Path: blob/main/crates/polars-parquet/src/parquet/encoding/hybrid_rle/proptest.rs
7887 views
use proptest::prelude::*;12#[derive(Debug, Clone)]3enum Chunk {4Rle(u32, usize),5Bitpacked(Vec<u32>),6}78proptest::prop_compose! {9fn hybrid_rle_chunks10(max_idx: u32, size: usize)11(idxs in proptest::collection::vec(0..=max_idx, size),12mut chunk_offsets in proptest::collection::vec((0..=size, any::<bool>()), 2..=size.max(2)),13)14-> Vec<Chunk> {15if size == 0 {16return Vec::new();17}1819chunk_offsets.sort_unstable();20chunk_offsets.first_mut().unwrap().0 = 0;21chunk_offsets.last_mut().unwrap().0 = idxs.len();22chunk_offsets.dedup_by_key(|(idx, _)| *idx);2324chunk_offsets25.windows(2)26.map(|values| {27let (start, is_bitpacked) = values[0];28let (end, _) = values[1];2930if is_bitpacked {31Chunk::Bitpacked(idxs[start..end].to_vec())32} else {33Chunk::Rle(idxs[start], end - start)34}35})36.collect::<Vec<Chunk>>()37}38}3940proptest::prop_compose! {41pub fn hybrid_rle42(max_idx: u32, size: usize)43(chunks in hybrid_rle_chunks(max_idx, size))44-> Vec<u8> {45use super::encoder::Encoder;46let mut buffer = Vec::new();47let bit_width = 32 - max_idx.leading_zeros();48for chunk in chunks {49match chunk {50Chunk::Rle(value, size) => {51u32::run_length_encode(&mut buffer, size, value, bit_width).unwrap()52}53Chunk::Bitpacked(values) => {54u32::bitpacked_encode(&mut buffer, values.into_iter(), bit_width as usize).unwrap()55}56}57}58buffer59}60}616263