use crate::db::{
cursor::{CursorBoundary, IndexScanContinuationInput},
direction::Direction,
executor::{
LoweredIndexPrefixSpec, LoweredIndexRangeSpec, LoweredKey,
route::IndexPrefixChildExpansionHint,
},
};
#[derive(Clone, Copy)]
pub(in crate::db::executor) struct AccessStreamBindings<'a> {
pub(in crate::db::executor) index_prefix_specs: &'a [LoweredIndexPrefixSpec],
pub(in crate::db::executor) index_range_specs: &'a [LoweredIndexRangeSpec],
pub(in crate::db::executor) continuation: AccessScanContinuationInput<'a>,
pub(in crate::db::executor) index_prefix_child_expansion: Option<IndexPrefixChildExpansionHint>,
}
impl<'a> AccessStreamBindings<'a> {
#[must_use]
pub(in crate::db::executor) const fn new(
index_prefix_specs: &'a [LoweredIndexPrefixSpec],
index_range_specs: &'a [LoweredIndexRangeSpec],
continuation: AccessScanContinuationInput<'a>,
) -> Self {
Self {
index_prefix_specs,
index_range_specs,
continuation,
index_prefix_child_expansion: None,
}
}
#[must_use]
pub(in crate::db::executor) const fn with_index_prefix_child_expansion(
self,
index_prefix_child_expansion: Option<IndexPrefixChildExpansionHint>,
) -> Self {
Self {
index_prefix_child_expansion,
..self
}
}
#[must_use]
pub(in crate::db::executor) const fn no_index(direction: Direction) -> Self {
Self::new(&[], &[], AccessScanContinuationInput::new(None, direction))
}
#[must_use]
pub(in crate::db::executor) const fn with_index_prefix(
index_prefix_spec: &'a LoweredIndexPrefixSpec,
direction: Direction,
) -> Self {
Self::new(
std::slice::from_ref(index_prefix_spec),
&[],
AccessScanContinuationInput::new(None, direction),
)
}
#[must_use]
pub(in crate::db::executor) const fn with_index_range_continuation(
index_range_spec: &'a LoweredIndexRangeSpec,
continuation: AccessScanContinuationInput<'a>,
) -> Self {
Self::new(&[], std::slice::from_ref(index_range_spec), continuation)
}
#[must_use]
pub(in crate::db::executor) const fn direction(&self) -> Direction {
self.continuation.direction()
}
}
#[derive(Clone, Copy)]
pub(in crate::db::executor) struct AccessScanContinuationInput<'a> {
index_scan_continuation: IndexScanContinuationInput<'a>,
primary_key_boundary: Option<&'a CursorBoundary>,
}
impl<'a> AccessScanContinuationInput<'a> {
#[must_use]
pub(in crate::db::executor) const fn new(
anchor: Option<&'a LoweredKey>,
direction: Direction,
) -> Self {
Self {
index_scan_continuation: IndexScanContinuationInput::new(anchor, direction),
primary_key_boundary: None,
}
}
#[must_use]
pub(in crate::db::executor) const fn with_primary_key_boundary(
anchor: Option<&'a LoweredKey>,
direction: Direction,
primary_key_boundary: Option<&'a CursorBoundary>,
) -> Self {
Self {
index_scan_continuation: IndexScanContinuationInput::new(anchor, direction),
primary_key_boundary,
}
}
#[must_use]
pub(in crate::db::executor) const fn initial_asc() -> Self {
Self::new(None, Direction::Asc)
}
#[must_use]
pub(in crate::db::executor) const fn direction(&self) -> Direction {
self.index_scan_continuation.direction()
}
#[must_use]
pub(in crate::db::executor) const fn index_scan_continuation(
&self,
) -> IndexScanContinuationInput<'a> {
self.index_scan_continuation
}
#[must_use]
pub(in crate::db::executor) const fn primary_key_boundary(&self) -> Option<&'a CursorBoundary> {
self.primary_key_boundary
}
}