From b4962acdfd049f991e1356df60e34afbc5305ec7 Mon Sep 17 00:00:00 2001 From: glendc Date: Mon, 8 Apr 2024 13:15:40 +0200 Subject: [PATCH] add functional filter map tests + fix bug in it --- venndb-macros/src/generate_db.rs | 8 ++-- venndb-usage/src/main.rs | 82 ++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 4 deletions(-) diff --git a/venndb-macros/src/generate_db.rs b/venndb-macros/src/generate_db.rs index 5b4572a..424bdb8 100644 --- a/venndb-macros/src/generate_db.rs +++ b/venndb-macros/src/generate_db.rs @@ -337,11 +337,11 @@ fn generate_db_struct_method_append( let #filter_index = match self.#filter_map_name.entry(data.#name.clone()) { ::venndb::__internal::hash_map::Entry::Occupied(entry) => *entry.get(), ::venndb::__internal::hash_map::Entry::Vacant(entry) => { - let index = self.#filter_vec_name.len(); - entry.insert(index); - let bv = ::venndb::__internal::BitVec::repeat(false, self.rows.len()); + let vec_index = self.#filter_vec_name.len(); + entry.insert(vec_index); + let bv = ::venndb::__internal::BitVec::repeat(false, index); self.#filter_vec_name.push(bv); - index + vec_index } }; for (i, row) in self.#filter_vec_name.iter_mut().enumerate() { diff --git a/venndb-usage/src/main.rs b/venndb-usage/src/main.rs index 4a8977e..4617106 100644 --- a/venndb-usage/src/main.rs +++ b/venndb-usage/src/main.rs @@ -443,4 +443,86 @@ mod tests { assert!(results.filter(|r| r.is_admin).is_none()); } + + #[test] + fn test_db_filter_map() { + let db = EmployeeDB::from_rows(vec![ + Employee { + id: 1, + name: "Alice".to_string(), + is_manager: true, + is_admin: false, + is_active: true, + department: Department::Engineering, + }, + Employee { + id: 2, + name: "Bob".to_string(), + is_manager: false, + is_admin: false, + is_active: true, + department: Department::Engineering, + }, + Employee { + id: 3, + name: "Charlie".to_string(), + is_manager: true, + is_admin: true, + is_active: true, + department: Department::Sales, + }, + Employee { + id: 4, + name: "David".to_string(), + is_manager: false, + is_admin: true, + is_active: true, + department: Department::HR, + }, + Employee { + id: 5, + name: "Eve".to_string(), + is_manager: true, + is_admin: false, + is_active: true, + department: Department::HR, + }, + ]) + .unwrap(); + + let mut query = db.query(); + query.department(Department::Marketing); + assert!(query.execute().is_none()); + + query.reset().department(Department::Engineering); + let results = query.execute().unwrap().iter().collect::>(); + assert_eq!(results.len(), 2); + assert_eq!(results[0].id, 1); + assert_eq!(results[1].id, 2); + + query.reset().department(Department::HR); + let results = query.execute().unwrap().iter().collect::>(); + assert_eq!(results.len(), 2); + assert_eq!(results[0].id, 4); + assert_eq!(results[1].id, 5); + + query.reset().department(Department::Sales); + let results = query.execute().unwrap().iter().collect::>(); + assert_eq!(results.len(), 1); + assert_eq!(results[0].id, 3); + + // all the filters + let results = query + .reset() + .department(Department::Engineering) + .is_manager(true) + .is_admin(false) + .is_active(true) + .execute() + .unwrap() + .iter() + .collect::>(); + assert_eq!(results.len(), 1); + assert_eq!(results[0].id, 1); + } }