1pub mod adaptive;
8pub mod adaptive_selection;
10pub mod benchmark;
12pub mod bitmap;
14pub mod bloom;
16pub mod brotli_compression;
18pub mod column_store;
20pub mod delta;
22pub mod dictionary;
24pub mod frame_of_reference;
26pub mod lz4;
28pub mod prefix;
30pub mod run_length;
32pub mod simd_scan;
34pub mod snappy;
36pub mod triple_delta;
38pub mod unified;
40pub mod zstd_codec;
41pub mod zstd_compression;
42
43use anyhow::Result;
44use serde::{Deserialize, Serialize};
45use std::collections::HashMap;
46use std::fmt;
47
48pub use adaptive::AdaptiveCompressor;
50pub use adaptive::{AdaptiveCodec, CodecType};
51pub use adaptive_selection::{AdaptiveCompressionSelector, SelectionStrategy};
52pub use benchmark::{BenchmarkResult, CompressionAlgo, CompressionBenchmark};
53pub use bitmap::{BitmapRoaringEncoder, BitmapWAHEncoder};
54pub use bloom::{BloomFilter, BloomFilterStats};
55pub use brotli_compression::BrotliCompressor;
56pub use column_store::ColumnStoreCompressor;
57pub use delta::DeltaEncoder;
58pub use dictionary::AdaptiveDictionary;
59pub use dictionary::TripleDictionary;
60pub use frame_of_reference::FrameOfReferenceEncoder;
61pub use lz4::Lz4Compressor;
62pub use prefix::{CompressedString, CompressionStats as PrefixCompressionStats, PrefixCompressor};
63pub use run_length::RunLengthEncoder;
64pub use simd_scan::SimdScanner;
65pub use snappy::SnappyCompressor;
66pub use triple_delta::{
67 DeltaStoreConfig, DeltaStoreStats, EncodedDeltaLog, TripleDelta, TripleDeltaStore,
68};
69pub use zstd_codec::{ZstdCodec, ZstdCodecStats};
70pub use zstd_compression::ZstdCompressor;
71
72#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
74pub enum AdvancedCompressionType {
75 RunLength = 10,
77 BitmapWAH = 11,
79 BitmapRoaring = 12,
81 Delta = 13,
83 FrameOfReference = 14,
85 AdaptiveDictionary = 15,
87 ColumnStore = 16,
89 Adaptive = 17,
91 Lz4 = 20,
93 Zstd = 21,
95 Snappy = 22,
97 Brotli = 23,
99}
100
101impl fmt::Display for AdvancedCompressionType {
102 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
103 match self {
104 AdvancedCompressionType::RunLength => write!(f, "RunLength"),
105 AdvancedCompressionType::BitmapWAH => write!(f, "BitmapWAH"),
106 AdvancedCompressionType::BitmapRoaring => write!(f, "BitmapRoaring"),
107 AdvancedCompressionType::Delta => write!(f, "Delta"),
108 AdvancedCompressionType::FrameOfReference => write!(f, "FrameOfReference"),
109 AdvancedCompressionType::AdaptiveDictionary => write!(f, "AdaptiveDictionary"),
110 AdvancedCompressionType::ColumnStore => write!(f, "ColumnStore"),
111 AdvancedCompressionType::Adaptive => write!(f, "Adaptive"),
112 AdvancedCompressionType::Lz4 => write!(f, "LZ4"),
113 AdvancedCompressionType::Zstd => write!(f, "Zstd"),
114 AdvancedCompressionType::Snappy => write!(f, "Snappy"),
115 AdvancedCompressionType::Brotli => write!(f, "Brotli"),
116 }
117 }
118}
119
120#[derive(Debug, Clone, Serialize, Deserialize)]
122pub struct CompressionMetadata {
123 pub algorithm: AdvancedCompressionType,
125 pub original_size: u64,
127 pub compressed_size: u64,
129 pub compression_time_us: u64,
131 pub metadata: HashMap<String, String>,
133}
134
135impl CompressionMetadata {
136 pub fn compression_ratio(&self) -> f64 {
138 if self.original_size == 0 {
139 0.0
140 } else {
141 self.compressed_size as f64 / self.original_size as f64
142 }
143 }
144
145 pub fn space_savings(&self) -> f64 {
147 (1.0 - self.compression_ratio()) * 100.0
148 }
149}
150
151impl Default for CompressionMetadata {
152 fn default() -> Self {
153 Self {
154 algorithm: AdvancedCompressionType::RunLength,
155 original_size: 0,
156 compressed_size: 0,
157 compression_time_us: 0,
158 metadata: HashMap::new(),
159 }
160 }
161}
162
163#[derive(Debug, Clone, Serialize, Deserialize)]
165pub struct CompressedData {
166 pub data: Vec<u8>,
168 pub metadata: CompressionMetadata,
170}
171
172pub const MAX_COMPRESSION_INPUT_SIZE: usize = 100 * 1024 * 1024;
174
175pub const MAX_BLOCK_COUNT: usize = 10000;
177
178pub const MAX_DICTIONARY_SIZE: usize = 100000;
180
181pub trait CompressionAlgorithm {
183 fn compress(&self, data: &[u8]) -> Result<CompressedData>;
185
186 fn decompress(&self, compressed: &CompressedData) -> Result<Vec<u8>>;
188
189 fn algorithm_type(&self) -> AdvancedCompressionType;
191}
192
193#[cfg(test)]
194mod tests {
195 use super::*;
196
197 #[test]
198 fn test_compression_metadata() {
199 let metadata = CompressionMetadata {
200 algorithm: AdvancedCompressionType::RunLength,
201 original_size: 1000,
202 compressed_size: 500,
203 compression_time_us: 100,
204 metadata: HashMap::new(),
205 };
206
207 assert_eq!(metadata.compression_ratio(), 0.5);
208 assert_eq!(metadata.space_savings(), 50.0);
209 }
210
211 #[test]
212 fn test_compression_type_display() {
213 assert_eq!(AdvancedCompressionType::RunLength.to_string(), "RunLength");
214 assert_eq!(AdvancedCompressionType::BitmapWAH.to_string(), "BitmapWAH");
215 assert_eq!(AdvancedCompressionType::Lz4.to_string(), "LZ4");
216 assert_eq!(AdvancedCompressionType::Zstd.to_string(), "Zstd");
217 assert_eq!(AdvancedCompressionType::Snappy.to_string(), "Snappy");
218 assert_eq!(AdvancedCompressionType::Brotli.to_string(), "Brotli");
219 }
220}