use std::ops::BitAnd;
use vortex_error::VortexResult;
use vortex_mask::AllOr;
use vortex_scalar::Scalar;
use crate::arrays::{BoolArray, BoolVTable};
use crate::compute::{SumKernel, SumKernelAdapter};
use crate::register_kernel;
impl SumKernel for BoolVTable {
fn sum(&self, array: &BoolArray) -> VortexResult<Scalar> {
let true_count: Option<u64> = match array.validity_mask().boolean_buffer() {
AllOr::All => {
Some(array.boolean_buffer().count_set_bits() as u64)
}
AllOr::None => {
unreachable!("All-invalid boolean array should have been handled by entry-point")
}
AllOr::Some(validity_mask) => Some(
array
.boolean_buffer()
.bitand(validity_mask)
.count_set_bits() as u64,
),
};
Ok(Scalar::from(true_count))
}
}
register_kernel!(SumKernelAdapter(BoolVTable).lift());