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