@@ -24,6 +24,7 @@ use crate::expr::operators::Operator;
2424/// semantics is also known as "Bochvar logic" and "weak Kleene logic".
2525///
2626/// See also [BooleanOperator::And]
27+ #[ deprecated( note = "Use and_kleene instead. Non-Kleene boolean ops cannot be lazily evaluated." ) ]
2728pub fn and ( lhs : & dyn Array , rhs : & dyn Array ) -> VortexResult < ArrayRef > {
2829 boolean ( lhs, rhs, BooleanOperator :: And )
2930}
@@ -41,6 +42,7 @@ pub fn and_kleene(lhs: &dyn Array, rhs: &dyn Array) -> VortexResult<ArrayRef> {
4142/// semantics is also known as "Bochvar logic" and "weak Kleene logic".
4243///
4344/// See also [BooleanOperator::Or]
45+ #[ deprecated( note = "Use or_kleene instead. Non-Kleene boolean ops cannot be lazily evaluated." ) ]
4446pub fn or ( lhs : & dyn Array , rhs : & dyn Array ) -> VortexResult < ArrayRef > {
4547 boolean ( lhs, rhs, BooleanOperator :: Or )
4648}
@@ -53,16 +55,19 @@ pub fn or_kleene(lhs: &dyn Array, rhs: &dyn Array) -> VortexResult<ArrayRef> {
5355}
5456
5557/// Point-wise logical operator between two Boolean arrays.
56- ///
57- /// This method uses Arrow-style null propagation rather than the Kleene logic semantics. This
58- /// semantics is also known as "Bochvar logic" and "weak Kleene logic".
5958pub fn boolean ( lhs : & dyn Array , rhs : & dyn Array , op : BooleanOperator ) -> VortexResult < ArrayRef > {
60- Ok ( ScalarFnArray :: try_new (
61- ScalarFn :: new ( Binary , Operator :: try_from ( op) ?) ,
62- vec ! [ lhs. to_array( ) , rhs. to_array( ) ] ,
63- lhs. len ( ) ,
64- ) ?
65- . into_array ( ) )
59+ match Operator :: try_from ( op) {
60+ Ok ( expr_op) => Ok ( ScalarFnArray :: try_new (
61+ ScalarFn :: new ( Binary , expr_op) ,
62+ vec ! [ lhs. to_array( ) , rhs. to_array( ) ] ,
63+ lhs. len ( ) ,
64+ ) ?
65+ . into_array ( ) ) ,
66+ Err ( _) => {
67+ tracing:: trace!( "non-Kleene boolean op {op:?} cannot be lazily evaluated, falling back to eager Arrow evaluation" ) ;
68+ arrow_boolean ( lhs. to_array ( ) , rhs. to_array ( ) , op)
69+ }
70+ }
6671}
6772
6873/// Operations over the nullable Boolean values.
@@ -156,7 +161,7 @@ mod tests {
156161 #[ case( BoolArray :: from_iter( [ Some ( true ) , Some ( false ) , Some ( true ) , Some ( false ) ] . into_iter( ) ) . into_array( ) ,
157162 BoolArray :: from_iter( [ Some ( true ) , Some ( true ) , Some ( false ) , Some ( false ) ] . into_iter( ) ) . into_array( ) ) ]
158163 fn test_or ( #[ case] lhs : ArrayRef , #[ case] rhs : ArrayRef ) {
159- let r = or ( & lhs, & rhs) . unwrap ( ) ;
164+ let r = or_kleene ( & lhs, & rhs) . unwrap ( ) ;
160165
161166 let r = r. to_bool ( ) . into_array ( ) ;
162167
@@ -178,7 +183,7 @@ mod tests {
178183 #[ case( BoolArray :: from_iter( [ Some ( true ) , Some ( false ) , Some ( true ) , Some ( false ) ] . into_iter( ) ) . into_array( ) ,
179184 BoolArray :: from_iter( [ Some ( true ) , Some ( true ) , Some ( false ) , Some ( false ) ] . into_iter( ) ) . into_array( ) ) ]
180185 fn test_and ( #[ case] lhs : ArrayRef , #[ case] rhs : ArrayRef ) {
181- let r = and ( & lhs, & rhs) . unwrap ( ) . to_bool ( ) . into_array ( ) ;
186+ let r = and_kleene ( & lhs, & rhs) . unwrap ( ) . to_bool ( ) . into_array ( ) ;
182187
183188 let v0 = r. scalar_at ( 0 ) . unwrap ( ) . as_bool ( ) . value ( ) ;
184189 let v1 = r. scalar_at ( 1 ) . unwrap ( ) . as_bool ( ) . value ( ) ;
0 commit comments