vortex_array/execution/
validity.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use vortex_compute::filter::Filter;
5use vortex_error::VortexResult;
6use vortex_mask::Mask;
7
8use crate::ArrayRef;
9use crate::execution::{BindCtx, MaskExecution};
10use crate::validity::Validity;
11
12impl dyn BindCtx + '_ {
13    /// Bind a validity helper into a [`MaskExecution`].
14    pub fn bind_validity(
15        &mut self,
16        validity: &Validity,
17        array_len: usize,
18        selection: Option<&ArrayRef>,
19    ) -> VortexResult<MaskExecution> {
20        match selection {
21            None => match validity {
22                Validity::NonNullable | Validity::AllValid => Ok(MaskExecution::AllTrue(array_len)),
23                Validity::AllInvalid => Ok(MaskExecution::AllFalse(array_len)),
24                Validity::Array(validity) => self.bind_mask(validity),
25            },
26            Some(selection) => {
27                let selection = self.bind_mask(selection)?;
28                match validity {
29                    Validity::NonNullable | Validity::AllValid => {
30                        Ok(MaskExecution::lazy(move || {
31                            Ok(Mask::AllTrue(selection.execute()?.true_count()))
32                        }))
33                    }
34                    Validity::AllInvalid => Ok(MaskExecution::lazy(move || {
35                        Ok(Mask::AllFalse(selection.execute()?.true_count()))
36                    })),
37                    Validity::Array(validity) => {
38                        let validity = self.bind_mask(validity)?;
39                        Ok(MaskExecution::lazy(move || {
40                            let validity = validity.execute()?;
41                            let selection = selection.execute()?;
42                            // We perform a take on the validity mask using the selection mask.
43                            Ok(validity.filter(&selection))
44                        }))
45                    }
46                }
47            }
48        }
49    }
50}