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>> {
|
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))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue