Skip to content

Commit deb1de3

Browse files
committed
Implement filter kernel for byte view arrays.
1 parent 36a6e51 commit deb1de3

File tree

5 files changed

+52
-15
lines changed

5 files changed

+52
-15
lines changed

arrow-arith/src/arity.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ use arrow_array::builder::BufferBuilder;
2121
use arrow_array::types::ArrowDictionaryKeyType;
2222
use arrow_array::*;
2323
use arrow_buffer::buffer::NullBuffer;
24+
use arrow_buffer::ArrowNativeType;
2425
use arrow_buffer::{Buffer, MutableBuffer};
2526
use arrow_data::ArrayData;
2627
use arrow_schema::ArrowError;
@@ -386,7 +387,7 @@ where
386387
O: ArrowPrimitiveType,
387388
F: Fn(A::Item, B::Item) -> Result<O::Native, ArrowError>,
388389
{
389-
let mut buffer = MutableBuffer::new(len * O::get_byte_width());
390+
let mut buffer = MutableBuffer::new(len * O::Native::get_byte_width());
390391
for idx in 0..len {
391392
unsafe {
392393
buffer.push_unchecked(op(a.value_unchecked(idx), b.value_unchecked(idx))?);

arrow-array/src/types.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,6 @@ pub trait ArrowPrimitiveType: primitive::PrimitiveTypeSealed + 'static {
5858
/// the corresponding Arrow data type of this primitive type.
5959
const DATA_TYPE: DataType;
6060

61-
/// Returns the byte width of this primitive type.
62-
fn get_byte_width() -> usize {
63-
std::mem::size_of::<Self::Native>()
64-
}
65-
6661
/// Returns a default value of this primitive type.
6762
///
6863
/// This is useful for aggregate array ops like `sum()`, `mean()`.

arrow-buffer/src/native.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ mod private {
4747
pub trait ArrowNativeType:
4848
std::fmt::Debug + Send + Sync + Copy + PartialOrd + Default + private::Sealed + 'static
4949
{
50+
/// Returns the byte width of this native type.
51+
fn get_byte_width() -> usize {
52+
std::mem::size_of::<Self>()
53+
}
54+
5055
/// Convert native integer type from usize
5156
///
5257
/// Returns `None` if [`Self`] is not an integer or conversion would result

arrow-data/src/data.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1761,6 +1761,11 @@ impl ArrayDataBuilder {
17611761
self
17621762
}
17631763

1764+
pub fn add_buffers(mut self, bs: Vec<Buffer>) -> Self {
1765+
self.buffers.extend(bs);
1766+
self
1767+
}
1768+
17641769
pub fn child_data(mut self, v: Vec<ArrayData>) -> Self {
17651770
self.child_data = v;
17661771
self

arrow-select/src/filter.rs

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ use std::sync::Arc;
2323
use arrow_array::builder::BooleanBufferBuilder;
2424
use arrow_array::cast::AsArray;
2525
use arrow_array::types::{
26-
ArrowDictionaryKeyType, ArrowPrimitiveType, ByteArrayType, RunEndIndexType,
26+
ArrowDictionaryKeyType, ArrowPrimitiveType, ByteArrayType, ByteViewType, RunEndIndexType,
2727
};
2828
use arrow_array::*;
29-
use arrow_buffer::{bit_util, BooleanBuffer, NullBuffer, RunEndBuffer};
29+
use arrow_buffer::{bit_util, ArrowNativeType, BooleanBuffer, NullBuffer, RunEndBuffer};
3030
use arrow_buffer::{Buffer, MutableBuffer};
3131
use arrow_data::bit_iterator::{BitIndexIterator, BitSliceIterator};
3232
use arrow_data::transform::MutableArrayData;
@@ -333,12 +333,18 @@ fn filter_array(values: &dyn Array, predicate: &FilterPredicate) -> Result<Array
333333
DataType::LargeUtf8 => {
334334
Ok(Arc::new(filter_bytes(values.as_string::<i64>(), predicate)))
335335
}
336+
DataType::Utf8View => {
337+
Ok(Arc::new(filter_byte_view(values.as_string_view(), predicate)))
338+
}
336339
DataType::Binary => {
337340
Ok(Arc::new(filter_bytes(values.as_binary::<i32>(), predicate)))
338341
}
339342
DataType::LargeBinary => {
340343
Ok(Arc::new(filter_bytes(values.as_binary::<i64>(), predicate)))
341344
}
345+
DataType::BinaryView => {
346+
Ok(Arc::new(filter_byte_view(values.as_string_view(), predicate)))
347+
}
342348
DataType::RunEndEncoded(_, _) => {
343349
downcast_run_array!{
344350
values => Ok(Arc::new(filter_run_end_array(values, predicate)?)),
@@ -508,12 +514,8 @@ fn filter_boolean(array: &BooleanArray, predicate: &FilterPredicate) -> BooleanA
508514
BooleanArray::from(data)
509515
}
510516

511-
/// `filter` implementation for primitive arrays
512-
fn filter_primitive<T>(array: &PrimitiveArray<T>, predicate: &FilterPredicate) -> PrimitiveArray<T>
513-
where
514-
T: ArrowPrimitiveType,
515-
{
516-
let values = array.values();
517+
#[inline(never)]
518+
fn filter_native<T: ArrowNativeType>(values: &[T], predicate: &FilterPredicate) -> Buffer {
517519
assert!(values.len() >= predicate.filter.len());
518520

519521
let buffer = match &predicate.strategy {
@@ -546,9 +548,19 @@ where
546548
IterationStrategy::All | IterationStrategy::None => unreachable!(),
547549
};
548550

551+
buffer.into()
552+
}
553+
554+
/// `filter` implementation for primitive arrays
555+
fn filter_primitive<T>(array: &PrimitiveArray<T>, predicate: &FilterPredicate) -> PrimitiveArray<T>
556+
where
557+
T: ArrowPrimitiveType,
558+
{
559+
let values = array.values();
560+
let buffer = filter_native(values, predicate);
549561
let mut builder = ArrayDataBuilder::new(array.data_type().clone())
550562
.len(predicate.count)
551-
.add_buffer(buffer.into());
563+
.add_buffer(buffer);
552564

553565
if let Some((null_count, nulls)) = filter_null_mask(array.nulls(), predicate) {
554566
builder = builder.null_count(null_count).null_bit_buffer(Some(nulls));
@@ -673,6 +685,25 @@ where
673685
GenericByteArray::from(data)
674686
}
675687

688+
/// `filter` implementation for byte view arrays.
689+
fn filter_byte_view<T: ByteViewType>(
690+
array: &GenericByteViewArray<T>,
691+
predicate: &FilterPredicate,
692+
) -> GenericByteViewArray<T> {
693+
let new_view_buffer = filter_native(array.views(), predicate);
694+
695+
let mut builder = ArrayDataBuilder::new(T::DATA_TYPE)
696+
.len(predicate.count)
697+
.add_buffer(new_view_buffer)
698+
.add_buffers(array.data_buffers().to_vec());
699+
700+
if let Some((null_count, nulls)) = filter_null_mask(array.nulls(), predicate) {
701+
builder = builder.null_count(null_count).null_bit_buffer(Some(nulls));
702+
}
703+
704+
GenericByteViewArray::from(unsafe { builder.build_unchecked() })
705+
}
706+
676707
/// `filter` implementation for dictionaries
677708
fn filter_dict<T>(array: &DictionaryArray<T>, predicate: &FilterPredicate) -> DictionaryArray<T>
678709
where

0 commit comments

Comments
 (0)