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