vortex_alp/alp_rd/compute/
mask.rs1use vortex_array::ArrayRef;
5use vortex_array::ArrayView;
6use vortex_array::IntoArray;
7use vortex_array::arrays::scalar_fn::ScalarFnFactoryExt;
8use vortex_array::scalar_fn::EmptyOptions;
9use vortex_array::scalar_fn::fns::mask::Mask as MaskExpr;
10use vortex_array::scalar_fn::fns::mask::MaskReduce;
11use vortex_error::VortexResult;
12
13use crate::ALPRD;
14use crate::ALPRDArrayExt;
15use crate::ALPRDArraySlotsExt;
16
17impl MaskReduce for ALPRD {
18 #[allow(clippy::disallowed_methods)]
19 fn mask(array: ArrayView<'_, Self>, mask: &ArrayRef) -> VortexResult<Option<ArrayRef>> {
20 let masked_left_parts = MaskExpr.try_new_array(
21 array.left_parts().len(),
22 EmptyOptions,
23 [array.left_parts().clone(), mask.clone()],
24 )?;
25 Ok(Some(
26 ALPRD::try_new(
27 array.dtype().as_nullable(),
28 masked_left_parts,
29 array.left_parts_dictionary().clone(),
30 array.right_parts().clone(),
31 array.right_bit_width(),
32 array.left_parts_patches(),
33 )?
34 .into_array(),
35 ))
36 }
37}
38
39#[cfg(test)]
40mod tests {
41 use std::sync::LazyLock;
42
43 use rstest::rstest;
44 use vortex_array::IntoArray;
45 use vortex_array::VortexSessionExecute;
46 use vortex_array::array_session;
47 use vortex_array::arrays::PrimitiveArray;
48 use vortex_array::compute::conformance::mask::test_mask_conformance;
49 use vortex_array::dtype::NativePType;
50 use vortex_session::VortexSession;
51
52 use crate::ALPRDFloat;
53 use crate::RDEncoder;
54 use crate::RDEncoderExt;
55
56 static SESSION: LazyLock<VortexSession> = LazyLock::new(|| {
57 let session = array_session();
58 crate::initialize(&session);
59 session
60 });
61
62 #[rstest]
63 #[case(0.1f32, 0.2f32, 3e25f32)]
64 #[case(0.1f64, 0.2f64, 3e100f64)]
65 fn test_mask_simple<T: ALPRDFloat + NativePType>(
66 #[case] a: T,
67 #[case] b: T,
68 #[case] outlier: T,
69 ) {
70 let mut ctx = SESSION.create_execution_ctx();
71 test_mask_conformance(
72 &RDEncoder::new(&[a, b])
73 .encode(PrimitiveArray::from_iter([a, b, outlier, b, outlier]).as_view())
74 .into_array(),
75 &mut ctx,
76 );
77 }
78
79 #[rstest]
80 #[case(0.1f32, 3e25f32)]
81 #[case(0.5f64, 1e100f64)]
82 fn test_mask_with_nulls<T: ALPRDFloat + NativePType>(#[case] a: T, #[case] outlier: T) {
83 let mut ctx = SESSION.create_execution_ctx();
84 test_mask_conformance(
85 &RDEncoder::new(&[a])
86 .encode(
87 PrimitiveArray::from_option_iter([Some(a), None, Some(outlier), Some(a), None])
88 .as_view(),
89 )
90 .into_array(),
91 &mut ctx,
92 );
93 }
94}