Skip to content
This repository was archived by the owner on Apr 4, 2023. It is now read-only.

Commit d38cc73

Browse files
committed
Add one more filter "integration" test
1 parent e688581 commit d38cc73

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed

milli/src/search/facet/filter.rs

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,10 +398,12 @@ impl<'a> From<FilterCondition<'a>> for Filter<'a> {
398398
#[cfg(test)]
399399
mod tests {
400400
use std::fmt::Write;
401+
use std::iter::FromIterator;
401402

402403
use big_s::S;
403404
use either::Either;
404405
use maplit::hashset;
406+
use roaring::RoaringBitmap;
405407

406408
use crate::index::tests::TempIndex;
407409
use crate::Filter;
@@ -752,4 +754,85 @@ mod tests {
752754
Err(crate::Error::UserError(crate::error::UserError::InvalidFilter(_)))
753755
));
754756
}
757+
758+
#[test]
759+
fn filter_number() {
760+
let index = TempIndex::new();
761+
762+
index
763+
.update_settings(|settings| {
764+
settings.set_primary_key("id".to_owned());
765+
settings.set_filterable_fields(hashset! { S("id"), S("one"), S("two") });
766+
})
767+
.unwrap();
768+
769+
let mut docs = vec![];
770+
for i in 0..100 {
771+
docs.push(serde_json::json!({ "id": i, "two": i % 10 }));
772+
}
773+
774+
index.add_documents(documents!(docs)).unwrap();
775+
776+
let rtxn = index.read_txn().unwrap();
777+
for i in 0..100 {
778+
let filter_str = format!("id = {i}");
779+
let filter = Filter::from_str(&filter_str).unwrap().unwrap();
780+
let result = filter.evaluate(&rtxn, &index).unwrap();
781+
assert_eq!(result, RoaringBitmap::from_iter([i]));
782+
}
783+
for i in 0..100 {
784+
let filter_str = format!("id > {i}");
785+
let filter = Filter::from_str(&filter_str).unwrap().unwrap();
786+
let result = filter.evaluate(&rtxn, &index).unwrap();
787+
assert_eq!(result, RoaringBitmap::from_iter((i + 1)..100));
788+
}
789+
for i in 0..100 {
790+
let filter_str = format!("id < {i}");
791+
let filter = Filter::from_str(&filter_str).unwrap().unwrap();
792+
let result = filter.evaluate(&rtxn, &index).unwrap();
793+
assert_eq!(result, RoaringBitmap::from_iter(0..i));
794+
}
795+
for i in 0..100 {
796+
let filter_str = format!("id <= {i}");
797+
let filter = Filter::from_str(&filter_str).unwrap().unwrap();
798+
let result = filter.evaluate(&rtxn, &index).unwrap();
799+
assert_eq!(result, RoaringBitmap::from_iter(0..=i));
800+
}
801+
for i in 0..100 {
802+
let filter_str = format!("id >= {i}");
803+
let filter = Filter::from_str(&filter_str).unwrap().unwrap();
804+
let result = filter.evaluate(&rtxn, &index).unwrap();
805+
assert_eq!(result, RoaringBitmap::from_iter(i..100));
806+
}
807+
for i in 0..100 {
808+
for j in i..100 {
809+
let filter_str = format!("id {i} TO {j}");
810+
let filter = Filter::from_str(&filter_str).unwrap().unwrap();
811+
let result = filter.evaluate(&rtxn, &index).unwrap();
812+
assert_eq!(result, RoaringBitmap::from_iter(i..=j));
813+
}
814+
}
815+
let filter = Filter::from_str("one >= 0 OR one <= 0").unwrap().unwrap();
816+
let result = filter.evaluate(&rtxn, &index).unwrap();
817+
assert_eq!(result, RoaringBitmap::default());
818+
819+
let filter = Filter::from_str("one = 0").unwrap().unwrap();
820+
let result = filter.evaluate(&rtxn, &index).unwrap();
821+
assert_eq!(result, RoaringBitmap::default());
822+
823+
for i in 0..10 {
824+
for j in i..10 {
825+
let filter_str = format!("two {i} TO {j}");
826+
let filter = Filter::from_str(&filter_str).unwrap().unwrap();
827+
let result = filter.evaluate(&rtxn, &index).unwrap();
828+
assert_eq!(
829+
result,
830+
RoaringBitmap::from_iter((0..100).filter(|x| (i..=j).contains(&(x % 10))))
831+
);
832+
}
833+
}
834+
let filter = Filter::from_str("two != 0").unwrap().unwrap();
835+
let result = filter.evaluate(&rtxn, &index).unwrap();
836+
assert_eq!(result, RoaringBitmap::from_iter((0..100).filter(|x| x % 10 != 0)));
837+
}
755838
}

0 commit comments

Comments
 (0)