fix and/or expressions generating incorrect sql

feat/vaults
Tomáš Mládek 2022-03-30 12:20:19 +02:00
parent 8c60a617a2
commit 1a05157a9d
No known key found for this signature in database
GPG Key ID: 65E225C8B3E2ED8A
2 changed files with 17 additions and 16 deletions

View File

@ -1,6 +1,7 @@
use crate::addressing::Address; use crate::addressing::Address;
use crate::database::entry::EntryValue; use crate::database::entry::EntryValue;
use crate::database::inner::schema::data; use crate::database::inner::schema::data;
use diesel::expression::grouped::Grouped;
use diesel::expression::operators::{And, Not, Or}; use diesel::expression::operators::{And, Not, Or};
use diesel::sql_types::Bool; use diesel::sql_types::Bool;
use diesel::sqlite::Sqlite; use diesel::sqlite::Sqlite;
@ -433,15 +434,15 @@ impl Query {
while !subqueries.is_empty() { while !subqueries.is_empty() {
result = Box::new(And::new(result, subqueries.remove(0))); result = Box::new(And::new(result, subqueries.remove(0)));
} }
Ok(Box::new(result)) Ok(Box::new(Grouped(result)))
} }
QueryQualifier::Or => { QueryQualifier::Or => {
let mut result: Box<Or<Box<Predicate>, Box<Predicate>>> = let mut result =
Box::new(Or::new(subqueries.remove(0), subqueries.remove(0))); Box::new(Or::new(subqueries.remove(0), subqueries.remove(0)));
while !subqueries.is_empty() { while !subqueries.is_empty() {
result = Box::new(Or::new(result, subqueries.remove(0))); result = Box::new(Or::new(result, subqueries.remove(0)));
} }
Ok(Box::new(result)) Ok(Box::new(Grouped(result)))
} }
QueryQualifier::Not => { QueryQualifier::Not => {
Err(QueryParseError("NOT only takes one subquery.".into())) Err(QueryParseError("NOT only takes one subquery.".into()))

View File

@ -503,18 +503,18 @@ mod test {
let result = connection.query(query).unwrap(); let result = connection.query(query).unwrap();
assert_eq!(result.len(), 1); assert_eq!(result.len(), 1);
// let query = format!( let query = format!(
// r#"(and r#"(and
// (or (or
// (matches ? ? (contains "OOBA")) (matches ? ? (contains "OOBA"))
// (matches ? (contains "HARGE") ?) (matches ? (contains "HARGE") ?)
// ) )
// (not (matches ? "{LABEL_ATTR}" ?)) (not (matches ? "{LABEL_ATTR}" ?))
// )"# )"#
// ) )
// .parse() .parse()
// .unwrap(); .unwrap();
// let result = connection.query(query).unwrap(); let result = connection.query(query).unwrap();
// assert_eq!(result.len(), 1); assert_eq!(result.len(), 1);
} }
} }