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;
15
16impl MaskReduce for ALPRD {
17 fn mask(array: ArrayView<'_, Self>, mask: &ArrayRef) -> VortexResult<Option<ArrayRef>> {
18 let masked_left_parts = MaskExpr.try_new_array(
19 array.left_parts().len(),
20 EmptyOptions,
21 [array.left_parts().clone(), mask.clone()],
22 )?;
23 Ok(Some(
24 ALPRD::try_new(
25 array.dtype().as_nullable(),
26 masked_left_parts,
27 array.left_parts_dictionary().clone(),
28 array.right_parts().clone(),
29 array.right_bit_width(),
30 array.left_parts_patches(),
31 )?
32 .into_array(),
33 ))
34 }
35}
36
37#[cfg(test)]
38mod tests {
39 use rstest::rstest;
40 use vortex_array::IntoArray;
41 use vortex_array::arrays::PrimitiveArray;
42 use vortex_array::compute::conformance::mask::test_mask_conformance;
43
44 use crate::ALPRDFloat;
45 use crate::RDEncoder;
46
47 #[rstest]
48 #[case(0.1f32, 0.2f32, 3e25f32)]
49 #[case(0.1f64, 0.2f64, 3e100f64)]
50 fn test_mask_simple<T: ALPRDFloat>(#[case] a: T, #[case] b: T, #[case] outlier: T) {
51 test_mask_conformance(
52 &RDEncoder::new(&[a, b])
53 .encode(&PrimitiveArray::from_iter([a, b, outlier, b, outlier]))
54 .into_array(),
55 );
56 }
57
58 #[rstest]
59 #[case(0.1f32, 3e25f32)]
60 #[case(0.5f64, 1e100f64)]
61 fn test_mask_with_nulls<T: ALPRDFloat>(#[case] a: T, #[case] outlier: T) {
62 test_mask_conformance(
63 &RDEncoder::new(&[a])
64 .encode(&PrimitiveArray::from_option_iter([
65 Some(a),
66 None,
67 Some(outlier),
68 Some(a),
69 None,
70 ]))
71 .into_array(),
72 );
73 }
74}