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::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}