mod bucket_filter;
mod column_masking;
mod deduplicating;
mod factory;
mod merging;
pub(crate) mod mock_iterator;
mod schema_evolving;
mod sorted_run;
mod vlog_seq_offset;
#[allow(unused_imports)]
pub(crate) use bucket_filter::BucketFilterIterator;
#[allow(unused_imports)]
pub(crate) use column_masking::ColumnMaskingIterator;
#[allow(unused_imports)]
pub(crate) use deduplicating::DeduplicatingIterator;
#[allow(unused_imports)]
pub(crate) use factory::{IteratorFactoryOptions, create_iterator, make_iterator_factory};
#[allow(unused_imports)]
pub(crate) use merging::MergingIterator;
#[allow(unused_imports)]
pub(crate) use schema_evolving::SchemaEvolvingIterator;
#[allow(unused_imports)]
pub(crate) use sorted_run::SortedRun;
#[allow(unused_imports)]
pub(crate) use vlog_seq_offset::VlogSeqOffsetIterator;
use crate::error::Result;
use crate::r#type::KvValue;
use bytes::Bytes;
pub(crate) trait KvIterator<'a>: 'a {
fn seek(&mut self, target: &[u8]) -> Result<()>;
fn seek_to_first(&mut self) -> Result<()>;
fn next(&mut self) -> Result<bool>;
fn valid(&self) -> bool;
fn key(&self) -> Result<Option<&[u8]>>;
fn take_key(&mut self) -> Result<Option<Bytes>>;
fn take_value(&mut self) -> Result<Option<KvValue>>;
fn take_current(&mut self) -> Result<Option<(Bytes, KvValue)>> {
if !self.valid() {
return Ok(None);
}
let key = self.take_key()?;
let value = self.take_value()?;
match (key, value) {
(Some(k), Some(v)) => Ok(Some((k, v))),
_ => Ok(None),
}
}
}
impl<'a> KvIterator<'a> for Box<dyn for<'b> KvIterator<'b>> {
fn seek(&mut self, target: &[u8]) -> Result<()> {
(**self).seek(target)
}
fn seek_to_first(&mut self) -> Result<()> {
(**self).seek_to_first()
}
fn next(&mut self) -> Result<bool> {
(**self).next()
}
fn valid(&self) -> bool {
(**self).valid()
}
fn key(&self) -> Result<Option<&[u8]>> {
(**self).key()
}
fn take_key(&mut self) -> Result<Option<Bytes>> {
(**self).take_key()
}
fn take_value(&mut self) -> Result<Option<KvValue>> {
(**self).take_value()
}
}