Skip to content

Commit fe20eee

Browse files
alambviirya
andauthored
Use arrow kernels for bitwise operations (#6098)
* Use arrow kernels for bitwise operations * Apply suggestions from code review Co-authored-by: Liang-Chi Hsieh <[email protected]> * Add link to upstream arrow ticket --------- Co-authored-by: Liang-Chi Hsieh <[email protected]>
1 parent 0576236 commit fe20eee

File tree

2 files changed

+143
-388
lines changed

2 files changed

+143
-388
lines changed

datafusion/physical-expr/src/expressions/binary.rs

Lines changed: 37 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,9 @@ use datafusion_common::scalar::{
6363
};
6464
use datafusion_expr::type_coercion::{is_decimal, is_timestamp, is_utf8_or_large_utf8};
6565
use kernels::{
66-
bitwise_and, bitwise_and_scalar, bitwise_or, bitwise_or_scalar, bitwise_shift_left,
67-
bitwise_shift_left_scalar, bitwise_shift_right, bitwise_shift_right_scalar,
68-
bitwise_xor, bitwise_xor_scalar,
66+
bitwise_and_dyn, bitwise_and_dyn_scalar, bitwise_or_dyn, bitwise_or_dyn_scalar,
67+
bitwise_shift_left_dyn, bitwise_shift_left_dyn_scalar, bitwise_shift_right_dyn,
68+
bitwise_shift_right_dyn_scalar, bitwise_xor_dyn, bitwise_xor_dyn_scalar,
6969
};
7070
use kernels_arrow::{
7171
add_decimal_dyn_scalar, add_dyn_decimal, add_dyn_temporal, add_dyn_temporal_scalar,
@@ -1135,11 +1135,11 @@ impl BinaryExpr {
11351135
true,
11361136
true
11371137
),
1138-
Operator::BitwiseAnd => bitwise_and_scalar(array, scalar),
1139-
Operator::BitwiseOr => bitwise_or_scalar(array, scalar),
1140-
Operator::BitwiseXor => bitwise_xor_scalar(array, scalar),
1141-
Operator::BitwiseShiftRight => bitwise_shift_right_scalar(array, scalar),
1142-
Operator::BitwiseShiftLeft => bitwise_shift_left_scalar(array, scalar),
1138+
Operator::BitwiseAnd => bitwise_and_dyn_scalar(array, scalar),
1139+
Operator::BitwiseOr => bitwise_or_dyn_scalar(array, scalar),
1140+
Operator::BitwiseXor => bitwise_xor_dyn_scalar(array, scalar),
1141+
Operator::BitwiseShiftRight => bitwise_shift_right_dyn_scalar(array, scalar),
1142+
Operator::BitwiseShiftLeft => bitwise_shift_left_dyn_scalar(array, scalar),
11431143
// if scalar operation is not supported - fallback to array implementation
11441144
_ => None,
11451145
};
@@ -1257,11 +1257,11 @@ impl BinaryExpr {
12571257
Operator::RegexNotIMatch => {
12581258
binary_string_array_flag_op!(left, right, regexp_is_match, true, true)
12591259
}
1260-
Operator::BitwiseAnd => bitwise_and(left, right),
1261-
Operator::BitwiseOr => bitwise_or(left, right),
1262-
Operator::BitwiseXor => bitwise_xor(left, right),
1263-
Operator::BitwiseShiftRight => bitwise_shift_right(left, right),
1264-
Operator::BitwiseShiftLeft => bitwise_shift_left(left, right),
1260+
Operator::BitwiseAnd => bitwise_and_dyn(left, right),
1261+
Operator::BitwiseOr => bitwise_or_dyn(left, right),
1262+
Operator::BitwiseXor => bitwise_xor_dyn(left, right),
1263+
Operator::BitwiseShiftRight => bitwise_shift_right_dyn(left, right),
1264+
Operator::BitwiseShiftLeft => bitwise_shift_left_dyn(left, right),
12651265
Operator::StringConcat => {
12661266
binary_string_array_op!(left, right, concat_elements)
12671267
}
@@ -5147,31 +5147,31 @@ mod tests {
51475147
let left = Arc::new(Int32Array::from(vec![Some(12), None, Some(11)])) as ArrayRef;
51485148
let right =
51495149
Arc::new(Int32Array::from(vec![Some(1), Some(3), Some(7)])) as ArrayRef;
5150-
let mut result = bitwise_and(left.clone(), right.clone())?;
5150+
let mut result = bitwise_and_dyn(left.clone(), right.clone())?;
51515151
let expected = Int32Array::from(vec![Some(0), None, Some(3)]);
51525152
assert_eq!(result.as_ref(), &expected);
51535153

5154-
result = bitwise_or(left.clone(), right.clone())?;
5154+
result = bitwise_or_dyn(left.clone(), right.clone())?;
51555155
let expected = Int32Array::from(vec![Some(13), None, Some(15)]);
51565156
assert_eq!(result.as_ref(), &expected);
51575157

5158-
result = bitwise_xor(left.clone(), right.clone())?;
5158+
result = bitwise_xor_dyn(left.clone(), right.clone())?;
51595159
let expected = Int32Array::from(vec![Some(13), None, Some(12)]);
51605160
assert_eq!(result.as_ref(), &expected);
51615161

51625162
let left =
51635163
Arc::new(UInt32Array::from(vec![Some(12), None, Some(11)])) as ArrayRef;
51645164
let right =
51655165
Arc::new(UInt32Array::from(vec![Some(1), Some(3), Some(7)])) as ArrayRef;
5166-
let mut result = bitwise_and(left.clone(), right.clone())?;
5166+
let mut result = bitwise_and_dyn(left.clone(), right.clone())?;
51675167
let expected = UInt32Array::from(vec![Some(0), None, Some(3)]);
51685168
assert_eq!(result.as_ref(), &expected);
51695169

5170-
result = bitwise_or(left.clone(), right.clone())?;
5170+
result = bitwise_or_dyn(left.clone(), right.clone())?;
51715171
let expected = UInt32Array::from(vec![Some(13), None, Some(15)]);
51725172
assert_eq!(result.as_ref(), &expected);
51735173

5174-
result = bitwise_xor(left.clone(), right.clone())?;
5174+
result = bitwise_xor_dyn(left.clone(), right.clone())?;
51755175
let expected = UInt32Array::from(vec![Some(13), None, Some(12)]);
51765176
assert_eq!(result.as_ref(), &expected);
51775177

@@ -5183,24 +5183,24 @@ mod tests {
51835183
let input = Arc::new(Int32Array::from(vec![Some(2), None, Some(10)])) as ArrayRef;
51845184
let modules =
51855185
Arc::new(Int32Array::from(vec![Some(2), Some(4), Some(8)])) as ArrayRef;
5186-
let mut result = bitwise_shift_left(input.clone(), modules.clone())?;
5186+
let mut result = bitwise_shift_left_dyn(input.clone(), modules.clone())?;
51875187

51885188
let expected = Int32Array::from(vec![Some(8), None, Some(2560)]);
51895189
assert_eq!(result.as_ref(), &expected);
51905190

5191-
result = bitwise_shift_right(result.clone(), modules.clone())?;
5191+
result = bitwise_shift_right_dyn(result.clone(), modules.clone())?;
51925192
assert_eq!(result.as_ref(), &input);
51935193

51945194
let input =
51955195
Arc::new(UInt32Array::from(vec![Some(2), None, Some(10)])) as ArrayRef;
51965196
let modules =
51975197
Arc::new(UInt32Array::from(vec![Some(2), Some(4), Some(8)])) as ArrayRef;
5198-
let mut result = bitwise_shift_left(input.clone(), modules.clone())?;
5198+
let mut result = bitwise_shift_left_dyn(input.clone(), modules.clone())?;
51995199

52005200
let expected = UInt32Array::from(vec![Some(8), None, Some(2560)]);
52015201
assert_eq!(result.as_ref(), &expected);
52025202

5203-
result = bitwise_shift_right(result.clone(), modules.clone())?;
5203+
result = bitwise_shift_right_dyn(result.clone(), modules.clone())?;
52045204
assert_eq!(result.as_ref(), &input);
52055205
Ok(())
52065206
}
@@ -5209,14 +5209,14 @@ mod tests {
52095209
fn bitwise_shift_array_overflow_test() -> Result<()> {
52105210
let input = Arc::new(Int32Array::from(vec![Some(2)])) as ArrayRef;
52115211
let modules = Arc::new(Int32Array::from(vec![Some(100)])) as ArrayRef;
5212-
let result = bitwise_shift_left(input.clone(), modules.clone())?;
5212+
let result = bitwise_shift_left_dyn(input.clone(), modules.clone())?;
52135213

52145214
let expected = Int32Array::from(vec![Some(32)]);
52155215
assert_eq!(result.as_ref(), &expected);
52165216

52175217
let input = Arc::new(UInt32Array::from(vec![Some(2)])) as ArrayRef;
52185218
let modules = Arc::new(UInt32Array::from(vec![Some(100)])) as ArrayRef;
5219-
let result = bitwise_shift_left(input.clone(), modules.clone())?;
5219+
let result = bitwise_shift_left_dyn(input.clone(), modules.clone())?;
52205220

52215221
let expected = UInt32Array::from(vec![Some(32)]);
52225222
assert_eq!(result.as_ref(), &expected);
@@ -5227,30 +5227,30 @@ mod tests {
52275227
fn bitwise_scalar_test() -> Result<()> {
52285228
let left = Arc::new(Int32Array::from(vec![Some(12), None, Some(11)])) as ArrayRef;
52295229
let right = ScalarValue::from(3i32);
5230-
let mut result = bitwise_and_scalar(&left, right.clone()).unwrap()?;
5230+
let mut result = bitwise_and_dyn_scalar(&left, right.clone()).unwrap()?;
52315231
let expected = Int32Array::from(vec![Some(0), None, Some(3)]);
52325232
assert_eq!(result.as_ref(), &expected);
52335233

5234-
result = bitwise_or_scalar(&left, right.clone()).unwrap()?;
5234+
result = bitwise_or_dyn_scalar(&left, right.clone()).unwrap()?;
52355235
let expected = Int32Array::from(vec![Some(15), None, Some(11)]);
52365236
assert_eq!(result.as_ref(), &expected);
52375237

5238-
result = bitwise_xor_scalar(&left, right).unwrap()?;
5238+
result = bitwise_xor_dyn_scalar(&left, right).unwrap()?;
52395239
let expected = Int32Array::from(vec![Some(15), None, Some(8)]);
52405240
assert_eq!(result.as_ref(), &expected);
52415241

52425242
let left =
52435243
Arc::new(UInt32Array::from(vec![Some(12), None, Some(11)])) as ArrayRef;
52445244
let right = ScalarValue::from(3u32);
5245-
let mut result = bitwise_and_scalar(&left, right.clone()).unwrap()?;
5245+
let mut result = bitwise_and_dyn_scalar(&left, right.clone()).unwrap()?;
52465246
let expected = UInt32Array::from(vec![Some(0), None, Some(3)]);
52475247
assert_eq!(result.as_ref(), &expected);
52485248

5249-
result = bitwise_or_scalar(&left, right.clone()).unwrap()?;
5249+
result = bitwise_or_dyn_scalar(&left, right.clone()).unwrap()?;
52505250
let expected = UInt32Array::from(vec![Some(15), None, Some(11)]);
52515251
assert_eq!(result.as_ref(), &expected);
52525252

5253-
result = bitwise_xor_scalar(&left, right).unwrap()?;
5253+
result = bitwise_xor_dyn_scalar(&left, right).unwrap()?;
52545254
let expected = UInt32Array::from(vec![Some(15), None, Some(8)]);
52555255
assert_eq!(result.as_ref(), &expected);
52565256
Ok(())
@@ -5260,22 +5260,24 @@ mod tests {
52605260
fn bitwise_shift_scalar_test() -> Result<()> {
52615261
let input = Arc::new(Int32Array::from(vec![Some(2), None, Some(4)])) as ArrayRef;
52625262
let module = ScalarValue::from(10i32);
5263-
let mut result = bitwise_shift_left_scalar(&input, module.clone()).unwrap()?;
5263+
let mut result =
5264+
bitwise_shift_left_dyn_scalar(&input, module.clone()).unwrap()?;
52645265

52655266
let expected = Int32Array::from(vec![Some(2048), None, Some(4096)]);
52665267
assert_eq!(result.as_ref(), &expected);
52675268

5268-
result = bitwise_shift_right_scalar(&result, module).unwrap()?;
5269+
result = bitwise_shift_right_dyn_scalar(&result, module).unwrap()?;
52695270
assert_eq!(result.as_ref(), &input);
52705271

52715272
let input = Arc::new(UInt32Array::from(vec![Some(2), None, Some(4)])) as ArrayRef;
52725273
let module = ScalarValue::from(10u32);
5273-
let mut result = bitwise_shift_left_scalar(&input, module.clone()).unwrap()?;
5274+
let mut result =
5275+
bitwise_shift_left_dyn_scalar(&input, module.clone()).unwrap()?;
52745276

52755277
let expected = UInt32Array::from(vec![Some(2048), None, Some(4096)]);
52765278
assert_eq!(result.as_ref(), &expected);
52775279

5278-
result = bitwise_shift_right_scalar(&result, module).unwrap()?;
5280+
result = bitwise_shift_right_dyn_scalar(&result, module).unwrap()?;
52795281
assert_eq!(result.as_ref(), &input);
52805282
Ok(())
52815283
}

0 commit comments

Comments
 (0)