perf: separate author/delegated_by queries, minor improvement

This commit is contained in:
Greg Heartsfield 2023-01-04 16:51:17 -06:00
parent 9a84dc19e9
commit 39a945b493

View File

@ -529,22 +529,42 @@ fn query_from_filter(f: &ReqFilter) -> (String, Vec<Box<dyn ToSql>>) {
for auth in authvec { for auth in authvec {
match hex_range(auth) { match hex_range(auth) {
Some(HexSearch::Exact(ex)) => { Some(HexSearch::Exact(ex)) => {
auth_searches.push("author=? OR delegated_by=?".to_owned()); auth_searches.push("author=?".to_owned());
params.push(Box::new(ex.clone()));
params.push(Box::new(ex)); params.push(Box::new(ex));
} }
Some(HexSearch::Range(lower, upper)) => { Some(HexSearch::Range(lower, upper)) => {
auth_searches.push( auth_searches.push(
"(author>? AND author<?) OR (delegated_by>? AND delegated_by<?)".to_owned(), "(author>? AND author<?)".to_owned(),
); );
params.push(Box::new(lower.clone()));
params.push(Box::new(upper.clone()));
params.push(Box::new(lower)); params.push(Box::new(lower));
params.push(Box::new(upper)); params.push(Box::new(upper));
} }
Some(HexSearch::LowerOnly(lower)) => { Some(HexSearch::LowerOnly(lower)) => {
auth_searches.push("author>? OR delegated_by>?".to_owned()); auth_searches.push("author>?".to_owned());
params.push(Box::new(lower.clone())); params.push(Box::new(lower));
}
None => {
info!("Could not parse hex range from author {:?}", auth);
}
}
}
// take each author and convert to a hexsearch
let mut del_searches: Vec<String> = vec![];
for auth in authvec {
match hex_range(auth) {
Some(HexSearch::Exact(ex)) => {
del_searches.push("delegated_by=?".to_owned());
params.push(Box::new(ex));
}
Some(HexSearch::Range(lower, upper)) => {
del_searches.push(
"(delegated_by>? AND delegated_by<?)".to_owned(),
);
params.push(Box::new(lower));
params.push(Box::new(upper));
}
Some(HexSearch::LowerOnly(lower)) => {
del_searches.push("delegated_by>?".to_owned());
params.push(Box::new(lower)); params.push(Box::new(lower));
} }
None => { None => {
@ -553,11 +573,10 @@ fn query_from_filter(f: &ReqFilter) -> (String, Vec<Box<dyn ToSql>>) {
} }
} }
if !authvec.is_empty() { if !authvec.is_empty() {
let authors_clause = format!("({})", auth_searches.join(" OR ")); // combine auth_searches and del_searches
filter_components.push(authors_clause); let comb_clause = format!("({} OR {})", auth_searches.join(" OR "), del_searches.join(" OR "));
filter_components.push(comb_clause);
} else { } else {
// if the authors list was empty, we should never return
// any results.
filter_components.push("false".to_owned()); filter_components.push("false".to_owned());
} }
} }