vortex_array/arrays/chunked/vtable/
validity.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use 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}