From ac02450b8b2c692393fe892b246d5b63ca7fc4ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Ml=C3=A1dek?= Date: Fri, 12 Feb 2021 11:56:29 +0100 Subject: [PATCH] fix "OR TRUE" variant; remove Option<> from query_to_sqlite() --- src/database.rs | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) 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)) } }, }