vortex_array/arrays/bool/compute/
fill_null.rs1use vortex_error::VortexResult;
5use vortex_error::vortex_err;
6
7use crate::ArrayRef;
8use crate::ExecutionCtx;
9use crate::IntoArray;
10use crate::array::ArrayView;
11use crate::arrays::Bool;
12use crate::arrays::BoolArray;
13use crate::arrays::bool::BoolArrayExt;
14use crate::scalar::Scalar;
15use crate::scalar_fn::fns::fill_null::FillNullKernel;
16use crate::validity::Validity;
17
18impl FillNullKernel for Bool {
19 fn fill_null(
20 array: ArrayView<'_, Bool>,
21 fill_value: &Scalar,
22 ctx: &mut ExecutionCtx,
23 ) -> VortexResult<Option<ArrayRef>> {
24 let fill = fill_value
25 .as_bool()
26 .value()
27 .ok_or_else(|| vortex_err!("Fill value must be non null"))?;
28
29 Ok(Some(match array.validity()? {
30 Validity::Array(v) => {
31 let v_bool = v.execute::<BoolArray>(ctx)?;
32 let bool_buffer = if fill {
33 array.to_bit_buffer() | &!v_bool.to_bit_buffer()
34 } else {
35 array.to_bit_buffer() & v_bool.to_bit_buffer()
36 };
37 BoolArray::new(bool_buffer, fill_value.dtype().nullability().into()).into_array()
38 }
39 _ => unreachable!("checked in entry point"),
40 }))
41 }
42}
43
44#[cfg(test)]
45mod tests {
46 use rstest::rstest;
47 use vortex_buffer::BitBuffer;
48 use vortex_buffer::bitbuffer;
49
50 use crate::IntoArray;
51 use crate::arrays::BoolArray;
52 use crate::arrays::bool::BoolArrayExt;
53 use crate::builtins::ArrayBuiltins;
54 #[expect(deprecated)]
55 use crate::canonical::ToCanonical as _;
56 use crate::dtype::DType;
57 use crate::dtype::Nullability;
58 use crate::scalar::Scalar;
59 use crate::validity::Validity;
60
61 #[rstest]
62 #[case(true, bitbuffer![true, true, false, true])]
63 #[case(false, bitbuffer![true, false, false, false])]
64 fn bool_fill_null(#[case] fill_value: bool, #[case] expected: BitBuffer) {
65 let bool_array = BoolArray::new(
66 BitBuffer::from_iter([true, true, false, false]),
67 Validity::from_iter([true, false, true, false]),
68 );
69 #[expect(deprecated)]
70 let non_null_array = bool_array
71 .into_array()
72 .fill_null(Scalar::from(fill_value))
73 .unwrap()
74 .to_bool();
75 assert_eq!(non_null_array.to_bit_buffer(), expected);
76 assert_eq!(
77 non_null_array.dtype(),
78 &DType::Bool(Nullability::NonNullable)
79 );
80 }
81}