Path: blob/main/crates/polars-parquet/src/parquet/encoding/delta_bitpacked/mod.rs
7887 views
mod decoder;1mod encoder;23pub(crate) use decoder::{Decoder, SumGatherer};4pub(crate) use encoder::encode;56/// The sum of `start, start + delta, start + 2 * delta, ... len times`.7pub(crate) fn lin_natural_sum(start: i64, delta: i64, len: usize) -> i64 {8debug_assert!(len < i64::MAX as usize);910let base = start * len as i64;11let sum = if len == 0 {12013} else {14let is_odd = len & 1;15// SUM_i=0^n f * i = f * (n(n+1)/2)16let sum = (len >> (is_odd ^ 1)) * (len.wrapping_sub(1) >> is_odd);17delta * sum as i6418};1920base + sum21}2223#[cfg(test)]24mod tests {25use super::*;26use crate::parquet::error::{ParquetError, ParquetResult};2728#[test]29fn linear_natural_sum() {30assert_eq!(lin_natural_sum(0, 0, 0), 0);31assert_eq!(lin_natural_sum(10, 4, 0), 0);32assert_eq!(lin_natural_sum(0, 1, 1), 0);33assert_eq!(lin_natural_sum(0, 1, 3), 3);34assert_eq!(lin_natural_sum(0, 1, 4), 6);35assert_eq!(lin_natural_sum(0, 2, 3), 6);36assert_eq!(lin_natural_sum(2, 2, 3), 12);37}3839#[test]40fn basic() -> Result<(), ParquetError> {41let data = vec![1, 3, 1, 2, 3];4243let mut buffer = vec![];44encode(data.clone().into_iter(), &mut buffer, 1);45let (iter, _) = Decoder::try_new(&buffer)?;4647let result = iter.collect::<Vec<_>>()?;48assert_eq!(result, data);49Ok(())50}5152#[test]53fn negative_value() -> Result<(), ParquetError> {54let data = vec![1, 3, -1, 2, 3];5556let mut buffer = vec![];57encode(data.clone().into_iter(), &mut buffer, 1);58let (iter, _) = Decoder::try_new(&buffer)?;5960let result = iter.collect::<Vec<_>>()?;61assert_eq!(result, data);62Ok(())63}6465#[test]66fn some() -> Result<(), ParquetError> {67let data = vec![68-2147483648,69-1777158217,70-984917788,71-1533539476,72-731221386,73-1322398478,74906736096,75];7677let mut buffer = vec![];78encode(data.clone().into_iter(), &mut buffer, 1);79let (iter, _) = Decoder::try_new(&buffer)?;8081let result = iter.collect::<Vec<_>>()?;82assert_eq!(result, data);83Ok(())84}8586#[test]87fn more_than_one_block() -> Result<(), ParquetError> {88let mut data = vec![1, 3, -1, 2, 3, 10, 1];89for x in 0..128 {90data.push(x - 10)91}9293let mut buffer = vec![];94encode(data.clone().into_iter(), &mut buffer, 1);95let (iter, _) = Decoder::try_new(&buffer)?;9697let result = iter.collect::<Vec<_>>()?;98assert_eq!(result, data);99Ok(())100}101102#[test]103fn test_another() -> Result<(), ParquetError> {104let data = vec![2, 3, 1, 2, 1];105106let mut buffer = vec![];107encode(data.clone().into_iter(), &mut buffer, 1);108let (iter, _) = Decoder::try_new(&buffer)?;109110let result = iter.collect::<Vec<_>>()?;111assert_eq!(result, data);112113Ok(())114}115116#[test]117fn overflow_constant() -> ParquetResult<()> {118let data = vec![i64::MIN, i64::MAX, i64::MIN, i64::MAX];119120let mut buffer = vec![];121encode(data.clone().into_iter(), &mut buffer, 1);122let (iter, _) = Decoder::try_new(&buffer)?;123124let result = iter.collect::<Vec<_>>()?;125assert_eq!(result, data);126127Ok(())128}129130#[test]131fn overflow_vary() -> ParquetResult<()> {132let data = vec![1330,134i64::MAX,135i64::MAX - 1,136i64::MIN + 1,137i64::MAX,138i64::MIN + 2,139];140141let mut buffer = vec![];142encode(data.clone().into_iter(), &mut buffer, 1);143let (iter, _) = Decoder::try_new(&buffer)?;144145let result = iter.collect::<Vec<_>>()?;146assert_eq!(result, data);147148Ok(())149}150}151152153