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::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}