mod grouped;
mod scalar;
use crate::{
db::{
PersistedRow,
cursor::{GroupedPlannedCursor, PlannedCursor},
executor::{
ContinuationEngine, ExecutablePlan, ExecutionTrace, LoadCursorInput, PreparedLoadPlan,
ResolvedLoadCursorContext,
pipeline::contracts::{CursorPage, GroupedCursorPage, LoadExecutor},
},
response::EntityResponse,
},
error::InternalError,
traits::{EntityKind, EntityValue},
};
pub(in crate::db::executor) use crate::db::executor::pipeline::orchestrator::{
LoadExecutionMode, LoadTracingMode,
};
#[cfg(test)]
pub(in crate::db::executor) use crate::db::executor::pipeline::orchestrator::{
load_execute_stage_order_guard, load_pipeline_state_optional_slot_count_guard,
};
pub(in crate::db::executor) use grouped::{
PreparedGroupedRouteRuntime, execute_prepared_grouped_route_runtime,
};
#[cfg(feature = "sql")]
pub(in crate::db) use scalar::execute_initial_scalar_rows_for_canister;
pub(in crate::db::executor) use scalar::{
PreparedScalarMaterializedBoundary, PreparedScalarRouteRuntime,
execute_prepared_scalar_route_runtime, execute_prepared_scalar_rows_for_canister,
};
fn resolve_entrypoint_cursor(
plan: &PreparedLoadPlan,
cursor: LoadCursorInput,
execution_mode: LoadExecutionMode,
) -> Result<ResolvedLoadCursorContext, InternalError> {
ContinuationEngine::resolve_load_cursor_context(plan, cursor, execution_mode.requested_shape())
}
impl<E> LoadExecutor<E>
where
E: EntityKind + EntityValue,
{
pub(in crate::db::executor::pipeline) fn resolve_entrypoint_cursor(
plan: &PreparedLoadPlan,
cursor: LoadCursorInput,
execution_mode: LoadExecutionMode,
) -> Result<ResolvedLoadCursorContext, InternalError> {
resolve_entrypoint_cursor(plan, cursor, execution_mode)
}
}
impl<E> LoadExecutor<E>
where
E: PersistedRow + EntityValue,
{
#[inline(never)]
pub(crate) fn execute(
&self,
plan: ExecutablePlan<E>,
) -> Result<EntityResponse<E>, InternalError> {
let page = execute_prepared_scalar_rows_for_canister(
&self.db,
self.debug,
plan.into_prepared_load_plan(),
)?;
page.into_entity_response::<E>()
}
pub(in crate::db) fn execute_paged_with_cursor_traced(
&self,
plan: ExecutablePlan<E>,
cursor: impl Into<PlannedCursor>,
) -> Result<(CursorPage<E>, Option<ExecutionTrace>), InternalError> {
self.execute_load_scalar_page_with_trace(
plan.into_prepared_load_plan(),
LoadCursorInput::scalar(cursor),
)
}
#[cfg(test)]
pub(in crate::db) fn execute_paged_with_cursor(
&self,
plan: ExecutablePlan<E>,
cursor: impl Into<PlannedCursor>,
) -> Result<CursorPage<E>, InternalError> {
let (page, _) = self.execute_paged_with_cursor_traced(plan, cursor)?;
Ok(page)
}
pub(in crate::db) fn execute_grouped_paged_with_cursor_traced(
&self,
plan: ExecutablePlan<E>,
cursor: impl Into<GroupedPlannedCursor>,
) -> Result<(GroupedCursorPage, Option<ExecutionTrace>), InternalError> {
self.execute_load_grouped_page_with_trace(
plan.into_prepared_load_plan(),
LoadCursorInput::grouped(cursor),
)
}
}