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::ArrowSessionExt;
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 = LEGACY_SESSION
47            .arrow()
48            .execute_arrow(actual.clone(), None, &mut ctx)
49            .unwrap();
50        let expected_arrow = LEGACY_SESSION
51            .arrow()
52            .execute_arrow(expected.clone(), None, &mut ctx)
53            .unwrap();
54        assert_eq!(
55            &actual_arrow,
56            &expected_arrow,
57            "{}, {}",
58            actual.display_values(),
59            expected.display_values()
60        );
61    }
62
63    #[test]
64    fn test_non_null() {
65        let mut ctx = LEGACY_SESSION.create_execution_ctx();
66        let actual = ConstantArray::new(Scalar::from(Some(1)), 3)
67            .into_array()
68            .fill_null(Scalar::from(1))
69            .unwrap();
70        let expected = ConstantArray::new(Scalar::from(1), 3).into_array();
71
72        assert!(!actual.dtype().is_nullable());
73
74        let actual_arrow = LEGACY_SESSION
75            .arrow()
76            .execute_arrow(actual.clone(), None, &mut ctx)
77            .unwrap();
78        let expected_arrow = LEGACY_SESSION
79            .arrow()
80            .execute_arrow(expected.clone(), None, &mut ctx)
81            .unwrap();
82        assert_eq!(
83            &actual_arrow,
84            &expected_arrow,
85            "{}, {}",
86            actual.display_values(),
87            expected.display_values()
88        );
89    }
90
91    #[test]
92    fn test_non_nullable_with_nullable() {
93        let mut ctx = LEGACY_SESSION.create_execution_ctx();
94        let actual = ConstantArray::new(Scalar::from(1), 3)
95            .into_array()
96            .fill_null(Scalar::new(
97                DType::Primitive(PType::I32, Nullability::Nullable),
98                Some(1.into()),
99            ))
100            .unwrap();
101        let expected = ConstantArray::new(Scalar::from(1), 3).into_array();
102
103        assert!(!Scalar::from(1).dtype().is_nullable());
104
105        assert!(actual.dtype().is_nullable());
106
107        let actual_arrow = LEGACY_SESSION
108            .arrow()
109            .execute_arrow(actual.clone(), None, &mut ctx)
110            .unwrap();
111        let expected_arrow = LEGACY_SESSION
112            .arrow()
113            .execute_arrow(expected.clone(), None, &mut ctx)
114            .unwrap();
115        assert_eq!(
116            &actual_arrow,
117            &expected_arrow,
118            "{}, {}",
119            actual.display_values(),
120            expected.display_values()
121        );
122    }
123}