@@ -257,7 +257,10 @@ impl VariantArray {
257257///
258258/// Finally, `v.typed_value.a.typed_value.b.value` is either NULL (`v:a.b` was an integer) or else a
259259/// variant value.
260+ #[ derive( Debug ) ]
260261pub struct ShreddedVariantFieldArray {
262+ /// Reference to the underlying StructArray
263+ inner : StructArray ,
261264 shredding_state : ShreddingState ,
262265}
263266
@@ -284,15 +287,17 @@ impl ShreddedVariantFieldArray {
284287 ///
285288 /// Currently, only `value` columns of type [`BinaryViewArray`] are supported.
286289 pub fn try_new ( inner : ArrayRef ) -> Result < Self , ArrowError > {
287- let Some ( inner ) = inner. as_struct_opt ( ) else {
290+ let Some ( inner_struct ) = inner. as_struct_opt ( ) else {
288291 return Err ( ArrowError :: InvalidArgumentError (
289- "Invalid VariantArray : requires StructArray as input" . to_string ( ) ,
292+ "Invalid ShreddedVariantFieldArray : requires StructArray as input" . to_string ( ) ,
290293 ) ) ;
291294 } ;
292295
293296 // Note this clone is cheap, it just bumps the ref count
297+ let inner = inner_struct. clone ( ) ;
294298 Ok ( Self {
295- shredding_state : ShreddingState :: try_new ( inner) ?,
299+ inner : inner. clone ( ) ,
300+ shredding_state : ShreddingState :: try_new ( & inner) ?,
296301 } )
297302 }
298303
@@ -310,6 +315,62 @@ impl ShreddedVariantFieldArray {
310315 pub fn typed_value_field ( & self ) -> Option < & ArrayRef > {
311316 self . shredding_state . typed_value_field ( )
312317 }
318+
319+ /// Returns a reference to the underlying [`StructArray`].
320+ pub fn inner ( & self ) -> & StructArray {
321+ & self . inner
322+ }
323+ }
324+
325+ impl Array for ShreddedVariantFieldArray {
326+ fn as_any ( & self ) -> & dyn Any {
327+ self
328+ }
329+
330+ fn to_data ( & self ) -> ArrayData {
331+ self . inner . to_data ( )
332+ }
333+
334+ fn into_data ( self ) -> ArrayData {
335+ self . inner . into_data ( )
336+ }
337+
338+ fn data_type ( & self ) -> & DataType {
339+ self . inner . data_type ( )
340+ }
341+
342+ fn slice ( & self , offset : usize , length : usize ) -> ArrayRef {
343+ let inner = self . inner . slice ( offset, length) ;
344+ let shredding_state = self . shredding_state . slice ( offset, length) ;
345+ Arc :: new ( Self {
346+ inner,
347+ shredding_state,
348+ } )
349+ }
350+
351+ fn len ( & self ) -> usize {
352+ self . inner . len ( )
353+ }
354+
355+ fn is_empty ( & self ) -> bool {
356+ self . inner . is_empty ( )
357+ }
358+
359+ fn offset ( & self ) -> usize {
360+ self . inner . offset ( )
361+ }
362+
363+ fn nulls ( & self ) -> Option < & NullBuffer > {
364+ self . inner . nulls ( )
365+ }
366+
367+ fn get_buffer_memory_size ( & self ) -> usize {
368+ self . inner . get_buffer_memory_size ( )
369+ }
370+
371+ fn get_array_memory_size ( & self ) -> usize {
372+ self . inner . get_array_memory_size ( )
373+ }
313374}
314375
315376/// Represents the shredding state of a [`VariantArray`]
0 commit comments