@@ -398,10 +398,12 @@ impl<'a> From<FilterCondition<'a>> for Filter<'a> {
398398#[ cfg( test) ]
399399mod 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