@@ -10,7 +10,7 @@ use vortex_array::aliases::hash_set::HashSet;
10
10
use vortex_array:: stats:: Stat ;
11
11
use vortex_array:: { Array , ArrayRef } ;
12
12
use vortex_dtype:: { FieldName , Nullability } ;
13
- use vortex_error:: { VortexExpect as _ , VortexResult } ;
13
+ use vortex_error:: { VortexExpect , VortexResult } ;
14
14
use vortex_scalar:: Scalar ;
15
15
16
16
use crate :: between:: Between ;
@@ -184,8 +184,12 @@ fn convert_to_pruning_expression(expr: &ExprRef) -> PruningPredicateStats {
184
184
let ( rewritten_left, mut refs_lhs) = convert_to_pruning_expression ( bexp. lhs ( ) ) ;
185
185
let ( rewritten_right, refs_rhs) = convert_to_pruning_expression ( bexp. rhs ( ) ) ;
186
186
refs_lhs. extend ( refs_rhs) ;
187
+ let flipped_op = bexp
188
+ . op ( )
189
+ . logical_inverse ( )
190
+ . vortex_expect ( "Can not be any other operator than and / or" ) ;
187
191
return (
188
- BinaryExpr :: new_expr ( rewritten_left, bexp . op ( ) , rewritten_right) ,
192
+ BinaryExpr :: new_expr ( rewritten_left, flipped_op , rewritten_right) ,
189
193
refs_lhs,
190
194
) ;
191
195
}
@@ -705,10 +709,29 @@ mod tests {
705
709
let predicate = PruningPredicate :: try_new ( & expr) . unwrap ( ) ;
706
710
assert_eq ! ( predicate. required_stats( ) , & expected) ;
707
711
708
- let expected_expr = or (
712
+ let expected_expr = and (
709
713
gt_eq ( get_item_scope ( FieldName :: from ( "min" ) ) , lit ( 10 ) ) ,
710
714
lt_eq ( get_item_scope ( FieldName :: from ( "max" ) ) , lit ( 50 ) ) ,
711
715
) ;
712
716
assert_eq ! ( predicate. expr( ) , & expected_expr)
713
717
}
718
+ #[ test]
719
+ pub fn pruning_and_or_operators ( ) {
720
+ // Test case: a > 10 AND a < 50
721
+ let column = FieldName :: from ( "a" ) ;
722
+ let and_expr = and (
723
+ gt ( get_item_scope ( column. clone ( ) ) , lit ( 10 ) ) ,
724
+ lt ( get_item_scope ( column) , lit ( 50 ) ) ,
725
+ ) ;
726
+ let pruned = PruningPredicate :: try_new ( & and_expr) . unwrap ( ) ;
727
+
728
+ // Expected: a_max <= 10 OR a_min >= 50
729
+ assert_eq ! (
730
+ pruned. expr( ) ,
731
+ & or(
732
+ lt_eq( get_item_scope( FieldName :: from( "a_max" ) ) , lit( 10 ) ) ,
733
+ gt_eq( get_item_scope( FieldName :: from( "a_min" ) ) , lit( 50 ) )
734
+ ) ,
735
+ ) ;
736
+ }
714
737
}
0 commit comments