fix "OR TRUE" variant; remove Option<> from query_to_sqlite()
parent
98a9c88173
commit
ac02450b8b
|
@ -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))
|
||||
}
|
||||
},
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue