@@ -624,8 +624,15 @@ pub fn eq_utf8_scalar<OffsetSize: StringOffsetSizeTrait>(
624624 compare_op_scalar ! ( left, right, |a, b| a == b)
625625}
626626
627- /// Perform `left == right` operation on [`BooleanArray`]
628- fn eq_bool ( left : & BooleanArray , right : & BooleanArray ) -> Result < BooleanArray > {
627+ #[ inline]
628+ fn binary_boolean_op < F > (
629+ left : & BooleanArray ,
630+ right : & BooleanArray ,
631+ op : F ,
632+ ) -> Result < BooleanArray >
633+ where
634+ F : Copy + Fn ( u64 , u64 ) -> u64 ,
635+ {
629636 binary_boolean_kernel (
630637 left,
631638 right,
@@ -640,32 +647,40 @@ fn eq_bool(left: &BooleanArray, right: &BooleanArray) -> Result<BooleanArray> {
640647 right,
641648 right_offset_in_bits,
642649 len_in_bits,
643- |a , b| ! ( a ^ b ) ,
650+ op ,
644651 )
645652 } ,
646653 )
647654}
648655
656+ /// Perform `left == right` operation on [`BooleanArray`]
657+ fn eq_bool ( left : & BooleanArray , right : & BooleanArray ) -> Result < BooleanArray > {
658+ binary_boolean_op ( left, right, |a, b| !( a ^ b) )
659+ }
660+
649661/// Perform `left != right` operation on [`BooleanArray`]
650662fn neq_bool ( left : & BooleanArray , right : & BooleanArray ) -> Result < BooleanArray > {
651- binary_boolean_kernel (
652- left,
653- right,
654- |left : & Buffer ,
655- left_offset_in_bits : usize ,
656- right : & Buffer ,
657- right_offset_in_bits : usize ,
658- len_in_bits : usize | {
659- bitwise_bin_op_helper (
660- left,
661- left_offset_in_bits,
662- right,
663- right_offset_in_bits,
664- len_in_bits,
665- |a, b| ( a ^ b) ,
666- )
667- } ,
668- )
663+ binary_boolean_op ( left, right, |a, b| ( a ^ b) )
664+ }
665+
666+ /// Perform `left < right` operation on [`BooleanArray`]
667+ fn lt_bool ( left : & BooleanArray , right : & BooleanArray ) -> Result < BooleanArray > {
668+ binary_boolean_op ( left, right, |a, b| ( ( !a) & b) )
669+ }
670+
671+ /// Perform `left <= right` operation on [`BooleanArray`]
672+ fn lt_eq_bool ( left : & BooleanArray , right : & BooleanArray ) -> Result < BooleanArray > {
673+ binary_boolean_op ( left, right, |a, b| !( a & ( !b) ) )
674+ }
675+
676+ /// Perform `left > right` operation on [`BooleanArray`]
677+ fn gt_bool ( left : & BooleanArray , right : & BooleanArray ) -> Result < BooleanArray > {
678+ binary_boolean_op ( left, right, |a, b| ( a & ( !b) ) )
679+ }
680+
681+ /// Perform `left >= right` operation on [`BooleanArray`]
682+ fn gt_eq_bool ( left : & BooleanArray , right : & BooleanArray ) -> Result < BooleanArray > {
683+ binary_boolean_op ( left, right, |a, b| !( ( !a) & b) )
669684}
670685
671686/// Perform `left == right` operation on [`BooleanArray`] and a scalar
@@ -1354,7 +1369,7 @@ mod tests {
13541369 vec ! [ Some ( true ) , Some ( false ) , Some ( false ) , Some ( true ) , Some ( true ) , None ]
13551370 . into ( ) ;
13561371 let b: BooleanArray =
1357- vec ! [ Some ( true ) , Some ( true ) , Some ( false ) , Some ( false ) , None , Some ( false ) ]
1372+ vec ! [ Some ( true ) , Some ( true ) , Some ( false ) , Some ( false ) , None , Some ( false ) ]
13581373 . into ( ) ;
13591374
13601375 let res: Vec < Option < bool > > = neq_bool ( & a, & b) . unwrap ( ) . iter ( ) . collect ( ) ;
@@ -1365,6 +1380,74 @@ mod tests {
13651380 )
13661381 }
13671382
1383+ #[ test]
1384+ fn test_boolean_array_lt ( ) {
1385+ let a: BooleanArray =
1386+ vec ! [ Some ( true ) , Some ( false ) , Some ( false ) , Some ( true ) , Some ( true ) , None ]
1387+ . into ( ) ;
1388+ let b: BooleanArray =
1389+ vec ! [ Some ( true ) , Some ( true ) , Some ( false ) , Some ( false ) , None , Some ( false ) ]
1390+ . into ( ) ;
1391+
1392+ let res: Vec < Option < bool > > = lt_bool ( & a, & b) . unwrap ( ) . iter ( ) . collect ( ) ;
1393+
1394+ assert_eq ! (
1395+ res,
1396+ vec![ Some ( false ) , Some ( true ) , Some ( false ) , Some ( false ) , None , None ]
1397+ )
1398+ }
1399+
1400+ #[ test]
1401+ fn test_boolean_array_lt_eq ( ) {
1402+ let a: BooleanArray =
1403+ vec ! [ Some ( true ) , Some ( false ) , Some ( false ) , Some ( true ) , Some ( true ) , None ]
1404+ . into ( ) ;
1405+ let b: BooleanArray =
1406+ vec ! [ Some ( true ) , Some ( true ) , Some ( false ) , Some ( false ) , None , Some ( false ) ]
1407+ . into ( ) ;
1408+
1409+ let res: Vec < Option < bool > > = lt_eq_bool ( & a, & b) . unwrap ( ) . iter ( ) . collect ( ) ;
1410+
1411+ assert_eq ! (
1412+ res,
1413+ vec![ Some ( true ) , Some ( true ) , Some ( true ) , Some ( false ) , None , None ]
1414+ )
1415+ }
1416+
1417+ #[ test]
1418+ fn test_boolean_array_gt ( ) {
1419+ let a: BooleanArray =
1420+ vec ! [ Some ( true ) , Some ( false ) , Some ( false ) , Some ( true ) , Some ( true ) , None ]
1421+ . into ( ) ;
1422+ let b: BooleanArray =
1423+ vec ! [ Some ( true ) , Some ( true ) , Some ( false ) , Some ( false ) , None , Some ( false ) ]
1424+ . into ( ) ;
1425+
1426+ let res: Vec < Option < bool > > = gt_bool ( & a, & b) . unwrap ( ) . iter ( ) . collect ( ) ;
1427+
1428+ assert_eq ! (
1429+ res,
1430+ vec![ Some ( false ) , Some ( false ) , Some ( false ) , Some ( true ) , None , None ]
1431+ )
1432+ }
1433+
1434+ #[ test]
1435+ fn test_boolean_array_gt_eq ( ) {
1436+ let a: BooleanArray =
1437+ vec ! [ Some ( true ) , Some ( false ) , Some ( false ) , Some ( true ) , Some ( true ) , None ]
1438+ . into ( ) ;
1439+ let b: BooleanArray =
1440+ vec ! [ Some ( true ) , Some ( true ) , Some ( false ) , Some ( false ) , None , Some ( false ) ]
1441+ . into ( ) ;
1442+
1443+ let res: Vec < Option < bool > > = gt_eq_bool ( & a, & b) . unwrap ( ) . iter ( ) . collect ( ) ;
1444+
1445+ assert_eq ! (
1446+ res,
1447+ vec![ Some ( true ) , Some ( false ) , Some ( true ) , Some ( true ) , None , None ]
1448+ )
1449+ }
1450+
13681451 #[ test]
13691452 fn test_boolean_array_eq_scalar ( ) {
13701453 let a: BooleanArray = vec ! [ Some ( true ) , Some ( false ) , None ] . into ( ) ;
0 commit comments