vortex_array/arrays/constant/compute/
invert.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use 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}