diff --git a/codegen/src/worktable/generator/table/select_executor.rs b/codegen/src/worktable/generator/table/select_executor.rs index 8aa04918..f0f9976e 100644 --- a/codegen/src/worktable/generator/table/select_executor.rs +++ b/codegen/src/worktable/generator/table/select_executor.rs @@ -130,6 +130,17 @@ impl Generator { where I: DoubleEndedIterator + Sized, { + + fn where_by(self, predicate: F) -> SelectQueryBuilder<#row_type, impl DoubleEndedIterator + Sized, #column_range_type> + where + F: FnMut(&#row_type) -> bool, + { + SelectQueryBuilder { + params: self.params, + iter: self.iter.filter(predicate), + } + } + fn execute(self) -> Result, WorkTableError> { let mut iter: Box> = Box::new(self.iter); diff --git a/src/table/select/query.rs b/src/table/select/query.rs index b697d9bc..46e37997 100644 --- a/src/table/select/query.rs +++ b/src/table/select/query.rs @@ -3,7 +3,6 @@ use std::collections::VecDeque; use crate::select::{Order, QueryParams}; use crate::WorkTableError; -#[derive(Clone)] pub struct SelectQueryBuilder where I: DoubleEndedIterator + Sized, @@ -43,7 +42,7 @@ where self } - pub fn where_by(mut self, range: R, column: impl Into) -> Self + pub fn range_by(mut self, range: R, column: impl Into) -> Self where R: Into, { @@ -52,10 +51,16 @@ where } } -pub trait SelectQueryExecutor +pub trait SelectQueryExecutor where Self: Sized, I: DoubleEndedIterator + Sized, { fn execute(self) -> Result, WorkTableError>; + fn where_by( + self, + predicate: F, + ) -> SelectQueryBuilder + Sized, ColumnRange> + where + F: FnMut(&Row) -> bool; } diff --git a/tests/worktable/base.rs b/tests/worktable/base.rs index c66b9045..0fb30c3f 100644 --- a/tests/worktable/base.rs +++ b/tests/worktable/base.rs @@ -569,7 +569,7 @@ fn select_all_range_test() { let all = table .select_all() - .where_by(0..2i64, "test") + .range_by(0..2i64, "test") .execute() .unwrap(); @@ -605,13 +605,148 @@ fn select_all_range_inclusive_test() { let all = table .select_all() - .where_by(0..=2i64, "test") + .range_by(0..=2i64, "test") .execute() .unwrap(); assert_eq!(all.len(), 2); } +#[test] +fn select_all_where_by_eq_string_test() { + let table = TestWorkTable::default(); + + let row1 = TestRow { + id: table.get_next_pk().into(), + test: 3, + another: 1, + exchange: "M1".to_string(), + }; + let row2 = TestRow { + id: table.get_next_pk().into(), + test: 1, + another: 2, + exchange: "N1".to_string(), + }; + let row3 = TestRow { + id: table.get_next_pk().into(), + test: 2, + another: 1, + exchange: "P1".to_string(), + }; + + let _ = table.insert(row1.clone()).unwrap(); + let _ = table.insert(row2.clone()).unwrap(); + let _ = table.insert(row3.clone()).unwrap(); + + let all = table.select_all(); + + let equal = all.where_by(|row| row.exchange.eq("P1")).execute().unwrap(); + assert_eq!(equal.len(), 1); +} + +#[test] +fn select_all_where_by_contains_string_test() { + let table = TestWorkTable::default(); + + let row1 = TestRow { + id: table.get_next_pk().into(), + test: 3, + another: 1, + exchange: "M1".to_string(), + }; + let row2 = TestRow { + id: table.get_next_pk().into(), + test: 1, + another: 2, + exchange: "N1".to_string(), + }; + let row3 = TestRow { + id: table.get_next_pk().into(), + test: 2, + another: 1, + exchange: "P1".to_string(), + }; + + let _ = table.insert(row1.clone()).unwrap(); + let _ = table.insert(row2.clone()).unwrap(); + let _ = table.insert(row3.clone()).unwrap(); + + let all = table.select_all(); + let contains = all + .where_by(|row| row.exchange.contains("1")) + .execute() + .unwrap(); + + assert_eq!(contains.len(), 3); +} + +#[test] +fn select_all_where_by_gt_string_number_test() { + let table = TestWorkTable::default(); + + let row1 = TestRow { + id: table.get_next_pk().into(), + test: 3, + another: 1, + exchange: "M1".to_string(), + }; + let row2 = TestRow { + id: table.get_next_pk().into(), + test: 1, + another: 2, + exchange: "N1".to_string(), + }; + let row3 = TestRow { + id: table.get_next_pk().into(), + test: 2, + another: 1, + exchange: "P1".to_string(), + }; + + let _ = table.insert(row1.clone()).unwrap(); + let _ = table.insert(row2.clone()).unwrap(); + let _ = table.insert(row3.clone()).unwrap(); + + let all = table.select_all(); + + let equal = all.where_by(|row| row.test > 1).execute().unwrap(); + assert_eq!(equal.len(), 2); +} + +#[test] +fn select_all_where_by_eq_string_number_test() { + let table = TestWorkTable::default(); + + let row1 = TestRow { + id: table.get_next_pk().into(), + test: 3, + another: 1, + exchange: "M1".to_string(), + }; + let row2 = TestRow { + id: table.get_next_pk().into(), + test: 1, + another: 2, + exchange: "N1".to_string(), + }; + let row3 = TestRow { + id: table.get_next_pk().into(), + test: 2, + another: 1, + exchange: "P1".to_string(), + }; + + let _ = table.insert(row1.clone()).unwrap(); + let _ = table.insert(row2.clone()).unwrap(); + let _ = table.insert(row3.clone()).unwrap(); + + let all = table.select_all(); + + let equal = all.where_by(|row| row.another == 1).execute().unwrap(); + assert_eq!(equal.len(), 2); +} + #[test] fn select_all_order_multiple_test() { let table = TestWorkTable::default();