Skip to main content

vortex_fastlanes/delta/vtable/
slice.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use std::cmp::min;
5use std::ops::Range;
6
7use vortex_array::ArrayRef;
8use vortex_array::ArrayView;
9use vortex_array::IntoArray;
10use vortex_array::arrays::slice::SliceReduce;
11use vortex_error::VortexResult;
12
13use crate::delta::array::DeltaArrayExt;
14use crate::delta::array::DeltaArraySlotsExt;
15use crate::delta::array::lane_count;
16use crate::delta::vtable::Delta;
17
18impl SliceReduce for Delta {
19    fn slice(array: ArrayView<'_, Self>, range: Range<usize>) -> VortexResult<Option<ArrayRef>> {
20        let physical_start = range.start + array.offset();
21        let physical_stop = range.end + array.offset();
22
23        let start_chunk = physical_start / 1024;
24        let stop_chunk = physical_stop.div_ceil(1024);
25
26        let bases = array.bases();
27        let deltas = array.deltas();
28        let lanes = lane_count(array.dtype().as_ptype());
29
30        let new_bases = bases
31            .slice(min(start_chunk * lanes, bases.len())..min(stop_chunk * lanes, bases.len()))?;
32
33        let new_deltas = deltas
34            .slice(min(start_chunk * 1024, deltas.len())..min(stop_chunk * 1024, deltas.len()))?;
35
36        Ok(Some(
37            Delta::try_new(new_bases, new_deltas, physical_start % 1024, range.len())?.into_array(),
38        ))
39    }
40}