use crate::coordinate::Region;
use crate::store::index::{IndexEntry, StoreIndex};
use std::sync::Arc;
pub struct Cursor {
region: Region,
position: u64, started: bool, index: Arc<StoreIndex>,
}
impl Cursor {
pub(crate) fn new(region: Region, index: Arc<StoreIndex>) -> Self {
Self {
region,
position: 0,
started: false,
index,
}
}
pub fn poll(&mut self) -> Option<IndexEntry> {
let results = self.index.query(&self.region);
for entry in results {
if !self.started || entry.global_sequence > self.position {
self.position = entry.global_sequence;
self.started = true;
return Some(entry);
}
}
None
}
pub fn poll_batch(&mut self, max: usize) -> Vec<IndexEntry> {
let mut batch = Vec::with_capacity(max);
let results = self.index.query(&self.region);
for entry in results {
if !self.started || entry.global_sequence > self.position {
self.position = entry.global_sequence;
self.started = true;
batch.push(entry);
if batch.len() >= max {
break;
}
}
}
batch
}
}