1use std::ops::Range;
5
6use vortex_array::ArrayRef;
7use vortex_array::ExecutionCtx;
8use vortex_array::IntoArray;
9use vortex_array::arrays::ConstantArray;
10use vortex_array::arrays::SliceKernel;
11use vortex_error::VortexResult;
12
13use crate::SparseArray;
14use crate::SparseVTable;
15
16impl SliceKernel for SparseVTable {
17 fn slice(
18 array: &SparseArray,
19 range: Range<usize>,
20 _ctx: &mut ExecutionCtx,
21 ) -> VortexResult<Option<ArrayRef>> {
22 let Some(new_patches) = array.patches().slice(range.clone())? else {
23 return Ok(Some(
24 ConstantArray::new(array.fill_scalar().clone(), range.len()).into_array(),
25 ));
26 };
27
28 if new_patches.array_len() == new_patches.values().len() {
31 return Ok(Some(new_patches.into_values()));
32 }
33
34 Ok(Some(
38 unsafe { SparseArray::new_unchecked(new_patches, array.fill_scalar().clone()) }
39 .into_array(),
40 ))
41 }
42}