vortex_array/arrays/primitive/vtable/
rules.rs1use vortex_buffer::Buffer;
5use vortex_dtype::match_each_native_ptype;
6use vortex_error::VortexResult;
7
8use crate::ArrayRef;
9use crate::IntoArray;
10use crate::arrays::MaskedArray;
11use crate::arrays::MaskedVTable;
12use crate::arrays::PrimitiveArray;
13use crate::arrays::PrimitiveVTable;
14use crate::matchers::Exact;
15use crate::optimizer::rules::ArrayParentReduceRule;
16use crate::optimizer::rules::ParentRuleSet;
17use crate::vtable::ValidityHelper;
18
19pub(super) const RULES: ParentRuleSet<PrimitiveVTable> =
20 ParentRuleSet::new(&[ParentRuleSet::lift(&PrimitiveMaskedValidityRule)]);
21
22#[derive(Default, Debug)]
27pub struct PrimitiveMaskedValidityRule;
28
29impl ArrayParentReduceRule<PrimitiveVTable> for PrimitiveMaskedValidityRule {
30 type Parent = Exact<MaskedVTable>;
31
32 fn parent(&self) -> Exact<MaskedVTable> {
33 Exact::from(&MaskedVTable)
34 }
35
36 fn reduce_parent(
37 &self,
38 array: &PrimitiveArray,
39 parent: &MaskedArray,
40 _child_idx: usize,
41 ) -> VortexResult<Option<ArrayRef>> {
42 let masked_array = match_each_native_ptype!(array.ptype(), |T| {
45 unsafe {
48 PrimitiveArray::new_unchecked(
49 Buffer::<T>::from_byte_buffer(array.byte_buffer().clone()),
50 array.validity().clone().and(parent.validity().clone()),
51 )
52 }
53 .into_array()
54 });
55
56 Ok(Some(masked_array))
57 }
58}