@@ -16,7 +16,7 @@ use vortex_dtype::{
1616 match_each_unsigned_integer_ptype,
1717} ;
1818use vortex_error:: { VortexExpect , VortexResult , vortex_bail} ;
19- use vortex_mask:: AllOr ;
19+ use vortex_mask:: { AllOr , Mask } ;
2020use vortex_scalar:: Scalar ;
2121
2222use crate :: BitPackedArray ;
@@ -274,52 +274,52 @@ fn apply_patches<T: NativePType>(dst: &mut UninitRange<T>, patches: &Patches) ->
274274
275275 let indices = indices. to_primitive ( ) ?;
276276 let values = values. to_primitive ( ) ?;
277- let validity = values. validity ( ) ;
277+ let validity = values. validity_mask ( ) ? ;
278278 let values = values. as_slice :: < T > ( ) ;
279279 match_each_unsigned_integer_ptype ! ( indices. ptype( ) , |$P | {
280- insert_values_and_validity_at_indices:: <T , $ P >(
280+ insert_values_and_validity_at_indices:: <T , _ >(
281281 dst,
282- indices,
282+ indices. as_slice :: <$ P > ( ) ,
283283 values,
284- validity. clone ( ) ,
284+ validity,
285285 indices_offset,
286286 )
287- } )
287+ } ) ;
288+ Ok ( ( ) )
288289}
289290
290291fn insert_values_and_validity_at_indices <
291292 T : NativePType ,
292293 IndexT : NativePType + AsPrimitive < usize > ,
293294> (
294295 dst : & mut UninitRange < T > ,
295- indices : PrimitiveArray ,
296+ indices : & [ IndexT ] ,
296297 values : & [ T ] ,
297- validity : Validity ,
298+ values_validity : Mask ,
298299 indices_offset : usize ,
299- ) -> VortexResult < ( ) > {
300- match validity {
301- Validity :: NonNullable => {
302- for ( compressed_index, decompressed_index) in
303- indices. as_slice :: < IndexT > ( ) . iter ( ) . enumerate ( )
304- {
300+ ) {
301+ match values_validity {
302+ Mask :: AllTrue ( _) => {
303+ for ( compressed_index, decompressed_index) in indices. iter ( ) . enumerate ( ) {
305304 dst[ decompressed_index. as_ ( ) - indices_offset] =
306305 MaybeUninit :: new ( values[ compressed_index] ) ;
307306 }
308307 }
309- _ => {
310- let validity = validity. to_logical ( indices. len ( ) ) ?;
311- for ( compressed_index, decompressed_index) in
312- indices. as_slice :: < IndexT > ( ) . iter ( ) . enumerate ( )
313- {
308+ Mask :: AllFalse ( _) => {
309+ for ( compressed_index, decompressed_index) in indices. iter ( ) . enumerate ( ) {
314310 let out_index = decompressed_index. as_ ( ) - indices_offset;
315- dst[ decompressed_index. as_ ( ) - indices_offset] =
316- MaybeUninit :: new ( values[ compressed_index] ) ;
317- dst. set_bit ( out_index, validity. value ( out_index) ) ;
311+ dst[ out_index] = MaybeUninit :: new ( values[ compressed_index] ) ;
312+ dst. set_bit ( out_index, false ) ;
313+ }
314+ }
315+ Mask :: Values ( vb) => {
316+ for ( compressed_index, decompressed_index) in indices. iter ( ) . enumerate ( ) {
317+ let out_index = decompressed_index. as_ ( ) - indices_offset;
318+ dst[ out_index] = MaybeUninit :: new ( values[ compressed_index] ) ;
319+ dst. set_bit ( out_index, vb. value ( out_index) ) ;
318320 }
319321 }
320322 }
321-
322- Ok ( ( ) )
323323}
324324
325325fn unpack_values_into < T : NativePType , UnsignedT : NativePType + BitPacking , F , G > (
0 commit comments