Skip to main content

vortex_array/arrays/constant/compute/
fill_null.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use vortex_error::VortexResult;
5
6use crate::ArrayRef;
7use crate::arrays::ConstantArray;
8use crate::arrays::ConstantVTable;
9use crate::expr::FillNullReduce;
10use crate::expr::fill_null_constant;
11use crate::scalar::Scalar;
12
13impl FillNullReduce for ConstantVTable {
14    fn fill_null(array: &ConstantArray, fill_value: &Scalar) -> VortexResult<Option<ArrayRef>> {
15        fill_null_constant(array, fill_value).map(Some)
16    }
17}
18
19#[cfg(test)]
20mod test {
21    use crate::IntoArray as _;
22    use crate::arrays::ConstantArray;
23    use crate::arrow::IntoArrowArray as _;
24    use crate::builtins::ArrayBuiltins;
25    use crate::scalar::Scalar;
26
27    #[test]
28    fn test_null() {
29        let actual = ConstantArray::new(Scalar::null_native::<i32>(), 3)
30            .into_array()
31            .fill_null(Scalar::from(1))
32            .unwrap();
33        let expected = ConstantArray::new(Scalar::from(1), 3).into_array();
34
35        assert!(!actual.dtype().is_nullable());
36
37        let actual_arrow = actual.clone().into_arrow_preferred().unwrap();
38        let expected_arrow = expected.clone().into_arrow_preferred().unwrap();
39        assert_eq!(
40            &actual_arrow,
41            &expected_arrow,
42            "{}, {}",
43            actual.display_values(),
44            expected.display_values()
45        );
46    }
47
48    #[test]
49    fn test_non_null() {
50        let actual = ConstantArray::new(Scalar::from(Some(1)), 3)
51            .into_array()
52            .fill_null(Scalar::from(1))
53            .unwrap();
54        let expected = ConstantArray::new(Scalar::from(1), 3).into_array();
55
56        assert!(!actual.dtype().is_nullable());
57
58        let actual_arrow = actual.clone().into_arrow_preferred().unwrap();
59        let expected_arrow = expected.clone().into_arrow_preferred().unwrap();
60        assert_eq!(
61            &actual_arrow,
62            &expected_arrow,
63            "{}, {}",
64            actual.display_values(),
65            expected.display_values()
66        );
67    }
68
69    #[test]
70    fn test_non_nullable_with_nullable() {
71        let actual = ConstantArray::new(Scalar::from(1), 3)
72            .into_array()
73            .fill_null(Scalar::from(Some(1)))
74            .unwrap();
75        let expected = ConstantArray::new(Scalar::from(1), 3).into_array();
76
77        assert!(!Scalar::from(1).dtype().is_nullable());
78
79        assert!(actual.dtype().is_nullable());
80
81        let actual_arrow = actual.clone().into_arrow_preferred().unwrap();
82        let expected_arrow = expected.clone().into_arrow_preferred().unwrap();
83        assert_eq!(
84            &actual_arrow,
85            &expected_arrow,
86            "{}, {}",
87            actual.display_values(),
88            expected.display_values()
89        );
90    }
91}