diff --git a/src/database.rs b/src/database.rs index 191a33f..a9e96ef 100644 --- a/src/database.rs +++ b/src/database.rs @@ -446,11 +446,7 @@ impl Query { pub fn query>(connection: &C, query: Query) -> Result> { use crate::schema::data::dsl::*; - let mut db_query = data.into_boxed(); - - if let Some(predicate) = query_to_sqlite(&query)? { - db_query = db_query.filter(predicate); - } + let db_query = data.filter(query_to_sqlite(&query)?); trace!("Querying: {}", debug_query(&db_query)); @@ -466,7 +462,7 @@ pub fn query>(connection: &C, query: Query) -> R } type Predicate = dyn BoxableExpression; -fn query_to_sqlite(query: &Query) -> Result>> { +fn query_to_sqlite(query: &Query) -> Result> { match query { Query::SingleQuery(qp) => match qp { QueryPart::Matches(eq) => { @@ -507,29 +503,27 @@ fn query_to_sqlite(query: &Query) -> Result>> { }; match subqueries.len() { - 0 => Ok(None), - 1 => Ok(Some(subqueries.remove(0))), + 0 => Ok(Box::new(true.into_sql::())), + 1 => Ok(subqueries.remove(0)), _ => { let mut result: Box, Box>> = Box::new(And::new(subqueries.remove(0), subqueries.remove(0))); while subqueries.len() > 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."), }, Query::MultiQuery(mq) => { - // TODO: Handle the "OR TRUE" case as well - let subqueries: Result>>> = + let subqueries: Result>> = mq.queries.iter().map(|sq| query_to_sqlite(sq)).collect(); - let mut subqueries: Vec> = - subqueries?.into_iter().filter_map(|sq| sq).collect(); + let mut subqueries: Vec> = subqueries?; match subqueries.len() { - 0 => Ok(None), - 1 => Ok(Some(subqueries.remove(0))), + 0 => Ok(Box::new(true.into_sql::())), + 1 => Ok(subqueries.remove(0)), _ => match mq.qualifier { QueryQualifier::AND => { let mut result: Box, Box>> = @@ -537,7 +531,7 @@ fn query_to_sqlite(query: &Query) -> Result>> { while subqueries.len() > 0 { result = Box::new(And::new(result, subqueries.remove(0))); } - Ok(Some(Box::new(result))) + Ok(Box::new(result)) } QueryQualifier::OR => { let mut result: Box, Box>> = @@ -545,7 +539,7 @@ fn query_to_sqlite(query: &Query) -> Result>> { while subqueries.len() > 0 { result = Box::new(Or::new(result, subqueries.remove(0))); } - Ok(Some(Box::new(result))) + Ok(Box::new(result)) } }, }