11use std:: collections:: BTreeSet ;
22use std:: sync:: { Arc , OnceLock , RwLock } ;
33
4- use bytes:: Bytes ;
54use itertools:: Itertools ;
65use vortex_array:: aliases:: hash_map:: HashMap ;
76use vortex_array:: array:: ChunkedArray ;
@@ -11,7 +10,7 @@ use vortex_array::{ArrayDType, ArrayData, IntoArrayData};
1110use vortex_dtype:: { DType , Nullability , StructDType } ;
1211use vortex_error:: { vortex_bail, vortex_err, vortex_panic, VortexExpect as _, VortexResult } ;
1312use vortex_expr:: Select ;
14- use vortex_flatbuffers:: footer;
13+ use vortex_flatbuffers:: footer as fb ;
1514
1615use crate :: layouts:: RangedLayoutReader ;
1716use crate :: pruning:: PruningPredicate ;
@@ -36,16 +35,14 @@ impl Layout for ChunkedLayout {
3635
3736 fn reader (
3837 & self ,
39- fb_bytes : Bytes ,
40- fb_loc : usize ,
38+ layout : fb:: Layout ,
4139 scan : Scan ,
4240 layout_builder : LayoutDeserializer ,
4341 message_cache : RelativeLayoutCache ,
4442 ) -> VortexResult < Box < dyn LayoutReader > > {
4543 Ok ( Box :: new (
4644 ChunkedLayoutBuilder {
47- fb_bytes,
48- fb_loc,
45+ layout,
4946 scan,
5047 layout_builder,
5148 message_cache,
@@ -61,35 +58,26 @@ const METADATA_LAYOUT_PART_ID: LayoutPartId = 0;
6158///
6259/// First child in the list is the metadata table
6360/// Subsequent children are consecutive chunks of this layout
64- struct ChunkedLayoutBuilder {
65- fb_bytes : Bytes ,
66- fb_loc : usize ,
61+ struct ChunkedLayoutBuilder < ' a > {
62+ layout : fb:: Layout < ' a > ,
6763 scan : Scan ,
6864 layout_builder : LayoutDeserializer ,
6965 message_cache : RelativeLayoutCache ,
7066}
7167
72- impl ChunkedLayoutBuilder {
73- fn flatbuffer ( & self ) -> footer:: Layout {
74- unsafe {
75- let tab = flatbuffers:: Table :: new ( & self . fb_bytes , self . fb_loc ) ;
76- footer:: Layout :: init_from_table ( tab)
77- }
78- }
79-
68+ impl ChunkedLayoutBuilder < ' _ > {
8069 fn metadata_layout ( & self ) -> VortexResult < Option < Box < dyn LayoutReader > > > {
81- self . flatbuffer ( )
70+ self . layout
8271 . metadata ( )
8372 . map ( |m| {
8473 let set_stats = stats_from_bitset_bytes ( m. bytes ( ) ) ;
8574 let metadata_fb = self
86- . flatbuffer ( )
75+ . layout
8776 . children ( )
8877 . ok_or_else ( || vortex_err ! ( "Must have children if layout has metadata" ) ) ?
8978 . get ( 0 ) ;
9079 self . layout_builder . read_layout (
91- self . fb_bytes . clone ( ) ,
92- metadata_fb. _tab . loc ( ) ,
80+ metadata_fb,
9381 Scan :: new ( Some ( Arc :: new ( Select :: include (
9482 set_stats. iter ( ) . map ( |s| s. to_string ( ) . into ( ) ) . collect ( ) ,
9583 ) ) ) ) ,
@@ -105,13 +93,13 @@ impl ChunkedLayoutBuilder {
10593 . transpose ( )
10694 }
10795
108- fn children ( & self ) -> impl Iterator < Item = ( usize , footer :: Layout ) > {
109- self . flatbuffer ( )
96+ fn children ( & self ) -> impl Iterator < Item = ( usize , fb :: Layout ) > {
97+ self . layout
11098 . children ( )
11199 . unwrap_or_default ( )
112100 . iter ( )
113101 . enumerate ( )
114- . skip ( if self . flatbuffer ( ) . metadata ( ) . is_some ( ) {
102+ . skip ( if self . layout . metadata ( ) . is_some ( ) {
115103 1
116104 } else {
117105 0
@@ -134,8 +122,7 @@ impl ChunkedLayoutBuilder {
134122 . zip_eq ( self . children_ranges ( ) )
135123 . map ( |( ( i, c) , ( begin, end) ) | {
136124 let layout = self . layout_builder . read_layout (
137- self . fb_bytes . clone ( ) ,
138- c. _tab . loc ( ) ,
125+ c,
139126 self . scan . clone ( ) ,
140127 self . message_cache
141128 . relative ( i as u16 , self . message_cache . dtype ( ) . clone ( ) ) ,
@@ -420,7 +407,7 @@ mod tests {
420407
421408 use arrow_buffer:: BooleanBufferBuilder ;
422409 use bytes:: Bytes ;
423- use flatbuffers:: { root_unchecked , FlatBufferBuilder } ;
410+ use flatbuffers:: { root , FlatBufferBuilder } ;
424411 use futures_util:: TryStreamExt ;
425412 use vortex_array:: array:: { BoolArray , ChunkedArray , PrimitiveArray } ;
426413 use vortex_array:: { ArrayDType , ArrayLen , IntoArrayData , IntoArrayVariant } ;
@@ -474,30 +461,26 @@ mod tests {
474461 let written = writer. into_inner ( ) ;
475462
476463 let mut fb = FlatBufferBuilder :: new ( ) ;
464+ // FIXME(ngates): impl From<LayoutSpec> for fb::Layout
477465 let chunked_layout = write:: LayoutSpec :: chunked ( flat_layouts. into ( ) , len as u64 , None ) ;
478466 let flat_buf = chunked_layout. write_flatbuffer ( & mut fb) ;
479467 fb. finish_minimal ( flat_buf) ;
480468 let fb_bytes = Bytes :: copy_from_slice ( fb. finished_data ( ) ) ;
481-
482- let fb_loc = ( unsafe { root_unchecked :: < footer:: Layout > ( & fb_bytes) } )
483- . _tab
484- . loc ( ) ;
469+ let layout = root :: < footer:: Layout > ( & fb_bytes) . unwrap ( ) ;
485470
486471 let dtype = Arc :: new ( LazyDType :: from_dtype ( PType :: I32 . into ( ) ) ) ;
487472 let layout_builder = LayoutDeserializer :: default ( ) ;
488473 (
489474 ChunkedLayoutBuilder {
490- fb_bytes : fb_bytes. clone ( ) ,
491- fb_loc,
475+ layout,
492476 scan,
493477 layout_builder : layout_builder. clone ( ) ,
494478 message_cache : RelativeLayoutCache :: new ( cache. clone ( ) , dtype. clone ( ) ) ,
495479 }
496480 . build ( )
497481 . unwrap ( ) ,
498482 ChunkedLayoutBuilder {
499- fb_bytes,
500- fb_loc,
483+ layout,
501484 scan : Scan :: new ( None ) ,
502485 layout_builder,
503486 message_cache : RelativeLayoutCache :: new ( cache, dtype) ,
0 commit comments