@@ -250,7 +250,10 @@ impl VariantArray {
250250///
251251/// Finally, `v.typed_value.a.typed_value.b.value` is either NULL (`v:a.b` was an integer) or else a
252252/// variant value.
253+ #[ derive( Debug ) ]
253254pub struct ShreddedVariantFieldArray {
255+ /// Reference to the underlying StructArray
256+ inner : StructArray ,
254257 shredding_state : ShreddingState ,
255258}
256259
@@ -277,15 +280,17 @@ impl ShreddedVariantFieldArray {
277280 ///
278281 /// Currently, only `value` columns of type [`BinaryViewArray`] are supported.
279282 pub fn try_new ( inner : ArrayRef ) -> Result < Self , ArrowError > {
280- let Some ( inner ) = inner. as_struct_opt ( ) else {
283+ let Some ( inner_struct ) = inner. as_struct_opt ( ) else {
281284 return Err ( ArrowError :: InvalidArgumentError (
282- "Invalid VariantArray : requires StructArray as input" . to_string ( ) ,
285+ "Invalid ShreddedVariantFieldArray : requires StructArray as input" . to_string ( ) ,
283286 ) ) ;
284287 } ;
285288
286289 // Note this clone is cheap, it just bumps the ref count
290+ let inner = inner_struct. clone ( ) ;
287291 Ok ( Self {
288- shredding_state : ShreddingState :: try_new ( inner) ?,
292+ inner : inner. clone ( ) ,
293+ shredding_state : ShreddingState :: try_new ( & inner) ?,
289294 } )
290295 }
291296
@@ -303,6 +308,62 @@ impl ShreddedVariantFieldArray {
303308 pub fn typed_value_field ( & self ) -> Option < & ArrayRef > {
304309 self . shredding_state . typed_value_field ( )
305310 }
311+
312+ /// Returns a reference to the underlying [`StructArray`].
313+ pub fn inner ( & self ) -> & StructArray {
314+ & self . inner
315+ }
316+ }
317+
318+ impl Array for ShreddedVariantFieldArray {
319+ fn as_any ( & self ) -> & dyn Any {
320+ self
321+ }
322+
323+ fn to_data ( & self ) -> ArrayData {
324+ self . inner . to_data ( )
325+ }
326+
327+ fn into_data ( self ) -> ArrayData {
328+ self . inner . into_data ( )
329+ }
330+
331+ fn data_type ( & self ) -> & DataType {
332+ self . inner . data_type ( )
333+ }
334+
335+ fn slice ( & self , offset : usize , length : usize ) -> ArrayRef {
336+ let inner = self . inner . slice ( offset, length) ;
337+ let shredding_state = self . shredding_state . slice ( offset, length) ;
338+ Arc :: new ( Self {
339+ inner,
340+ shredding_state,
341+ } )
342+ }
343+
344+ fn len ( & self ) -> usize {
345+ self . inner . len ( )
346+ }
347+
348+ fn is_empty ( & self ) -> bool {
349+ self . inner . is_empty ( )
350+ }
351+
352+ fn offset ( & self ) -> usize {
353+ self . inner . offset ( )
354+ }
355+
356+ fn nulls ( & self ) -> Option < & NullBuffer > {
357+ self . inner . nulls ( )
358+ }
359+
360+ fn get_buffer_memory_size ( & self ) -> usize {
361+ self . inner . get_buffer_memory_size ( )
362+ }
363+
364+ fn get_array_memory_size ( & self ) -> usize {
365+ self . inner . get_array_memory_size ( )
366+ }
306367}
307368
308369/// Represents the shredding state of a [`VariantArray`]
0 commit comments