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::ALPRDArraySlotsExt;
15use crate::alp_rd::ALPRD;
16
17impl SliceKernel for ALPRD {
18    fn slice(
19        array: ArrayView<'_, Self>,
20        range: Range<usize>,
21        ctx: &mut ExecutionCtx,
22    ) -> VortexResult<Option<ArrayRef>> {
23        let left_parts_exceptions = array
24            .left_parts_patches()
25            .map(|patches| patches.slice(range.clone(), ctx))
26            .transpose()?
27            .flatten();
28
29        // SAFETY: slicing components does not change the encoded values
30        Ok(Some(unsafe {
31            ALPRD::new_unchecked(
32                array.dtype().clone(),
33                array.left_parts().slice(range.clone())?,
34                array.left_parts_dictionary().clone(),
35                array.right_parts().slice(range)?,
36                array.right_bit_width(),
37                left_parts_exceptions,
38            )
39            .into_array()
40        }))
41    }
42}