Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-parquet/src/arrow/write/primitive/nested.rs
6940 views
1
use arrow::array::{Array, PrimitiveArray};
2
use arrow::types::NativeType as ArrowNativeType;
3
use polars_error::PolarsResult;
4
5
use super::super::{WriteOptions, nested, utils};
6
use super::basic::{build_statistics, encode_plain};
7
use crate::arrow::read::schema::is_nullable;
8
use crate::arrow::write::Nested;
9
use crate::parquet::encoding::Encoding;
10
use crate::parquet::page::DataPage;
11
use crate::parquet::schema::types::PrimitiveType;
12
use crate::parquet::types::NativeType;
13
use crate::write::EncodeNullability;
14
15
pub fn array_to_page<T, R>(
16
array: &PrimitiveArray<T>,
17
options: WriteOptions,
18
type_: PrimitiveType,
19
nested: &[Nested],
20
) -> PolarsResult<DataPage>
21
where
22
T: ArrowNativeType,
23
R: NativeType,
24
T: num_traits::AsPrimitive<R>,
25
{
26
let is_optional = is_nullable(&type_.field_info);
27
let encode_options = EncodeNullability::new(is_optional);
28
29
let mut buffer = vec![];
30
31
let (repetition_levels_byte_length, definition_levels_byte_length) =
32
nested::write_rep_and_def(options.version, nested, &mut buffer)?;
33
34
let buffer = encode_plain(array, encode_options, buffer);
35
36
let statistics = if options.has_statistics() {
37
Some(build_statistics(array, type_.clone(), &options.statistics).serialize())
38
} else {
39
None
40
};
41
42
utils::build_plain_page(
43
buffer,
44
nested::num_values(nested),
45
nested[0].len(),
46
array.null_count(),
47
repetition_levels_byte_length,
48
definition_levels_byte_length,
49
statistics,
50
type_,
51
options,
52
Encoding::Plain,
53
)
54
}
55
56