Skip to content

Commit 27d7888

Browse files
committed
Use Dynamic Dispatch kernels in Arrow eq_dyn
1 parent ecfc7d8 commit 27d7888

File tree

1 file changed

+22
-12
lines changed
  • datafusion/src/physical_plan/expressions

1 file changed

+22
-12
lines changed

datafusion/src/physical_plan/expressions/binary.rs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,23 +23,22 @@ use arrow::compute::kernels::arithmetic::{
2323
add, divide, divide_scalar, modulus, modulus_scalar, multiply, subtract,
2424
};
2525
use arrow::compute::kernels::boolean::{and_kleene, not, or_kleene};
26-
use arrow::compute::kernels::comparison::{eq, gt, gt_eq, lt, lt_eq, neq};
2726
use arrow::compute::kernels::comparison::{
28-
eq_bool, eq_bool_scalar, gt_bool, gt_bool_scalar, gt_eq_bool, gt_eq_bool_scalar,
29-
lt_bool, lt_bool_scalar, lt_eq_bool, lt_eq_bool_scalar, neq_bool, neq_bool_scalar,
27+
eq_bool_scalar, gt_bool_scalar, gt_eq_bool_scalar, lt_bool_scalar, lt_eq_bool_scalar,
28+
neq_bool_scalar,
3029
};
3130
use arrow::compute::kernels::comparison::{
32-
eq_scalar, gt_eq_scalar, gt_scalar, lt_eq_scalar, lt_scalar, neq_scalar,
31+
eq_dyn, gt_dyn, gt_eq_dyn, lt_dyn, lt_eq_dyn, neq_dyn,
3332
};
3433
use arrow::compute::kernels::comparison::{
35-
eq_utf8, gt_eq_utf8, gt_utf8, like_utf8, lt_eq_utf8, lt_utf8, neq_utf8, nlike_utf8,
36-
regexp_is_match_utf8,
34+
eq_scalar, gt_eq_scalar, gt_scalar, lt_eq_scalar, lt_scalar, neq_scalar,
3735
};
3836
use arrow::compute::kernels::comparison::{
3937
eq_utf8_scalar, gt_eq_utf8_scalar, gt_utf8_scalar, like_utf8_scalar,
4038
lt_eq_utf8_scalar, lt_utf8_scalar, neq_utf8_scalar, nlike_utf8_scalar,
4139
regexp_is_match_utf8_scalar,
4240
};
41+
use arrow::compute::kernels::comparison::{like_utf8, nlike_utf8, regexp_is_match_utf8};
4342
use arrow::datatypes::{ArrowNumericType, DataType, Schema, TimeUnit};
4443
use arrow::record_batch::RecordBatch;
4544

@@ -357,6 +356,17 @@ macro_rules! binary_array_op_scalar {
357356
}};
358357
}
359358

359+
/// Calls a dynamic comparison operation from Arrow and converts the
360+
/// error and return type appropriately
361+
fn call_dyn_cmp<F>(left: Arc<dyn Array>, right: Arc<dyn Array>, f: F) -> Result<ArrayRef>
362+
where
363+
F: Fn(&dyn Array, &dyn Array) -> arrow::error::Result<BooleanArray>,
364+
{
365+
f(left.as_ref(), right.as_ref())
366+
.map(|a| Arc::new(a) as ArrayRef)
367+
.map_err(|e| e.into())
368+
}
369+
360370
/// The binary_array_op macro includes types that extend beyond the primitive,
361371
/// such as Utf8 strings.
362372
#[macro_export]
@@ -755,12 +765,12 @@ impl BinaryExpr {
755765
match &self.op {
756766
Operator::Like => binary_string_array_op!(left, right, like),
757767
Operator::NotLike => binary_string_array_op!(left, right, nlike),
758-
Operator::Lt => binary_array_op!(left, right, lt),
759-
Operator::LtEq => binary_array_op!(left, right, lt_eq),
760-
Operator::Gt => binary_array_op!(left, right, gt),
761-
Operator::GtEq => binary_array_op!(left, right, gt_eq),
762-
Operator::Eq => binary_array_op!(left, right, eq),
763-
Operator::NotEq => binary_array_op!(left, right, neq),
768+
Operator::Lt => call_dyn_cmp(left, right, lt_dyn),
769+
Operator::LtEq => call_dyn_cmp(left, right, lt_eq_dyn),
770+
Operator::Gt => call_dyn_cmp(left, right, gt_dyn),
771+
Operator::GtEq => call_dyn_cmp(left, right, gt_eq_dyn),
772+
Operator::Eq => call_dyn_cmp(left, right, eq_dyn),
773+
Operator::NotEq => call_dyn_cmp(left, right, neq_dyn),
764774
Operator::IsDistinctFrom => binary_array_op!(left, right, is_distinct_from),
765775
Operator::IsNotDistinctFrom => {
766776
binary_array_op!(left, right, is_not_distinct_from)

0 commit comments

Comments
 (0)