pub mod adaptive;
pub mod adaptive_selection;
pub mod benchmark;
pub mod bitmap;
pub mod bloom;
pub mod brotli_compression;
pub mod column_store;
pub mod delta;
pub mod dictionary;
pub mod frame_of_reference;
pub mod lz4;
pub mod prefix;
pub mod run_length;
pub mod simd_scan;
pub mod snappy;
pub mod triple_delta;
pub mod unified;
pub mod zstd_codec;
pub mod zstd_compression;
use anyhow::Result;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::fmt;
pub use adaptive::AdaptiveCompressor;
pub use adaptive::{AdaptiveCodec, CodecType};
pub use adaptive_selection::{AdaptiveCompressionSelector, SelectionStrategy};
pub use benchmark::{BenchmarkResult, CompressionAlgo, CompressionBenchmark};
pub use bitmap::{BitmapRoaringEncoder, BitmapWAHEncoder};
pub use bloom::{BloomFilter, BloomFilterStats};
pub use brotli_compression::BrotliCompressor;
pub use column_store::ColumnStoreCompressor;
pub use delta::DeltaEncoder;
pub use dictionary::AdaptiveDictionary;
pub use dictionary::TripleDictionary;
pub use frame_of_reference::FrameOfReferenceEncoder;
pub use lz4::Lz4Compressor;
pub use prefix::{CompressedString, CompressionStats as PrefixCompressionStats, PrefixCompressor};
pub use run_length::RunLengthEncoder;
pub use simd_scan::SimdScanner;
pub use snappy::SnappyCompressor;
pub use triple_delta::{
DeltaStoreConfig, DeltaStoreStats, EncodedDeltaLog, TripleDelta, TripleDeltaStore,
};
pub use zstd_codec::{ZstdCodec, ZstdCodecStats};
pub use zstd_compression::ZstdCompressor;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AdvancedCompressionType {
RunLength = 10,
BitmapWAH = 11,
BitmapRoaring = 12,
Delta = 13,
FrameOfReference = 14,
AdaptiveDictionary = 15,
ColumnStore = 16,
Adaptive = 17,
Lz4 = 20,
Zstd = 21,
Snappy = 22,
Brotli = 23,
}
impl fmt::Display for AdvancedCompressionType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
AdvancedCompressionType::RunLength => write!(f, "RunLength"),
AdvancedCompressionType::BitmapWAH => write!(f, "BitmapWAH"),
AdvancedCompressionType::BitmapRoaring => write!(f, "BitmapRoaring"),
AdvancedCompressionType::Delta => write!(f, "Delta"),
AdvancedCompressionType::FrameOfReference => write!(f, "FrameOfReference"),
AdvancedCompressionType::AdaptiveDictionary => write!(f, "AdaptiveDictionary"),
AdvancedCompressionType::ColumnStore => write!(f, "ColumnStore"),
AdvancedCompressionType::Adaptive => write!(f, "Adaptive"),
AdvancedCompressionType::Lz4 => write!(f, "LZ4"),
AdvancedCompressionType::Zstd => write!(f, "Zstd"),
AdvancedCompressionType::Snappy => write!(f, "Snappy"),
AdvancedCompressionType::Brotli => write!(f, "Brotli"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CompressionMetadata {
pub algorithm: AdvancedCompressionType,
pub original_size: u64,
pub compressed_size: u64,
pub compression_time_us: u64,
pub metadata: HashMap<String, String>,
}
impl CompressionMetadata {
pub fn compression_ratio(&self) -> f64 {
if self.original_size == 0 {
0.0
} else {
self.compressed_size as f64 / self.original_size as f64
}
}
pub fn space_savings(&self) -> f64 {
(1.0 - self.compression_ratio()) * 100.0
}
}
impl Default for CompressionMetadata {
fn default() -> Self {
Self {
algorithm: AdvancedCompressionType::RunLength,
original_size: 0,
compressed_size: 0,
compression_time_us: 0,
metadata: HashMap::new(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CompressedData {
pub data: Vec<u8>,
pub metadata: CompressionMetadata,
}
pub const MAX_COMPRESSION_INPUT_SIZE: usize = 100 * 1024 * 1024;
pub const MAX_BLOCK_COUNT: usize = 10000;
pub const MAX_DICTIONARY_SIZE: usize = 100000;
pub trait CompressionAlgorithm {
fn compress(&self, data: &[u8]) -> Result<CompressedData>;
fn decompress(&self, compressed: &CompressedData) -> Result<Vec<u8>>;
fn algorithm_type(&self) -> AdvancedCompressionType;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_compression_metadata() {
let metadata = CompressionMetadata {
algorithm: AdvancedCompressionType::RunLength,
original_size: 1000,
compressed_size: 500,
compression_time_us: 100,
metadata: HashMap::new(),
};
assert_eq!(metadata.compression_ratio(), 0.5);
assert_eq!(metadata.space_savings(), 50.0);
}
#[test]
fn test_compression_type_display() {
assert_eq!(AdvancedCompressionType::RunLength.to_string(), "RunLength");
assert_eq!(AdvancedCompressionType::BitmapWAH.to_string(), "BitmapWAH");
assert_eq!(AdvancedCompressionType::Lz4.to_string(), "LZ4");
assert_eq!(AdvancedCompressionType::Zstd.to_string(), "Zstd");
assert_eq!(AdvancedCompressionType::Snappy.to_string(), "Snappy");
assert_eq!(AdvancedCompressionType::Brotli.to_string(), "Brotli");
}
}