use bson::DateTime;
use bson::oid::ObjectId;
use serde::{Deserialize, Serialize};
use anyhow::Result;
use bloom::{BloomFilter, Unionable};
use crate::storage::conf::*;
use crate::storage::sstable::*;
pub struct Level {
pub meta: LevelMeta,
pub tables: Vec<SSTableHandle>,
pub bloom_filter: BloomFilter,
}
impl Level {
pub fn new(meta: LevelMeta, tables: Vec<SSTableHandle>) -> Result<Self> {
let bloom_filter = BloomFilter::with_rate(
BLOOM_FILTER_ERROR_RATE,
BLOOM_FILTER_SIZE,
);
Ok(Level {
meta,
tables,
bloom_filter,
})
}
pub fn get_bloom_filter(&self) -> Result<BloomFilter> {
let mut bloom_filter = BloomFilter::with_rate(
BLOOM_FILTER_ERROR_RATE,
BLOOM_FILTER_SIZE,
);
for table in &self.tables {
let table_bloom_filter = table.get_bloom_filter()?;
bloom_filter.union(&table_bloom_filter);
}
Ok(bloom_filter)
}
pub fn add_sstable(&mut self, ) -> Result<()> {
Ok(())
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct LevelMeta {
pub id: ObjectId,
pub created_at: DateTime,
pub level: usize,
pub num_tables: usize,
}
#[cfg(test)]
mod test {}