vortex_array/arrays/bool/compute/
min_max.rs

1use 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        // If there are no slices, then all values are false
20        // if there is a single slice that covers the entire array, then all values are true
21        // otherwise, we have a mix of true and false values
22
23        let Some(slice) = slices.next() else {
24            // all false
25            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            // all true
32            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}