@@ -810,6 +810,102 @@ pub fn neq_bool_scalar(left: &BooleanArray, right: bool) -> Result<BooleanArray>
810810 eq_bool_scalar ( left, !right)
811811}
812812
813+ /// Perform `left == right` operation on [`BinaryArray`] / [`LargeBinaryArray`].
814+ pub fn eq_binary < OffsetSize : BinaryOffsetSizeTrait > (
815+ left : & GenericBinaryArray < OffsetSize > ,
816+ right : & GenericBinaryArray < OffsetSize > ,
817+ ) -> Result < BooleanArray > {
818+ compare_op ! ( left, right, |a, b| a == b)
819+ }
820+
821+ /// Perform `left == right` operation on [`BinaryArray`] / [`LargeBinaryArray`] and a scalar
822+ pub fn eq_binary_scalar < OffsetSize : BinaryOffsetSizeTrait > (
823+ left : & GenericBinaryArray < OffsetSize > ,
824+ right : & [ u8 ] ,
825+ ) -> Result < BooleanArray > {
826+ compare_op_scalar ! ( left, right, |a, b| a == b)
827+ }
828+
829+ /// Perform `left != right` operation on [`BinaryArray`] / [`LargeBinaryArray`].
830+ pub fn neq_binary < OffsetSize : BinaryOffsetSizeTrait > (
831+ left : & GenericBinaryArray < OffsetSize > ,
832+ right : & GenericBinaryArray < OffsetSize > ,
833+ ) -> Result < BooleanArray > {
834+ compare_op ! ( left, right, |a, b| a != b)
835+ }
836+
837+ /// Perform `left != right` operation on [`BinaryArray`] / [`LargeBinaryArray`] and a scalar.
838+ pub fn neq_binary_scalar < OffsetSize : BinaryOffsetSizeTrait > (
839+ left : & GenericBinaryArray < OffsetSize > ,
840+ right : & [ u8 ] ,
841+ ) -> Result < BooleanArray > {
842+ compare_op_scalar ! ( left, right, |a, b| a != b)
843+ }
844+
845+ /// Perform `left < right` operation on [`BinaryArray`] / [`LargeBinaryArray`].
846+ pub fn lt_binary < OffsetSize : BinaryOffsetSizeTrait > (
847+ left : & GenericBinaryArray < OffsetSize > ,
848+ right : & GenericBinaryArray < OffsetSize > ,
849+ ) -> Result < BooleanArray > {
850+ compare_op ! ( left, right, |a, b| a < b)
851+ }
852+
853+ /// Perform `left < right` operation on [`BinaryArray`] / [`LargeBinaryArray`] and a scalar.
854+ pub fn lt_binary_scalar < OffsetSize : BinaryOffsetSizeTrait > (
855+ left : & GenericBinaryArray < OffsetSize > ,
856+ right : & [ u8 ] ,
857+ ) -> Result < BooleanArray > {
858+ compare_op_scalar ! ( left, right, |a, b| a < b)
859+ }
860+
861+ /// Perform `left <= right` operation on [`BinaryArray`] / [`LargeBinaryArray`].
862+ pub fn lt_eq_binary < OffsetSize : BinaryOffsetSizeTrait > (
863+ left : & GenericBinaryArray < OffsetSize > ,
864+ right : & GenericBinaryArray < OffsetSize > ,
865+ ) -> Result < BooleanArray > {
866+ compare_op ! ( left, right, |a, b| a <= b)
867+ }
868+
869+ /// Perform `left <= right` operation on [`BinaryArray`] / [`LargeBinaryArray`] and a scalar.
870+ pub fn lt_eq_binary_scalar < OffsetSize : BinaryOffsetSizeTrait > (
871+ left : & GenericBinaryArray < OffsetSize > ,
872+ right : & [ u8 ] ,
873+ ) -> Result < BooleanArray > {
874+ compare_op_scalar ! ( left, right, |a, b| a <= b)
875+ }
876+
877+ /// Perform `left > right` operation on [`BinaryArray`] / [`LargeBinaryArray`].
878+ pub fn gt_binary < OffsetSize : BinaryOffsetSizeTrait > (
879+ left : & GenericBinaryArray < OffsetSize > ,
880+ right : & GenericBinaryArray < OffsetSize > ,
881+ ) -> Result < BooleanArray > {
882+ compare_op ! ( left, right, |a, b| a > b)
883+ }
884+
885+ /// Perform `left > right` operation on [`BinaryArray`] / [`LargeBinaryArray`] and a scalar.
886+ pub fn gt_binary_scalar < OffsetSize : BinaryOffsetSizeTrait > (
887+ left : & GenericBinaryArray < OffsetSize > ,
888+ right : & [ u8 ] ,
889+ ) -> Result < BooleanArray > {
890+ compare_op_scalar ! ( left, right, |a, b| a > b)
891+ }
892+
893+ /// Perform `left >= right` operation on [`BinaryArray`] / [`LargeBinaryArray`].
894+ pub fn gt_eq_binary < OffsetSize : BinaryOffsetSizeTrait > (
895+ left : & GenericBinaryArray < OffsetSize > ,
896+ right : & GenericBinaryArray < OffsetSize > ,
897+ ) -> Result < BooleanArray > {
898+ compare_op ! ( left, right, |a, b| a >= b)
899+ }
900+
901+ /// Perform `left >= right` operation on [`BinaryArray`] / [`LargeBinaryArray`] and a scalar.
902+ pub fn gt_eq_binary_scalar < OffsetSize : BinaryOffsetSizeTrait > (
903+ left : & GenericBinaryArray < OffsetSize > ,
904+ right : & [ u8 ] ,
905+ ) -> Result < BooleanArray > {
906+ compare_op_scalar ! ( left, right, |a, b| a >= b)
907+ }
908+
813909/// Perform `left != right` operation on [`StringArray`] / [`LargeStringArray`].
814910pub fn neq_utf8 < OffsetSize : StringOffsetSizeTrait > (
815911 left : & GenericStringArray < OffsetSize > ,
@@ -2794,6 +2890,177 @@ mod tests {
27942890 ) ;
27952891 }
27962892
2893+ macro_rules! test_binary {
2894+ ( $test_name: ident, $left: expr, $right: expr, $op: expr, $expected: expr) => {
2895+ #[ test]
2896+ fn $test_name( ) {
2897+ let left = BinaryArray :: from_vec( $left) ;
2898+ let right = BinaryArray :: from_vec( $right) ;
2899+ let res = $op( & left, & right) . unwrap( ) ;
2900+ let expected = $expected;
2901+ assert_eq!( expected. len( ) , res. len( ) ) ;
2902+ for i in 0 ..res. len( ) {
2903+ let v = res. value( i) ;
2904+ assert_eq!( v, expected[ i] ) ;
2905+ }
2906+
2907+ let left = LargeBinaryArray :: from_vec( $left) ;
2908+ let right = LargeBinaryArray :: from_vec( $right) ;
2909+ let res = $op( & left, & right) . unwrap( ) ;
2910+ let expected = $expected;
2911+ assert_eq!( expected. len( ) , res. len( ) ) ;
2912+ for i in 0 ..res. len( ) {
2913+ let v = res. value( i) ;
2914+ assert_eq!( v, expected[ i] ) ;
2915+ }
2916+ }
2917+ } ;
2918+ }
2919+
2920+ #[ test]
2921+ fn test_binary_eq_scalar_on_slice ( ) {
2922+ let a = BinaryArray :: from_opt_vec (
2923+ vec ! [ Some ( b"hi" ) , None , Some ( b"hello" ) , Some ( b"world" ) ] ,
2924+ ) ;
2925+ let a = a. slice ( 1 , 3 ) ;
2926+ let a = as_generic_binary_array :: < i32 > ( & a) ;
2927+ let a_eq = eq_binary_scalar ( a, b"hello" ) . unwrap ( ) ;
2928+ assert_eq ! (
2929+ a_eq,
2930+ BooleanArray :: from( vec![ None , Some ( true ) , Some ( false ) ] )
2931+ ) ;
2932+ }
2933+
2934+ macro_rules! test_binary_scalar {
2935+ ( $test_name: ident, $left: expr, $right: expr, $op: expr, $expected: expr) => {
2936+ #[ test]
2937+ fn $test_name( ) {
2938+ let left = BinaryArray :: from_vec( $left) ;
2939+ let res = $op( & left, $right) . unwrap( ) ;
2940+ let expected = $expected;
2941+ assert_eq!( expected. len( ) , res. len( ) ) ;
2942+ for i in 0 ..res. len( ) {
2943+ let v = res. value( i) ;
2944+ assert_eq!(
2945+ v,
2946+ expected[ i] ,
2947+ "unexpected result when comparing {:?} at position {} to {:?} " ,
2948+ left. value( i) ,
2949+ i,
2950+ $right
2951+ ) ;
2952+ }
2953+
2954+ let left = LargeBinaryArray :: from_vec( $left) ;
2955+ let res = $op( & left, $right) . unwrap( ) ;
2956+ let expected = $expected;
2957+ assert_eq!( expected. len( ) , res. len( ) ) ;
2958+ for i in 0 ..res. len( ) {
2959+ let v = res. value( i) ;
2960+ assert_eq!(
2961+ v,
2962+ expected[ i] ,
2963+ "unexpected result when comparing {:?} at position {} to {:?} " ,
2964+ left. value( i) ,
2965+ i,
2966+ $right
2967+ ) ;
2968+ }
2969+ }
2970+ } ;
2971+ }
2972+
2973+ test_binary ! (
2974+ test_binary_array_eq,
2975+ vec![ b"arrow" , b"arrow" , b"arrow" , b"arrow" ] ,
2976+ vec![ b"arrow" , b"parquet" , b"datafusion" , b"flight" ] ,
2977+ eq_binary,
2978+ vec![ true , false , false , false ]
2979+ ) ;
2980+
2981+ test_binary_scalar ! (
2982+ test_binary_array_eq_scalar,
2983+ vec![ b"arrow" , b"parquet" , b"datafusion" , b"flight" ] ,
2984+ "arrow" . as_bytes( ) ,
2985+ eq_binary_scalar,
2986+ vec![ true , false , false , false ]
2987+ ) ;
2988+
2989+ test_binary ! (
2990+ test_binary_array_neq,
2991+ vec![ b"arrow" , b"arrow" , b"arrow" , b"arrow" ] ,
2992+ vec![ b"arrow" , b"parquet" , b"datafusion" , b"flight" ] ,
2993+ neq_binary,
2994+ vec![ false , true , true , true ]
2995+ ) ;
2996+ test_binary_scalar ! (
2997+ test_binary_array_neq_scalar,
2998+ vec![ b"arrow" , b"parquet" , b"datafusion" , b"flight" ] ,
2999+ "arrow" . as_bytes( ) ,
3000+ neq_binary_scalar,
3001+ vec![ false , true , true , true ]
3002+ ) ;
3003+
3004+ test_binary ! (
3005+ test_binary_array_lt,
3006+ vec![ b"arrow" , b"datafusion" , b"flight" , b"parquet" ] ,
3007+ vec![ b"flight" , b"flight" , b"flight" , b"flight" ] ,
3008+ lt_binary,
3009+ vec![ true , true , false , false ]
3010+ ) ;
3011+ test_binary_scalar ! (
3012+ test_binary_array_lt_scalar,
3013+ vec![ b"arrow" , b"datafusion" , b"flight" , b"parquet" ] ,
3014+ "flight" . as_bytes( ) ,
3015+ lt_binary_scalar,
3016+ vec![ true , true , false , false ]
3017+ ) ;
3018+
3019+ test_binary ! (
3020+ test_binary_array_lt_eq,
3021+ vec![ b"arrow" , b"datafusion" , b"flight" , b"parquet" ] ,
3022+ vec![ b"flight" , b"flight" , b"flight" , b"flight" ] ,
3023+ lt_eq_binary,
3024+ vec![ true , true , true , false ]
3025+ ) ;
3026+ test_binary_scalar ! (
3027+ test_binary_array_lt_eq_scalar,
3028+ vec![ b"arrow" , b"datafusion" , b"flight" , b"parquet" ] ,
3029+ "flight" . as_bytes( ) ,
3030+ lt_eq_binary_scalar,
3031+ vec![ true , true , true , false ]
3032+ ) ;
3033+
3034+ test_binary ! (
3035+ test_binary_array_gt,
3036+ vec![ b"arrow" , b"datafusion" , b"flight" , b"parquet" ] ,
3037+ vec![ b"flight" , b"flight" , b"flight" , b"flight" ] ,
3038+ gt_binary,
3039+ vec![ false , false , false , true ]
3040+ ) ;
3041+ test_binary_scalar ! (
3042+ test_binary_array_gt_scalar,
3043+ vec![ b"arrow" , b"datafusion" , b"flight" , b"parquet" ] ,
3044+ "flight" . as_bytes( ) ,
3045+ gt_binary_scalar,
3046+ vec![ false , false , false , true ]
3047+ ) ;
3048+
3049+ test_binary ! (
3050+ test_binary_array_gt_eq,
3051+ vec![ b"arrow" , b"datafusion" , b"flight" , b"parquet" ] ,
3052+ vec![ b"flight" , b"flight" , b"flight" , b"flight" ] ,
3053+ gt_eq_binary,
3054+ vec![ false , false , true , true ]
3055+ ) ;
3056+ test_binary_scalar ! (
3057+ test_binary_array_gt_eq_scalar,
3058+ vec![ b"arrow" , b"datafusion" , b"flight" , b"parquet" ] ,
3059+ "flight" . as_bytes( ) ,
3060+ gt_eq_binary_scalar,
3061+ vec![ false , false , true , true ]
3062+ ) ;
3063+
27973064 // Expected behaviour:
27983065 // contains("ab", ["ab", "cd", null]) = true
27993066 // contains("ef", ["ab", "cd", null]) = false
0 commit comments