vortex_array/arrays/constant/compute/
invert.rs

1use vortex_error::VortexResult;
2use vortex_scalar::Scalar;
3
4use crate::arrays::{ConstantArray, ConstantEncoding};
5use crate::compute::{InvertKernel, InvertKernelAdapter};
6use crate::{Array, ArrayRef, register_kernel};
7
8impl InvertKernel for ConstantEncoding {
9    fn invert(&self, array: &ConstantArray) -> VortexResult<ArrayRef> {
10        match array.scalar().as_bool().value() {
11            None => Ok(array.to_array().into_array()),
12            Some(b) => Ok(ConstantArray::new(
13                Scalar::bool(!b, array.dtype().nullability()),
14                array.len(),
15            )
16            .into_array()),
17        }
18    }
19}
20
21register_kernel!(InvertKernelAdapter(ConstantEncoding).lift());
22
23#[cfg(test)]
24mod tests {
25    use vortex_dtype::Nullability::Nullable;
26    use vortex_scalar::Scalar;
27
28    use crate::arrays::{ConstantArray, ConstantEncoding};
29    use crate::compute::InvertKernel;
30    use crate::{Array, ArrayStatistics};
31
32    #[test]
33    fn invert_nullable_const() {
34        let constant = ConstantArray::new(Scalar::bool(false, Nullable), 10);
35
36        let invert = ConstantEncoding.invert(&constant).unwrap();
37        assert_eq!(invert.dtype(), constant.dtype());
38
39        let orig = ConstantEncoding
40            .invert(invert.as_any().downcast_ref::<ConstantArray>().unwrap())
41            .unwrap();
42
43        assert_eq!(orig.dtype(), constant.dtype());
44        assert_eq!(orig.as_constant(), constant.as_constant())
45    }
46}