vortex_array/execution/
validity.rs1use 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 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 Ok(validity.filter(&selection))
44 }))
45 }
46 }
47 }
48 }
49 }
50}