@@ -296,14 +296,12 @@ impl<'a> Stream<'a> {
296296 . map_err ( Into :: into)
297297 }
298298
299- pub fn decode_u64 ( self ) -> Result < Vec < u64 > , MltError > {
300- let meta = self . meta ;
301- // First decode physical layer as u64
302- let physical_data = match meta. physical_decoder {
299+ pub fn decode_bits_u64 ( self ) -> Result < Vec < u64 > , MltError > {
300+ match self . meta . physical_decoder {
303301 PhysicalDecoder :: VarInt => match self . data {
304302 StreamData :: VarInt ( data) => all ( utils:: parse_varint_vec :: < u64 , u64 > (
305303 data. data ,
306- meta. num_values ,
304+ self . meta . num_values ,
307305 ) ?) ,
308306 StreamData :: Raw ( _) => {
309307 return Err ( MltError :: InvalidStreamData {
@@ -323,40 +321,15 @@ impl<'a> Stream<'a> {
323321 return Err ( MltError :: UnsupportedPhysicalDecoder ( "FastPFOR" ) ) ;
324322 }
325323 PhysicalDecoder :: Alp => return Err ( MltError :: UnsupportedPhysicalDecoder ( "ALP" ) ) ,
326- } ?;
327-
328- // Then apply logical decoding
329- match meta. logical_decoder {
330- LogicalDecoder :: None => Ok ( physical_data) ,
331- LogicalDecoder :: Rle ( rle_meta) => {
332- decode_rle (
333- & physical_data,
334- rle_meta. runs as usize ,
335- rle_meta. num_rle_values as usize ,
336- )
337- }
338- LogicalDecoder :: Delta => {
339- // For delta decoding, we need to treat values as signed (i64) for zigzag
340- // Convert u64 to u64 (no-op) but we'll decode as if they were zigzag-encoded i64 values
341- // The zigzag encoding stores signed values in unsigned form
342- Ok ( decode_zigzag_delta :: < i64 , u64 > ( & physical_data) )
343- }
344- LogicalDecoder :: DeltaRle ( rle_meta) => {
345- // First decode RLE
346- let rle_decoded = decode_rle (
347- & physical_data,
348- rle_meta. runs as usize ,
349- rle_meta. num_rle_values as usize ,
350- ) ?;
351- // Then apply ZigZag Delta decoding
352- Ok ( decode_zigzag_delta :: < i64 , u64 > ( & rle_decoded) )
353- }
354- v => Err ( MltError :: DecodeError ( format ! (
355- "Unsupported LogicalDecoder {v:?} for u64"
356- ) ) ) ,
357324 }
358325 }
359326
327+ pub fn decode_u64 ( self ) -> Result < Vec < u64 > , MltError > {
328+ let meta = self . meta ;
329+ let physical_data = self . decode_bits_u64 ( ) ?;
330+ apply_logical_decoding_u64 ( physical_data, meta. logical_decoder )
331+ }
332+
360333 pub fn decode_bits_u32 ( self ) -> Result < LogicalValue , MltError > {
361334 let value = match self . meta . physical_decoder {
362335 PhysicalDecoder :: VarInt => match self . data {
@@ -391,34 +364,6 @@ impl<'a> Stream<'a> {
391364 Ok ( LogicalValue :: new ( self . meta , LogicalData :: VecU32 ( value) ) )
392365 }
393366
394- fn decode_physical_u64 ( self ) -> Result < Vec < u64 > , MltError > {
395- match self . meta . physical_decoder {
396- PhysicalDecoder :: VarInt => match self . data {
397- StreamData :: VarInt ( data) => all ( utils:: parse_varint_vec :: < u64 , u64 > (
398- data. data ,
399- self . meta . num_values ,
400- ) ?) ,
401- StreamData :: Raw ( _) => {
402- return Err ( MltError :: InvalidStreamData {
403- expected : "VarInt" ,
404- got : format ! ( "{:?}" , self . data) ,
405- } ) ;
406- }
407- } ,
408- PhysicalDecoder :: None => {
409- // For raw data, we'd need to read 8 bytes per value
410- // But typically 64-bit IDs use VarInt encoding
411- return Err ( MltError :: DecodeError (
412- "Raw physical decoder not supported for u64" . to_string ( ) ,
413- ) ) ;
414- }
415- PhysicalDecoder :: FastPFOR => {
416- return Err ( MltError :: UnsupportedPhysicalDecoder ( "FastPFOR" ) ) ;
417- }
418- PhysicalDecoder :: Alp => return Err ( MltError :: UnsupportedPhysicalDecoder ( "ALP" ) ) ,
419- }
420- }
421-
422367 // pub fn decode<'a, T, U>(&'_ self) -> Result<Vec<U>, MltError>
423368 // where
424369 // T: VarInt,
@@ -546,6 +491,41 @@ impl LogicalValue {
546491 }
547492}
548493
494+ /// Apply logical decoding to u64 data
495+ fn apply_logical_decoding_u64 (
496+ physical_data : Vec < u64 > ,
497+ logical_decoder : LogicalDecoder ,
498+ ) -> Result < Vec < u64 > , MltError > {
499+ match logical_decoder {
500+ LogicalDecoder :: None => Ok ( physical_data) ,
501+ LogicalDecoder :: Rle ( rle_meta) => {
502+ decode_rle (
503+ & physical_data,
504+ rle_meta. runs as usize ,
505+ rle_meta. num_rle_values as usize ,
506+ )
507+ }
508+ LogicalDecoder :: Delta => {
509+ // For delta decoding, we need to treat values as signed (i64) for zigzag
510+ // The zigzag encoding stores signed values in unsigned form
511+ Ok ( decode_zigzag_delta :: < i64 , u64 > ( & physical_data) )
512+ }
513+ LogicalDecoder :: DeltaRle ( rle_meta) => {
514+ // First decode RLE
515+ let rle_decoded = decode_rle (
516+ & physical_data,
517+ rle_meta. runs as usize ,
518+ rle_meta. num_rle_values as usize ,
519+ ) ?;
520+ // Then apply ZigZag Delta decoding
521+ Ok ( decode_zigzag_delta :: < i64 , u64 > ( & rle_decoded) )
522+ }
523+ v => Err ( MltError :: DecodeError ( format ! (
524+ "Unsupported LogicalDecoder {v:?} for u64"
525+ ) ) ) ,
526+ }
527+ }
528+
549529/// Logical encoding technique used for a column, as stored in the tile
550530#[ borrowme]
551531#[ derive( Debug , Clone , Copy , PartialEq , TryFromPrimitive ) ]
0 commit comments