use prost::Message;
pub use super::pb23::{
BufferCompression, ByteStreamSplit, CompressionScheme, CompressiveEncoding, Constant, Delta,
Dictionary, FixedSizeList, Flat, Fsst, General, InlineBitpacking, OutOfLineBitpacking,
PackedStruct, Range, RepDefLayer, Rle, Variable, VariablePackedStruct, compressive_encoding,
variable_packed_struct,
};
#[derive(Clone, Debug, Default, PartialEq)]
pub struct PageLayout {
pub layout: Option<page_layout::Layout>,
}
pub mod page_layout {
use super::*;
#[derive(Clone, Debug, PartialEq)]
pub enum Layout {
MiniBlockLayout(MiniBlockLayout),
FullZipLayout(FullZipLayout),
ConstantLayout(ConstantLayout),
BlobLayout(Box<BlobLayout>),
}
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct MiniBlockLayout {
pub rep_compression: Option<CompressiveEncoding>,
pub def_compression: Option<CompressiveEncoding>,
pub value_compression: Option<CompressiveEncoding>,
pub dictionary: Option<CompressiveEncoding>,
pub num_dictionary_items: u64,
pub layers: Vec<i32>,
pub num_buffers: u64,
pub repetition_index_depth: u32,
pub num_items: u64,
pub has_large_chunk: bool,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct FullZipLayout {
pub bits_rep: u32,
pub bits_def: u32,
pub details: Option<full_zip_layout::Details>,
pub num_items: u32,
pub num_visible_items: u32,
pub value_compression: Option<CompressiveEncoding>,
pub layers: Vec<i32>,
}
pub mod full_zip_layout {
#[derive(Clone, Debug, PartialEq)]
pub enum Details {
BitsPerValue(u32),
BitsPerOffset(u32),
}
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ConstantLayout {
pub layers: Vec<i32>,
pub inline_value: Option<bytes::Bytes>,
pub rep_compression: Option<CompressiveEncoding>,
pub def_compression: Option<CompressiveEncoding>,
pub num_rep_values: u64,
pub num_def_values: u64,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct BlobLayout {
pub inner_layout: Option<Box<PageLayout>>,
pub layers: Vec<i32>,
}
impl PageLayout {
pub(crate) fn estimated_size(&self) -> usize {
let compression =
|value: &Option<CompressiveEncoding>| value.as_ref().map_or(0, |v| v.encoded_len() * 4);
std::mem::size_of::<Self>()
+ match &self.layout {
Some(page_layout::Layout::MiniBlockLayout(v)) => {
v.layers.capacity() * 4
+ compression(&v.rep_compression)
+ compression(&v.def_compression)
+ compression(&v.value_compression)
+ compression(&v.dictionary)
}
Some(page_layout::Layout::FullZipLayout(v)) => {
v.layers.capacity() * 4 + compression(&v.value_compression)
}
Some(page_layout::Layout::ConstantLayout(v)) => {
v.layers.capacity() * 4
+ v.inline_value.as_ref().map_or(0, |v| v.len())
+ compression(&v.rep_compression)
+ compression(&v.def_compression)
}
Some(page_layout::Layout::BlobLayout(v)) => {
std::mem::size_of::<BlobLayout>()
+ v.layers.capacity() * 4
+ v.inner_layout.as_ref().map_or(0, |v| v.estimated_size())
}
None => 0,
}
}
}