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>> {
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<C: Connection<Backend = Sqlite>>(connection: &C, query: Query) -> R
}
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 {
Query::SingleQuery(qp) => match qp {
QueryPart::Matches(eq) => {
@ -507,29 +503,27 @@ fn query_to_sqlite(query: &Query) -> Result<Option<Box<Predicate>>> {
};
match subqueries.len() {
0 => Ok(None),
1 => Ok(Some(subqueries.remove(0))),
0 => Ok(Box::new(true.into_sql::<Bool>())),
1 => Ok(subqueries.remove(0)),
_ => {
let mut result: Box<And<Box<Predicate>, Box<Predicate>>> =
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<Vec<Option<Box<Predicate>>>> =
let subqueries: Result<Vec<Box<Predicate>>> =
mq.queries.iter().map(|sq| query_to_sqlite(sq)).collect();
let mut subqueries: Vec<Box<Predicate>> =
subqueries?.into_iter().filter_map(|sq| sq).collect();
let mut subqueries: Vec<Box<Predicate>> = subqueries?;
match subqueries.len() {
0 => Ok(None),
1 => Ok(Some(subqueries.remove(0))),
0 => Ok(Box::new(true.into_sql::<Bool>())),
1 => Ok(subqueries.remove(0)),
_ => match mq.qualifier {
QueryQualifier::AND => {
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 {
result = Box::new(And::new(result, subqueries.remove(0)));
}
Ok(Some(Box::new(result)))
Ok(Box::new(result))
}
QueryQualifier::OR => {
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 {
result = Box::new(Or::new(result, subqueries.remove(0)));
}
Ok(Some(Box::new(result)))
Ok(Box::new(result))
}
},
}