@@ -7,6 +7,7 @@ use std::fmt::Formatter;
77use std:: hash:: Hasher ;
88
99use prost:: Message ;
10+ use vortex_array:: AnyCanonical ;
1011use vortex_array:: Array ;
1112use vortex_array:: ArrayEq ;
1213use vortex_array:: ArrayHash ;
@@ -18,17 +19,18 @@ use vortex_array::ExecutionCtx;
1819use vortex_array:: ExecutionResult ;
1920use vortex_array:: IntoArray ;
2021use vortex_array:: Precision ;
21- use vortex_array:: TypedArrayRef ;
22+ use vortex_array:: array_slots;
23+ use vortex_array:: arrays:: Primitive ;
2224use vortex_array:: arrays:: TemporalArray ;
2325use vortex_array:: buffer:: BufferHandle ;
2426use vortex_array:: dtype:: DType ;
2527use vortex_array:: dtype:: Nullability ;
2628use vortex_array:: dtype:: PType ;
29+ use vortex_array:: require_child;
2730use vortex_array:: serde:: ArrayChildren ;
2831use vortex_array:: vtable:: VTable ;
2932use vortex_array:: vtable:: ValidityChild ;
3033use vortex_array:: vtable:: ValidityVTableFromChild ;
31- use vortex_error:: VortexExpect ;
3234use vortex_error:: VortexResult ;
3335use vortex_error:: vortex_bail;
3436use vortex_error:: vortex_ensure;
@@ -104,16 +106,8 @@ impl VTable for DateTimeParts {
104106 len : usize ,
105107 slots : & [ Option < ArrayRef > ] ,
106108 ) -> VortexResult < ( ) > {
107- let days = slots[ DAYS_SLOT ]
108- . as_ref ( )
109- . vortex_expect ( "DateTimePartsArray days slot" ) ;
110- let seconds = slots[ SECONDS_SLOT ]
111- . as_ref ( )
112- . vortex_expect ( "DateTimePartsArray seconds slot" ) ;
113- let subseconds = slots[ SUBSECONDS_SLOT ]
114- . as_ref ( )
115- . vortex_expect ( "DateTimePartsArray subseconds slot" ) ;
116- DateTimePartsData :: validate ( dtype, days, seconds, subseconds, len)
109+ let slots = DateTimePartsSlotsView :: from_slots ( slots) ;
110+ DateTimePartsData :: validate ( dtype, slots. days , slots. seconds , slots. subseconds , len)
117111 }
118112
119113 fn nbuffers ( _array : ArrayView < ' _ , Self > ) -> usize {
@@ -181,12 +175,20 @@ impl VTable for DateTimeParts {
181175 }
182176
183177 fn slot_name ( _array : ArrayView < ' _ , Self > , idx : usize ) -> String {
184- SLOT_NAMES [ idx] . to_string ( )
178+ DateTimePartsSlots :: NAMES [ idx] . to_string ( )
185179 }
186180
187181 fn execute ( array : Array < Self > , ctx : & mut ExecutionCtx ) -> VortexResult < ExecutionResult > {
182+ let array = require_child ! ( array, array. days( ) , DateTimePartsSlots :: DAYS => Primitive ) ;
183+ let array =
184+ require_child ! ( array, array. seconds( ) , DateTimePartsSlots :: SECONDS => AnyCanonical ) ;
185+ let array = require_child ! ( array, array. subseconds( ) , DateTimePartsSlots :: SUBSECONDS => AnyCanonical ) ;
186+
187+ let dtype = array. dtype ( ) . clone ( ) ;
188+ let parts = array. into_parts ( ) ;
189+
188190 Ok ( ExecutionResult :: done (
189- decode_to_temporal ( & array , ctx) ?. into_array ( ) ,
191+ decode_to_temporal ( parts , & dtype , ctx) ?. into_array ( ) ,
190192 ) )
191193 }
192194
@@ -208,46 +210,58 @@ impl VTable for DateTimeParts {
208210 }
209211}
210212
211- /// The days component of the datetime, stored as an integer array.
212- pub ( super ) const DAYS_SLOT : usize = 0 ;
213- /// The seconds component of the datetime (within the day).
214- pub ( super ) const SECONDS_SLOT : usize = 1 ;
215- /// The sub-second component of the datetime.
216- pub ( super ) const SUBSECONDS_SLOT : usize = 2 ;
217- pub ( super ) const NUM_SLOTS : usize = 3 ;
218- pub ( super ) const SLOT_NAMES : [ & str ; NUM_SLOTS ] = [ "days" , "seconds" , "subseconds" ] ;
213+ #[ array_slots( DateTimeParts ) ]
214+ pub struct DateTimePartsSlots {
215+ /// The days component of the datetime, stored as an integer array.
216+ pub days : ArrayRef ,
217+ /// The seconds component of the datetime (within the day).
218+ pub seconds : ArrayRef ,
219+ /// The sub-second component of the datetime.
220+ pub subseconds : ArrayRef ,
221+ }
219222
220223#[ derive( Clone , Debug ) ]
221224pub struct DateTimePartsData { }
222225
223- impl Display for DateTimePartsData {
224- fn fmt ( & self , _f : & mut Formatter < ' _ > ) -> std :: fmt :: Result {
225- Ok ( ( ) )
226- }
226+ pub struct DateTimePartsParts {
227+ pub days : ArrayRef ,
228+ pub seconds : ArrayRef ,
229+ pub subseconds : ArrayRef ,
227230}
228231
229- pub trait DateTimePartsArrayExt : TypedArrayRef < DateTimeParts > {
230- fn days ( & self ) -> & ArrayRef {
231- self . as_ref ( ) . slots ( ) [ DAYS_SLOT ]
232- . as_ref ( )
233- . vortex_expect ( "DateTimePartsArray days slot" )
234- }
232+ pub trait DateTimePartsOwnedExt {
233+ fn into_parts ( self ) -> DateTimePartsParts ;
234+ }
235235
236- fn seconds ( & self ) -> & ArrayRef {
237- self . as_ref ( ) . slots ( ) [ SECONDS_SLOT ]
238- . as_ref ( )
239- . vortex_expect ( "DateTimePartsArray seconds slot" )
236+ impl DateTimePartsOwnedExt for Array < DateTimeParts > {
237+ fn into_parts ( self ) -> DateTimePartsParts {
238+ match self . try_into_parts ( ) {
239+ Ok ( parts) => {
240+ let slots = DateTimePartsSlots :: from_slots ( parts. slots ) ;
241+ DateTimePartsParts {
242+ days : slots. days ,
243+ seconds : slots. seconds ,
244+ subseconds : slots. subseconds ,
245+ }
246+ }
247+ Err ( array) => {
248+ let view = DateTimePartsSlotsView :: from_slots ( array. as_ref ( ) . slots ( ) ) ;
249+ DateTimePartsParts {
250+ days : view. days . clone ( ) ,
251+ seconds : view. seconds . clone ( ) ,
252+ subseconds : view. subseconds . clone ( ) ,
253+ }
254+ }
255+ }
240256 }
257+ }
241258
242- fn subseconds ( & self ) -> & ArrayRef {
243- self . as_ref ( ) . slots ( ) [ SUBSECONDS_SLOT ]
244- . as_ref ( )
245- . vortex_expect ( "DateTimePartsArray subseconds slot" )
259+ impl Display for DateTimePartsData {
260+ fn fmt ( & self , _f : & mut Formatter < ' _ > ) -> std:: fmt:: Result {
261+ Ok ( ( ) )
246262 }
247263}
248264
249- impl < T : TypedArrayRef < DateTimeParts > > DateTimePartsArrayExt for T { }
250-
251265#[ derive( Clone , Debug ) ]
252266pub struct DateTimeParts ;
253267
0 commit comments