use std::any::Any;
use vortex_session::SessionExt;
use vortex_session::SessionGuard;
use vortex_session::SessionVar;
use crate::Scheme;
use crate::SchemeExt;
use crate::schemes::binary;
use crate::schemes::decimal;
use crate::schemes::float;
use crate::schemes::integer;
use crate::schemes::string;
use crate::schemes::temporal;
static DELTA_SCHEME: integer::DeltaScheme = integer::DeltaScheme::new(1.25);
#[derive(Clone, Debug)]
pub struct CompressionSession {
schemes: Vec<&'static dyn Scheme>,
}
impl Default for CompressionSession {
fn default() -> Self {
Self {
schemes: vec![
&integer::FOR_V1,
&integer::ZigZagScheme,
&integer::BITPACKING_V1,
&integer::SparseScheme,
&integer::IntDictScheme,
&integer::RunEndScheme,
&integer::SequenceScheme,
&integer::IntRLEScheme,
&DELTA_SCHEME,
#[cfg(feature = "pco")]
&integer::PcoScheme,
&float::ALPScheme,
&float::ALPRDScheme,
&float::FloatDictScheme,
&float::NullDominatedSparseScheme,
&float::FloatRLEScheme,
#[cfg(feature = "pco")]
&float::PcoScheme,
&string::StringDictScheme,
&string::FSSTScheme,
&string::OnPairScheme,
&string::NullDominatedSparseScheme,
#[cfg(feature = "zstd")]
&string::ZstdScheme,
&binary::BinaryDictScheme,
&binary::VarBinScheme,
#[cfg(feature = "zstd")]
&binary::ZstdScheme,
#[cfg(feature = "zstd")]
&binary::ZstdBuffersScheme,
&decimal::DECIMAL_V1,
&temporal::TemporalScheme,
],
}
}
}
impl SessionVar for CompressionSession {
fn as_any(&self) -> &dyn Any {
self
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
}
impl CompressionSession {
pub fn register(&mut self, scheme: &'static dyn Scheme) {
assert!(
!self.schemes.iter().any(|s| s.id() == scheme.id()),
"scheme {:?} is already registered",
scheme.id(),
);
self.schemes.push(scheme);
}
pub fn schemes(&self) -> &[&'static dyn Scheme] {
&self.schemes
}
}
pub trait CompressionSessionExt: SessionExt {
fn compression(&self) -> SessionGuard<'_, CompressionSession>;
fn register_scheme(&self, scheme: &'static dyn Scheme);
}
impl<S: SessionExt> CompressionSessionExt for S {
fn compression(&self) -> SessionGuard<'_, CompressionSession> {
self.get::<CompressionSession>()
}
fn register_scheme(&self, scheme: &'static dyn Scheme) {
self.get_mut::<CompressionSession>().register(scheme);
}
}