33
44//! Conversion logic from this "legacy" scalar crate to Vortex Vector scalars.
55
6+ use std:: ops:: Deref ;
67use std:: sync:: Arc ;
78
9+ use itertools:: Itertools ;
810use vortex_buffer:: Buffer ;
911use vortex_dtype:: DType ;
1012use vortex_dtype:: DecimalType ;
13+ use vortex_dtype:: NativeDecimalType ;
14+ use vortex_dtype:: PTypeDowncastExt ;
1115use vortex_dtype:: PrecisionScale ;
1216use vortex_dtype:: match_each_decimal_value_type;
1317use vortex_dtype:: match_each_native_ptype;
1418use vortex_error:: VortexExpect ;
19+ use vortex_error:: VortexResult ;
20+ use vortex_error:: vortex_ensure;
1521use vortex_mask:: Mask ;
1622use vortex_vector:: VectorMut ;
1723use vortex_vector:: VectorMutOps ;
24+ use vortex_vector:: VectorOps ;
1825use vortex_vector:: binaryview:: BinaryScalar ;
1926use vortex_vector:: binaryview:: StringScalar ;
2027use vortex_vector:: bool:: BoolScalar ;
@@ -30,6 +37,7 @@ use vortex_vector::primitive::PVector;
3037use vortex_vector:: struct_:: StructScalar ;
3138use vortex_vector:: struct_:: StructVector ;
3239
40+ use crate :: DecimalValue ;
3341use crate :: Scalar ;
3442
3543impl Scalar {
@@ -158,4 +166,115 @@ impl Scalar {
158166 DType :: Extension ( _) => self . as_extension ( ) . storage ( ) . to_vector_scalar ( ) ,
159167 }
160168 }
169+
170+ /// Convert a `vortex-vector` [`vortex_vector::Scalar`] into a `vortex-scalar` [`Scalar`].
171+ pub fn from_vector_scalar ( scalar : vortex_vector:: Scalar , dtype : & DType ) -> VortexResult < Self > {
172+ Ok ( match dtype {
173+ DType :: Null => Scalar :: null ( DType :: Null ) ,
174+ DType :: Bool ( n) => match scalar. as_bool ( ) . value ( ) {
175+ None => {
176+ vortex_ensure ! (
177+ n. is_nullable( ) ,
178+ "Cannot create null scalar for non-nullable dtype"
179+ ) ;
180+ Scalar :: null ( dtype. clone ( ) )
181+ }
182+ Some ( b) => Scalar :: bool ( b, * n) ,
183+ } ,
184+ DType :: Primitive ( ptype, n) => {
185+ match_each_native_ptype ! ( ptype, |T | {
186+ let pscalar = scalar. into_primitive( ) . downcast:: <T >( ) ;
187+ match pscalar. value( ) {
188+ None => {
189+ vortex_ensure!(
190+ n. is_nullable( ) ,
191+ "Cannot create null scalar for non-nullable dtype"
192+ ) ;
193+ Scalar :: null( dtype. clone( ) )
194+ }
195+ Some ( v) => Scalar :: primitive( v, * n) ,
196+ }
197+ } )
198+ }
199+ DType :: Decimal ( dec_type, n) => {
200+ let dec_scalar = scalar. into_decimal ( ) ;
201+ match_each_decimal_value_type ! (
202+ DecimalType :: smallest_decimal_value_type( dec_type) ,
203+ |D | {
204+ let dscalar = <D as NativeDecimalType >:: downcast( dec_scalar) ;
205+ match dscalar. value( ) {
206+ None => {
207+ vortex_ensure!(
208+ n. is_nullable( ) ,
209+ "Cannot create null scalar for non-nullable dtype"
210+ ) ;
211+ Scalar :: null( dtype. clone( ) )
212+ }
213+ Some ( v) => Scalar :: decimal( DecimalValue :: from( v) , dec_type. clone( ) , * n) ,
214+ }
215+ }
216+ )
217+ }
218+ DType :: Utf8 ( n) => match scalar. as_string ( ) . value ( ) {
219+ None => {
220+ vortex_ensure ! (
221+ n. is_nullable( ) ,
222+ "Cannot create null scalar for non-nullable dtype"
223+ ) ;
224+ Scalar :: null ( dtype. clone ( ) )
225+ }
226+ Some ( s) => Scalar :: utf8 ( s. clone ( ) , * n) ,
227+ } ,
228+ DType :: Binary ( n) => match scalar. as_binary ( ) . value ( ) {
229+ None => {
230+ vortex_ensure ! (
231+ n. is_nullable( ) ,
232+ "Cannot create null scalar for non-nullable dtype"
233+ ) ;
234+ Scalar :: null ( dtype. clone ( ) )
235+ }
236+ Some ( b) => Scalar :: binary ( b. clone ( ) , * n) ,
237+ } ,
238+ DType :: List ( elem_dtype, n) => {
239+ let elements = scalar. as_list ( ) . value ( ) . elements ( ) ;
240+ Scalar :: list (
241+ elem_dtype. clone ( ) ,
242+ ( 0 ..elements. len ( ) )
243+ . map ( |idx| elements. scalar_at ( idx) )
244+ . map ( |scalar| Scalar :: from_vector_scalar ( scalar, elem_dtype. deref ( ) ) )
245+ . try_collect ( ) ?,
246+ * n,
247+ )
248+ }
249+ DType :: FixedSizeList ( elem_dtype, size, n) => {
250+ let scalar = scalar. into_fixed_size_list ( ) ;
251+ let elements = scalar. value ( ) . elements ( ) ;
252+ vortex_ensure ! ( scalar. value( ) . element_size( ) == * size) ;
253+
254+ Scalar :: fixed_size_list (
255+ DType :: FixedSizeList ( elem_dtype. clone ( ) , * size, * n) ,
256+ ( 0 ..* size as usize )
257+ . map ( |idx| {
258+ Scalar :: from_vector_scalar ( elements. scalar_at ( idx) , elem_dtype. deref ( ) )
259+ } )
260+ . try_collect ( ) ?,
261+ * n,
262+ )
263+ }
264+ DType :: Struct ( fields, n) => Scalar :: struct_ (
265+ DType :: Struct ( fields. clone ( ) , * n) ,
266+ fields
267+ . fields ( )
268+ . zip ( scalar. into_struct ( ) . fields ( ) )
269+ . map ( |( field_dtype, field_scalar) | {
270+ Scalar :: from_vector_scalar ( field_scalar, & field_dtype)
271+ } )
272+ . try_collect ( ) ?,
273+ ) ,
274+ DType :: Extension ( ext_dtype) => Scalar :: extension (
275+ ext_dtype. clone ( ) ,
276+ Scalar :: from_vector_scalar ( scalar, ext_dtype. storage_dtype ( ) ) ?,
277+ ) ,
278+ } )
279+ }
161280}
0 commit comments