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;
10use crate::execution::MaskExecution;
11use crate::validity::Validity;
12
13impl dyn BindCtx + '_ {
14 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 Ok(validity.filter(&selection))
45 }))
46 }
47 }
48 }
49 }
50 }
51}