@@ -43,35 +43,37 @@ pub(crate) fn acc_range(a: Option<Range<usize>>, b: Option<Range<usize>>) -> Opt
43
43
///
44
44
/// Returns a vector of `index[column_number]`.
45
45
///
46
- /// Returns an empty vector if this row group does not contain a
47
- /// [`ColumnIndex`].
46
+ /// Returns `None` if this row group does not contain a [`ColumnIndex`].
48
47
///
49
48
/// See [Page Index Documentation] for more details.
50
49
///
51
50
/// [Page Index Documentation]: https://github.com/apache/parquet-format/blob/master/PageIndex.md
52
51
pub fn read_columns_indexes < R : ChunkReader > (
53
52
reader : & R ,
54
53
chunks : & [ ColumnChunkMetaData ] ,
55
- ) -> Result < Vec < Index > , ParquetError > {
54
+ ) -> Result < Option < Vec < Index > > , ParquetError > {
56
55
let fetch = chunks
57
56
. iter ( )
58
57
. fold ( None , |range, c| acc_range ( range, c. column_index_range ( ) ) ) ;
59
58
60
59
let fetch = match fetch {
61
60
Some ( r) => r,
62
- None => return Ok ( vec ! [ Index :: NONE ; chunks . len ( ) ] ) ,
61
+ None => return Ok ( None ) ,
63
62
} ;
64
63
65
64
let bytes = reader. get_bytes ( fetch. start as _ , fetch. end - fetch. start ) ?;
66
65
let get = |r : Range < usize > | & bytes[ ( r. start - fetch. start ) ..( r. end - fetch. start ) ] ;
67
66
68
- chunks
69
- . iter ( )
70
- . map ( |c| match c. column_index_range ( ) {
71
- Some ( r) => decode_column_index ( get ( r) , c. column_type ( ) ) ,
72
- None => Ok ( Index :: NONE ) ,
73
- } )
74
- . collect ( )
67
+ Some (
68
+ chunks
69
+ . iter ( )
70
+ . map ( |c| match c. column_index_range ( ) {
71
+ Some ( r) => decode_column_index ( get ( r) , c. column_type ( ) ) ,
72
+ None => Ok ( Index :: NONE ) ,
73
+ } )
74
+ . collect ( ) ,
75
+ )
76
+ . transpose ( )
75
77
}
76
78
77
79
/// Reads [`OffsetIndex`], per-page [`PageLocation`] for all columns of a row
@@ -116,35 +118,37 @@ pub fn read_pages_locations<R: ChunkReader>(
116
118
///
117
119
/// Returns a vector of `offset_index[column_number]`.
118
120
///
119
- /// Returns an empty vector if this row group does not contain an
120
- /// [`OffsetIndex`].
121
+ /// Returns `None` if this row group does not contain an [`OffsetIndex`].
121
122
///
122
123
/// See [Page Index Documentation] for more details.
123
124
///
124
125
/// [Page Index Documentation]: https://github.com/apache/parquet-format/blob/master/PageIndex.md
125
126
pub fn read_offset_indexes < R : ChunkReader > (
126
127
reader : & R ,
127
128
chunks : & [ ColumnChunkMetaData ] ,
128
- ) -> Result < Vec < OffsetIndexMetaData > , ParquetError > {
129
+ ) -> Result < Option < Vec < OffsetIndexMetaData > > , ParquetError > {
129
130
let fetch = chunks
130
131
. iter ( )
131
132
. fold ( None , |range, c| acc_range ( range, c. offset_index_range ( ) ) ) ;
132
133
133
134
let fetch = match fetch {
134
135
Some ( r) => r,
135
- None => return Ok ( vec ! [ ] ) ,
136
+ None => return Ok ( None ) ,
136
137
} ;
137
138
138
139
let bytes = reader. get_bytes ( fetch. start as _ , fetch. end - fetch. start ) ?;
139
140
let get = |r : Range < usize > | & bytes[ ( r. start - fetch. start ) ..( r. end - fetch. start ) ] ;
140
141
141
- chunks
142
- . iter ( )
143
- . map ( |c| match c. offset_index_range ( ) {
144
- Some ( r) => decode_offset_index ( get ( r) ) ,
145
- None => Err ( general_err ! ( "missing offset index" ) ) ,
146
- } )
147
- . collect ( )
142
+ Some (
143
+ chunks
144
+ . iter ( )
145
+ . map ( |c| match c. offset_index_range ( ) {
146
+ Some ( r) => decode_offset_index ( get ( r) ) ,
147
+ None => Err ( general_err ! ( "missing offset index" ) ) ,
148
+ } )
149
+ . collect ( ) ,
150
+ )
151
+ . transpose ( )
148
152
}
149
153
150
154
pub ( crate ) fn decode_offset_index ( data : & [ u8 ] ) -> Result < OffsetIndexMetaData , ParquetError > {
0 commit comments