vortex_array/arrays/constant/compute/
invert.rs1use vortex_error::VortexResult;
2use vortex_scalar::Scalar;
3
4use crate::arrays::{ConstantArray, ConstantEncoding};
5use crate::compute::InvertFn;
6use crate::{Array, ArrayRef};
7
8impl InvertFn<&ConstantArray> 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
21#[cfg(test)]
22mod tests {
23 use vortex_dtype::Nullability::Nullable;
24 use vortex_scalar::Scalar;
25
26 use crate::arrays::{ConstantArray, ConstantEncoding};
27 use crate::compute::InvertFn;
28 use crate::{Array, ArrayStatistics};
29
30 #[test]
31 fn invert_nullable_const() {
32 let constant = ConstantArray::new(Scalar::bool(false, Nullable), 10);
33
34 let invert = ConstantEncoding.invert(&constant).unwrap();
35 assert_eq!(invert.dtype(), constant.dtype());
36
37 let orig = ConstantEncoding
38 .invert(invert.as_any().downcast_ref::<ConstantArray>().unwrap())
39 .unwrap();
40
41 assert_eq!(orig.dtype(), constant.dtype());
42 assert_eq!(orig.as_constant(), constant.as_constant())
43 }
44}