@@ -929,6 +929,43 @@ impl ArrayData {
929
929
Ok ( ( ) )
930
930
}
931
931
932
+ /// Does a cheap sanity check that the `self.len` values in `buffer` are valid
933
+ /// offsets and sizes (of type T) into some other buffer of `values_length` bytes long
934
+ fn validate_offsets_and_sizes < T : ArrowNativeType + num:: Num + std:: fmt:: Display > (
935
+ & self ,
936
+ values_length : usize ,
937
+ ) -> Result < ( ) , ArrowError > {
938
+ let offsets: & [ T ] = self . typed_buffer ( 0 , self . len ) ?;
939
+ let sizes: & [ T ] = self . typed_buffer ( 1 , self . len ) ?;
940
+ for i in 0 ..values_length {
941
+ let size = sizes[ i] . to_usize ( ) . ok_or_else ( || {
942
+ ArrowError :: InvalidArgumentError ( format ! (
943
+ "Error converting size[{}] ({}) to usize for {}" ,
944
+ i, sizes[ i] , self . data_type
945
+ ) )
946
+ } ) ?;
947
+ let offset = offsets[ i] . to_usize ( ) . ok_or_else ( || {
948
+ ArrowError :: InvalidArgumentError ( format ! (
949
+ "Error converting offset[{}] ({}) to usize for {}" ,
950
+ i, offsets[ i] , self . data_type
951
+ ) )
952
+ } ) ?;
953
+ if offset > values_length {
954
+ return Err ( ArrowError :: InvalidArgumentError ( format ! (
955
+ "Size {} at index {} is offset {} is out of bounds for {}" ,
956
+ size, i, offset, self . data_type
957
+ ) ) ) ;
958
+ }
959
+ if size > values_length - offset {
960
+ return Err ( ArrowError :: InvalidArgumentError ( format ! (
961
+ "Size {} at index {} is larger than the remaining values for {}" ,
962
+ size, i, self . data_type
963
+ ) ) ) ;
964
+ }
965
+ }
966
+ Ok ( ( ) )
967
+ }
968
+
932
969
/// Validates the layout of `child_data` ArrayData structures
933
970
fn validate_child_data ( & self ) -> Result < ( ) , ArrowError > {
934
971
match & self . data_type {
@@ -942,6 +979,16 @@ impl ArrayData {
942
979
self . validate_offsets :: < i64 > ( values_data. len ) ?;
943
980
Ok ( ( ) )
944
981
}
982
+ DataType :: ListView ( field) => {
983
+ let values_data = self . get_single_valid_child_data ( field. data_type ( ) ) ?;
984
+ self . validate_offsets_and_sizes :: < i32 > ( values_data. len ) ?;
985
+ Ok ( ( ) )
986
+ }
987
+ DataType :: LargeListView ( field) => {
988
+ let values_data = self . get_single_valid_child_data ( field. data_type ( ) ) ?;
989
+ self . validate_offsets_and_sizes :: < i64 > ( values_data. len ) ?;
990
+ Ok ( ( ) )
991
+ }
945
992
DataType :: FixedSizeList ( field, list_size) => {
946
993
let values_data = self . get_single_valid_child_data ( field. data_type ( ) ) ?;
947
994
@@ -1546,9 +1593,8 @@ pub fn layout(data_type: &DataType) -> DataTypeLayout {
1546
1593
DataType :: BinaryView | DataType :: Utf8View => DataTypeLayout :: new_view ( ) ,
1547
1594
DataType :: FixedSizeList ( _, _) => DataTypeLayout :: new_nullable_empty ( ) , // all in child data
1548
1595
DataType :: List ( _) => DataTypeLayout :: new_fixed_width :: < i32 > ( ) ,
1549
- DataType :: ListView ( _) | DataType :: LargeListView ( _) => {
1550
- unimplemented ! ( "ListView/LargeListView not implemented" )
1551
- }
1596
+ DataType :: ListView ( _) => DataTypeLayout :: new_list_view :: < i32 > ( ) ,
1597
+ DataType :: LargeListView ( _) => DataTypeLayout :: new_list_view :: < i64 > ( ) ,
1552
1598
DataType :: LargeList ( _) => DataTypeLayout :: new_fixed_width :: < i64 > ( ) ,
1553
1599
DataType :: Map ( _, _) => DataTypeLayout :: new_fixed_width :: < i32 > ( ) ,
1554
1600
DataType :: Struct ( _) => DataTypeLayout :: new_nullable_empty ( ) , // all in child data,
@@ -1661,6 +1707,24 @@ impl DataTypeLayout {
1661
1707
variadic : true ,
1662
1708
}
1663
1709
}
1710
+
1711
+ /// Describes a list view type
1712
+ pub fn new_list_view < T > ( ) -> Self {
1713
+ Self {
1714
+ buffers : vec ! [
1715
+ BufferSpec :: FixedWidth {
1716
+ byte_width: mem:: size_of:: <T >( ) ,
1717
+ alignment: mem:: align_of:: <T >( ) ,
1718
+ } ,
1719
+ BufferSpec :: FixedWidth {
1720
+ byte_width: mem:: size_of:: <T >( ) ,
1721
+ alignment: mem:: align_of:: <T >( ) ,
1722
+ } ,
1723
+ ] ,
1724
+ can_contain_null_mask : true ,
1725
+ variadic : true ,
1726
+ }
1727
+ }
1664
1728
}
1665
1729
1666
1730
/// Layout specification for a single data type buffer
0 commit comments