use tessarikv_types::{KeyspaceId, SequenceNumber};
use super::Db;
use super::read::{ScanPage, ScanRange, scan_in};
use super::view::View;
use crate::{ReadOptions, Result};
impl Db {
pub async fn multi_scan<'a>(
&self,
keyspace: KeyspaceId,
ranges: impl IntoIterator<Item = ScanRange<'a>>,
options: &ReadOptions,
) -> Result<Vec<ScanPage>> {
self.check_keyspace(keyspace)?;
let view = self.view.load();
let snapshot = self.visible_sequence()?;
scan_all(&view, keyspace, ranges, snapshot, options).await
}
pub(super) async fn multi_scan_at<'a>(
&self,
keyspace: KeyspaceId,
ranges: impl IntoIterator<Item = ScanRange<'a>>,
snapshot: SequenceNumber,
options: &ReadOptions,
) -> Result<Vec<ScanPage>> {
self.check_keyspace(keyspace)?;
let view = self.view.load();
scan_all(&view, keyspace, ranges, snapshot, options).await
}
}
async fn scan_all<'a>(
view: &View,
keyspace: KeyspaceId,
ranges: impl IntoIterator<Item = ScanRange<'a>>,
snapshot: SequenceNumber,
options: &ReadOptions,
) -> Result<Vec<ScanPage>> {
let ranges = ranges.into_iter();
let mut pages = Vec::with_capacity(ranges.size_hint().0);
for range in ranges {
pages.push(scan_in(view, keyspace, range, snapshot, options.fill_cache).await?);
}
Ok(pages)
}