Skip to content

Commit 34f62ef

Browse files
committed
Update null_if kernel to use Arc<[Buffer]>
1 parent 98532ad commit 34f62ef

File tree

1 file changed

+23
-18
lines changed

1 file changed

+23
-18
lines changed

arrow-select/src/zip.rs

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ use std::fmt::{Debug, Formatter};
3535
use std::hash::Hash;
3636
use std::marker::PhantomData;
3737
use std::ops::Not;
38-
use std::sync::Arc;
38+
use std::sync::{Arc, OnceLock};
3939

4040
/// Zip two arrays by some boolean mask.
4141
///
@@ -667,12 +667,17 @@ fn maybe_prep_null_mask_filter(predicate: &BooleanArray) -> BooleanBuffer {
667667

668668
struct ByteViewScalarImpl<T: ByteViewType> {
669669
truthy_view: Option<u128>,
670-
truthy_buffers: Vec<Buffer>,
670+
truthy_buffers: Arc<[Buffer]>,
671671
falsy_view: Option<u128>,
672-
falsy_buffers: Vec<Buffer>,
672+
falsy_buffers: Arc<[Buffer]>,
673673
phantom: PhantomData<T>,
674674
}
675675

676+
static EMPTY_ARC: OnceLock<Arc<[Buffer]>> = OnceLock::new();
677+
fn empty_arc_buffers() -> Arc<[Buffer]> {
678+
Arc::clone(EMPTY_ARC.get_or_init(|| Arc::new([])))
679+
}
680+
676681
impl<T: ByteViewType> ByteViewScalarImpl<T> {
677682
fn new(truthy: &dyn Array, falsy: &dyn Array) -> Self {
678683
let (truthy_view, truthy_buffers) = Self::get_value_from_scalar(truthy);
@@ -686,9 +691,9 @@ impl<T: ByteViewType> ByteViewScalarImpl<T> {
686691
}
687692
}
688693

689-
fn get_value_from_scalar(scalar: &dyn Array) -> (Option<u128>, Vec<Buffer>) {
694+
fn get_value_from_scalar(scalar: &dyn Array) -> (Option<u128>, Arc<[Buffer]>) {
690695
if scalar.is_null(0) {
691-
(None, vec![])
696+
(None, empty_arc_buffers())
692697
} else {
693698
let (views, buffers, _) = scalar.as_byte_view::<T>().clone().into_parts();
694699
(views.first().copied(), buffers)
@@ -698,8 +703,8 @@ impl<T: ByteViewType> ByteViewScalarImpl<T> {
698703
fn get_views_for_single_non_nullable(
699704
predicate: BooleanBuffer,
700705
value: u128,
701-
buffers: Vec<Buffer>,
702-
) -> (ScalarBuffer<u128>, Vec<Buffer>, Option<NullBuffer>) {
706+
buffers: Arc<[Buffer]>,
707+
) -> (ScalarBuffer<u128>, Arc<[Buffer]>, Option<NullBuffer>) {
703708
let number_of_true = predicate.count_set_bits();
704709
let number_of_values = predicate.len();
705710

@@ -708,7 +713,7 @@ impl<T: ByteViewType> ByteViewScalarImpl<T> {
708713
// All values are null
709714
return (
710715
vec![0; number_of_values].into(),
711-
vec![],
716+
empty_arc_buffers(),
712717
Some(NullBuffer::new_null(number_of_values)),
713718
);
714719
}
@@ -724,10 +729,10 @@ impl<T: ByteViewType> ByteViewScalarImpl<T> {
724729
predicate: BooleanBuffer,
725730
result_len: usize,
726731
truthy_view: u128,
727-
truthy_buffers: Vec<Buffer>,
732+
truthy_buffers: Arc<[Buffer]>,
728733
falsy_view: u128,
729-
falsy_buffers: Vec<Buffer>,
730-
) -> (ScalarBuffer<u128>, Vec<Buffer>, Option<NullBuffer>) {
734+
falsy_buffers: Arc<[Buffer]>,
735+
) -> (ScalarBuffer<u128>, Arc<[Buffer]>, Option<NullBuffer>) {
731736
let true_count = predicate.count_set_bits();
732737
match true_count {
733738
0 => {
@@ -751,7 +756,7 @@ impl<T: ByteViewType> ByteViewScalarImpl<T> {
751756
let byte_view_falsy = ByteView::from(falsy_view);
752757
let new_index_falsy_buffers =
753758
buffers.len() as u32 + byte_view_falsy.buffer_index;
754-
buffers.extend(falsy_buffers);
759+
buffers.extend(falsy_buffers.iter().cloned());
755760
let byte_view_falsy =
756761
byte_view_falsy.with_buffer_index(new_index_falsy_buffers);
757762
byte_view_falsy.as_u128()
@@ -778,7 +783,7 @@ impl<T: ByteViewType> ByteViewScalarImpl<T> {
778783
}
779784

780785
let bytes = Buffer::from(mutable);
781-
(bytes.into(), buffers, None)
786+
(bytes.into(), buffers.into(), None)
782787
}
783788
}
784789
}
@@ -804,28 +809,28 @@ impl<T: ByteViewType> ZipImpl for ByteViewScalarImpl<T> {
804809
predicate,
805810
result_len,
806811
truthy,
807-
self.truthy_buffers.clone(),
812+
Arc::clone(&self.truthy_buffers),
808813
falsy,
809-
self.falsy_buffers.clone(),
814+
Arc::clone(&self.falsy_buffers),
810815
),
811816
(Some(truthy), None) => Self::get_views_for_single_non_nullable(
812817
predicate,
813818
truthy,
814-
self.truthy_buffers.clone(),
819+
Arc::clone(&self.truthy_buffers),
815820
),
816821
(None, Some(falsy)) => {
817822
let predicate = predicate.not();
818823
Self::get_views_for_single_non_nullable(
819824
predicate,
820825
falsy,
821-
self.falsy_buffers.clone(),
826+
Arc::clone(&self.falsy_buffers),
822827
)
823828
}
824829
(None, None) => {
825830
// All values are null
826831
(
827832
vec![0; result_len].into(),
828-
vec![],
833+
empty_arc_buffers(),
829834
Some(NullBuffer::new_null(result_len)),
830835
)
831836
}

0 commit comments

Comments
 (0)