Skip to main content

vortex_alp/alp_rd/
slice.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use std::ops::Range;
5
6use vortex_array::ArrayRef;
7use vortex_array::ArrayView;
8use vortex_array::ExecutionCtx;
9use vortex_array::IntoArray;
10use vortex_array::arrays::slice::SliceKernel;
11use vortex_error::VortexResult;
12
13use crate::ALPRDArrayExt;
14use crate::alp_rd::ALPRD;
15
16impl SliceKernel for ALPRD {
17    fn slice(
18        array: ArrayView<'_, Self>,
19        range: Range<usize>,
20        _ctx: &mut ExecutionCtx,
21    ) -> VortexResult<Option<ArrayRef>> {
22        let left_parts_exceptions = array
23            .left_parts_patches()
24            .map(|patches| patches.slice(range.clone()))
25            .transpose()?
26            .flatten();
27
28        // SAFETY: slicing components does not change the encoded values
29        Ok(Some(unsafe {
30            ALPRD::new_unchecked(
31                array.dtype().clone(),
32                array.left_parts().slice(range.clone())?,
33                array.left_parts_dictionary().clone(),
34                array.right_parts().slice(range)?,
35                array.right_bit_width(),
36                left_parts_exceptions,
37            )
38            .into_array()
39        }))
40    }
41}