diff --git a/arrow/benches/filter_kernels.rs b/arrow/benches/filter_kernels.rs index bd612994663..9dd3e7ebba0 100644 --- a/arrow/benches/filter_kernels.rs +++ b/arrow/benches/filter_kernels.rs @@ -26,6 +26,7 @@ use arrow::array::*; use arrow::compute::filter; use arrow::datatypes::{Field, Float32Type, Int32Type, Schema, UInt8Type}; +use arrow_array::types::Decimal128Type; use criterion::{criterion_group, criterion_main, Criterion}; fn bench_filter(data_array: &dyn Array, filter_array: &BooleanArray) { @@ -143,6 +144,29 @@ fn add_benchmark(c: &mut Criterion) { b.iter(|| bench_built_filter(&sparse_filter, &data_array)) }); + let data_array = create_primitive_array::(size, 0.0); + c.bench_function("filter decimal128 (kept 1/2)", |b| { + b.iter(|| bench_filter(&data_array, &filter_array)) + }); + c.bench_function("filter decimal128 high selectivity (kept 1023/1024)", |b| { + b.iter(|| bench_filter(&data_array, &dense_filter_array)) + }); + c.bench_function("filter decimal128 low selectivity (kept 1/1024)", |b| { + b.iter(|| bench_filter(&data_array, &sparse_filter_array)) + }); + + c.bench_function("filter context decimal128 (kept 1/2)", |b| { + b.iter(|| bench_built_filter(&filter, &data_array)) + }); + c.bench_function( + "filter context decimal128 high selectivity (kept 1023/1024)", + |b| b.iter(|| bench_built_filter(&dense_filter, &data_array)), + ); + c.bench_function( + "filter context decimal128 low selectivity (kept 1/1024)", + |b| b.iter(|| bench_built_filter(&sparse_filter, &data_array)), + ); + let data_array = create_string_array::(size, 0.5); c.bench_function("filter context string (kept 1/2)", |b| { b.iter(|| bench_built_filter(&filter, &data_array)) diff --git a/arrow/src/compute/kernels/filter.rs b/arrow/src/compute/kernels/filter.rs index d1e2ad17593..150253b1c0d 100644 --- a/arrow/src/compute/kernels/filter.rs +++ b/arrow/src/compute/kernels/filter.rs @@ -338,6 +338,16 @@ fn filter_array(values: &dyn Array, predicate: &FilterPredicate) -> Result downcast_primitive_array! { values => Ok(Arc::new(filter_primitive(values, predicate))), + DataType::Decimal128(p, s) => { + let values = values.as_any().downcast_ref::().unwrap(); + let filtered = filter_primitive(values, predicate); + Ok(Arc::new(filtered.with_precision_and_scale(*p, *s).unwrap())) + } + DataType::Decimal256(p, s) => { + let values = values.as_any().downcast_ref::().unwrap(); + let filtered = filter_primitive(values, predicate); + Ok(Arc::new(filtered.with_precision_and_scale(*p, *s).unwrap())) + } DataType::Boolean => { let values = values.as_any().downcast_ref::().unwrap(); Ok(Arc::new(filter_boolean(values, predicate)))