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