vortex_array/arrays/chunked/compute/
fill_null.rs1use vortex_error::VortexResult;
5use vortex_scalar::Scalar;
6
7use crate::ArrayRef;
8use crate::IntoArray;
9use crate::arrays::ChunkedArray;
10use crate::arrays::ChunkedVTable;
11use crate::compute::FillNullKernel;
12use crate::compute::FillNullKernelAdapter;
13use crate::compute::fill_null;
14use crate::register_kernel;
15
16impl FillNullKernel for ChunkedVTable {
17 fn fill_null(&self, array: &ChunkedArray, fill_value: &Scalar) -> VortexResult<ArrayRef> {
18 unsafe {
20 Ok(ChunkedArray::new_unchecked(
21 array
22 .chunks()
23 .iter()
24 .map(|c| fill_null(c, fill_value))
25 .collect::<VortexResult<Vec<_>>>()?,
26 fill_value.dtype().clone(),
27 )
28 .into_array())
29 }
30 }
31}
32
33register_kernel!(FillNullKernelAdapter(ChunkedVTable).lift());
34
35#[cfg(test)]
36mod tests {
37 use vortex_buffer::BitBuffer;
38 use vortex_dtype::DType;
39 use vortex_dtype::Nullability;
40
41 use crate::array::Array;
42 use crate::arrays::BoolArray;
43 use crate::arrays::ChunkedArray;
44 use crate::compute::fill_null;
45 use crate::validity::Validity;
46
47 #[test]
48 fn fill_null_chunks() {
49 let chunked = ChunkedArray::try_new(
50 vec![
51 BoolArray::from_bit_buffer(BitBuffer::new_set(5), Validity::AllInvalid).to_array(),
52 BoolArray::from_bit_buffer(BitBuffer::new_set(5), Validity::AllValid).to_array(),
53 ],
54 DType::Bool(Nullability::Nullable),
55 )
56 .unwrap();
57
58 let filled = fill_null(chunked.as_ref(), &false.into()).unwrap();
59 assert_eq!(*filled.dtype(), DType::Bool(Nullability::NonNullable));
60 }
61}