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