diff --git a/01.workspace/heave/src/fun/sqlite_build_statement.rs b/01.workspace/heave/src/fun/sqlite_build_statement.rs index 5fee943..122a84f 100644 --- a/01.workspace/heave/src/fun/sqlite_build_statement.rs +++ b/01.workspace/heave/src/fun/sqlite_build_statement.rs @@ -25,65 +25,59 @@ fn from_condition( ) -> Result { let fragment = match (comparison, condition) { // BOOL - (Comparison::Equal, Condition::Bool(_)) => compose_fragment(name, "value_bool", "=", i + 1), + (Comparison::Equal, Condition::Bool(_)) => compose_fragment(name, "value_bool", "=", i), (_, Condition::Bool(_)) => return Err(FailedTo::ComposeFilter), // SIGNED INT - (Comparison::Equal, Condition::SignedInt(_)) => { - compose_fragment(name, "value_int", "=", i + 1) - } + (Comparison::Equal, Condition::SignedInt(_)) => compose_fragment(name, "value_int", "=", i), (Comparison::Greater, Condition::SignedInt(_)) => { - compose_fragment(name, "value_int", ">", i + 1) + compose_fragment(name, "value_int", ">", i) } (Comparison::Lesser, Condition::SignedInt(_)) => { - compose_fragment(name, "value_int", "<", i + 1) + compose_fragment(name, "value_int", "<", i) } (Comparison::GreaterOrEqual, Condition::SignedInt(_)) => { - compose_fragment(name, "value_int", ">=", i + 1) + compose_fragment(name, "value_int", ">=", i) } (Comparison::LesserOrEqual, Condition::SignedInt(_)) => { - compose_fragment(name, "value_int", "<=", i + 1) + compose_fragment(name, "value_int", "<=", i) } (_, Condition::SignedInt(_)) => return Err(FailedTo::ComposeFilter), // UNSIGNED INT (Comparison::Equal, Condition::UnsignedInt(_)) => { - compose_fragment(name, "value_uint", "=", i + 1) + compose_fragment(name, "value_uint", "=", i) } (Comparison::Greater, Condition::UnsignedInt(_)) => { - compose_fragment(name, "value_uint", ">", i + 1) + compose_fragment(name, "value_uint", ">", i) } (Comparison::Lesser, Condition::UnsignedInt(_)) => { - compose_fragment(name, "value_uint", "<", i + 1) + compose_fragment(name, "value_uint", "<", i) } (Comparison::GreaterOrEqual, Condition::UnsignedInt(_)) => { - compose_fragment(name, "value_uint", ">=", i + 1) + compose_fragment(name, "value_uint", ">=", i) } (Comparison::LesserOrEqual, Condition::UnsignedInt(_)) => { - compose_fragment(name, "value_uint", "<=", i + 1) + compose_fragment(name, "value_uint", "<=", i) } (_, Condition::UnsignedInt(_)) => return Err(FailedTo::ComposeFilter), // REAL - (Comparison::Equal, Condition::Real(_)) => compose_fragment(name, "value_real", "=", i + 1), - (Comparison::Greater, Condition::Real(_)) => { - compose_fragment(name, "value_real", ">", i + 1) - } - (Comparison::Lesser, Condition::Real(_)) => { - compose_fragment(name, "value_real", "<", i + 1) - } + (Comparison::Equal, Condition::Real(_)) => compose_fragment(name, "value_real", "=", i), + (Comparison::Greater, Condition::Real(_)) => compose_fragment(name, "value_real", ">", i), + (Comparison::Lesser, Condition::Real(_)) => compose_fragment(name, "value_real", "<", i), (Comparison::GreaterOrEqual, Condition::Real(_)) => { - compose_fragment(name, "value_real", ">=", i + 1) + compose_fragment(name, "value_real", ">=", i) } (Comparison::LesserOrEqual, Condition::Real(_)) => { - compose_fragment(name, "value_real", "<=", i + 1) + compose_fragment(name, "value_real", "<=", i) } (_, Condition::Real(_)) => return Err(FailedTo::ComposeFilter), // TEXT (Comparison::IsExactly, Condition::Text(_)) => { - compose_fragment(name, "value_text", "LIKE", i + 1) + compose_fragment(name, "value_text", "LIKE", i) } ( Comparison::StartsWith | Comparison::EndsWith | Comparison::Contains, Condition::Text(_), - ) => compose_fragment(name, "value_text", "LIKE", i + 1), + ) => compose_fragment(name, "value_text", "LIKE", i), (_, Condition::Text(_)) => return Err(FailedTo::ComposeFilter), }; Ok(fragment) @@ -95,8 +89,8 @@ pub fn run(filter: &Filter) -> Result { let mut idx = 0; // for each condition add an inner join fragment for (i, (name, comparison, condition)) in filter.conditions().enumerate() { - idx = i; - let fragment = from_condition(i, name, comparison, condition)?; + idx = i + 1; + let fragment = from_condition(idx, name, comparison, condition)?; statement.push_str(&fragment); } // add a neutral where condition diff --git a/01.workspace/heave/src/fun/sqlite_init_db.rs b/01.workspace/heave/src/fun/sqlite_init_db.rs index 9c32f9c..9e4c44c 100644 --- a/01.workspace/heave/src/fun/sqlite_init_db.rs +++ b/01.workspace/heave/src/fun/sqlite_init_db.rs @@ -21,6 +21,7 @@ pub fn run(path: &path::Path) -> result::Result<(), FailedTo> { CONSTRAINT fk_entity_id FOREIGN KEY (entity_id) REFERENCES entity (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX IF NOT EXISTS entity_class ON entity (class); + CREATE INDEX IF NOT EXISTS entity_subclass ON entity (subclass); CREATE INDEX IF NOT EXISTS attribute_id ON attribute (id); "#; let connection = Connection::open(path).map_err(|_| sqlite::FailedTo::OpenConnection)?;