Skip to main content

vortex_array/vtable/
validity.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use vortex_error::VortexResult;
5
6use crate::Array;
7use crate::ArrayRef;
8use crate::validity::Validity;
9use crate::vtable::VTable;
10
11pub trait ValidityVTable<V: VTable> {
12    /// Returns the [`Validity`] of the array.
13    ///
14    /// ## Pre-conditions
15    ///
16    /// - The array DType is nullable.
17    fn validity(array: &V::Array) -> VortexResult<Validity>;
18}
19
20/// An implementation of the [`ValidityVTable`] for arrays that hold validity as a child array.
21pub struct ValidityVTableFromValidityHelper;
22
23/// Expose validity held as a child array.
24pub trait ValidityHelper {
25    fn validity(&self) -> &Validity;
26}
27
28impl<V: VTable> ValidityVTable<V> for ValidityVTableFromValidityHelper
29where
30    V::Array: ValidityHelper,
31{
32    fn validity(array: &V::Array) -> VortexResult<Validity> {
33        Ok(array.validity().clone())
34    }
35}
36
37/// An implementation of the [`ValidityVTable`] for arrays that hold an unsliced validity
38/// and a slice into it.
39pub struct ValidityVTableFromValiditySliceHelper;
40
41pub trait ValiditySliceHelper {
42    fn unsliced_validity_and_slice(&self) -> (&Validity, usize, usize);
43
44    fn sliced_validity(&self) -> VortexResult<Validity> {
45        let (unsliced_validity, start, stop) = self.unsliced_validity_and_slice();
46        unsliced_validity.slice(start..stop)
47    }
48}
49
50impl<V: VTable> ValidityVTable<V> for ValidityVTableFromValiditySliceHelper
51where
52    V::Array: ValiditySliceHelper,
53{
54    fn validity(array: &V::Array) -> VortexResult<Validity> {
55        array.sliced_validity()
56    }
57}
58
59/// An implementation of the [`ValidityVTable`] for arrays that delegate validity entirely
60/// to a child array.
61pub struct ValidityVTableFromChild;
62
63pub trait ValidityChild<V: VTable> {
64    fn validity_child(array: &V::Array) -> &ArrayRef;
65}
66
67impl<V: VTable> ValidityVTable<V> for ValidityVTableFromChild
68where
69    V: ValidityChild<V>,
70{
71    fn validity(array: &V::Array) -> VortexResult<Validity> {
72        V::validity_child(array).validity()
73    }
74}
75
76/// An implementation of the [`ValidityVTable`] for arrays that hold an unsliced validity
77/// and a slice into it.
78pub struct ValidityVTableFromChildSliceHelper;
79
80pub trait ValidityChildSliceHelper {
81    fn unsliced_child_and_slice(&self) -> (&ArrayRef, usize, usize);
82
83    fn sliced_child_array(&self) -> VortexResult<ArrayRef> {
84        let (unsliced_validity, start, stop) = self.unsliced_child_and_slice();
85        unsliced_validity.slice(start..stop)
86    }
87}
88
89impl<V: VTable> ValidityVTable<V> for ValidityVTableFromChildSliceHelper
90where
91    V::Array: ValidityChildSliceHelper,
92{
93    fn validity(array: &V::Array) -> VortexResult<Validity> {
94        array.sliced_child_array()?.validity()
95    }
96}