#![allow(dead_code)]
use super::{SequenceNumber, VersionPointer};
#[derive(Clone, Debug)]
pub struct SparseEntry {
pub key: Vec<u8>,
pub pointer: VersionPointer,
}
#[derive(Clone, Debug, Default)]
pub struct SparseIndex {
entries: Vec<SparseEntry>,
}
impl SparseIndex {
pub fn new(mut entries: Vec<SparseEntry>) -> Self {
entries.sort_by(|a, b| a.key.cmp(&b.key));
Self { entries }
}
pub fn len(&self) -> usize {
self.entries.len()
}
pub fn locate(&self, key: &[u8], snapshot: SequenceNumber) -> Option<VersionPointer> {
let idx = self
.entries
.binary_search_by(|entry| entry.key.as_slice().cmp(key))
.unwrap_or_else(|idx| idx.saturating_sub(1));
self.entries.get(idx).and_then(|entry| {
if entry.key.as_slice() <= key && entry.pointer.is_visible_at(snapshot) {
Some(entry.pointer.clone())
} else {
None
}
})
}
pub fn range(
&self,
start: &[u8],
end: &[u8],
snapshot: SequenceNumber,
) -> Vec<(Vec<u8>, VersionPointer)> {
self.entries
.iter()
.filter(|entry| {
entry.key.as_slice() >= start
&& entry.key.as_slice() <= end
&& entry.pointer.is_visible_at(snapshot)
})
.map(|entry| (entry.key.clone(), entry.pointer.clone()))
.collect()
}
}