Skip to content

Commit 04680b1

Browse files
committed
Move ListLikeArray to arrow-array to be shared with json writer and parquet unshredding
1 parent c129c7c commit 04680b1

File tree

7 files changed

+58
-55
lines changed

7 files changed

+58
-55
lines changed

arrow-array/src/array/fixed_size_list_array.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,18 @@ unsafe impl Array for FixedSizeListArray {
530530
}
531531
}
532532

533+
impl super::ListLikeArray for FixedSizeListArray {
534+
fn values(&self) -> &ArrayRef {
535+
self.values()
536+
}
537+
538+
fn element_range(&self, index: usize) -> std::ops::Range<usize> {
539+
let value_length = self.value_length().as_usize();
540+
let offset = index * value_length;
541+
offset..(offset + value_length)
542+
}
543+
}
544+
533545
impl ArrayAccessor for FixedSizeListArray {
534546
type Item = ArrayRef;
535547

arrow-array/src/array/list_array.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,19 @@ unsafe impl<OffsetSize: OffsetSizeTrait> Array for GenericListArray<OffsetSize>
622622
}
623623
}
624624

625+
impl<OffsetSize: OffsetSizeTrait> super::ListLikeArray for GenericListArray<OffsetSize> {
626+
fn values(&self) -> &ArrayRef {
627+
self.values()
628+
}
629+
630+
fn element_range(&self, index: usize) -> std::ops::Range<usize> {
631+
let offsets = self.offsets();
632+
let start = offsets[index].as_usize();
633+
let end = offsets[index + 1].as_usize();
634+
start..end
635+
}
636+
}
637+
625638
impl<OffsetSize: OffsetSizeTrait> ArrayAccessor for &GenericListArray<OffsetSize> {
626639
type Item = ArrayRef;
627640

arrow-array/src/array/list_view_array.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,18 @@ unsafe impl<OffsetSize: OffsetSizeTrait> Array for GenericListViewArray<OffsetSi
488488
}
489489
}
490490

491+
impl<OffsetSize: OffsetSizeTrait> super::ListLikeArray for GenericListViewArray<OffsetSize> {
492+
fn values(&self) -> &ArrayRef {
493+
self.values()
494+
}
495+
496+
fn element_range(&self, index: usize) -> std::ops::Range<usize> {
497+
let offset = self.value_offsets()[index].as_usize();
498+
let size = self.value_sizes()[index].as_usize();
499+
offset..(offset + size)
500+
}
501+
}
502+
491503
impl<OffsetSize: OffsetSizeTrait> std::fmt::Debug for GenericListViewArray<OffsetSize> {
492504
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
493505
let prefix = OffsetSize::PREFIX;

arrow-array/src/array/mod.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -667,6 +667,21 @@ impl<'a> BinaryArrayType<'a> for &'a FixedSizeBinaryArray {
667667
}
668668
}
669669

