@@ -33,7 +33,7 @@ use crate::arrow::schema::{parquet_to_arrow_schema_and_fields, ParquetField};
3333use crate :: arrow:: { parquet_to_arrow_field_levels, FieldLevels , ProjectionMask } ;
3434use crate :: column:: page:: { PageIterator , PageReader } ;
3535#[ cfg( feature = "encryption" ) ]
36- use crate :: encryption:: decrypt:: { CryptoContext , FileDecryptionProperties } ;
36+ use crate :: encryption:: decrypt:: FileDecryptionProperties ;
3737use crate :: errors:: { ParquetError , Result } ;
3838use crate :: file:: metadata:: { ParquetMetaData , ParquetMetaDataReader } ;
3939use crate :: file:: reader:: { ChunkReader , SerializedPageReader } ;
@@ -682,13 +682,11 @@ struct ReaderPageIterator<T: ChunkReader> {
682682 metadata : Arc < ParquetMetaData > ,
683683}
684684
685- impl < T : ChunkReader + ' static > Iterator for ReaderPageIterator < T > {
686- type Item = Result < Box < dyn PageReader > > ;
687-
688- fn next ( & mut self ) -> Option < Self :: Item > {
689- let rg_idx = self . row_groups . next ( ) ?;
685+ impl < T : ChunkReader + ' static > ReaderPageIterator < T > {
686+ /// Return the next SerializedPageReader
687+ fn next_page_reader ( & mut self , rg_idx : usize ) -> Result < SerializedPageReader < T > > {
690688 let rg = self . metadata . row_group ( rg_idx) ;
691- let meta = rg. column ( self . column_idx ) ;
689+ let column_chunk_metadata = rg. column ( self . column_idx ) ;
692690 let offset_index = self . metadata . offset_index ( ) ;
693691 // `offset_index` may not exist and `i[rg_idx]` will be empty.
694692 // To avoid `i[rg_idx][self.column_idx`] panic, we need to filter out empty `i[rg_idx]`.
@@ -698,32 +696,25 @@ impl<T: ChunkReader + 'static> Iterator for ReaderPageIterator<T> {
698696 let total_rows = rg. num_rows ( ) as usize ;
699697 let reader = self . reader . clone ( ) ;
700698
701- #[ cfg( feature = "encryption" ) ]
702- let crypto_context = if let Some ( file_decryptor) = self . metadata . file_decryptor ( ) {
703- match meta. crypto_metadata ( ) {
704- Some ( crypto_metadata) => {
705- match CryptoContext :: for_column (
706- file_decryptor,
707- crypto_metadata,
708- rg_idx,
709- self . column_idx ,
710- ) {
711- Ok ( context) => Some ( Arc :: new ( context) ) ,
712- Err ( err) => return Some ( Err ( err) ) ,
713- }
714- }
715- None => None ,
716- }
717- } else {
718- None
719- } ;
720-
721- let ret = SerializedPageReader :: new ( reader, meta, total_rows, page_locations) ;
699+ SerializedPageReader :: new ( reader, column_chunk_metadata, total_rows, page_locations) ?
700+ . add_crypto_context (
701+ rg_idx,
702+ self . column_idx ,
703+ self . metadata . as_ref ( ) ,
704+ column_chunk_metadata,
705+ )
706+ }
707+ }
722708
723- # [ cfg ( feature = "encryption" ) ]
724- let ret = ret . map ( |reader| reader . with_crypto_context ( crypto_context ) ) ;
709+ impl < T : ChunkReader + ' static > Iterator for ReaderPageIterator < T > {
710+ type Item = Result < Box < dyn PageReader > > ;
725711
726- Some ( ret. map ( |x| Box :: new ( x) as _ ) )
712+ fn next ( & mut self ) -> Option < Self :: Item > {
713+ let rg_idx = self . row_groups . next ( ) ?;
714+ let page_reader = self
715+ . next_page_reader ( rg_idx)
716+ . map ( |page_reader| Box :: new ( page_reader) as _ ) ;
717+ Some ( page_reader)
727718 }
728719}
729720
0 commit comments