@@ -329,13 +329,18 @@ impl ParquetMetaDataReader {
329
329
return Ok ( ( ) ) ;
330
330
}
331
331
332
- self . load_page_index ( fetch, remainder) . await
332
+ self . load_page_index_with_remainder ( fetch, remainder) . await
333
333
}
334
334
335
335
/// Asynchronously fetch the page index structures when a [`ParquetMetaData`] has already
336
336
/// been obtained. See [`Self::new_with_metadata()`].
337
337
#[ 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 > (
339
344
& mut self ,
340
345
mut fetch : F ,
341
346
remainder : Option < ( usize , Bytes ) > ,
@@ -836,7 +841,7 @@ mod async_tests {
836
841
837
842
struct MetadataFetchFn < F > ( F ) ;
838
843
839
- impl < F , Fut > MetadataFetch for MetadataFetchFn < F >
844
+ impl < ' a , F , Fut > MetadataFetch for & ' a mut MetadataFetchFn < F >
840
845
where
841
846
F : FnMut ( Range < usize > ) -> Fut + Send ,
842
847
Fut : Future < Output = Result < Bytes > > + Send ,
@@ -865,74 +870,68 @@ mod async_tests {
865
870
let expected = expected. file_metadata ( ) . schema ( ) ;
866
871
let fetch_count = AtomicUsize :: new ( 0 ) ;
867
872
868
- let mut fetch = |range| {
873
+ let fetch = |range| {
869
874
fetch_count. fetch_add ( 1 , Ordering :: SeqCst ) ;
870
875
futures:: future:: ready ( read_range ( & mut file, range) )
871
876
} ;
872
877
873
- let input = MetadataFetchFn ( & mut fetch) ;
878
+ let mut f = MetadataFetchFn ( fetch) ;
874
879
let actual = ParquetMetaDataReader :: new ( )
875
- . load_and_finish ( input , len)
880
+ . load_and_finish ( & mut f , len)
876
881
. await
877
882
. unwrap ( ) ;
878
883
assert_eq ! ( actual. file_metadata( ) . schema( ) , expected) ;
879
884
assert_eq ! ( fetch_count. load( Ordering :: SeqCst ) , 2 ) ;
880
885
881
886
// Metadata hint too small - below footer size
882
887
fetch_count. store ( 0 , Ordering :: SeqCst ) ;
883
- let input = MetadataFetchFn ( & mut fetch) ;
884
888
let actual = ParquetMetaDataReader :: new ( )
885
889
. with_prefetch_hint ( Some ( 7 ) )
886
- . load_and_finish ( input , len)
890
+ . load_and_finish ( & mut f , len)
887
891
. await
888
892
. unwrap ( ) ;
889
893
assert_eq ! ( actual. file_metadata( ) . schema( ) , expected) ;
890
894
assert_eq ! ( fetch_count. load( Ordering :: SeqCst ) , 2 ) ;
891
895
892
896
// Metadata hint too small
893
897
fetch_count. store ( 0 , Ordering :: SeqCst ) ;
894
- let input = MetadataFetchFn ( & mut fetch) ;
895
898
let actual = ParquetMetaDataReader :: new ( )
896
899
. with_prefetch_hint ( Some ( 10 ) )
897
- . load_and_finish ( input , len)
900
+ . load_and_finish ( & mut f , len)
898
901
. await
899
902
. unwrap ( ) ;
900
903
assert_eq ! ( actual. file_metadata( ) . schema( ) , expected) ;
901
904
assert_eq ! ( fetch_count. load( Ordering :: SeqCst ) , 2 ) ;
902
905
903
906
// Metadata hint too large
904
907
fetch_count. store ( 0 , Ordering :: SeqCst ) ;
905
- let input = MetadataFetchFn ( & mut fetch) ;
906
908
let actual = ParquetMetaDataReader :: new ( )
907
909
. with_prefetch_hint ( Some ( 500 ) )
908
- . load_and_finish ( input , len)
910
+ . load_and_finish ( & mut f , len)
909
911
. await
910
912
. unwrap ( ) ;
911
913
assert_eq ! ( actual. file_metadata( ) . schema( ) , expected) ;
912
914
assert_eq ! ( fetch_count. load( Ordering :: SeqCst ) , 1 ) ;
913
915
914
916
// Metadata hint exactly correct
915
917
fetch_count. store ( 0 , Ordering :: SeqCst ) ;
916
- let input = MetadataFetchFn ( & mut fetch) ;
917
918
let actual = ParquetMetaDataReader :: new ( )
918
919
. with_prefetch_hint ( Some ( 428 ) )
919
- . load_and_finish ( input , len)
920
+ . load_and_finish ( & mut f , len)
920
921
. await
921
922
. unwrap ( ) ;
922
923
assert_eq ! ( actual. file_metadata( ) . schema( ) , expected) ;
923
924
assert_eq ! ( fetch_count. load( Ordering :: SeqCst ) , 1 ) ;
924
925
925
- let input = MetadataFetchFn ( & mut fetch) ;
926
926
let err = ParquetMetaDataReader :: new ( )
927
- . load_and_finish ( input , 4 )
927
+ . load_and_finish ( & mut f , 4 )
928
928
. await
929
929
. unwrap_err ( )
930
930
. to_string ( ) ;
931
931
assert_eq ! ( err, "EOF: file size of 4 is less than footer" ) ;
932
932
933
- let input = MetadataFetchFn ( & mut fetch) ;
934
933
let err = ParquetMetaDataReader :: new ( )
935
- . load_and_finish ( input , 20 )
934
+ . load_and_finish ( & mut f , 20 )
936
935
. await
937
936
. unwrap_err ( )
938
937
. to_string ( ) ;
@@ -949,42 +948,39 @@ mod async_tests {
949
948
futures:: future:: ready ( read_range ( & mut file, range) )
950
949
} ;
951
950
952
- let f = MetadataFetchFn ( & mut fetch) ;
951
+ let mut f = MetadataFetchFn ( & mut fetch) ;
953
952
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 ( ) ;
955
954
assert_eq ! ( fetch_count. load( Ordering :: SeqCst ) , 3 ) ;
956
955
let metadata = loader. finish ( ) . unwrap ( ) ;
957
956
assert ! ( metadata. offset_index( ) . is_some( ) && metadata. column_index( ) . is_some( ) ) ;
958
957
959
958
// Prefetch just footer exactly
960
959
fetch_count. store ( 0 , Ordering :: SeqCst ) ;
961
- let f = MetadataFetchFn ( & mut fetch) ;
962
960
let mut loader = ParquetMetaDataReader :: new ( )
963
961
. with_page_indexes ( true )
964
962
. with_prefetch_hint ( Some ( 1729 ) ) ;
965
- loader. try_load ( f, len) . await . unwrap ( ) ;
963
+ loader. try_load ( & mut f, len) . await . unwrap ( ) ;
966
964
assert_eq ! ( fetch_count. load( Ordering :: SeqCst ) , 2 ) ;
967
965
let metadata = loader. finish ( ) . unwrap ( ) ;
968
966
assert ! ( metadata. offset_index( ) . is_some( ) && metadata. column_index( ) . is_some( ) ) ;
969
967
970
968
// Prefetch more than footer but not enough
971
969
fetch_count. store ( 0 , Ordering :: SeqCst ) ;
972
- let f = MetadataFetchFn ( & mut fetch) ;
973
970
let mut loader = ParquetMetaDataReader :: new ( )
974
971
. with_page_indexes ( true )
975
972
. with_prefetch_hint ( Some ( 130649 ) ) ;
976
- loader. try_load ( f, len) . await . unwrap ( ) ;
973
+ loader. try_load ( & mut f, len) . await . unwrap ( ) ;
977
974
assert_eq ! ( fetch_count. load( Ordering :: SeqCst ) , 2 ) ;
978
975
let metadata = loader. finish ( ) . unwrap ( ) ;
979
976
assert ! ( metadata. offset_index( ) . is_some( ) && metadata. column_index( ) . is_some( ) ) ;
980
977
981
978
// Prefetch exactly enough
982
979
fetch_count. store ( 0 , Ordering :: SeqCst ) ;
983
- let f = MetadataFetchFn ( & mut fetch) ;
984
980
let metadata = ParquetMetaDataReader :: new ( )
985
981
. with_page_indexes ( true )
986
982
. with_prefetch_hint ( Some ( 130650 ) )
987
- . load_and_finish ( f, len)
983
+ . load_and_finish ( & mut f, len)
988
984
. await
989
985
. unwrap ( ) ;
990
986
assert_eq ! ( fetch_count. load( Ordering :: SeqCst ) , 1 ) ;
0 commit comments