vortex_array/arrays/constant/compute/
fill_null.rs1use 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}