@@ -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 ,
@@ -114,13 +113,15 @@ impl PageLookup {
114113/// descriptor is derived from the chosen mode only when a page is decoded for the first time.
115114pub ( crate ) struct DecodedPages < T : Number > {
116115 decoder : PageDecoder < T > ,
116+ lookup : PageLookup ,
117117 pages : BTreeMap < usize , PrimitiveArray > ,
118118}
119119
120120impl < T : Number + NativePType > DecodedPages < T > {
121121 pub fn new ( array : ArrayView < ' _ , Pco > ) -> VortexResult < Self > {
122122 Ok ( Self {
123123 decoder : PageDecoder :: new ( array. metadata . header . as_slice ( ) ) ?,
124+ lookup : PageLookup :: default ( ) ,
124125 pages : BTreeMap :: new ( ) ,
125126 } )
126127 }
@@ -134,19 +135,19 @@ impl<T: Number + NativePType> DecodedPages<T> {
134135 let entry = match self . pages . entry ( page) {
135136 Entry :: Occupied ( entry) => entry. into_mut ( ) ,
136137 Entry :: Vacant ( entry) => {
137- let info = view . physical ( page) ?;
138+ let ( chunk_id , n_values ) = self . lookup . resolve ( view , array , page) ?;
138139 let buffer = array
139140 . pages
140141 . get ( page)
141142 . ok_or_else ( || vortex_err ! ( "Pco compressed page is missing" ) ) ?;
142143 let chunk = array
143144 . chunk_metas
144- . get ( info . chunk )
145+ . get ( chunk_id )
145146 . ok_or_else ( || vortex_err ! ( "Pco chunk metadata is missing" ) ) ?;
146147 entry. insert ( self . decoder . read (
147- info . chunk ,
148+ chunk_id ,
148149 chunk. as_slice ( ) ,
149- info . n_values ,
150+ n_values,
150151 buffer. as_slice ( ) ,
151152 ctx,
152153 ) ?)
0 commit comments