Skip to content

Commit 0cae3ab

Browse files
committed
[ADD] add support for shredded objects
1 parent 81270f1 commit 0cae3ab

File tree

5 files changed

+970
-37
lines changed

5 files changed

+970
-37
lines changed

parquet-variant-compute/src/variant_array.rs

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

Comments
 (0)