Skip to content

Commit f8996bf

Browse files
committed
Remove arrow usage from VarBin::compare, VarBinView::filter and BoolArray::from_iter
Signed-off-by: Robert Kruszewski <github@robertk.io>
1 parent 11f15a9 commit f8996bf

5 files changed

Lines changed: 162 additions & 175 deletions

File tree

vortex-array/src/arrays/bool/array.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
use std::fmt::Display;
55
use std::fmt::Formatter;
66

7-
use arrow_array::BooleanArray;
87
use smallvec::smallvec;
98
use vortex_buffer::BitBuffer;
109
use vortex_buffer::BitBufferMeta;
@@ -338,14 +337,16 @@ impl FromIterator<bool> for BoolArray {
338337

339338
impl FromIterator<Option<bool>> for BoolArray {
340339
fn from_iter<I: IntoIterator<Item = Option<bool>>>(iter: I) -> Self {
341-
let (buffer, nulls) = BooleanArray::from_iter(iter).into_parts();
340+
let iter = iter.into_iter();
341+
let capacity = iter.size_hint().0;
342+
let mut bits = BitBufferMut::with_capacity(capacity);
343+
let mut validity = BitBufferMut::with_capacity(capacity);
344+
for value in iter {
345+
bits.append(value.unwrap_or_default());
346+
validity.append(value.is_some());
347+
}
342348

343-
BoolArray::new(
344-
BitBuffer::from(buffer),
345-
nulls
346-
.map(|n| Validity::from(BitBuffer::from(n.into_inner())))
347-
.unwrap_or(Validity::AllValid),
348-
)
349+
BoolArray::new(bits.freeze(), Validity::from(validity.freeze()))
349350
}
350351
}
351352

vortex-array/src/arrays/filter/execute/mod.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,19 +83,13 @@ pub(super) fn execute_filter_fast_paths(
8383
}
8484

8585
/// Filter a canonical array by a mask, returning a new canonical array.
86-
pub(super) fn execute_filter(
87-
canonical: Canonical,
88-
mask: &Arc<MaskValues>,
89-
ctx: &mut ExecutionCtx,
90-
) -> Canonical {
86+
pub(super) fn execute_filter(canonical: Canonical, mask: &Arc<MaskValues>) -> Canonical {
9187
match canonical {
9288
Canonical::Null(_) => Canonical::Null(NullArray::new(mask.true_count())),
9389
Canonical::Bool(a) => Canonical::Bool(bool::filter_bool(&a, mask)),
9490
Canonical::Primitive(a) => Canonical::Primitive(primitive::filter_primitive(&a, mask)),
9591
Canonical::Decimal(a) => Canonical::Decimal(decimal::filter_decimal(&a, mask)),
96-
Canonical::VarBinView(a) => {
97-
Canonical::VarBinView(varbinview::filter_varbinview(&a, mask, ctx))
98-
}
92+
Canonical::VarBinView(a) => Canonical::VarBinView(varbinview::filter_varbinview(&a, mask)),
9993
Canonical::List(a) => Canonical::List(listview::filter_listview(&a, mask)),
10094
Canonical::FixedSizeList(a) => {
10195
Canonical::FixedSizeList(fixed_size_list::filter_fixed_size_list(&a, mask))

vortex-array/src/arrays/filter/execute/varbinview.rs

Lines changed: 23 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -3,54 +3,32 @@
33

44
use std::sync::Arc;
55

6-
use arrow_array::BooleanArray;
7-
use vortex_error::VortexExpect;
8-
use vortex_mask::Mask;
6+
use vortex_buffer::Buffer;
97
use vortex_mask::MaskValues;
108

11-
use crate::ArrayRef;
12-
use crate::ExecutionCtx;
13-
use crate::IntoArray;
14-
use crate::arrays::VarBinView;
159
use crate::arrays::VarBinViewArray;
16-
use crate::arrow::ArrowSessionExt;
17-
use crate::arrow::FromArrowArray;
18-
19-
pub fn filter_varbinview(
20-
array: &VarBinViewArray,
21-
mask: &Arc<MaskValues>,
22-
ctx: &mut ExecutionCtx,
23-
) -> VarBinViewArray {
24-
// Delegate to the Arrow implementation of filter over `VarBinView`.
25-
arrow_filter_fn(
26-
&array.clone().into_array(),
27-
&Mask::Values(Arc::clone(mask)),
28-
ctx,
29-
)
30-
.vortex_expect("VarBinViewArray is Arrow-compatible and supports arrow_filter_fn")
31-
.as_::<VarBinView>()
32-
.into_owned()
33-
}
34-
35-
fn arrow_filter_fn(
36-
array: &ArrayRef,
37-
mask: &Mask,
38-
ctx: &mut ExecutionCtx,
39-
) -> vortex_error::VortexResult<ArrayRef> {
40-
let values = match &mask {
41-
Mask::Values(values) => values,
42-
Mask::AllTrue(_) | Mask::AllFalse(_) => unreachable!("check in filter invoke"),
43-
};
44-
45-
let array_ref = ctx
46-
.session()
47-
.arrow()
48-
.clone()
49-
.execute_arrow(array.clone(), None, ctx)?;
50-
let mask_array = BooleanArray::new(values.bit_buffer().clone().into(), None);
51-
let filtered = arrow_select::filter::filter(array_ref.as_ref(), &mask_array)?;
52-
53-
ArrayRef::from_arrow(filtered.as_ref(), array.dtype().is_nullable())
10+
use crate::arrays::filter::execute::buffer;
11+
use crate::arrays::filter::execute::filter_validity;
12+
use crate::arrays::varbinview::BinaryView;
13+
use crate::arrays::varbinview::VarBinViewArrayExt;
14+
use crate::buffer::BufferHandle;
15+
16+
pub fn filter_varbinview(array: &VarBinViewArray, mask: &Arc<MaskValues>) -> VarBinViewArray {
17+
let filtered_validity = filter_validity(array.varbinview_validity(), mask);
18+
19+
let views = Buffer::<BinaryView>::from_byte_buffer(array.views_handle().as_host().clone());
20+
let filtered_views = buffer::filter_buffer(views, mask.as_ref());
21+
22+
// SAFETY: the filtered views are a subset of the original views and reference the same data
23+
// buffers, and the validity is filtered by the same mask so lengths stay aligned.
24+
unsafe {
25+
VarBinViewArray::new_handle_unchecked(
26+
BufferHandle::new_host(filtered_views.into_byte_buffer()),
27+
Arc::clone(array.data_buffers()),
28+
array.dtype().clone(),
29+
filtered_validity,
30+
)
31+
}
5432
}
5533

5634
#[cfg(test)]

vortex-array/src/arrays/filter/vtable.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ impl VTable for Filter {
168168
// TODO(joe): fix the ownership of AnyCanonical
169169
let child = Canonical::from(array.child().as_::<AnyCanonical>());
170170
Ok(ExecutionResult::done(
171-
execute_filter(child, &mask_values, ctx).into_array(),
171+
execute_filter(child, &mask_values).into_array(),
172172
))
173173
}
174174

0 commit comments

Comments
 (0)