Skip to main content

vortex_alp/alp/
ops.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use vortex_array::ArrayView;
5use vortex_array::ExecutionCtx;
6use vortex_array::ProbeState;
7use vortex_array::scalar::Scalar;
8use vortex_array::vtable::OperationsVTable;
9use vortex_error::VortexExpect;
10use vortex_error::VortexResult;
11use vortex_error::vortex_err;
12
13use crate::ALP;
14use crate::ALPArrayExt;
15use crate::ALPFloat;
16use crate::ALPSlots;
17use crate::match_each_alp_float_ptype;
18
19impl OperationsVTable<ALP> for ALP {
20    type ProbeState = ();
21
22    fn probe_scalar(
23        state: &mut ProbeState<'_, ALP>,
24        index: usize,
25        ctx: &mut ExecutionCtx,
26    ) -> VortexResult<Scalar> {
27        if !state.is_valid(index, ctx)? {
28            return Ok(Scalar::null(state.array().dtype().clone()));
29        }
30        let array = state.array();
31        if let Some(patches) = array.patches()
32            && let Some(patch) = patches.get_patched(index, ctx)?
33        {
34            return patch.cast(array.dtype());
35        }
36
37        let encoded_val = state
38            .slot(ALPSlots::ENCODED)?
39            .ok_or_else(|| vortex_err!("ALP encoded slot is missing"))?
40            .execute_scalar(index, ctx)?;
41
42        Ok(match_each_alp_float_ptype!(array.dtype().as_ptype(), |T| {
43            let encoded_val: <T as ALPFloat>::ALPInt =
44                (&encoded_val).try_into().vortex_expect("invalid ALPInt");
45            Scalar::primitive(
46                <T as ALPFloat>::decode_single(encoded_val, array.exponents()),
47                array.dtype().nullability(),
48            )
49        }))
50    }
51
52    fn scalar_at(
53        array: ArrayView<'_, ALP>,
54        index: usize,
55        ctx: &mut ExecutionCtx,
56    ) -> VortexResult<Scalar> {
57        Self::probe_scalar(&mut ProbeState::once(array), index, ctx)
58    }
59}