vortex_array/arrays/chunked/vtable/
validity.rs1use itertools::Itertools;
5use vortex_dtype::DType;
6use vortex_dtype::Nullability;
7use vortex_error::VortexResult;
8use vortex_mask::Mask;
9
10use crate::Array;
11use crate::IntoArray;
12use crate::arrays::ChunkedArray;
13use crate::arrays::ChunkedVTable;
14use crate::validity::Validity;
15use crate::vtable::ValidityVTable;
16
17impl ValidityVTable<ChunkedVTable> for ChunkedVTable {
18 fn is_valid(array: &ChunkedArray, index: usize) -> bool {
19 if !array.dtype.is_nullable() {
20 return true;
21 }
22 let (chunk, offset_in_chunk) = array.find_chunk_idx(index);
23 array.chunk(chunk).is_valid(offset_in_chunk)
24 }
25
26 fn all_valid(array: &ChunkedArray) -> bool {
27 if !array.dtype().is_nullable() {
28 return true;
29 }
30 for chunk in array.non_empty_chunks() {
31 if !chunk.all_valid() {
32 return false;
33 }
34 }
35 true
36 }
37
38 fn all_invalid(array: &ChunkedArray) -> bool {
39 if !array.dtype().is_nullable() {
40 return false;
41 }
42 for chunk in array.non_empty_chunks() {
43 if !chunk.all_invalid() {
44 return false;
45 }
46 }
47 true
48 }
49
50 fn validity(array: &ChunkedArray) -> VortexResult<Validity> {
51 Ok(Validity::Array(
52 unsafe {
53 ChunkedArray::new_unchecked(
54 array
55 .chunks()
56 .iter()
57 .map(|chunk| chunk.validity().map(|v| v.to_array(chunk.len())))
58 .try_collect()?,
59 DType::Bool(Nullability::NonNullable),
60 )
61 }
62 .into_array(),
63 ))
64 }
65
66 fn validity_mask(array: &ChunkedArray) -> Mask {
67 array.chunks().iter().map(|a| a.validity_mask()).collect()
68 }
69}