@@ -2,7 +2,7 @@ use arrow_array::builder::make_view;
22use arrow_buffer:: { BooleanBuffer , BufferBuilder } ;
33use vortex_buffer:: Buffer ;
44use vortex_dtype:: { match_each_native_ptype, DType , Nullability , PType } ;
5- use vortex_error:: { vortex_bail, vortex_panic , VortexResult } ;
5+ use vortex_error:: { vortex_bail, VortexResult } ;
66use vortex_scalar:: { BinaryScalar , BoolScalar , ExtScalar , Scalar , Utf8Scalar } ;
77
88use crate :: array:: constant:: ConstantArray ;
@@ -25,58 +25,45 @@ impl IntoCanonical for ConstantArray {
2525 } ,
2626 } ;
2727
28- if let Ok ( b) = BoolScalar :: try_from ( scalar) {
29- return Ok ( Canonical :: Bool ( BoolArray :: try_new (
30- if b. value ( ) . unwrap_or_default ( ) {
28+ Ok ( match self . dtype ( ) {
29+ DType :: Null => Canonical :: Null ( NullArray :: new ( self . len ( ) ) ) ,
30+ DType :: Bool ( ..) => Canonical :: Bool ( BoolArray :: try_new (
31+ if BoolScalar :: try_from ( scalar) ?. value ( ) . unwrap_or_default ( ) {
3132 BooleanBuffer :: new_set ( self . len ( ) )
3233 } else {
3334 BooleanBuffer :: new_unset ( self . len ( ) )
3435 } ,
3536 validity,
36- ) ?) ) ;
37- }
38-
39- if let Ok ( s) = Utf8Scalar :: try_from ( scalar) {
40- let value = s. value ( ) ;
41- let const_value = value. as_ref ( ) . map ( |v| v. as_bytes ( ) ) ;
42-
43- return canonical_byte_view ( const_value, self . dtype ( ) , self . len ( ) )
44- . map ( Canonical :: VarBinView ) ;
45- }
46-
47- if let Ok ( b) = BinaryScalar :: try_from ( scalar) {
48- let value = b. value ( ) ;
49- let const_value = value. as_ref ( ) . map ( |v| v. as_slice ( ) ) ;
50-
51- return canonical_byte_view ( const_value, self . dtype ( ) , self . len ( ) )
52- . map ( Canonical :: VarBinView ) ;
53- }
54-
55- if let Ok ( ptype) = PType :: try_from ( scalar. dtype ( ) ) {
56- return match_each_native_ptype ! ( ptype, |$P | {
57- Ok ( Canonical :: Primitive ( PrimitiveArray :: from_vec:: <$P >(
58- vec![ $P :: try_from( scalar) . unwrap_or_else( |_| $P :: default ( ) ) ; self . len( ) ] ,
59- validity,
60- ) ) )
61- } ) ;
62- }
63-
64- if matches ! ( self . dtype( ) , DType :: Null ) {
65- return Ok ( Canonical :: Null ( NullArray :: new ( self . len ( ) ) ) ) ;
66- }
67-
68- if let Ok ( s) = ExtScalar :: try_from ( scalar) {
69- let DType :: Extension ( ext_dtype) = s. dtype ( ) else {
70- vortex_panic ! ( "ExtScalar has a non-ext dtype {}" , s. dtype( ) ) ;
71- } ;
72-
73- let storage_dtype = ext_dtype. storage_dtype ( ) ;
74- let storage_scalar = Scalar :: new ( storage_dtype. clone ( ) , s. value ( ) . clone ( ) ) ;
75- let storage_array = ConstantArray :: new ( storage_scalar, self . len ( ) ) . into_array ( ) ;
76- return ExtensionArray :: new ( ext_dtype. clone ( ) , storage_array) . into_canonical ( ) ;
77- }
78-
79- vortex_bail ! ( "Unsupported scalar type {}" , self . dtype( ) )
37+ ) ?) ,
38+ DType :: Primitive ( ptype, ..) => {
39+ match_each_native_ptype ! ( ptype, |$P | {
40+ Canonical :: Primitive ( PrimitiveArray :: from_vec:: <$P >(
41+ vec![ $P :: try_from( scalar) . unwrap_or_else( |_| $P :: default ( ) ) ; self . len( ) ] ,
42+ validity,
43+ ) )
44+ } )
45+ }
46+ DType :: Utf8 ( _) => {
47+ let value = Utf8Scalar :: try_from ( scalar) ?. value ( ) ;
48+ let const_value = value. as_ref ( ) . map ( |v| v. as_bytes ( ) ) ;
49+ Canonical :: VarBinView ( canonical_byte_view ( const_value, self . dtype ( ) , self . len ( ) ) ?)
50+ }
51+ DType :: Binary ( _) => {
52+ let value = BinaryScalar :: try_from ( scalar) ?. value ( ) ;
53+ let const_value = value. as_ref ( ) . map ( |v| v. as_slice ( ) ) ;
54+ Canonical :: VarBinView ( canonical_byte_view ( const_value, self . dtype ( ) , self . len ( ) ) ?)
55+ }
56+ DType :: Struct ( ..) => vortex_bail ! ( "Unsupported scalar type {}" , self . dtype( ) ) ,
57+ DType :: List ( ..) => vortex_bail ! ( "Unsupported scalar type {}" , self . dtype( ) ) ,
58+ DType :: Extension ( ext_dtype) => {
59+ let s = ExtScalar :: try_from ( scalar) ?;
60+
61+ let storage_dtype = ext_dtype. storage_dtype ( ) ;
62+ let storage_scalar = Scalar :: new ( storage_dtype. clone ( ) , s. value ( ) . clone ( ) ) ;
63+ let storage_array = ConstantArray :: new ( storage_scalar, self . len ( ) ) . into_array ( ) ;
64+ ExtensionArray :: new ( ext_dtype. clone ( ) , storage_array) . into_canonical ( ) ?
65+ }
66+ } )
8067 }
8168}
8269
0 commit comments