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