|
4 | 4 | //! Array validity and nullability behavior, used by arrays and compute functions. |
5 | 5 |
|
6 | 6 | use std::fmt::Debug; |
7 | | -use std::ops::{BitAnd, Not, Range}; |
| 7 | +use std::ops::{BitAnd, Range}; |
8 | 8 |
|
9 | 9 | use vortex_buffer::BitBuffer; |
10 | 10 | use vortex_dtype::{DType, Nullability}; |
@@ -180,16 +180,15 @@ impl Validity { |
180 | 180 | pub fn mask(&self, mask: &Mask) -> Self { |
181 | 181 | match mask.bit_buffer() { |
182 | 182 | AllOr::All => Validity::AllInvalid, |
183 | | - AllOr::None => self.clone(), |
| 183 | + AllOr::None => self.clone().into_nullable(), |
184 | 184 | AllOr::Some(make_invalid) => match self { |
185 | 185 | Validity::NonNullable | Validity::AllValid => { |
186 | | - Validity::Array(BoolArray::from(make_invalid.not()).into_array()) |
| 186 | + Validity::Array(BoolArray::from(!make_invalid).into_array()) |
187 | 187 | } |
188 | 188 | Validity::AllInvalid => Validity::AllInvalid, |
189 | 189 | Validity::Array(is_valid) => { |
190 | 190 | let is_valid = is_valid.to_bool(); |
191 | | - let keep_valid = make_invalid.not(); |
192 | | - Validity::from(is_valid.bit_buffer() & &keep_valid) |
| 191 | + Validity::from(is_valid.bit_buffer() & !make_invalid) |
193 | 192 | } |
194 | 193 | }, |
195 | 194 | } |
@@ -552,4 +551,12 @@ mod tests { |
552 | 551 | ) { |
553 | 552 | assert_eq!(validity.take(&indices).unwrap(), expected); |
554 | 553 | } |
| 554 | + |
| 555 | + #[test] |
| 556 | + fn mask_non_nullable() { |
| 557 | + assert_eq!( |
| 558 | + Validity::AllValid, |
| 559 | + Validity::NonNullable.mask(&Mask::AllFalse(2)) |
| 560 | + ) |
| 561 | + } |
555 | 562 | } |
0 commit comments