Path: blob/main/crates/polars-parquet/src/parquet/encoding/delta_byte_array/encoder.rs
7887 views
use super::super::delta_bitpacked;1use crate::parquet::encoding::delta_length_byte_array;23/// Encodes an iterator of according to DELTA_BYTE_ARRAY4pub fn encode<'a, I: ExactSizeIterator<Item = &'a [u8]> + Clone>(5iterator: I,6buffer: &mut Vec<u8>,7) {8let mut previous = b"".as_ref();910let mut sum_lengths = 0;11let prefixes = iterator12.clone()13.map(|item| {14let prefix_length = item15.iter()16.zip(previous.iter())17.enumerate()18// find first difference19.find_map(|(length, (lhs, rhs))| (lhs != rhs).then_some(length))20.unwrap_or(previous.len());21previous = item;2223sum_lengths += item.len() - prefix_length;24prefix_length as i6425})26.collect::<Vec<_>>();27delta_bitpacked::encode(prefixes.iter().copied(), buffer, 1);2829let remaining = iterator30.zip(prefixes)31.map(|(item, prefix)| &item[prefix as usize..]);3233delta_length_byte_array::encode(remaining, buffer);34}353637