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