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::array::ArrayView;
8use crate::arrays::Constant;
9use crate::scalar::Scalar;
10use crate::scalar_fn::fns::fill_null::FillNullReduce;
11use crate::scalar_fn::fns::fill_null::fill_null_constant;
12
13impl FillNullReduce for Constant {
14    fn fill_null(
15        array: ArrayView<'_, Constant>,
16        fill_value: &Scalar,
17    ) -> VortexResult<Option<ArrayRef>> {
18        fill_null_constant(array, fill_value).map(Some)
19    }
20}
21
22#[cfg(test)]
23mod test {
24    use crate::IntoArray as _;
25    use crate::arrays::ConstantArray;
26    use crate::arrow::IntoArrowArray as _;
27    use crate::builtins::ArrayBuiltins;
28    use crate::dtype::DType;
29    use crate::dtype::Nullability;
30    use crate::dtype::PType;
31    use crate::scalar::Scalar;
32
33    #[test]
34    fn test_null() {
35        let actual = ConstantArray::new(Scalar::null_native::<i32>(), 3)
36            .into_array()
37            .fill_null(Scalar::from(1))
38            .unwrap();
39        let expected = ConstantArray::new(Scalar::from(1), 3).into_array();
40
41        assert!(!actual.dtype().is_nullable());
42
43        let actual_arrow = actual.clone().into_arrow_preferred().unwrap();
44        let expected_arrow = expected.clone().into_arrow_preferred().unwrap();
45        assert_eq!(
46            &actual_arrow,
47            &expected_arrow,
48            "{}, {}",
49            actual.display_values(),
50            expected.display_values()
51        );
52    }
53
54    #[test]
55    fn test_non_null() {
56        let actual = ConstantArray::new(Scalar::from(Some(1)), 3)
57            .into_array()
58            .fill_null(Scalar::from(1))
59            .unwrap();
60        let expected = ConstantArray::new(Scalar::from(1), 3).into_array();
61
62        assert!(!actual.dtype().is_nullable());
63
64        let actual_arrow = actual.clone().into_arrow_preferred().unwrap();
65        let expected_arrow = expected.clone().into_arrow_preferred().unwrap();
66        assert_eq!(
67            &actual_arrow,
68            &expected_arrow,
69            "{}, {}",
70            actual.display_values(),
71            expected.display_values()
72        );
73    }
74
75    #[test]
76    fn test_non_nullable_with_nullable() {
77        let actual = ConstantArray::new(Scalar::from(1), 3)
78            .into_array()
79            .fill_null(Scalar::new(
80                DType::Primitive(PType::I32, Nullability::Nullable),
81                Some(1.into()),
82            ))
83            .unwrap();
84        let expected = ConstantArray::new(Scalar::from(1), 3).into_array();
85
86        assert!(!Scalar::from(1).dtype().is_nullable());
87
88        assert!(actual.dtype().is_nullable());
89
90        let actual_arrow = actual.clone().into_arrow_preferred().unwrap();
91        let expected_arrow = expected.clone().into_arrow_preferred().unwrap();
92        assert_eq!(
93            &actual_arrow,
94            &expected_arrow,
95            "{}, {}",
96            actual.display_values(),
97            expected.display_values()
98        );
99    }
100}