use parquet2::bloom_filter;
use parquet2::error::Result;
use parquet2::encoding::Encoding;
use parquet2::page::{split_buffer, DataPage, DictPage, Page};
use parquet2::schema::types::PhysicalType;
fn deserialize(page: &DataPage, dict: Option<&DictPage>) -> Result<()> {
let (_rep_levels, _def_levels, _values_buffer) = split_buffer(page)?;
match (
page.descriptor.primitive_type.physical_type,
page.encoding(),
dict,
) {
(
PhysicalType::Int32,
Encoding::PlainDictionary | Encoding::RleDictionary,
Some(_dict_page),
) => {
todo!()
}
(PhysicalType::Int32, Encoding::Plain, None) => {
todo!()
}
_ => todo!(),
}
}
fn main() -> Result<()> {
use std::env;
let args: Vec<String> = env::args().collect();
let path = &args[1];
use parquet2::read::read_metadata;
let mut reader = std::fs::File::open(path)?;
let metadata = read_metadata(&mut reader)?;
println!("{:#?}", metadata);
let row_group = 0;
let column = 0;
let columns = metadata.row_groups[row_group].columns();
let column_metadata = &columns[column];
use parquet2::read;
let index = read::read_columns_indexes(&mut reader, columns)?;
println!("{index:?}");
let pages = read::read_pages_locations(&mut reader, columns)?;
println!("{pages:?}");
if let Some(maybe_stats) = column_metadata.statistics() {
let stats = maybe_stats?;
use parquet2::statistics::PrimitiveStatistics;
match stats.physical_type() {
PhysicalType::Int32 => {
let stats = stats
.as_any()
.downcast_ref::<PrimitiveStatistics<i32>>()
.unwrap();
let _min: i32 = stats.min_value.unwrap();
let _max: i32 = stats.max_value.unwrap();
let _null_count: i64 = stats.null_count.unwrap();
}
PhysicalType::Int64 => {
let stats = stats
.as_any()
.downcast_ref::<PrimitiveStatistics<i64>>()
.unwrap();
let _min: i64 = stats.min_value.unwrap();
let _max: i64 = stats.max_value.unwrap();
let _null_count: i64 = stats.null_count.unwrap();
}
_ => todo!(),
}
}
let mut bitset = vec![];
bloom_filter::read(column_metadata, &mut reader, &mut bitset)?;
if !bitset.is_empty() {
let value = 100i64;
let hash = bloom_filter::hash_native(value);
let _in_set = bloom_filter::is_in_set(&bitset, hash);
}
use parquet2::read::get_page_iterator;
let pages = get_page_iterator(column_metadata, &mut reader, None, vec![], 1024 * 1024)?;
let mut decompress_buffer = vec![];
let mut dict = None;
for maybe_page in pages {
let page = maybe_page?;
let page = parquet2::read::decompress(page, &mut decompress_buffer)?;
match page {
Page::Dict(page) => {
dict = Some(page);
}
Page::Data(page) => {
let _array = deserialize(&page, dict.as_ref())?;
}
}
}
Ok(())
}