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