Skip to main content

vortex_array/arrays/bool/compute/
cast.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use vortex_error::VortexResult;
5
6use crate::IntoArray;
7use crate::array::ArrayRef;
8use crate::arrays::BoolArray;
9use crate::arrays::BoolVTable;
10use crate::dtype::DType;
11use crate::scalar_fn::fns::cast::CastReduce;
12use crate::vtable::ValidityHelper;
13
14impl CastReduce for BoolVTable {
15    fn cast(array: &BoolArray, dtype: &DType) -> VortexResult<Option<ArrayRef>> {
16        if !matches!(dtype, DType::Bool(_)) {
17            return Ok(None);
18        }
19
20        let new_nullability = dtype.nullability();
21        let new_validity = array
22            .validity()
23            .clone()
24            .cast_nullability(new_nullability, array.len())?;
25        Ok(Some(
26            BoolArray::new(array.to_bit_buffer(), new_validity).into_array(),
27        ))
28    }
29}
30
31#[cfg(test)]
32mod tests {
33    use rstest::rstest;
34
35    use crate::IntoArray;
36    use crate::arrays::BoolArray;
37    use crate::builtins::ArrayBuiltins;
38    use crate::compute::conformance::cast::test_cast_conformance;
39    use crate::dtype::DType;
40    use crate::dtype::Nullability;
41
42    #[test]
43    fn try_cast_bool_success() {
44        let bool = BoolArray::from_iter(vec![Some(true), Some(false), Some(true)]);
45
46        let res = bool
47            .into_array()
48            .cast(DType::Bool(Nullability::NonNullable));
49        assert!(res.is_ok());
50        assert_eq!(res.unwrap().dtype(), &DType::Bool(Nullability::NonNullable));
51    }
52
53    #[test]
54    #[should_panic]
55    fn try_cast_bool_fail() {
56        let bool = BoolArray::from_iter(vec![Some(true), Some(false), None]);
57        bool.into_array()
58            .cast(DType::Bool(Nullability::NonNullable))
59            .unwrap();
60    }
61
62    #[rstest]
63    #[case(BoolArray::from_iter(vec![true, false, true, true, false]))]
64    #[case(BoolArray::from_iter(vec![Some(true), Some(false), None, Some(true), None]))]
65    #[case(BoolArray::from_iter(vec![true]))]
66    #[case(BoolArray::from_iter(vec![false, false]))]
67    fn test_cast_bool_conformance(#[case] array: BoolArray) {
68        test_cast_conformance(&array.into_array());
69    }
70}