1use vortex_array::ArrayView;
5use vortex_array::ExecutionCtx;
6use vortex_array::scalar::Scalar;
7use vortex_array::vtable::OperationsVTable;
8use vortex_error::VortexResult;
9
10use crate::Sparse;
11
12impl OperationsVTable<Sparse> for Sparse {
13 fn scalar_at(
14 array: ArrayView<'_, Sparse>,
15 index: usize,
16 _ctx: &mut ExecutionCtx,
17 ) -> VortexResult<Scalar> {
18 Ok(array
19 .patches()
20 .get_patched(index)?
21 .unwrap_or_else(|| array.fill_scalar().clone()))
22 }
23}
24
25#[cfg(test)]
26mod tests {
27 use vortex_array::IntoArray;
28 use vortex_array::LEGACY_SESSION;
29 use vortex_array::VortexSessionExecute;
30 use vortex_array::arrays::PrimitiveArray;
31 use vortex_array::assert_arrays_eq;
32 use vortex_buffer::buffer;
33
34 use crate::Sparse;
35
36 #[test]
37 fn slice_partially_invalid() {
38 let mut ctx = LEGACY_SESSION.create_execution_ctx();
39 let values = buffer![0u64].into_array();
40 let indices = buffer![0u8].into_array();
41
42 let sparse = Sparse::try_new(indices, values, 1000, 999u64.into()).unwrap();
43 let sliced = sparse.slice(0..1000).unwrap();
44 let mut expected = vec![999u64; 1000];
45 expected[0] = 0;
46
47 let values = sliced.execute::<PrimitiveArray>(&mut ctx).unwrap();
48 assert_arrays_eq!(values, PrimitiveArray::from_iter(expected));
49 }
50}