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