vortex_array/arrays/bool/compute/
min_max.rs1use std::ops::BitAnd;
2
3use vortex_error::VortexResult;
4use vortex_mask::Mask;
5use vortex_scalar::Scalar;
6
7use crate::arrays::{BoolArray, BoolVTable};
8use crate::compute::{MinMaxKernel, MinMaxKernelAdapter, MinMaxResult};
9use crate::register_kernel;
10
11impl MinMaxKernel for BoolVTable {
12    fn min_max(&self, array: &BoolArray) -> VortexResult<Option<MinMaxResult>> {
13        let x = match array.validity_mask()? {
14            Mask::AllTrue(_) => array.boolean_buffer().clone(),
15            Mask::AllFalse(_) => return Ok(None),
16            Mask::Values(v) => array.boolean_buffer().bitand(v.boolean_buffer()),
17        };
18
19        let mut slices = x.set_slices();
22        let Some(slice) = slices.next() else {
27            return Ok(Some(MinMaxResult {
29                min: Scalar::new(array.dtype().clone(), false.into()),
30                max: Scalar::new(array.dtype().clone(), false.into()),
31            }));
32        };
33        if slice.0 == 0 && slice.1 == x.len() {
34            return Ok(Some(MinMaxResult {
36                min: Scalar::new(array.dtype().clone(), true.into()),
37                max: Scalar::new(array.dtype().clone(), true.into()),
38            }));
39        };
40
41        Ok(Some(MinMaxResult {
42            min: Scalar::new(array.dtype().clone(), false.into()),
43            max: Scalar::new(array.dtype().clone(), true.into()),
44        }))
45    }
46}
47
48register_kernel!(MinMaxKernelAdapter(BoolVTable).lift());