vortex_array/arrays/varbinview/compute/
cast.rs1use std::sync::Arc;
5
6use vortex_error::VortexResult;
7
8use crate::ArrayRef;
9use crate::IntoArray;
10use crate::array::ArrayView;
11use crate::arrays::VarBinView;
12use crate::arrays::VarBinViewArray;
13use crate::dtype::DType;
14use crate::scalar_fn::fns::cast::CastReduce;
15
16impl CastReduce for VarBinView {
17 fn cast(array: ArrayView<'_, VarBinView>, dtype: &DType) -> VortexResult<Option<ArrayRef>> {
18 if !array.dtype().eq_ignore_nullability(dtype) {
19 return Ok(None);
20 }
21
22 let new_nullability = dtype.nullability();
23 let new_validity = array
24 .validity()?
25 .cast_nullability(new_nullability, array.len())?;
26 let new_dtype = array.dtype().with_nullability(new_nullability);
27
28 unsafe {
30 Ok(Some(
31 VarBinViewArray::new_handle_unchecked(
32 array.views_handle().clone(),
33 Arc::clone(array.data_buffers()),
34 new_dtype,
35 new_validity,
36 )
37 .into_array(),
38 ))
39 }
40 }
41}
42
43#[cfg(test)]
44mod tests {
45 use rstest::rstest;
46
47 use crate::IntoArray;
48 use crate::arrays::VarBinViewArray;
49 use crate::builtins::ArrayBuiltins;
50 use crate::compute::conformance::cast::test_cast_conformance;
51 use crate::dtype::DType;
52 use crate::dtype::Nullability;
53
54 #[rstest]
55 #[case(
56 DType::Utf8(Nullability::Nullable),
57 DType::Utf8(Nullability::NonNullable)
58 )]
59 #[case(
60 DType::Binary(Nullability::Nullable),
61 DType::Binary(Nullability::NonNullable)
62 )]
63 #[case(
64 DType::Utf8(Nullability::NonNullable),
65 DType::Utf8(Nullability::Nullable)
66 )]
67 #[case(
68 DType::Binary(Nullability::NonNullable),
69 DType::Binary(Nullability::Nullable)
70 )]
71 fn try_cast_varbin_nullable(#[case] source: DType, #[case] target: DType) {
72 let varbin = VarBinViewArray::from_iter(vec![Some("a"), Some("b"), Some("c")], source);
73
74 let res = varbin.into_array().cast(target.clone());
75 assert_eq!(res.unwrap().dtype(), &target);
76 }
77
78 #[rstest]
79 #[should_panic]
80 #[case(DType::Utf8(Nullability::Nullable))]
81 #[should_panic]
82 #[case(DType::Binary(Nullability::Nullable))]
83 fn try_cast_varbin_fail(#[case] source: DType) {
84 let non_nullable_source = source.as_nonnullable();
85 let varbin = VarBinViewArray::from_iter(vec![Some("a"), Some("b"), None], source);
86 varbin.into_array().cast(non_nullable_source).unwrap();
87 }
88
89 #[rstest]
90 #[case(VarBinViewArray::from_iter(vec![Some("hello"), Some("world"), Some("test")], DType::Utf8(Nullability::NonNullable)))]
91 #[case(VarBinViewArray::from_iter(vec![Some("hello"), None, Some("world")], DType::Utf8(Nullability::Nullable)))]
92 #[case(VarBinViewArray::from_iter(vec![Some(b"binary".as_slice()), Some(b"data".as_slice())], DType::Binary(Nullability::NonNullable)))]
93 #[case(VarBinViewArray::from_iter(vec![Some(b"test".as_slice()), None], DType::Binary(Nullability::Nullable)))]
94 #[case(VarBinViewArray::from_iter(vec![Some("single")], DType::Utf8(Nullability::NonNullable)))]
95 #[case(VarBinViewArray::from_iter(vec![Some("very long string that exceeds the inline size to test view functionality with multiple buffers")], DType::Utf8(Nullability::NonNullable)))]
96 fn test_cast_varbinview_conformance(#[case] array: VarBinViewArray) {
97 test_cast_conformance(&array.into_array());
98 }
99}