viirya commented on code in PR #6098:
URL: https://github.com/apache/arrow-datafusion/pull/6098#discussion_r1174622526


##########
datafusion/physical-expr/src/expressions/binary/kernels.rs:
##########
@@ -238,333 +268,52 @@ pub(crate) fn bitwise_shift_left(left: ArrayRef, right: 
ArrayRef) -> Result<Arra
     }
 }
 
-pub(crate) fn bitwise_or(left: ArrayRef, right: ArrayRef) -> Result<ArrayRef> {
-    match &left.data_type() {
-        DataType::Int8 => {
-            binary_bitwise_array_op!(left, right, |a: i8, b: i8| a | b, 
Int8Array)
-        }
-        DataType::Int16 => {
-            binary_bitwise_array_op!(left, right, |a: i16, b: i16| a | b, 
Int16Array)
-        }
-        DataType::Int32 => {
-            binary_bitwise_array_op!(left, right, |a: i32, b: i32| a | b, 
Int32Array)
-        }
-        DataType::Int64 => {
-            binary_bitwise_array_op!(left, right, |a: i64, b: i64| a | b, 
Int64Array)
-        }
-        DataType::UInt8 => {
-            binary_bitwise_array_op!(left, right, |a: u8, b: u8| a | b, 
UInt8Array)
-        }
-        DataType::UInt16 => {
-            binary_bitwise_array_op!(left, right, |a: u16, b: u16| a | b, 
UInt16Array)
-        }
-        DataType::UInt32 => {
-            binary_bitwise_array_op!(left, right, |a: u32, b: u32| a | b, 
UInt32Array)
-        }
-        DataType::UInt64 => {
-            binary_bitwise_array_op!(left, right, |a: u64, b: u64| a | b, 
UInt64Array)
-        }
-        other => Err(DataFusionError::Internal(format!(
-            "Data type {:?} not supported for binary operation '{}' on dyn 
arrays",
-            other,
-            Operator::BitwiseOr
-        ))),
-    }
-}
-
-pub(crate) fn bitwise_xor(left: ArrayRef, right: ArrayRef) -> Result<ArrayRef> 
{
-    match &left.data_type() {
-        DataType::Int8 => {
-            binary_bitwise_array_op!(left, right, |a: i8, b: i8| a ^ b, 
Int8Array)
-        }
-        DataType::Int16 => {
-            binary_bitwise_array_op!(left, right, |a: i16, b: i16| a ^ b, 
Int16Array)
-        }
-        DataType::Int32 => {
-            binary_bitwise_array_op!(left, right, |a: i32, b: i32| a ^ b, 
Int32Array)
-        }
-        DataType::Int64 => {
-            binary_bitwise_array_op!(left, right, |a: i64, b: i64| a ^ b, 
Int64Array)
-        }
-        DataType::UInt8 => {
-            binary_bitwise_array_op!(left, right, |a: u8, b: u8| a ^ b, 
UInt8Array)
-        }
-        DataType::UInt16 => {
-            binary_bitwise_array_op!(left, right, |a: u16, b: u16| a ^ b, 
UInt16Array)
-        }
-        DataType::UInt32 => {
-            binary_bitwise_array_op!(left, right, |a: u32, b: u32| a ^ b, 
UInt32Array)
-        }
-        DataType::UInt64 => {
-            binary_bitwise_array_op!(left, right, |a: u64, b: u64| a ^ b, 
UInt64Array)
-        }
-        other => Err(DataFusionError::Internal(format!(
-            "Data type {:?} not supported for binary operation '{}' on dyn 
arrays",
-            other,
-            Operator::BitwiseXor
-        ))),
-    }
-}
-
-pub(crate) fn bitwise_and_scalar(
-    array: &dyn Array,
-    scalar: ScalarValue,
-) -> Option<Result<ArrayRef>> {
-    let result = match array.data_type() {
-        DataType::Int8 => {
-            binary_bitwise_array_scalar!(
-                array,
-                scalar,
-                |a: i8| move |b: i8| a & b,
-                Int8Array,
-                i8
-            )
-        }
-        DataType::Int16 => {
-            binary_bitwise_array_scalar!(
-                array,
-                scalar,
-                |a: i16| move |b: i16| a & b,
-                Int16Array,
-                i16
-            )
-        }
-        DataType::Int32 => {
-            binary_bitwise_array_scalar!(
-                array,
-                scalar,
-                |a: i32| move |b: i32| a & b,
-                Int32Array,
-                i32
-            )
-        }
-        DataType::Int64 => {
-            binary_bitwise_array_scalar!(
-                array,
-                scalar,
-                |a: i64| move |b: i64| a & b,
-                Int64Array,
-                i64
-            )
-        }
-        DataType::UInt8 => {
-            binary_bitwise_array_scalar!(
-                array,
-                scalar,
-                |a: u8| move |b: u8| a & b,
-                UInt8Array,
-                u8
-            )
-        }
-        DataType::UInt16 => {
-            binary_bitwise_array_scalar!(
-                array,
-                scalar,
-                |a: u16| move |b: u16| a & b,
-                UInt16Array,
-                u16
-            )
-        }
-        DataType::UInt32 => {
-            binary_bitwise_array_scalar!(
-                array,
-                scalar,
-                |a: u32| move |b: u32| a & b,
-                UInt32Array,
-                u32
-            )
-        }
-        DataType::UInt64 => {
-            binary_bitwise_array_scalar!(
-                array,
-                scalar,
-                |a: u64| move |b: u64| a & b,
-                UInt64Array,
-                u64
-            )
+/// Downcasts $LEFT as $ARRAY_TYPE and $RIGHT as TYPE and calls $KERNEL($LEFT, 
RIGHT)
+macro_rules! call_bitwise_scalar_kernel {
+    ($LEFT:expr, $RIGHT:expr, $KERNEL:ident, $ARRAY_TYPE:ident, $TYPE:ty) => {{
+        let len = $LEFT.len();
+        let array = $LEFT.as_any().downcast_ref::<$ARRAY_TYPE>().unwrap();
+        let scalar = $RIGHT;
+        if scalar.is_null() {
+            Ok(new_null_array(array.data_type(), len))
+        } else {
+            let scalar: $TYPE = scalar.try_into().unwrap();
+            let result: $ARRAY_TYPE = $KERNEL(array, scalar).unwrap();
+            Ok(Arc::new(result) as ArrayRef)
         }
-        other => Err(DataFusionError::Internal(format!(
-            "Data type {:?} not supported for binary operation '{}' on dyn 
arrays",
-            other,
-            Operator::BitwiseAnd
-        ))),
-    };
-    Some(result)
+    }};
 }
 
-pub(crate) fn bitwise_or_scalar(
-    array: &dyn Array,
-    scalar: ScalarValue,
-) -> Option<Result<ArrayRef>> {
-    let result = match array.data_type() {
-        DataType::Int8 => {
-            binary_bitwise_array_scalar!(
-                array,
-                scalar,
-                |a: i8| move |b: i8| a | b,
-                Int8Array,
-                i8
-            )
-        }
-        DataType::Int16 => {
-            binary_bitwise_array_scalar!(
-                array,
-                scalar,
-                |a: i16| move |b: i16| a | b,
-                Int16Array,
-                i16
-            )
-        }
-        DataType::Int32 => {
-            binary_bitwise_array_scalar!(
-                array,
-                scalar,
-                |a: i32| move |b: i32| a | b,
-                Int32Array,
-                i32
-            )
-        }
-        DataType::Int64 => {
-            binary_bitwise_array_scalar!(
-                array,
-                scalar,
-                |a: i64| move |b: i64| a | b,
-                Int64Array,
-                i64
-            )
-        }
-        DataType::UInt8 => {
-            binary_bitwise_array_scalar!(
-                array,
-                scalar,
-                |a: u8| move |b: u8| a | b,
-                UInt8Array,
-                u8
-            )
-        }
-        DataType::UInt16 => {
-            binary_bitwise_array_scalar!(
-                array,
-                scalar,
-                |a: u16| move |b: u16| a | b,
-                UInt16Array,
-                u16
-            )
+/// Creates a $FUNC(left: ArrayRef, right: ArrayRef) that

Review Comment:
   ```suggestion
   /// Creates a $FUNC(left: ArrayRef, right: ScalarValue) that
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to