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