vortex_array/arrays/bool/compute/
sum.rs

1use std::ops::BitAnd;
2
3use vortex_error::VortexResult;
4use vortex_mask::AllOr;
5use vortex_scalar::Scalar;
6
7use crate::Array;
8use crate::arrays::{BoolArray, BoolEncoding};
9use crate::compute::SumFn;
10
11impl SumFn<&BoolArray> for BoolEncoding {
12    fn sum(&self, array: &BoolArray) -> VortexResult<Scalar> {
13        let true_count: Option<u64> = match array.validity_mask()?.boolean_buffer() {
14            AllOr::All => {
15                // All-valid
16                Some(array.boolean_buffer().count_set_bits() as u64)
17            }
18            AllOr::None => {
19                // All-invalid
20                unreachable!("All-invalid boolean array should have been handled by entry-point")
21            }
22            AllOr::Some(validity_mask) => Some(
23                array
24                    .boolean_buffer()
25                    .bitand(validity_mask)
26                    .count_set_bits() as u64,
27            ),
28        };
29        Ok(Scalar::from(true_count))
30    }
31}