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::CastFn;
6use crate::{Array, ArrayRef};
7
8impl CastFn<&VarBinViewArray> 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
27#[cfg(test)]
28mod tests {
29    use rstest::rstest;
30    use vortex_dtype::{DType, Nullability};
31
32    use crate::arrays::VarBinViewArray;
33    use crate::compute::try_cast;
34
35    #[rstest]
36    #[case(
37        DType::Utf8(Nullability::Nullable),
38        DType::Utf8(Nullability::NonNullable)
39    )]
40    #[case(
41        DType::Binary(Nullability::Nullable),
42        DType::Binary(Nullability::NonNullable)
43    )]
44    #[case(
45        DType::Utf8(Nullability::NonNullable),
46        DType::Utf8(Nullability::Nullable)
47    )]
48    #[case(
49        DType::Binary(Nullability::NonNullable),
50        DType::Binary(Nullability::Nullable)
51    )]
52    fn try_cast_varbin_nullable(#[case] source: DType, #[case] target: DType) {
53        let varbin = VarBinViewArray::from_iter(vec![Some("a"), Some("b"), Some("c")], source);
54
55        let res = try_cast(&varbin, &target);
56        assert_eq!(res.unwrap().dtype(), &target);
57    }
58
59    #[rstest]
60    #[should_panic]
61    #[case(DType::Utf8(Nullability::Nullable))]
62    #[should_panic]
63    #[case(DType::Binary(Nullability::Nullable))]
64    fn try_cast_varbin_fail(#[case] source: DType) {
65        let non_nullable_source = source.as_nonnullable();
66        let varbin = VarBinViewArray::from_iter(vec![Some("a"), Some("b"), None], source);
67        try_cast(&varbin, &non_nullable_source).unwrap();
68    }
69}