11// SPDX-License-Identifier: Apache-2.0
22// SPDX-FileCopyrightText: Copyright the Vortex contributors
33
4- use std:: ops:: Not ;
54use std:: sync:: Arc ;
65
76use vortex_array:: arrays:: {
87 BoolArray , DecimalArray , ExtensionArray , FixedSizeListArray , ListViewArray , PrimitiveArray ,
98 StructArray , VarBinViewArray ,
109} ;
11- use vortex_array:: validity:: Validity ;
1210use vortex_array:: vtable:: ValidityHelper ;
13- use vortex_array:: { ArrayRef , Canonical , IntoArray , ToCanonical } ;
11+ use vortex_array:: { ArrayRef , Canonical , IntoArray } ;
1412use vortex_dtype:: { ExtDType , match_each_decimal_value_type} ;
1513use vortex_error:: { VortexResult , VortexUnwrap } ;
16- use vortex_mask:: { AllOr , Mask } ;
14+ use vortex_mask:: Mask ;
1715
1816/// Apply mask on the canonical form of the array to get a consistent baseline.
1917/// This implementation manually applies the mask to each canonical type
@@ -25,11 +23,11 @@ pub fn mask_canonical_array(canonical: Canonical, mask: &Mask) -> VortexResult<A
2523 array. into_array ( )
2624 }
2725 Canonical :: Bool ( array) => {
28- let new_validity = apply_mask_to_validity ( array. validity ( ) , mask) ;
26+ let new_validity = array. validity ( ) . mask ( mask) ;
2927 BoolArray :: from_bit_buffer ( array. bit_buffer ( ) . clone ( ) , new_validity) . into_array ( )
3028 }
3129 Canonical :: Primitive ( array) => {
32- let new_validity = apply_mask_to_validity ( array. validity ( ) , mask) ;
30+ let new_validity = array. validity ( ) . mask ( mask) ;
3331 PrimitiveArray :: from_byte_buffer (
3432 array. byte_buffer ( ) . clone ( ) ,
3533 array. ptype ( ) ,
@@ -38,14 +36,14 @@ pub fn mask_canonical_array(canonical: Canonical, mask: &Mask) -> VortexResult<A
3836 . into_array ( )
3937 }
4038 Canonical :: Decimal ( array) => {
41- let new_validity = apply_mask_to_validity ( array. validity ( ) , mask) ;
39+ let new_validity = array. validity ( ) . mask ( mask) ;
4240 match_each_decimal_value_type ! ( array. values_type( ) , |D | {
4341 DecimalArray :: new( array. buffer:: <D >( ) , array. decimal_dtype( ) , new_validity)
4442 . into_array( )
4543 } )
4644 }
4745 Canonical :: VarBinView ( array) => {
48- let new_validity = apply_mask_to_validity ( array. validity ( ) , mask) ;
46+ let new_validity = array. validity ( ) . mask ( mask) ;
4947 VarBinViewArray :: new (
5048 array. views ( ) . clone ( ) ,
5149 array. buffers ( ) . clone ( ) ,
@@ -55,7 +53,7 @@ pub fn mask_canonical_array(canonical: Canonical, mask: &Mask) -> VortexResult<A
5553 . into_array ( )
5654 }
5755 Canonical :: List ( array) => {
58- let new_validity = apply_mask_to_validity ( array. validity ( ) , mask) ;
56+ let new_validity = array. validity ( ) . mask ( mask) ;
5957
6058 // SAFETY: Since we are only masking the validity and everything else comes from an
6159 // already valid `ListViewArray`, all of the invariants are still upheld.
@@ -71,7 +69,7 @@ pub fn mask_canonical_array(canonical: Canonical, mask: &Mask) -> VortexResult<A
7169 . into_array ( )
7270 }
7371 Canonical :: FixedSizeList ( array) => {
74- let new_validity = apply_mask_to_validity ( array. validity ( ) , mask) ;
72+ let new_validity = array. validity ( ) . mask ( mask) ;
7573 FixedSizeListArray :: new (
7674 array. elements ( ) . clone ( ) ,
7775 array. list_size ( ) ,
@@ -81,7 +79,7 @@ pub fn mask_canonical_array(canonical: Canonical, mask: &Mask) -> VortexResult<A
8179 . into_array ( )
8280 }
8381 Canonical :: Struct ( array) => {
84- let new_validity = apply_mask_to_validity ( array. validity ( ) , mask) ;
82+ let new_validity = array. validity ( ) . mask ( mask) ;
8583 StructArray :: try_new_with_dtype (
8684 array. fields ( ) . clone ( ) ,
8785 array. struct_fields ( ) . clone ( ) ,
@@ -113,24 +111,6 @@ pub fn mask_canonical_array(canonical: Canonical, mask: &Mask) -> VortexResult<A
113111 } )
114112}
115113
116- fn apply_mask_to_validity ( validity : & Validity , mask : & Mask ) -> Validity {
117- match mask. bit_buffer ( ) {
118- AllOr :: All => Validity :: AllInvalid ,
119- AllOr :: None => validity. clone ( ) ,
120- AllOr :: Some ( make_invalid) => match validity {
121- Validity :: NonNullable | Validity :: AllValid => {
122- Validity :: Array ( BoolArray :: from ( make_invalid. not ( ) ) . into_array ( ) )
123- }
124- Validity :: AllInvalid => Validity :: AllInvalid ,
125- Validity :: Array ( is_valid) => {
126- let is_valid = is_valid. to_bool ( ) ;
127- let keep_valid = make_invalid. not ( ) ;
128- Validity :: from ( is_valid. bit_buffer ( ) & & keep_valid)
129- }
130- } ,
131- }
132- }
133-
134114#[ cfg( test) ]
135115mod tests {
136116 use vortex_array:: arrays:: {
0 commit comments