@@ -272,37 +272,47 @@ impl Validity {
272272 indices : & dyn Array ,
273273 patches : & Validity ,
274274 ) -> Self {
275+ use Validity :: * ;
276+
275277 match ( & self , patches) {
276- ( Validity :: NonNullable , Validity :: NonNullable ) => return Validity :: NonNullable ,
277- ( Validity :: NonNullable , _) => {
278- vortex_panic ! ( "Can't patch a non-nullable validity with nullable validity" )
278+ ( NonNullable , NonNullable | AllValid ) => {
279+ return NonNullable ;
280+ }
281+ ( NonNullable , Array ( _) | AllInvalid ) => {
282+ vortex_panic ! ( "Can't patch a non-nullable validity with null values" )
279283 }
280- ( _, Validity :: NonNullable ) => {
281- vortex_panic ! ( "Can't patch a nullable validity with non-nullable validity" )
284+
285+ ( AllValid | Array ( _) | AllInvalid , NonNullable ) => {
286+ vortex_panic ! ( "Can't patch a nullable validity with a non-nullable validity" )
282287 }
283- ( Validity :: AllValid , Validity :: AllValid ) => return Validity :: AllValid ,
284- ( Validity :: AllInvalid , Validity :: AllInvalid ) => return Validity :: AllInvalid ,
285- _ => { }
288+
289+ ( AllValid , AllValid ) => return AllValid ,
290+ ( AllValid , Array ( _) | AllInvalid ) => { }
291+
292+ ( AllInvalid , AllInvalid ) => return AllInvalid ,
293+ ( AllInvalid , AllValid | Array ( _) ) => { }
294+
295+ ( Array ( _) , _) => { }
286296 } ;
287297
288- let own_nullability = if self == Validity :: NonNullable {
298+ let own_nullability = if self == NonNullable {
289299 Nullability :: NonNullable
290300 } else {
291301 Nullability :: Nullable
292302 } ;
293303
294304 let source = match self {
295- Validity :: NonNullable => BoolArray :: from ( BitBuffer :: new_set ( len) ) ,
296- Validity :: AllValid => BoolArray :: from ( BitBuffer :: new_set ( len) ) ,
297- Validity :: AllInvalid => BoolArray :: from ( BitBuffer :: new_unset ( len) ) ,
298- Validity :: Array ( a) => a. to_bool ( ) ,
305+ NonNullable => BoolArray :: from ( BitBuffer :: new_set ( len) ) ,
306+ AllValid => BoolArray :: from ( BitBuffer :: new_set ( len) ) ,
307+ AllInvalid => BoolArray :: from ( BitBuffer :: new_unset ( len) ) ,
308+ Array ( a) => a. to_bool ( ) ,
299309 } ;
300310
301311 let patch_values = match patches {
302- Validity :: NonNullable => BoolArray :: from ( BitBuffer :: new_set ( indices. len ( ) ) ) ,
303- Validity :: AllValid => BoolArray :: from ( BitBuffer :: new_set ( indices. len ( ) ) ) ,
304- Validity :: AllInvalid => BoolArray :: from ( BitBuffer :: new_unset ( indices. len ( ) ) ) ,
305- Validity :: Array ( a) => a. to_bool ( ) ,
312+ NonNullable => BoolArray :: from ( BitBuffer :: new_set ( indices. len ( ) ) ) ,
313+ AllValid => BoolArray :: from ( BitBuffer :: new_set ( indices. len ( ) ) ) ,
314+ AllInvalid => BoolArray :: from ( BitBuffer :: new_unset ( indices. len ( ) ) ) ,
315+ Array ( a) => a. to_bool ( ) ,
306316 } ;
307317
308318 let patches = Patches :: new (
@@ -513,21 +523,96 @@ mod tests {
513523 use crate :: validity:: Validity ;
514524
515525 #[ rstest]
516- #[ case( Validity :: AllValid , 5 , & [ 2 , 4 ] , Validity :: AllValid , Validity :: AllValid ) ]
517- #[ case( Validity :: AllValid , 5 , & [ 2 , 4 ] , Validity :: AllInvalid , Validity :: Array ( BoolArray :: from_iter( [ true , true , false , true , false ] ) . into_array( ) )
526+ #[ case(
527+ Validity :: AllValid ,
528+ 5 ,
529+ & [ 2 , 4 ] ,
530+ Validity :: AllValid ,
531+ Validity :: AllValid
532+ ) ]
533+ #[ case(
534+ Validity :: AllValid ,
535+ 5 ,
536+ & [ 2 , 4 ] ,
537+ Validity :: AllInvalid ,
538+ Validity :: Array ( BoolArray :: from_iter( [ true , true , false , true , false ] ) . into_array( ) )
539+ ) ]
540+ #[ case(
541+ Validity :: AllValid ,
542+ 5 ,
543+ & [ 2 , 4 ] ,
544+ Validity :: Array ( BoolArray :: from_iter( [ true , false ] ) . into_array( ) ) ,
545+ Validity :: Array ( BoolArray :: from_iter( [ true , true , true , true , false ] ) . into_array( ) )
546+ ) ]
547+ #[ case(
548+ Validity :: AllInvalid ,
549+ 5 ,
550+ & [ 2 , 4 ] ,
551+ Validity :: AllValid ,
552+ Validity :: Array ( BoolArray :: from_iter( [ false , false , true , false , true ] ) . into_array( ) )
553+ ) ]
554+ #[ case(
555+ Validity :: AllInvalid ,
556+ 5 ,
557+ & [ 2 , 4 ] ,
558+ Validity :: AllInvalid ,
559+ Validity :: AllInvalid
560+ ) ]
561+ #[ case(
562+ Validity :: AllInvalid ,
563+ 5 ,
564+ & [ 2 , 4 ] ,
565+ Validity :: Array ( BoolArray :: from_iter( [ true , false ] ) . into_array( ) ) ,
566+ Validity :: Array ( BoolArray :: from_iter( [ false , false , true , false , false ] ) . into_array( ) )
567+ ) ]
568+ #[ case(
569+ Validity :: Array ( BoolArray :: from_iter( [ false , true , false , true , false ] ) . into_array( ) ) ,
570+ 5 ,
571+ & [ 2 , 4 ] ,
572+ Validity :: AllValid ,
573+ Validity :: Array ( BoolArray :: from_iter( [ false , true , true , true , true ] ) . into_array( ) )
518574 ) ]
519- #[ case( Validity :: AllValid , 5 , & [ 2 , 4 ] , Validity :: Array ( BoolArray :: from_iter( [ true , false ] ) . into_array( ) ) , Validity :: Array ( BoolArray :: from_iter( [ true , true , true , true , false ] ) . into_array( ) )
575+ #[ case(
576+ Validity :: Array ( BoolArray :: from_iter( [ false , true , false , true , false ] ) . into_array( ) ) ,
577+ 5 ,
578+ & [ 2 , 4 ] ,
579+ Validity :: AllInvalid ,
580+ Validity :: Array ( BoolArray :: from_iter( [ false , true , false , true , false ] ) . into_array( ) )
520581 ) ]
521- #[ case( Validity :: AllInvalid , 5 , & [ 2 , 4 ] , Validity :: AllValid , Validity :: Array ( BoolArray :: from_iter( [ false , false , true , false , true ] ) . into_array( ) )
582+ #[ case(
583+ Validity :: Array ( BoolArray :: from_iter( [ false , true , false , true , false ] ) . into_array( ) ) ,
584+ 5 ,
585+ & [ 2 , 4 ] ,
586+ Validity :: Array ( BoolArray :: from_iter( [ true , false ] ) . into_array( ) ) ,
587+ Validity :: Array ( BoolArray :: from_iter( [ false , true , true , true , false ] ) . into_array( ) )
522588 ) ]
523- #[ case( Validity :: AllInvalid , 5 , & [ 2 , 4 ] , Validity :: AllInvalid , Validity :: AllInvalid ) ]
524- #[ case( Validity :: AllInvalid , 5 , & [ 2 , 4 ] , Validity :: Array ( BoolArray :: from_iter( [ true , false ] ) . into_array( ) ) , Validity :: Array ( BoolArray :: from_iter( [ false , false , true , false , false ] ) . into_array( ) )
589+ #[ case(
590+ Validity :: NonNullable ,
591+ 5 ,
592+ & [ 2 , 4 ] ,
593+ Validity :: AllValid ,
594+ Validity :: NonNullable
525595 ) ]
526- #[ case( Validity :: Array ( BoolArray :: from_iter( [ false , true , false , true , false ] ) . into_array( ) ) , 5 , & [ 2 , 4 ] , Validity :: AllValid , Validity :: Array ( BoolArray :: from_iter( [ false , true , true , true , true ] ) . into_array( ) )
596+ #[ case(
597+ Validity :: AllValid ,
598+ 5 ,
599+ & [ 2 , 4 ] ,
600+ Validity :: NonNullable ,
601+ Validity :: AllValid
527602 ) ]
528- #[ case( Validity :: Array ( BoolArray :: from_iter( [ false , true , false , true , false ] ) . into_array( ) ) , 5 , & [ 2 , 4 ] , Validity :: AllInvalid , Validity :: Array ( BoolArray :: from_iter( [ false , true , false , true , false ] ) . into_array( ) )
603+ #[ case(
604+ Validity :: AllInvalid ,
605+ 5 ,
606+ & [ 2 , 4 ] ,
607+ Validity :: NonNullable ,
608+ Validity :: Array ( BoolArray :: from_iter( [ false , false , true , false , true ] ) . into_array( ) )
529609 ) ]
530- #[ case( Validity :: Array ( BoolArray :: from_iter( [ false , true , false , true , false ] ) . into_array( ) ) , 5 , & [ 2 , 4 ] , Validity :: Array ( BoolArray :: from_iter( [ true , false ] ) . into_array( ) ) , Validity :: Array ( BoolArray :: from_iter( [ false , true , true , true , false ] ) . into_array( ) )
610+ #[ case(
611+ Validity :: Array ( BoolArray :: from_iter( [ false , true , false , true , false ] ) . into_array( ) ) ,
612+ 5 ,
613+ & [ 2 , 4 ] ,
614+ Validity :: NonNullable ,
615+ Validity :: Array ( BoolArray :: from_iter( [ false , true , true , true , true ] ) . into_array( ) )
531616 ) ]
532617 fn patch_validity (
533618 #[ case] validity : Validity ,
0 commit comments