@@ -5,7 +5,6 @@ use std::collections::BTreeSet;
55use std:: ops:: BitAnd ;
66use std:: ops:: Range ;
77use std:: sync:: Arc ;
8- use std:: sync:: OnceLock ;
98
109use futures:: FutureExt ;
1110use futures:: future:: BoxFuture ;
@@ -40,7 +39,6 @@ pub struct FlatReader {
4039 name : Arc < str > ,
4140 segment_source : Arc < dyn SegmentSource > ,
4241 session : VortexSession ,
43- array : OnceLock < SharedArrayFuture > ,
4442}
4543
4644impl FlatReader {
@@ -55,38 +53,33 @@ impl FlatReader {
5553 name,
5654 segment_source,
5755 session,
58- array : Default :: default ( ) ,
5956 }
6057 }
6158
6259 /// Register the segment request and return a future that would resolve into the deserialised array.
6360 fn array_future ( & self ) -> SharedArrayFuture {
64- self . array
65- . get_or_init ( || {
66- let row_count = usize:: try_from ( self . layout . row_count ( ) )
67- . vortex_expect ( "row count must fit in usize" ) ;
68- let segment_fut = self . segment_source . request ( self . layout . segment_id ( ) ) ;
69- let ctx = self . layout . array_ctx ( ) . clone ( ) ;
70- let session = self . session . clone ( ) ;
71- let dtype = self . layout . dtype ( ) . clone ( ) ;
72- let array_tree = self . layout . array_tree ( ) . cloned ( ) ;
73- async move {
74- let segment = segment_fut. await ?;
75- let parts = if let Some ( array_tree) = array_tree {
76- // Use the pre-stored flatbuffer from layout metadata combined with segment buffers.
77- ArrayParts :: from_flatbuffer_and_segment ( array_tree, segment) ?
78- } else {
79- // Parse the flatbuffer from the segment itself.
80- ArrayParts :: try_from ( segment) ?
81- } ;
82- parts
83- . decode ( & dtype, row_count, & ctx, & session)
84- . map_err ( Arc :: new)
85- }
86- . boxed ( )
87- . shared ( )
88- } )
89- . clone ( )
61+ let row_count =
62+ usize:: try_from ( self . layout . row_count ( ) ) . vortex_expect ( "row count must fit in usize" ) ;
63+ let segment_fut = self . segment_source . request ( self . layout . segment_id ( ) ) ;
64+ let ctx = self . layout . array_ctx ( ) . clone ( ) ;
65+ let session = self . session . clone ( ) ;
66+ let dtype = self . layout . dtype ( ) . clone ( ) ;
67+ let array_tree = self . layout . array_tree ( ) . cloned ( ) ;
68+ async move {
69+ let segment = segment_fut. await ?;
70+ let parts = if let Some ( array_tree) = array_tree {
71+ // Use the pre-stored flatbuffer from layout metadata combined with segment buffers.
72+ ArrayParts :: from_flatbuffer_and_segment ( array_tree, segment) ?
73+ } else {
74+ // Parse the flatbuffer from the segment itself.
75+ ArrayParts :: try_from ( segment) ?
76+ } ;
77+ parts
78+ . decode ( & dtype, row_count, & ctx, & session)
79+ . map_err ( Arc :: new)
80+ }
81+ . boxed ( )
82+ . shared ( )
9083 }
9184}
9285
0 commit comments