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;
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                // All-valid
22                Some(array.bit_buffer().true_count() as u64)
23            }
24            AllOr::None => {
25                // All-invalid
26                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());