@@ -23,7 +23,6 @@ use crate::Pco;
2323use crate :: array:: vortex_err_from_pco;
2424use crate :: page_index:: LogicalPageIndex ;
2525use crate :: page_index:: PhysicalPage ;
26- use crate :: page_index:: ChunkCursor ;
2726
2827pub ( crate ) struct PageDecoder < T : Number > {
2928 file : FileDecompressor ,
@@ -116,13 +115,15 @@ impl PageLookup {
116115/// descriptor is derived from the chosen mode only when a page is decoded for the first time.
117116pub ( crate ) struct DecodedPages < T : Number > {
118117 decoder : PageDecoder < T > ,
118+ lookup : PageLookup ,
119119 pages : BTreeMap < usize , PrimitiveArray > ,
120120}
121121
122122impl < T : Number + NativePType > DecodedPages < T > {
123123 pub fn new ( array : ArrayView < ' _ , Pco > ) -> VortexResult < Self > {
124124 Ok ( Self {
125125 decoder : PageDecoder :: new ( array. metadata . header . as_slice ( ) ) ?,
126+ lookup : PageLookup :: default ( ) ,
126127 pages : BTreeMap :: new ( ) ,
127128 } )
128129 }
@@ -136,19 +137,19 @@ impl<T: Number + NativePType> DecodedPages<T> {
136137 let entry = match self . pages . entry ( page) {
137138 Entry :: Occupied ( entry) => entry. into_mut ( ) ,
138139 Entry :: Vacant ( entry) => {
139- let info = view . physical ( page) ?;
140+ let ( chunk_id , n_values ) = self . lookup . resolve ( view , array , page) ?;
140141 let buffer = array
141142 . pages
142143 . get ( page)
143144 . ok_or_else ( || vortex_err ! ( "Pco compressed page is missing" ) ) ?;
144145 let chunk = array
145146 . chunk_metas
146- . get ( info . chunk )
147+ . get ( chunk_id )
147148 . ok_or_else ( || vortex_err ! ( "Pco chunk metadata is missing" ) ) ?;
148149 entry. insert ( self . decoder . read (
149- info . chunk ,
150+ chunk_id ,
150151 chunk. as_slice ( ) ,
151- info . n_values ,
152+ n_values,
152153 buffer. as_slice ( ) ,
153154 ctx,
154155 ) ?)
0 commit comments