use std::io::Cursor;
use arrow::array::Array;
use arrow::bitmap::Bitmap;
use arrow::datatypes::Field;
use polars_buffer::Buffer;
use polars_error::PolarsResult;
use polars_parquet::read::{
BasicDecompressor, ColumnChunkMetadata, Filter, PageReader, column_iter_to_arrays,
};
use polars_utils::mem::prefetch::prefetch_l2;
pub enum ColumnStore {
Local(Buffer<u8>),
}
pub(super) fn mmap_columns<'a>(
store: &'a ColumnStore,
field_columns: &'a [&ColumnChunkMetadata],
) -> Vec<(&'a ColumnChunkMetadata, Buffer<u8>)> {
field_columns
.iter()
.map(|meta| _mmap_single_column(store, meta))
.collect()
}
fn _mmap_single_column<'a>(
store: &'a ColumnStore,
meta: &'a ColumnChunkMetadata,
) -> (&'a ColumnChunkMetadata, Buffer<u8>) {
let byte_range = meta.byte_range();
let chunk = match store {
ColumnStore::Local(mem_slice) => mem_slice
.clone()
.sliced(byte_range.start as usize..byte_range.end as usize),
};
(meta, chunk)
}
pub fn to_deserializer(
columns: Vec<(&ColumnChunkMetadata, Buffer<u8>)>,
field: Field,
filter: Option<Filter>,
) -> PolarsResult<(Vec<Box<dyn Array>>, Bitmap)> {
let (columns, types): (Vec<_>, Vec<_>) = columns
.into_iter()
.map(|(column_meta, chunk)| {
prefetch_l2(&chunk);
let pages = PageReader::new(Cursor::new(chunk), column_meta, vec![], usize::MAX);
(
BasicDecompressor::new(pages, vec![]),
&column_meta.descriptor().descriptor.primitive_type,
)
})
.unzip();
column_iter_to_arrays(columns, types, field, filter)
}