Skip to content

Commit f8c455d

Browse files
committed
[ADD] add support for shredded objects
1 parent 769247c commit f8c455d

File tree

5 files changed

+969
-38
lines changed

5 files changed

+969
-38
lines changed

parquet-variant-compute/src/variant_array.rs

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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)]
253254
pub 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

Comments
 (0)