Skip to content

Commit 1f01920

Browse files
committed
chore(ci): minor CI and justfile cleanup
1 parent 0b8d0bc commit 1f01920

File tree

1 file changed

+44
-64
lines changed

1 file changed

+44
-64
lines changed

rust/mlt-nom/src/v01/stream.rs

Lines changed: 44 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)