vortex_array/arrays/chunked/compute/
compare.rs1use 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 (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 vortex_buffer::Buffer;
43
44 use super::*;
45 use crate::IntoArray;
46
47 #[test]
48 fn empty_compare() {
49 let base = Buffer::<u32>::empty().into_array();
50 let chunked =
51 ChunkedArray::try_new(vec![base.clone(), base.clone()], base.dtype().clone()).unwrap();
52 let chunked_empty = ChunkedArray::try_new(vec![], base.dtype().clone()).unwrap();
53
54 let r = compare(chunked.as_ref(), chunked_empty.as_ref(), Operator::Eq).unwrap();
55
56 assert!(r.is_empty());
57 }
58}