fix "OR TRUE" variant; remove Option<> from query_to_sqlite()

feat/vaults
Tomáš Mládek 2021-02-12 11:56:29 +01:00
parent 98a9c88173
commit ac02450b8b
1 changed files with 11 additions and 17 deletions

View File

@ -446,11 +446,7 @@ impl Query {
pub fn query<C: Connection<Backend = Sqlite>>(connection: &C, query: Query) -> Result<Vec<Entry>> { pub fn query<C: Connection<Backend = Sqlite>>(connection: &C, query: Query) -> Result<Vec<Entry>> {
use crate::schema::data::dsl::*; use crate::schema::data::dsl::*;
let mut db_query = data.into_boxed(); let db_query = data.filter(query_to_sqlite(&query)?);
if let Some(predicate) = query_to_sqlite(&query)? {
db_query = db_query.filter(predicate);
}
trace!("Querying: {}", debug_query(&db_query)); trace!("Querying: {}", debug_query(&db_query));
@ -466,7 +462,7 @@ pub fn query<C: Connection<Backend = Sqlite>>(connection: &C, query: Query) -> R
} }
type Predicate = dyn BoxableExpression<data::table, Sqlite, SqlType = Bool>; type Predicate = dyn BoxableExpression<data::table, Sqlite, SqlType = Bool>;
fn query_to_sqlite(query: &Query) -> Result<Option<Box<Predicate>>> { fn query_to_sqlite(query: &Query) -> Result<Box<Predicate>> {
match query { match query {
Query::SingleQuery(qp) => match qp { Query::SingleQuery(qp) => match qp {
QueryPart::Matches(eq) => { QueryPart::Matches(eq) => {
@ -507,29 +503,27 @@ fn query_to_sqlite(query: &Query) -> Result<Option<Box<Predicate>>> {
}; };
match subqueries.len() { match subqueries.len() {
0 => Ok(None), 0 => Ok(Box::new(true.into_sql::<Bool>())),
1 => Ok(Some(subqueries.remove(0))), 1 => Ok(subqueries.remove(0)),
_ => { _ => {
let mut result: Box<And<Box<Predicate>, Box<Predicate>>> = let mut result: Box<And<Box<Predicate>, Box<Predicate>>> =
Box::new(And::new(subqueries.remove(0), subqueries.remove(0))); Box::new(And::new(subqueries.remove(0), subqueries.remove(0)));
while subqueries.len() > 0 { while subqueries.len() > 0 {
result = Box::new(And::new(result, subqueries.remove(0))); result = Box::new(And::new(result, subqueries.remove(0)));
} }
Ok(Some(Box::new(result))) Ok(Box::new(result))
} }
} }
} }
QueryPart::Type(_) => unimplemented!("Type queries are not yet implemented."), QueryPart::Type(_) => unimplemented!("Type queries are not yet implemented."),
}, },
Query::MultiQuery(mq) => { Query::MultiQuery(mq) => {
// TODO: Handle the "OR TRUE" case as well let subqueries: Result<Vec<Box<Predicate>>> =
let subqueries: Result<Vec<Option<Box<Predicate>>>> =
mq.queries.iter().map(|sq| query_to_sqlite(sq)).collect(); mq.queries.iter().map(|sq| query_to_sqlite(sq)).collect();
let mut subqueries: Vec<Box<Predicate>> = let mut subqueries: Vec<Box<Predicate>> = subqueries?;
subqueries?.into_iter().filter_map(|sq| sq).collect();
match subqueries.len() { match subqueries.len() {
0 => Ok(None), 0 => Ok(Box::new(true.into_sql::<Bool>())),
1 => Ok(Some(subqueries.remove(0))), 1 => Ok(subqueries.remove(0)),
_ => match mq.qualifier { _ => match mq.qualifier {
QueryQualifier::AND => { QueryQualifier::AND => {
let mut result: Box<And<Box<Predicate>, Box<Predicate>>> = let mut result: Box<And<Box<Predicate>, Box<Predicate>>> =
@ -537,7 +531,7 @@ fn query_to_sqlite(query: &Query) -> Result<Option<Box<Predicate>>> {
while subqueries.len() > 0 { while subqueries.len() > 0 {
result = Box::new(And::new(result, subqueries.remove(0))); result = Box::new(And::new(result, subqueries.remove(0)));
} }
Ok(Some(Box::new(result))) Ok(Box::new(result))
} }
QueryQualifier::OR => { QueryQualifier::OR => {
let mut result: Box<Or<Box<Predicate>, Box<Predicate>>> = let mut result: Box<Or<Box<Predicate>, Box<Predicate>>> =
@ -545,7 +539,7 @@ fn query_to_sqlite(query: &Query) -> Result<Option<Box<Predicate>>> {
while subqueries.len() > 0 { while subqueries.len() > 0 {
result = Box::new(Or::new(result, subqueries.remove(0))); result = Box::new(Or::new(result, subqueries.remove(0)));
} }
Ok(Some(Box::new(result))) Ok(Box::new(result))
} }
}, },
} }