@@ -6,20 +6,20 @@ use std::fmt::Formatter;
66use std:: hash:: Hasher ;
77use std:: sync:: Arc ;
88
9- use smallvec:: smallvec;
109use vortex_error:: VortexExpect ;
1110use vortex_error:: VortexResult ;
1211use vortex_error:: vortex_ensure;
1312
1413use crate :: ArrayEq ;
1514use crate :: ArrayHash ;
1615use crate :: ArrayRef ;
16+ use crate :: ArraySlots ;
1717use crate :: EqMode ;
1818use crate :: IntoArray ;
1919use crate :: array:: Array ;
2020use crate :: array:: ArrayParts ;
21- use crate :: array:: ArrayView ;
2221use crate :: array:: TypedArrayRef ;
22+ use crate :: array_slots;
2323use crate :: arrays:: ListView ;
2424use crate :: arrays:: ListViewArray ;
2525use crate :: arrays:: listview:: ListViewArrayExt ;
@@ -28,10 +28,12 @@ use crate::dtype::DType;
2828use crate :: dtype:: MapDType ;
2929use crate :: validity:: Validity ;
3030
31- /// The one child slot holding a [`ListViewArray`] of map entries.
32- pub ( super ) const ENTRIES_SLOT : usize = 0 ;
33- pub ( super ) const NUM_SLOTS : usize = 1 ;
34- pub ( super ) const SLOT_NAMES : [ & str ; NUM_SLOTS ] = [ "entries" ] ;
31+ #[ array_slots( Map ) ]
32+ pub struct MapSlots {
33+ /// The list-view storage of non-null `{key, value}` entry structs.
34+ #[ slot( 0 ) ]
35+ pub entries : ArrayRef ,
36+ }
3537
3638/// Encoding-specific metadata for [`crate::arrays::MapArray`].
3739///
@@ -56,6 +58,12 @@ impl ArrayHash for MapData {
5658 fn array_hash < H : Hasher > ( & self , _state : & mut H , _accuracy : EqMode ) { }
5759}
5860
61+ impl MapData {
62+ pub ( crate ) fn make_slots ( entries : ArrayRef ) -> ArraySlots {
63+ MapSlots { entries } . into_slots ( )
64+ }
65+ }
66+
5967/// The logical and physical inputs used to construct a [`crate::arrays::MapArray`].
6068pub struct MapDataParts {
6169 /// The key/value type and sortedness assertion for the map.
@@ -65,28 +73,20 @@ pub struct MapDataParts {
6573}
6674
6775/// Accessors for the canonical map representation.
68- pub trait MapArrayExt : TypedArrayRef < Map > {
69- /// Returns the list-view storage of map entry structs.
70- fn entries ( & self ) -> ArrayView < ' _ , ListView > {
71- self . as_ref ( ) . slots ( ) [ ENTRIES_SLOT ]
72- . as_ref ( )
73- . vortex_expect ( "MapArray entries slot" )
74- . as_ :: < ListView > ( )
75- }
76-
76+ pub trait MapArrayExt : MapArraySlotsExt {
7777 /// Returns the entry structs for one map row.
7878 fn entries_at ( & self , index : usize ) -> VortexResult < ArrayRef > {
79- self . entries ( ) . list_elements_at ( index)
79+ self . entries ( ) . as_ :: < ListView > ( ) . list_elements_at ( index)
8080 }
8181
8282 /// Returns the number of entries in one map row.
8383 fn entry_count_at ( & self , index : usize ) -> usize {
84- self . entries ( ) . size_at ( index)
84+ self . entries ( ) . as_ :: < ListView > ( ) . size_at ( index)
8585 }
8686
8787 /// Returns the outer map validity delegated from the entries list-view.
8888 fn map_validity ( & self ) -> Validity {
89- self . entries ( ) . listview_validity ( )
89+ self . entries ( ) . as_ :: < ListView > ( ) . listview_validity ( )
9090 }
9191
9292 /// Returns this map's key/value type information.
@@ -125,8 +125,8 @@ impl Array<Map> {
125125 let nullability = entries. nullability ( ) ;
126126 let dtype = DType :: Map ( map_dtype, nullability) ;
127127 let len = entries. len ( ) ;
128- let parts = ArrayParts :: new ( Map , dtype , len , MapData )
129- . with_slots ( smallvec ! [ Some ( entries . into_array ( ) ) ] ) ;
128+ let slots = MapData :: make_slots ( entries . into_array ( ) ) ;
129+ let parts = ArrayParts :: new ( Map , dtype , len , MapData ) . with_slots ( slots ) ;
130130 Self :: try_from_parts ( parts)
131131 }
132132
@@ -141,8 +141,8 @@ impl Array<Map> {
141141 let nullability = entries. nullability ( ) ;
142142 let dtype = DType :: Map ( map_dtype, nullability) ;
143143 let len = entries. len ( ) ;
144- let parts = ArrayParts :: new ( Map , dtype , len , MapData )
145- . with_slots ( smallvec ! [ Some ( entries . into_array ( ) ) ] ) ;
144+ let slots = MapData :: make_slots ( entries . into_array ( ) ) ;
145+ let parts = ArrayParts :: new ( Map , dtype , len , MapData ) . with_slots ( slots ) ;
146146 unsafe { Self :: from_parts_unchecked ( parts) }
147147 }
148148
@@ -153,7 +153,7 @@ impl Array<Map> {
153153 . as_map_opt ( )
154154 . vortex_expect ( "MapArray requires a map dtype" )
155155 . clone ( ) ;
156- let entries = self . entries ( ) . into_owned ( ) ;
156+ let entries = self . entries ( ) . clone ( ) . downcast :: < ListView > ( ) ;
157157 MapDataParts { map_dtype, entries }
158158 }
159159}
0 commit comments