vortex_array/arrays/bool/compute/
sum.rs1use std::ops::BitAnd;
5
6use vortex_error::{VortexExpect, VortexResult};
7use vortex_mask::AllOr;
8use vortex_scalar::Scalar;
9
10use crate::arrays::{BoolArray, BoolVTable};
11use crate::compute::{SumKernel, SumKernelAdapter};
12use crate::register_kernel;
13
14impl SumKernel for BoolVTable {
15 fn sum(&self, array: &BoolArray, accumulator: &Scalar) -> VortexResult<Scalar> {
16 let true_count: Option<u64> = match array.validity_mask().bit_buffer() {
17 AllOr::All => {
18 Some(array.bit_buffer().true_count() as u64)
20 }
21 AllOr::None => {
22 unreachable!("All-invalid boolean array should have been handled by entry-point")
24 }
25 AllOr::Some(validity_mask) => {
26 Some(array.bit_buffer().bitand(validity_mask).true_count() as u64)
27 }
28 };
29
30 let accumulator = accumulator
31 .as_primitive()
32 .as_::<u64>()
33 .vortex_expect("cannot be null");
34 Ok(Scalar::from(
35 true_count.and_then(|tc| accumulator.checked_add(tc)),
36 ))
37 }
38}
39
40register_kernel!(SumKernelAdapter(BoolVTable).lift());