@@ -35,7 +35,7 @@ use std::fmt::{Debug, Formatter};
3535use std:: hash:: Hash ;
3636use std:: marker:: PhantomData ;
3737use 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
668668struct 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+
676681impl < 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