use crate::types::sequence::SeqNum;
use bytes::Bytes;
use crate::memtable::skiplist::{decode_seq_from_key, user_key_of, EntryValue};
#[derive(Clone, Debug)]
pub struct MemEntry {
pub user_key: Bytes,
pub seq: SeqNum,
pub entry: EntryValue,
}
pub struct MemtableIterator<'a> {
inner: Box<dyn Iterator<Item = (Bytes, EntryValue)> + 'a>,
read_seq: SeqNum,
last_user_key: Option<Bytes>,
}
impl<'a> MemtableIterator<'a> {
pub fn new(inner: impl Iterator<Item = (Bytes, EntryValue)> + 'a, read_seq: SeqNum) -> Self {
Self {
inner: Box::new(inner),
read_seq,
last_user_key: None,
}
}
}
impl<'a> Iterator for MemtableIterator<'a> {
type Item = MemEntry;
fn next(&mut self) -> Option<Self::Item> {
loop {
let (ikey_bytes, entry) = self.inner.next()?;
let seq = decode_seq_from_key(&ikey_bytes);
if seq > self.read_seq {
continue;
}
let uk = Bytes::copy_from_slice(user_key_of(&ikey_bytes));
if let Some(ref last) = self.last_user_key {
if *last == uk {
continue;
}
}
self.last_user_key = Some(uk.clone());
return Some(MemEntry {
user_key: uk,
seq,
entry,
});
}
}
}