use std::collections::BTreeMap;
use crate::pax::PaxRecord;
#[derive(Default)]
pub struct MemTable {
map: BTreeMap<Vec<u8>, PaxRecord>,
approx_bytes: usize,
}
impl MemTable {
pub fn new() -> Self {
Self::default()
}
pub fn put(&mut self, mut record: PaxRecord) {
if matches!(record.vector, crate::pax::VectorField::Unchanged)
&& let Some(existing) = self.map.get(&record.key)
{
record.vector = existing.vector.clone();
}
let size = record.key.len() + record.scalar_blob.len() + 16;
let size = size
+ match &record.vector {
crate::pax::VectorField::Set(b) => b.len(),
_ => 0,
};
if let Some(old) = self.map.insert(record.key.clone(), record) {
self.approx_bytes = self.approx_bytes.saturating_sub(
old.key.len()
+ old.scalar_blob.len()
+ match &old.vector {
crate::pax::VectorField::Set(b) => b.len(),
_ => 0,
}
+ 16,
);
}
self.approx_bytes += size;
}
pub fn get(&self, key: &[u8]) -> Option<&PaxRecord> {
self.map.get(key)
}
pub fn approx_bytes(&self) -> usize {
self.approx_bytes
}
pub fn len(&self) -> usize {
self.map.len()
}
pub fn is_empty(&self) -> bool {
self.map.is_empty()
}
pub fn iter_sorted(&self) -> impl Iterator<Item = &PaxRecord> {
self.map.values()
}
pub fn clear(&mut self) {
self.map.clear();
self.approx_bytes = 0;
}
}