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::scalar::Scalar;
10use crate::scalar_fn::fns::fill_null::FillNullReduce;
11use crate::scalar_fn::fns::fill_null::fill_null_constant;
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::dtype::DType;
26    use crate::dtype::Nullability;
27    use crate::dtype::PType;
28    use crate::scalar::Scalar;
29
30    #[test]
31    fn test_null() {
32        let actual = ConstantArray::new(Scalar::null_native::<i32>(), 3)
33            .into_array()
34            .fill_null(Scalar::from(1))
35            .unwrap();
36        let expected = ConstantArray::new(Scalar::from(1), 3).into_array();
37
38        assert!(!actual.dtype().is_nullable());
39
40        let actual_arrow = actual.clone().into_arrow_preferred().unwrap();
41        let expected_arrow = expected.clone().into_arrow_preferred().unwrap();
42        assert_eq!(
43            &actual_arrow,
44            &expected_arrow,
45            "{}, {}",
46            actual.display_values(),
47            expected.display_values()
48        );
49    }
50
51    #[test]
52    fn test_non_null() {
53        let actual = ConstantArray::new(Scalar::from(Some(1)), 3)
54            .into_array()
55            .fill_null(Scalar::from(1))
56            .unwrap();
57        let expected = ConstantArray::new(Scalar::from(1), 3).into_array();
58
59        assert!(!actual.dtype().is_nullable());
60
61        let actual_arrow = actual.clone().into_arrow_preferred().unwrap();
62        let expected_arrow = expected.clone().into_arrow_preferred().unwrap();
63        assert_eq!(
64            &actual_arrow,
65            &expected_arrow,
66            "{}, {}",
67            actual.display_values(),
68            expected.display_values()
69        );
70    }
71
72    #[test]
73    fn test_non_nullable_with_nullable() {
74        let actual = ConstantArray::new(Scalar::from(1), 3)
75            .into_array()
76            .fill_null(Scalar::new(
77                DType::Primitive(PType::I32, Nullability::Nullable),
78                Some(1.into()),
79            ))
80            .unwrap();
81        let expected = ConstantArray::new(Scalar::from(1), 3).into_array();
82
83        assert!(!Scalar::from(1).dtype().is_nullable());
84
85        assert!(actual.dtype().is_nullable());
86
87        let actual_arrow = actual.clone().into_arrow_preferred().unwrap();
88        let expected_arrow = expected.clone().into_arrow_preferred().unwrap();
89        assert_eq!(
90            &actual_arrow,
91            &expected_arrow,
92            "{}, {}",
93            actual.display_values(),
94            expected.display_values()
95        );
96    }
97}