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