vortex_array/arrays/bool/compute/
sum.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use 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                // All-valid
19                Some(array.bit_buffer().true_count() as u64)
20            }
21            AllOr::None => {
22                // All-invalid
23                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());