You are viewing a plain text version of this content. The canonical link for it is here.
Posted to github@arrow.apache.org by "viirya (via GitHub)" <gi...@apache.org> on 2023/04/23 18:15:11 UTC

[GitHub] [arrow-datafusion] viirya commented on a diff in pull request #6098: Use arrow kernels for bitwise operations

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: github-unsubscribe@arrow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org