vortex_array/arrays/chunked/compute/
scalar_at.rs1use vortex_error::VortexResult;
2use vortex_scalar::Scalar;
3
4use crate::arrays::{ChunkedArray, ChunkedEncoding};
5use crate::compute::{ScalarAtFn, scalar_at};
6
7impl ScalarAtFn<&ChunkedArray> for ChunkedEncoding {
8 fn scalar_at(&self, array: &ChunkedArray, index: usize) -> VortexResult<Scalar> {
9 let (chunk_index, chunk_offset) = array.find_chunk_idx(index);
10 scalar_at(array.chunk(chunk_index)?, chunk_offset)
11 }
12}
13
14#[cfg(test)]
15mod tests {
16 use vortex_buffer::Buffer;
17 use vortex_dtype::{DType, Nullability, PType};
18
19 use crate::IntoArray;
20 use crate::array::Array;
21 use crate::arrays::{ChunkedArray, PrimitiveArray};
22 use crate::compute::scalar_at;
23
24 #[test]
25 fn empty_children_both_sides() {
26 let array = ChunkedArray::try_new(
27 vec![
28 Buffer::<u64>::empty().into_array(),
29 Buffer::<u64>::empty().into_array(),
30 PrimitiveArray::from_iter([1u64, 2]).into_array(),
31 Buffer::<u64>::empty().into_array(),
32 Buffer::<u64>::empty().into_array(),
33 ],
34 DType::Primitive(PType::U64, Nullability::NonNullable),
35 )
36 .unwrap();
37 assert_eq!(scalar_at(&array, 0).unwrap(), 1u64.into());
38 assert_eq!(scalar_at(&array, 1).unwrap(), 2u64.into());
39 }
40
41 #[test]
42 fn empty_children_trailing() {
43 let array = ChunkedArray::try_new(
44 vec![
45 PrimitiveArray::from_iter([1u64, 2]).into_array(),
46 Buffer::<u64>::empty().into_array(),
47 Buffer::<u64>::empty().into_array(),
48 PrimitiveArray::from_iter([3u64, 4]).into_array(),
49 ],
50 DType::Primitive(PType::U64, Nullability::NonNullable),
51 )
52 .unwrap();
53 assert_eq!(scalar_at(&array, 0).unwrap(), 1u64.into());
54 assert_eq!(scalar_at(&array, 1).unwrap(), 2u64.into());
55 assert_eq!(scalar_at(&array, 2).unwrap(), 3u64.into());
56 assert_eq!(scalar_at(&array, 3).unwrap(), 4u64.into());
57 }
58
59 #[test]
60 fn empty_children_leading() {
61 let array = ChunkedArray::try_new(
62 vec![
63 Buffer::<u64>::empty().into_array(),
64 Buffer::<u64>::empty().into_array(),
65 PrimitiveArray::from_iter([1u64, 2]).into_array(),
66 PrimitiveArray::from_iter([3u64, 4]).into_array(),
67 ],
68 DType::Primitive(PType::U64, Nullability::NonNullable),
69 )
70 .unwrap();
71 assert_eq!(scalar_at(&array, 0).unwrap(), 1u64.into());
72 assert_eq!(scalar_at(&array, 1).unwrap(), 2u64.into());
73 assert_eq!(scalar_at(&array, 2).unwrap(), 3u64.into());
74 assert_eq!(scalar_at(&array, 3).unwrap(), 4u64.into());
75 }
76}