vortex_array/arrays/varbinview/compute/
cast.rs1use 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}