670+
/// A trait for Arrow list-like arrays, abstracting over
671+
/// [`GenericListArray`], [`GenericListViewArray`], and [`FixedSizeListArray`].
672+
///
673+
/// This trait provides a uniform interface for accessing the child values and
674+
/// computing the element range for a given index, regardless of the underlying
675+
/// list layout (offsets, offsets+sizes, or fixed-size).
676+
pub trait ListLikeArray: Array {
677+
/// Returns the child values array.
678+
fn values(&self) -> &ArrayRef;
679+
680+
/// Returns the start and end indices into the values array for the list
681+
/// element at `index`.
682+
fn element_range(&self, index: usize) -> std::ops::Range<usize>;
683+
}
684+
670685
impl PartialEq for dyn Array + '_ {
671686
fn eq(&self, other: &Self) -> bool {
672687
self.to_data().eq(&other.to_data())

parquet-variant-compute/src/arrow_to_variant.rs

Lines changed: 2 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
// under the License.
1717

1818
use arrow::array::{
19-
Array, ArrayRef, AsArray, FixedSizeListArray, GenericBinaryArray, GenericListArray,
20-
GenericListViewArray, GenericStringArray, OffsetSizeTrait, PrimitiveArray,
19+
Array, AsArray, FixedSizeListArray, GenericBinaryArray, GenericListArray, GenericListViewArray,
20+
GenericStringArray, ListLikeArray, OffsetSizeTrait, PrimitiveArray,
2121
};
2222
use arrow::compute::{CastOptions, kernels::cast};
2323
use arrow::datatypes::{
@@ -32,7 +32,6 @@ use parquet_variant::{
3232
VariantDecimal16, VariantDecimalType,
3333
};
3434
use std::collections::HashMap;
35-
use std::ops::Range;
3635

3736
// ============================================================================
3837
// Row-oriented builders for efficient Arrow-to-Variant conversion
@@ -552,54 +551,6 @@ impl<'a, L: ListLikeArray> ListArrowToVariantBuilder<'a, L> {
552551
}
553552
}
554553

555-
/// Trait for list-like arrays that can provide element ranges
556-
pub(crate) trait ListLikeArray: Array {
557-
/// Get the values array
558-
fn values(&self) -> &ArrayRef;
559-
560-
/// Get the start and end indices for a list element
561-
fn element_range(&self, index: usize) -> Range<usize>;
562-
}
563-
564-
impl<O: OffsetSizeTrait> ListLikeArray for GenericListArray<O> {
565-
fn values(&self) -> &ArrayRef {
566-
self.values()
567-
}
568-
569-
fn element_range(&self, index: usize) -> Range<usize> {
570-
let offsets = self.offsets();
571-
let start = offsets[index].as_usize();
572-
let end = offsets[index + 1].as_usize();
573-
start..end
574-
}
575-
}
576-
577-
impl<O: OffsetSizeTrait> ListLikeArray for GenericListViewArray<O> {
578-
fn values(&self) -> &ArrayRef {
579-
self.values()
580-
}
581-
582-
fn element_range(&self, index: usize) -> Range<usize> {
583-
let offsets = self.value_offsets();
584-
let sizes = self.value_sizes();
585-
let offset = offsets[index].as_usize();
586-
let size = sizes[index].as_usize();
587-
offset..(offset + size)
588-
}
589-
}
590-
591-
impl ListLikeArray for FixedSizeListArray {
592-
fn values(&self) -> &ArrayRef {
593-
self.values()
594-
}
595-
596-
fn element_range(&self, index: usize) -> Range<usize> {
597-
let value_length = self.value_length().as_usize();
598-
let offset = index * value_length;
599-
offset..(offset + value_length)
600-
}
601-
}
602-
603554
/// Struct builder for StructArray
604555
pub(crate) struct StructArrowToVariantBuilder<'a> {
605556
struct_array: &'a arrow::array::StructArray,

parquet-variant-compute/src/shred_variant.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -652,10 +652,10 @@ impl VariantSchemaNode {
652652
mod tests {
653653
use super::*;
654654
use crate::VariantArrayBuilder;
655-
use crate::arrow_to_variant::ListLikeArray;
656655
use arrow::array::{
657656
Array, BinaryViewArray, FixedSizeBinaryArray, Float64Array, GenericListArray,
658-
GenericListViewArray, Int64Array, ListArray, OffsetSizeTrait, PrimitiveArray, StringArray,
657+
GenericListViewArray, Int64Array, ListArray, ListLikeArray, OffsetSizeTrait,
658+
PrimitiveArray, StringArray,
659659
};
660660
use arrow::datatypes::{
661661
ArrowPrimitiveType, DataType, Field, Fields, Int64Type, TimeUnit, UnionFields, UnionMode,

parquet-variant-compute/src/unshred_variant.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717

1818
//! Module for unshredding VariantArray by folding typed_value columns back into the value column.
1919
20-
use crate::arrow_to_variant::ListLikeArray;
2120
use crate::{BorrowedShreddingState, VariantArray, VariantValueArrayBuilder};
2221
use arrow::array::{
2322
Array, AsArray as _, BinaryViewArray, BooleanArray, FixedSizeBinaryArray, FixedSizeListArray,
24-
GenericListArray, GenericListViewArray, PrimitiveArray, StringArray, StructArray,
23+
GenericListArray, GenericListViewArray, ListLikeArray, PrimitiveArray, StringArray,
24+
StructArray,
2525
};
2626
use arrow::buffer::NullBuffer;
2727
use arrow::datatypes::{

0 commit comments

Comments
 (0)