@@ -329,13 +329,18 @@ impl ParquetMetaDataReader {
329329 return Ok ( ( ) ) ;
330330 }
331331
332- self . load_page_index ( fetch, remainder) . await
332+ self . load_page_index_with_remainder ( fetch, remainder) . await
333333 }
334334
335335 /// Asynchronously fetch the page index structures when a [`ParquetMetaData`] has already
336336 /// been obtained. See [`Self::new_with_metadata()`].
337337 #[ cfg( feature = "async" ) ]
338- pub async fn load_page_index < F : MetadataFetch > (
338+ pub async fn load_page_index < F : MetadataFetch > ( & mut self , fetch : F ) -> Result < ( ) > {
339+ self . load_page_index_with_remainder ( fetch, None ) . await
340+ }
341+
342+ #[ cfg( feature = "async" ) ]
343+ async fn load_page_index_with_remainder < F : MetadataFetch > (
339344 & mut self ,
340345 mut fetch : F ,
341346 remainder : Option < ( usize , Bytes ) > ,
@@ -836,7 +841,7 @@ mod async_tests {
836841
837842 struct MetadataFetchFn < F > ( F ) ;
838843
839- impl < F , Fut > MetadataFetch for MetadataFetchFn < F >
844+ impl < ' a , F , Fut > MetadataFetch for & ' a mut MetadataFetchFn < F >
840845 where
841846 F : FnMut ( Range < usize > ) -> Fut + Send ,
842847 Fut : Future < Output = Result < Bytes > > + Send ,
@@ -865,74 +870,68 @@ mod async_tests {
865870 let expected = expected. file_metadata ( ) . schema ( ) ;
866871 let fetch_count = AtomicUsize :: new ( 0 ) ;
867872
868- let mut fetch = |range| {
873+ let fetch = |range| {
869874 fetch_count. fetch_add ( 1 , Ordering :: SeqCst ) ;
870875 futures:: future:: ready ( read_range ( & mut file, range) )
871876 } ;
872877
873- let input = MetadataFetchFn ( & mut fetch) ;
878+ let mut f = MetadataFetchFn ( fetch) ;
874879 let actual = ParquetMetaDataReader :: new ( )
875- . load_and_finish ( input , len)
880+ . load_and_finish ( & mut f , len)
876881 . await
877882 . unwrap ( ) ;
878883 assert_eq ! ( actual. file_metadata( ) . schema( ) , expected) ;
879884 assert_eq ! ( fetch_count. load( Ordering :: SeqCst ) , 2 ) ;
880885
881886 // Metadata hint too small - below footer size
882887 fetch_count. store ( 0 , Ordering :: SeqCst ) ;
883- let input = MetadataFetchFn ( & mut fetch) ;
884888 let actual = ParquetMetaDataReader :: new ( )
885889 . with_prefetch_hint ( Some ( 7 ) )
886- . load_and_finish ( input , len)
890+ . load_and_finish ( & mut f , len)
887891 . await
888892 . unwrap ( ) ;
889893 assert_eq ! ( actual. file_metadata( ) . schema( ) , expected) ;
890894 assert_eq ! ( fetch_count. load( Ordering :: SeqCst ) , 2 ) ;
891895
892896 // Metadata hint too small
893897 fetch_count. store ( 0 , Ordering :: SeqCst ) ;
894- let input = MetadataFetchFn ( & mut fetch) ;
895898 let actual = ParquetMetaDataReader :: new ( )
896899 . with_prefetch_hint ( Some ( 10 ) )
897- . load_and_finish ( input , len)
900+ . load_and_finish ( & mut f , len)
898901 . await
899902 . unwrap ( ) ;
900903 assert_eq ! ( actual. file_metadata( ) . schema( ) , expected) ;
901904 assert_eq ! ( fetch_count. load( Ordering :: SeqCst ) , 2 ) ;
902905
903906 // Metadata hint too large
904907 fetch_count. store ( 0 , Ordering :: SeqCst ) ;
905- let input = MetadataFetchFn ( & mut fetch) ;
906908 let actual = ParquetMetaDataReader :: new ( )
907909 . with_prefetch_hint ( Some ( 500 ) )
908- . load_and_finish ( input , len)
910+ . load_and_finish ( & mut f , len)
909911 . await
910912 . unwrap ( ) ;
911913 assert_eq ! ( actual. file_metadata( ) . schema( ) , expected) ;
912914 assert_eq ! ( fetch_count. load( Ordering :: SeqCst ) , 1 ) ;
913915
914916 // Metadata hint exactly correct
915917 fetch_count. store ( 0 , Ordering :: SeqCst ) ;
916- let input = MetadataFetchFn ( & mut fetch) ;
917918 let actual = ParquetMetaDataReader :: new ( )
918919 . with_prefetch_hint ( Some ( 428 ) )
919- . load_and_finish ( input , len)
920+ . load_and_finish ( & mut f , len)
920921 . await
921922 . unwrap ( ) ;
922923 assert_eq ! ( actual. file_metadata( ) . schema( ) , expected) ;
923924 assert_eq ! ( fetch_count. load( Ordering :: SeqCst ) , 1 ) ;
924925
925- let input = MetadataFetchFn ( & mut fetch) ;
926926 let err = ParquetMetaDataReader :: new ( )
927- . load_and_finish ( input , 4 )
927+ . load_and_finish ( & mut f , 4 )
928928 . await
929929 . unwrap_err ( )
930930 . to_string ( ) ;
931931 assert_eq ! ( err, "EOF: file size of 4 is less than footer" ) ;
932932
933- let input = MetadataFetchFn ( & mut fetch) ;
934933 let err = ParquetMetaDataReader :: new ( )
935- . load_and_finish ( input , 20 )
934+ . load_and_finish ( & mut f , 20 )
936935 . await
937936 . unwrap_err ( )
938937 . to_string ( ) ;
@@ -949,42 +948,39 @@ mod async_tests {
949948 futures:: future:: ready ( read_range ( & mut file, range) )
950949 } ;
951950
952- let f = MetadataFetchFn ( & mut fetch) ;
951+ let mut f = MetadataFetchFn ( & mut fetch) ;
953952 let mut loader = ParquetMetaDataReader :: new ( ) . with_page_indexes ( true ) ;
954- loader. try_load ( f, len) . await . unwrap ( ) ;
953+ loader. try_load ( & mut f, len) . await . unwrap ( ) ;
955954 assert_eq ! ( fetch_count. load( Ordering :: SeqCst ) , 3 ) ;
956955 let metadata = loader. finish ( ) . unwrap ( ) ;
957956 assert ! ( metadata. offset_index( ) . is_some( ) && metadata. column_index( ) . is_some( ) ) ;
958957
959958 // Prefetch just footer exactly
960959 fetch_count. store ( 0 , Ordering :: SeqCst ) ;
961- let f = MetadataFetchFn ( & mut fetch) ;
962960 let mut loader = ParquetMetaDataReader :: new ( )
963961 . with_page_indexes ( true )
964962 . with_prefetch_hint ( Some ( 1729 ) ) ;
965- loader. try_load ( f, len) . await . unwrap ( ) ;
963+ loader. try_load ( & mut f, len) . await . unwrap ( ) ;
966964 assert_eq ! ( fetch_count. load( Ordering :: SeqCst ) , 2 ) ;
967965 let metadata = loader. finish ( ) . unwrap ( ) ;
968966 assert ! ( metadata. offset_index( ) . is_some( ) && metadata. column_index( ) . is_some( ) ) ;
969967
970968 // Prefetch more than footer but not enough
971969 fetch_count. store ( 0 , Ordering :: SeqCst ) ;
972- let f = MetadataFetchFn ( & mut fetch) ;
973970 let mut loader = ParquetMetaDataReader :: new ( )
974971 . with_page_indexes ( true )
975972 . with_prefetch_hint ( Some ( 130649 ) ) ;
976- loader. try_load ( f, len) . await . unwrap ( ) ;
973+ loader. try_load ( & mut f, len) . await . unwrap ( ) ;
977974 assert_eq ! ( fetch_count. load( Ordering :: SeqCst ) , 2 ) ;
978975 let metadata = loader. finish ( ) . unwrap ( ) ;
979976 assert ! ( metadata. offset_index( ) . is_some( ) && metadata. column_index( ) . is_some( ) ) ;
980977
981978 // Prefetch exactly enough
982979 fetch_count. store ( 0 , Ordering :: SeqCst ) ;
983- let f = MetadataFetchFn ( & mut fetch) ;
984980 let metadata = ParquetMetaDataReader :: new ( )
985981 . with_page_indexes ( true )
986982 . with_prefetch_hint ( Some ( 130650 ) )
987- . load_and_finish ( f, len)
983+ . load_and_finish ( & mut f, len)
988984 . await
989985 . unwrap ( ) ;
990986 assert_eq ! ( fetch_count. load( Ordering :: SeqCst ) , 1 ) ;
0 commit comments