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