Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-parquet/src/parquet/encoding/byte_stream_split/mod.rs
7887 views
1
mod decoder;
2
3
pub use decoder::Decoder;
4
5
#[cfg(test)]
6
mod tests {
7
use super::*;
8
use crate::parquet::error::ParquetError;
9
use crate::parquet::types::NativeType;
10
11
#[test]
12
fn round_trip_f32() -> Result<(), ParquetError> {
13
let data = vec![1.0e-2_f32, 2.5_f32, 3.0e2_f32];
14
let mut buffer = vec![];
15
encode(&data, &mut buffer);
16
17
let mut decoder = Decoder::try_new(&buffer, size_of::<f32>())?;
18
let values = decoder
19
.iter_converted(|bytes| f32::from_le_bytes(bytes.try_into().unwrap()))
20
.collect::<Vec<_>>();
21
22
assert_eq!(data, values);
23
24
Ok(())
25
}
26
27
#[test]
28
fn round_trip_f64() -> Result<(), ParquetError> {
29
let data = vec![1.0e-2_f64, 2.5_f64, 3.0e2_f64];
30
let mut buffer = vec![];
31
encode(&data, &mut buffer);
32
33
let mut decoder = Decoder::try_new(&buffer, size_of::<f64>())?;
34
let values = decoder
35
.iter_converted(|bytes| f64::from_le_bytes(bytes.try_into().unwrap()))
36
.collect::<Vec<_>>();
37
38
assert_eq!(data, values);
39
40
Ok(())
41
}
42
43
#[test]
44
fn fails_for_invalid_values_size() -> Result<(), ParquetError> {
45
let buffer = vec![0; 12];
46
47
let result = Decoder::try_new(&buffer, 8);
48
assert!(result.is_err());
49
50
Ok(())
51
}
52
53
#[test]
54
fn fails_for_invalid_element_size() -> Result<(), ParquetError> {
55
let buffer = vec![0; 16];
56
57
let result = Decoder::try_new(&buffer, 16);
58
assert!(result.is_err());
59
60
Ok(())
61
}
62
63
fn encode<T: NativeType>(data: &[T], buffer: &mut Vec<u8>) {
64
let element_size = size_of::<T>();
65
let num_elements = data.len();
66
let total_length = size_of_val(data);
67
buffer.resize(total_length, 0);
68
69
for (i, v) in data.iter().enumerate() {
70
let value_bytes = v.to_le_bytes();
71
let value_bytes_ref = value_bytes.as_ref();
72
for n in 0..element_size {
73
buffer[(num_elements * n) + i] = value_bytes_ref[n];
74
}
75
}
76
}
77
}
78
79