vortex_array/arrays/chunked/compute/
fill_null.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use 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        // SAFETY: fill_null applied to all chunks gives them same DType
19        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}