vortex_array/arrays/varbinview/compute/
cast.rs

1use vortex_dtype::DType;
2use vortex_error::{VortexResult, vortex_bail};
3
4use crate::arrays::{VarBinViewArray, VarBinViewEncoding};
5use crate::compute::{CastKernel, CastKernelAdapter};
6use crate::{Array, ArrayRef, register_kernel};
7
8impl CastKernel for VarBinViewEncoding {
9    fn cast(&self, array: &VarBinViewArray, dtype: &DType) -> VortexResult<ArrayRef> {
10        if !array.dtype().eq_ignore_nullability(dtype) {
11            vortex_bail!("Cannot cast {} to {}", array.dtype(), dtype);
12        }
13
14        let new_nullability = dtype.nullability();
15        let new_validity = array.validity().clone().cast_nullability(new_nullability)?;
16        let new_dtype = array.dtype().with_nullability(new_nullability);
17        Ok(VarBinViewArray::try_new(
18            array.views().clone(),
19            array.buffers().to_vec(),
20            new_dtype,
21            new_validity,
22        )?
23        .into_array())
24    }
25}
26
27register_kernel!(CastKernelAdapter(VarBinViewEncoding).lift());
28
29#[cfg(test)]
30mod tests {
31    use rstest::rstest;
32    use vortex_dtype::{DType, Nullability};
33
34    use crate::arrays::VarBinViewArray;
35    use crate::compute::cast;
36
37    #[rstest]
38    #[case(
39        DType::Utf8(Nullability::Nullable),
40        DType::Utf8(Nullability::NonNullable)
41    )]
42    #[case(
43        DType::Binary(Nullability::Nullable),
44        DType::Binary(Nullability::NonNullable)
45    )]
46    #[case(
47        DType::Utf8(Nullability::NonNullable),
48        DType::Utf8(Nullability::Nullable)
49    )]
50    #[case(
51        DType::Binary(Nullability::NonNullable),
52        DType::Binary(Nullability::Nullable)
53    )]
54    fn try_cast_varbin_nullable(#[case] source: DType, #[case] target: DType) {
55        let varbin = VarBinViewArray::from_iter(vec![Some("a"), Some("b"), Some("c")], source);
56
57        let res = cast(&varbin, &target);
58        assert_eq!(res.unwrap().dtype(), &target);
59    }
60
61    #[rstest]
62    #[should_panic]
63    #[case(DType::Utf8(Nullability::Nullable))]
64    #[should_panic]
65    #[case(DType::Binary(Nullability::Nullable))]
66    fn try_cast_varbin_fail(#[case] source: DType) {
67        let non_nullable_source = source.as_nonnullable();
68        let varbin = VarBinViewArray::from_iter(vec![Some("a"), Some("b"), None], source);
69        cast(&varbin, &non_nullable_source).unwrap();
70    }
71}