diff --git a/src/database/lang.rs b/src/database/lang.rs index f0e9266..bd08962 100644 --- a/src/database/lang.rs +++ b/src/database/lang.rs @@ -1,6 +1,7 @@ use crate::addressing::Address; use crate::database::entry::EntryValue; use crate::database::inner::schema::data; +use diesel::expression::grouped::Grouped; use diesel::expression::operators::{And, Not, Or}; use diesel::sql_types::Bool; use diesel::sqlite::Sqlite; @@ -433,15 +434,15 @@ impl Query { while !subqueries.is_empty() { result = Box::new(And::new(result, subqueries.remove(0))); } - Ok(Box::new(result)) + Ok(Box::new(Grouped(result))) } QueryQualifier::Or => { - let mut result: Box, Box>> = + let mut result = Box::new(Or::new(subqueries.remove(0), subqueries.remove(0))); while !subqueries.is_empty() { result = Box::new(Or::new(result, subqueries.remove(0))); } - Ok(Box::new(result)) + Ok(Box::new(Grouped(result))) } QueryQualifier::Not => { Err(QueryParseError("NOT only takes one subquery.".into())) diff --git a/src/database/mod.rs b/src/database/mod.rs index d00b3b5..c497439 100644 --- a/src/database/mod.rs +++ b/src/database/mod.rs @@ -503,18 +503,18 @@ mod test { let result = connection.query(query).unwrap(); assert_eq!(result.len(), 1); - // let query = format!( - // r#"(and - // (or - // (matches ? ? (contains "OOBA")) - // (matches ? (contains "HARGE") ?) - // ) - // (not (matches ? "{LABEL_ATTR}" ?)) - // )"# - // ) - // .parse() - // .unwrap(); - // let result = connection.query(query).unwrap(); - // assert_eq!(result.len(), 1); + let query = format!( + r#"(and + (or + (matches ? ? (contains "OOBA")) + (matches ? (contains "HARGE") ?) + ) + (not (matches ? "{LABEL_ATTR}" ?)) + )"# + ) + .parse() + .unwrap(); + let result = connection.query(query).unwrap(); + assert_eq!(result.len(), 1); } }