vortex_array/arrays/listview/compute/
cast.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use vortex_dtype::DType;
5use vortex_error::VortexResult;
6
7use crate::arrays::{ListViewArray, ListViewVTable};
8use crate::compute::{self, CastKernel, CastKernelAdapter};
9use crate::vtable::ValidityHelper;
10use crate::{ArrayRef, register_kernel};
11
12impl CastKernel for ListViewVTable {
13    fn cast(&self, array: &ListViewArray, dtype: &DType) -> VortexResult<Option<ArrayRef>> {
14        // Check if we're casting to a `List` type.
15        let Some(target_element_type) = dtype.as_list_element_opt() else {
16            return Ok(None);
17        };
18
19        // Cast the elements to the target element type.
20        let new_elements = compute::cast(array.elements(), target_element_type)?;
21        let validity = array
22            .validity()
23            .clone()
24            .cast_nullability(dtype.nullability(), array.len())?;
25
26        // SAFETY: Since `cast` is length-preserving, all of the invariants remain the same.
27        Ok(Some(
28            unsafe {
29                ListViewArray::new_unchecked(
30                    new_elements,
31                    array.offsets().clone(),
32                    array.sizes().clone(),
33                    validity,
34                )
35            }
36            .to_array(),
37        ))
38    }
39}
40
41register_kernel!(CastKernelAdapter(ListViewVTable).lift());