Skip to content

Commit 59667db

Browse files
Optimize IN LIST for fixed-size binary arrays
1 parent fb78805 commit 59667db

3 files changed

Lines changed: 449 additions & 0 deletions

File tree

‎datafusion/physical-expr/src/expressions/in_list.rs‎

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ use datafusion_expr::{ColumnarValue, expr_vec_fmt};
3838

3939
mod array_static_filter;
4040
mod branchless_filter;
41+
mod fixed_size_binary_filter;
4142
mod primitive_filter;
4243
mod result;
4344
mod static_filter;
@@ -3548,6 +3549,39 @@ mod tests {
35483549
);
35493550
}
35503551

3552+
// FixedSizeBinary in_array, FixedSizeBinary and Dictionary needles
3553+
let fsb_in = Arc::new(FixedSizeBinaryArray::try_from_iter(
3554+
[
3555+
[1, 2, 3, 4].as_slice(),
3556+
[5, 6, 7, 8].as_slice(),
3557+
[9, 10, 11, 12].as_slice(),
3558+
]
3559+
.into_iter(),
3560+
)?) as ArrayRef;
3561+
let fsb_needle = Arc::new(FixedSizeBinaryArray::try_from_iter(
3562+
[
3563+
[1, 2, 3, 4].as_slice(),
3564+
[13, 14, 15, 16].as_slice(),
3565+
[5, 6, 7, 8].as_slice(),
3566+
]
3567+
.into_iter(),
3568+
)?) as ArrayRef;
3569+
assert_eq!(
3570+
expected,
3571+
eval_in_list_from_array(Arc::clone(&fsb_needle), Arc::clone(&fsb_in))?
3572+
);
3573+
assert_eq!(
3574+
expected,
3575+
eval_in_list_from_array(
3576+
wrap_in_dict(Arc::clone(&fsb_needle)),
3577+
Arc::clone(&fsb_in),
3578+
)?
3579+
);
3580+
assert_eq!(
3581+
expected,
3582+
eval_in_list_from_array(wrap_in_dict(fsb_needle), wrap_in_dict(fsb_in))?
3583+
);
3584+
35513585
// Utf8 (falls through to ArrayStaticFilter)
35523586
let utf8_in = Arc::new(StringArray::from(vec!["a", "b", "c"])) as ArrayRef;
35533587
let utf8_needle = Arc::new(StringArray::from(vec!["a", "d", "b"])) as ArrayRef;

0 commit comments

Comments
 (0)