vortex_array/arrays/chunked/compute/
compare.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use vortex_error::VortexResult;
5
6use crate::arrays::{ChunkedArray, ChunkedVTable};
7use crate::builders::{ArrayBuilder, BoolBuilder};
8use crate::compute::{CompareKernel, CompareKernelAdapter, Operator, compare};
9use crate::{Array, ArrayRef, register_kernel};
10
11impl CompareKernel for ChunkedVTable {
12    fn compare(
13        &self,
14        lhs: &ChunkedArray,
15        rhs: &dyn Array,
16        operator: Operator,
17    ) -> VortexResult<Option<ArrayRef>> {
18        let mut idx = 0;
19
20        let mut bool_builder = BoolBuilder::with_capacity(
21            // nullable <= non-nullable
22            (lhs.dtype().is_nullable() || rhs.dtype().is_nullable()).into(),
23            lhs.len(),
24        );
25
26        for chunk in lhs.non_empty_chunks() {
27            let sliced = rhs.slice(idx, idx + chunk.len());
28            let cmp_result = compare(chunk, &sliced, operator)?;
29
30            bool_builder.extend_from_array(&cmp_result)?;
31            idx += chunk.len();
32        }
33
34        Ok(Some(bool_builder.finish()))
35    }
36}
37
38register_kernel!(CompareKernelAdapter(ChunkedVTable).lift());
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43    use crate::IntoArray;
44    use crate::arrays::PrimitiveArray;
45
46    #[test]
47    fn empty_compare() {
48        let base = PrimitiveArray::from_iter(Vec::<u32>::new()).into_array();
49        let chunked =
50            ChunkedArray::try_new(vec![base.clone(), base.clone()], base.dtype().clone()).unwrap();
51        let chunked_empty = ChunkedArray::try_new(vec![], base.dtype().clone()).unwrap();
52
53        let r = compare(chunked.as_ref(), chunked_empty.as_ref(), Operator::Eq).unwrap();
54
55        assert!(r.is_empty());
56    }
57}