Skip to main content

StreamingExecutionEngine

Struct StreamingExecutionEngine 

Source
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

Source

pub fn new() -> Self

Create a new streaming execution engine

Source

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.

Source

pub fn max_workers(&self) -> usize

Returns the maximum number of worker threads.

Source

pub fn set_spill_config(&mut self, config: SpillConfig)

Set the spill configuration for blocking operators.

Source

pub fn set_max_buffered_chunks(&mut self, max_buffered_chunks: usize)

Set the bounded output capacity used by worker channels.

Source

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.

Source

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.

Source

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.

Source

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.

Source

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.

Source

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.

Source

pub fn partition_count(&self) -> usize

Returns the number of registered partition executors.

Source

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.

Source

pub fn runtime(&self) -> Option<&Arc<ExecutionRuntime>>

Return a reference to the attached runtime, if any.

Source

pub fn open_root(&mut self) -> Result<(), QueryError>

Open the root executor (used by ResultStream).

Source

pub fn next_chunk_from_root(&mut self) -> Result<Option<DataChunk>, QueryError>

Pull the next chunk from the root executor (used by ResultStream).

Source

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.

Source

pub fn close_root(&mut self) -> Result<(), QueryError>

Close the root executor (used by ResultStream).

Source

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.

Source

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.

Source

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§

Source§

impl Default for StreamingExecutionEngine

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .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
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .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
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more