pub struct StreamingExecutionEngine { /* private fields */ }Expand description
Streaming execution engine
Drives a single root executor (or multiple partition executors) via direct pull: open() → loop next() → close().
Partitioned roots retain their normal Gather semantics. Eligible local
inputs may run through the bounded coordinator when max_workers > 1;
all other trees retain the serial pull path.
An optional ExecutionRuntime can be attached to enable cancellation,
memory tracking, and profiling. Cancel checking and profile recording
are built into StreamingExecutor dispatch in executor.rs.
Implementations§
Source§impl StreamingExecutionEngine
impl StreamingExecutionEngine
Sourcepub fn set_max_workers(&mut self, max_workers: usize)
pub fn set_max_workers(&mut self, max_workers: usize)
Set the maximum number of worker threads for intra-query parallelism.
Values below one are normalised to the serial fallback.
When a runtime is already attached and no shared scheduler is
configured, this creates a per-query MorselWorkerPool.
Sourcepub fn max_workers(&self) -> usize
pub fn max_workers(&self) -> usize
Returns the maximum number of worker threads.
Sourcepub fn set_spill_config(&mut self, config: SpillConfig)
pub fn set_spill_config(&mut self, config: SpillConfig)
Set the spill configuration for blocking operators.
Sourcepub fn set_max_buffered_chunks(&mut self, max_buffered_chunks: usize)
pub fn set_max_buffered_chunks(&mut self, max_buffered_chunks: usize)
Set the bounded output capacity used by worker channels.
Sourcepub fn register_executor(
&mut self,
_executor_id: usize,
executor: StreamingExecutor,
)
pub fn register_executor( &mut self, _executor_id: usize, executor: StreamingExecutor, )
Register the root executor.
If a runtime is already attached, it is recursively injected into the executor tree so that cancellation, profiling, and resource tracking work regardless of registration order.
Sourcepub fn register_partitioned_root(
&mut self,
partition_count: usize,
executor: StreamingExecutor,
) -> Result<(), QueryError>
pub fn register_partitioned_root( &mut self, partition_count: usize, executor: StreamingExecutor, ) -> Result<(), QueryError>
Register a root that owns local partition trees below one or more
exchange nodes. Unlike register_partition_executors, execution still
starts from a single root, while the recorded count remains available
to profile and explain consumers.
Sourcepub fn register_partition_executors(
&mut self,
executors: Vec<StreamingExecutor>,
)
pub fn register_partition_executors( &mut self, executors: Vec<StreamingExecutor>, )
Register partition executors (one per partition).
When set, [execute] will run each partition’s executor sequentially
and combine the results. This replaces any single root executor.
If a runtime is already attached, it is recursively injected into
each partition executor.
Sourcepub fn build_partitioned_executor(
&mut self,
local_trees: Vec<StreamingExecutor>,
gather_mode: GatherOperator,
global_tree: Option<StreamingExecutor>,
) -> Result<(), QueryError>
pub fn build_partitioned_executor( &mut self, local_trees: Vec<StreamingExecutor>, gather_mode: GatherOperator, global_tree: Option<StreamingExecutor>, ) -> Result<(), QueryError>
Build and register a partitioned executor tree.
Wraps local_trees (one per partition) in a GatherOperator with
the given gather_mode, then optionally attaches a global_tree on
top. The resulting tree is set as the root executor so that normal
[execute] and [into_stream] paths work unchanged.
When global_tree is Some, the tree is:
global_tree → Gather(local[0], local[1], …)
When global_tree is None, only the gather is used as root.
Sourcepub fn build_partitioned_sort_executor(
&mut self,
local_trees: Vec<StreamingExecutor>,
sort_expressions: Vec<Expression>,
sort_directions: Vec<SortDirection>,
limit: Option<usize>,
) -> Result<(), QueryError>
pub fn build_partitioned_sort_executor( &mut self, local_trees: Vec<StreamingExecutor>, sort_expressions: Vec<Expression>, sort_directions: Vec<SortDirection>, limit: Option<usize>, ) -> Result<(), QueryError>
Build the only supported partitioned sort shape:
LocalSort(spec) × N -> Gather::MergeSort(spec, limit).
This entry point prevents callers from feeding arbitrary, unsorted
local streams to the k-way merge implementation. limit, when set,
is applied globally after merge order is established.
Sourcepub fn build_partitioned_join_executor(
&mut self,
left_local_trees: Vec<StreamingExecutor>,
right_local_trees: Vec<StreamingExecutor>,
global_join: StreamingExecutor,
) -> Result<(), QueryError>
pub fn build_partitioned_join_executor( &mut self, left_local_trees: Vec<StreamingExecutor>, right_local_trees: Vec<StreamingExecutor>, global_join: StreamingExecutor, ) -> Result<(), QueryError>
Build a semantically-correct partitioned join shape:
Gather(left local trees) -> GlobalJoin <- Gather(right local trees).
This is a gather exchange rather than a hash/range shuffle. It keeps every join variant correct while the engine remains single-threaded; a future distributed exchange may replace either gather independently.
Sourcepub fn partition_count(&self) -> usize
pub fn partition_count(&self) -> usize
Returns the number of registered partition executors.
Sourcepub fn set_runtime(&mut self, runtime: Arc<ExecutionRuntime>)
pub fn set_runtime(&mut self, runtime: Arc<ExecutionRuntime>)
Attach an execution runtime (for cancellation, profiling, memory tracking).
Also propagates the runtime recursively into all operators.
If max_workers > 1 and no shared scheduler is configured, creates
a per-query MorselWorkerPool.
Sourcepub fn runtime(&self) -> Option<&Arc<ExecutionRuntime>>
pub fn runtime(&self) -> Option<&Arc<ExecutionRuntime>>
Return a reference to the attached runtime, if any.
Sourcepub fn open_root(&mut self) -> Result<(), QueryError>
pub fn open_root(&mut self) -> Result<(), QueryError>
Open the root executor (used by ResultStream).
Sourcepub fn next_chunk_from_root(&mut self) -> Result<Option<DataChunk>, QueryError>
pub fn next_chunk_from_root(&mut self) -> Result<Option<DataChunk>, QueryError>
Pull the next chunk from the root executor (used by ResultStream).
Sourcepub fn stop_root(&mut self) -> Result<(), QueryError>
pub fn stop_root(&mut self) -> Result<(), QueryError>
Stop the root executor (signal upstream to stop producing).
Used by ResultStream before close to allow operators to
stop upstream production early.
Sourcepub fn close_root(&mut self) -> Result<(), QueryError>
pub fn close_root(&mut self) -> Result<(), QueryError>
Close the root executor (used by ResultStream).
Sourcepub fn execute(self) -> Result<ResultStream, QueryError>
pub fn execute(self) -> Result<ResultStream, QueryError>
Execute the query and return a streaming result handle.
This is the default execution path. Results are delivered chunk-at-a-time
via ResultStream, enabling:
- Low first-chunk latency (no need to wait for full materialization)
- Constant memory usage regardless of result size
- Cooperative cancellation mid-stream
For cases that require full materialization (e.g. EXPLAIN/PROFILE
diagnostics, test assertions), use execute_collected.
§Partitioned Execution
When partition executors are registered, partitions are executed sequentially and the collected chunks are wrapped in a stream. Formal parallelism runs through the Gather-based root.
Sourcepub fn execute_collected(&mut self) -> Result<Vec<DataChunk>, QueryError>
pub fn execute_collected(&mut self) -> Result<Vec<DataChunk>, QueryError>
Execute and collect all chunks into memory (explicit materialization).
Use this when you need the full result set upfront. For streaming
consumption, prefer execute.
Sourcepub fn into_stream(self) -> Result<ResultStream, QueryError>
pub fn into_stream(self) -> Result<ResultStream, QueryError>
Convert this engine into a ResultStream for chunk-at-a-time consumption.
Requires a runtime to have been set (via [set_runtime]).
Returns an error if no runtime has been attached.
Trait Implementations§
Auto Trait Implementations§
impl !RefUnwindSafe for StreamingExecutionEngine
impl !Sync for StreamingExecutionEngine
impl !UnwindSafe for StreamingExecutionEngine
impl Freeze for StreamingExecutionEngine
impl Send for StreamingExecutionEngine
impl Unpin for StreamingExecutionEngine
impl UnsafeUnpin for StreamingExecutionEngine
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.