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::Array;
8use crate::arrays::{BoolArray, BoolEncoding};
9use crate::compute::{MinMaxFn, MinMaxResult};
10
11impl MinMaxFn<&BoolArray> for BoolEncoding {
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 let mut slices = x.set_slices();
19 let Some(slice) = slices.next() else {
24 return Ok(Some(MinMaxResult {
26 min: Scalar::new(array.dtype().clone(), false.into()),
27 max: Scalar::new(array.dtype().clone(), false.into()),
28 }));
29 };
30 if slice.0 == 0 && slice.1 == x.len() {
31 return Ok(Some(MinMaxResult {
33 min: Scalar::new(array.dtype().clone(), true.into()),
34 max: Scalar::new(array.dtype().clone(), true.into()),
35 }));
36 };
37
38 Ok(Some(MinMaxResult {
39 min: Scalar::new(array.dtype().clone(), false.into()),
40 max: Scalar::new(array.dtype().clone(), true.into()),
41 }))
42 }
43}