feat(api): add search query to targets

This commit is contained in:
Jef Roosens 2022-12-31 10:19:59 +01:00 committed by Chewing_Bever
parent 60d5fb77e0
commit f8f611f5c5
Signed by untrusted user: Jef Roosens
GPG key ID: B75D4F293C7052DB
5 changed files with 58 additions and 12 deletions

View file

@ -1,24 +1,55 @@
module db
import models { Target, TargetArch, TargetFilter }
import math
// get_targets returns all targets in the database.
pub fn (db &VieterDb) get_targets(filter TargetFilter) []Target {
// This seems to currently be blocked by a bug in the ORM, I'll have to ask
// around.
if filter.repo != '' {
res := sql db.conn {
select from Target where repo == filter.repo order by id limit filter.limit offset filter.offset
window_size := 32
mut out := []Target{}
mut targets := []Target{cap: window_size}
mut offset := 0
mut filtered_offset := u64(0)
for out.len < filter.limit {
targets = sql db.conn {
select from Target order by id limit window_size offset offset
}
offset += targets.len
if targets.len == 0 {
break
}
return res
if filter.repo != '' {
targets = targets.filter(it.repo == filter.repo)
}
if filter.query != '' {
targets = targets.filter(it.url.contains(filter.query) || it.path.contains(filter.query)
|| it.branch.contains(filter.query))
}
if filtered_offset > filter.offset {
end_index := math.min(filter.limit - u64(out.len), u64(targets.len))
out << targets[0..end_index]
}
// We start counting targets in the middle of the current window
else if filtered_offset + u64(targets.len) > filter.offset {
start_index := filter.offset - filtered_offset
end_index := start_index +
math.min(filter.limit - u64(out.len), u64(targets.len) - start_index)
out << targets[start_index..end_index]
}
filtered_offset += u64(targets.len)
}
res := sql db.conn {
select from Target order by id limit filter.limit offset filter.offset
}
return res
return out
}
// get_target tries to return a specific target.