mod execution;
mod fast_stream;
pub(in crate::db::executor) mod grouped;
mod materialization;
mod post_access;
mod scan;
use crate::{
db::{
Db,
cursor::{ContinuationToken, GroupedContinuationToken},
direction::Direction,
executor::{
ExecutionOptimization, KeyOrderComparator, OrderedKeyStreamBox, RuntimeGroupedRow,
saturating_u32_len,
},
response::EntityResponse,
},
traits::EntityKind,
};
pub(in crate::db) use execution::StructuralCursorPage;
pub(in crate::db::executor) use execution::{
CursorEmissionMode, ExecutionInputs, ExecutionOutcomeMetrics, ExecutionRuntimeAdapter,
KernelRowsExecutionAttempt, MaterializedExecutionAttempt, MaterializedExecutionPayload,
PreparedExecutionInputParts, PreparedExecutionProjection, ProjectionMaterializationMode,
ResolvedExecutionKeyStream, RowCollectorMaterializationRequest,
RuntimePageMaterializationRequest,
};
pub(in crate::db::executor) use fast_stream::{FastStreamRouteKind, FastStreamRouteRequest};
pub(in crate::db::executor) use grouped::{
GroupedPlannerPayload, GroupedRoutePayload, GroupedRouteStage, IndexSpecBundle,
};
pub(in crate::db::executor) use materialization::{
KernelPageMaterializationRequest, ScalarMaterializationCapabilities,
};
pub(in crate::db::executor) use post_access::PostAccessContract;
pub(in crate::db) use scan::AccessScanContinuationInput;
pub(in crate::db::executor) use scan::AccessStreamBindings;
#[derive(Clone, Debug, Eq, PartialEq)]
pub(in crate::db) enum PageCursor {
Scalar(ContinuationToken),
Grouped(GroupedContinuationToken),
}
impl PageCursor {
#[must_use]
pub(in crate::db) const fn as_scalar(&self) -> Option<&ContinuationToken> {
match self {
Self::Scalar(token) => Some(token),
Self::Grouped(_) => None,
}
}
#[must_use]
pub(in crate::db) const fn as_grouped(&self) -> Option<&GroupedContinuationToken> {
match self {
Self::Scalar(_) => None,
Self::Grouped(token) => Some(token),
}
}
#[cfg(test)]
pub(in crate::db) fn encode(&self) -> Result<Vec<u8>, crate::db::cursor::TokenWireError> {
match self {
Self::Scalar(token) => token.encode(),
Self::Grouped(token) => token.encode(),
}
}
}
impl From<ContinuationToken> for PageCursor {
fn from(value: ContinuationToken) -> Self {
Self::Scalar(value)
}
}
impl From<GroupedContinuationToken> for PageCursor {
fn from(value: GroupedContinuationToken) -> Self {
Self::Grouped(value)
}
}
#[derive(Debug)]
pub(in crate::db) struct CursorPage<E: EntityKind> {
pub(in crate::db) items: EntityResponse<E>,
pub(in crate::db) next_cursor: Option<PageCursor>,
}
#[derive(Debug)]
pub(in crate::db::executor) struct GroupedCursorPage {
pub(in crate::db::executor) rows: Vec<RuntimeGroupedRow>,
pub(in crate::db::executor) next_cursor: Option<PageCursor>,
}
#[derive(Debug)]
pub(in crate::db) struct StructuralGroupedProjectionResult {
page: GroupedCursorPage,
}
impl StructuralGroupedProjectionResult {
#[must_use]
pub(in crate::db::executor) const fn from_page(page: GroupedCursorPage) -> Self {
Self { page }
}
#[must_use]
pub(in crate::db) fn row_count(&self) -> u32 {
saturating_u32_len(self.page.rows.len())
}
#[must_use]
pub(in crate::db) fn into_parts(self) -> (Vec<RuntimeGroupedRow>, Option<PageCursor>) {
let Self { page } = self;
(page.rows, page.next_cursor)
}
}
pub(in crate::db::executor) const fn key_stream_comparator_from_direction(
direction: Direction,
) -> KeyOrderComparator {
KeyOrderComparator::from_direction(direction)
}
pub(in crate::db::executor) struct FastPathKeyResult {
pub(in crate::db::executor) ordered_key_stream: OrderedKeyStreamBox,
pub(in crate::db::executor) rows_scanned: Option<usize>,
pub(in crate::db::executor) optimization: ExecutionOptimization,
}
#[derive(Clone)]
pub(in crate::db) struct LoadExecutor<E: EntityKind> {
pub(in crate::db::executor) db: Db<E::Canister>,
pub(in crate::db::executor) debug: bool,
}