@@ -23,28 +23,31 @@ use vortex_error::VortexResult;
2323use vortex_mask:: AllOr ;
2424use vortex_mask:: Mask ;
2525
26- /// Set to false any entries for which the mask is true .
27- ///
26+ /// Apply a logical AND of a validity and a mask .
27+ /// This needs to be coherent with applications of Mask.
2828/// The result is always nullable. The result has the same length as self.
2929#[ inline]
3030pub fn mask_validity ( validity : & Validity , mask : & Mask ) -> Validity {
31- match mask. bit_buffer ( ) {
32- AllOr :: All => Validity :: AllInvalid ,
33- AllOr :: None => validity. clone ( ) . into_nullable ( ) ,
34- AllOr :: Some ( make_invalid) => match validity {
31+ let out = match mask. bit_buffer ( ) {
32+ AllOr :: All => validity. clone ( ) . into_nullable ( ) ,
33+ AllOr :: None => Validity :: AllInvalid ,
34+ AllOr :: Some ( make_valid) => match validity {
35+ Validity :: AllInvalid => Validity :: AllInvalid ,
3536 Validity :: NonNullable | Validity :: AllValid => {
36- Validity :: from_bit_buffer ( !make_invalid , Nullability :: Nullable )
37+ Validity :: from_bit_buffer ( make_valid . clone ( ) , Nullability :: Nullable )
3738 }
38- Validity :: AllInvalid => Validity :: AllInvalid ,
3939 Validity :: Array ( is_valid) => {
4040 let is_valid = is_valid. to_bool ( ) ;
4141 Validity :: from_bit_buffer (
42- is_valid. to_bit_buffer ( ) & !make_invalid ,
42+ is_valid. to_bit_buffer ( ) & make_valid ,
4343 Nullability :: Nullable ,
4444 )
4545 }
4646 } ,
47- }
47+ } ;
48+
49+ tracing:: debug!( validity = ?validity, mask = ?mask, out = ?out, "generated fuzzer mask" ) ;
50+ out
4851}
4952
5053/// Apply mask on the canonical form of the array to get a consistent baseline.
@@ -173,7 +176,7 @@ mod tests {
173176 #[ test]
174177 fn test_mask_bool_array ( ) {
175178 let array = BoolArray :: from_iter ( [ true , false , true , false , true ] ) ;
176- let mask = Mask :: from_iter ( [ true , false , false , true , false ] ) ;
179+ let mask = Mask :: from_iter ( [ false , true , true , false , true ] ) ;
177180
178181 let result = mask_canonical_array ( array. to_canonical ( ) . unwrap ( ) , & mask) . unwrap ( ) ;
179182
@@ -184,7 +187,7 @@ mod tests {
184187 #[ test]
185188 fn test_mask_primitive_array ( ) {
186189 let array = PrimitiveArray :: from_iter ( [ 1i32 , 2 , 3 , 4 , 5 ] ) ;
187- let mask = Mask :: from_iter ( [ false , true , false , true , false ] ) ;
190+ let mask = Mask :: from_iter ( [ true , false , true , false , true ] ) ;
188191
189192 let result = mask_canonical_array ( array. to_canonical ( ) . unwrap ( ) , & mask) . unwrap ( ) ;
190193
@@ -195,7 +198,7 @@ mod tests {
195198 #[ test]
196199 fn test_mask_primitive_array_with_nulls ( ) {
197200 let array = PrimitiveArray :: from_option_iter ( [ Some ( 1i32 ) , None , Some ( 3 ) , Some ( 4 ) , None ] ) ;
198- let mask = Mask :: from_iter ( [ true , false , false , true , false ] ) ;
201+ let mask = Mask :: from_iter ( [ false , true , true , false , true ] ) ;
199202
200203 let result = mask_canonical_array ( array. to_canonical ( ) . unwrap ( ) , & mask) . unwrap ( ) ;
201204
@@ -210,7 +213,7 @@ mod tests {
210213 [ Some ( 1i128 ) , Some ( 2 ) , Some ( 3 ) , Some ( 4 ) , Some ( 5 ) ] ,
211214 dtype,
212215 ) ;
213- let mask = Mask :: from_iter ( [ false , false , true , false , false ] ) ;
216+ let mask = Mask :: from_iter ( [ true , true , false , true , true ] ) ;
214217
215218 let result = mask_canonical_array ( array. to_canonical ( ) . unwrap ( ) , & mask) . unwrap ( ) ;
216219
@@ -222,7 +225,7 @@ mod tests {
222225 #[ test]
223226 fn test_mask_varbinview_array ( ) {
224227 let array = VarBinViewArray :: from_iter_str ( [ "one" , "two" , "three" , "four" , "five" ] ) ;
225- let mask = Mask :: from_iter ( [ true , false , true , false , true ] ) ;
228+ let mask = Mask :: from_iter ( [ false , true , false , true , false ] ) ;
226229
227230 let result = mask_canonical_array ( array. to_canonical ( ) . unwrap ( ) , & mask) . unwrap ( ) ;
228231
@@ -241,7 +244,7 @@ mod tests {
241244 . with_zero_copy_to_list ( true )
242245 } ;
243246
244- let mask = Mask :: from_iter ( [ false , true , false ] ) ;
247+ let mask = Mask :: from_iter ( [ true , false , true ] ) ;
245248
246249 let result = mask_canonical_array ( array. to_canonical ( ) . unwrap ( ) , & mask) . unwrap ( ) ;
247250
@@ -257,7 +260,7 @@ mod tests {
257260 let array =
258261 FixedSizeListArray :: try_new ( elements, 2 , Nullability :: NonNullable . into ( ) , 3 ) . unwrap ( ) ;
259262
260- let mask = Mask :: from_iter ( [ true , false , true ] ) ;
263+ let mask = Mask :: from_iter ( [ false , true , false ] ) ;
261264
262265 let result = mask_canonical_array ( array. to_canonical ( ) . unwrap ( ) , & mask) . unwrap ( ) ;
263266
@@ -281,7 +284,7 @@ mod tests {
281284 )
282285 . unwrap ( ) ;
283286
284- let mask = Mask :: from_iter ( [ false , true , false ] ) ;
287+ let mask = Mask :: from_iter ( [ true , false , true ] ) ;
285288
286289 let result = mask_canonical_array ( array. to_canonical ( ) . unwrap ( ) , & mask) . unwrap ( ) ;
287290
@@ -292,9 +295,9 @@ mod tests {
292295 }
293296
294297 #[ test]
295- fn test_mask_all_true ( ) {
298+ fn test_mask_all_false ( ) {
296299 let array = PrimitiveArray :: from_iter ( [ 1i32 , 2 , 3 , 4 , 5 ] ) ;
297- let mask = Mask :: AllTrue ( 5 ) ;
300+ let mask = Mask :: AllFalse ( 5 ) ;
298301
299302 let result = mask_canonical_array ( array. to_canonical ( ) . unwrap ( ) , & mask) . unwrap ( ) ;
300303
@@ -303,9 +306,9 @@ mod tests {
303306 }
304307
305308 #[ test]
306- fn test_mask_all_false ( ) {
309+ fn test_mask_all_true ( ) {
307310 let array = PrimitiveArray :: from_iter ( [ 1i32 , 2 , 3 , 4 , 5 ] ) ;
308- let mask = Mask :: AllFalse ( 5 ) ;
311+ let mask = Mask :: AllTrue ( 5 ) ;
309312
310313 let result = mask_canonical_array ( array. to_canonical ( ) . unwrap ( ) , & mask) . unwrap ( ) ;
311314
@@ -317,10 +320,9 @@ mod tests {
317320 #[ test]
318321 fn test_mask_empty_array ( ) {
319322 let array = PrimitiveArray :: from_iter ( Vec :: < i32 > :: new ( ) ) ;
320- let mask = Mask :: AllFalse ( 0 ) ;
321-
322- let result = mask_canonical_array ( array. to_canonical ( ) . unwrap ( ) , & mask) . unwrap ( ) ;
323-
324- assert_eq ! ( result. len( ) , 0 ) ;
323+ for mask in [ Mask :: AllFalse ( 0 ) , Mask :: AllTrue ( 0 ) ] {
324+ let result = mask_canonical_array ( array. to_canonical ( ) . unwrap ( ) , & mask) . unwrap ( ) ;
325+ assert_eq ! ( result. len( ) , 0 ) ;
326+ }
325327 }
326328}
0 commit comments