Skip to main content

ResultDispenser

Struct ResultDispenser 

Source
pub struct ResultDispenser { /* private fields */ }
Expand description

Wraps an inner OpDispenser to expose declared op-result fields as Polydat named wires (SRD-40b §5).

Per cycle, after the inner adapter returns its OpResult, this wrapper walks the op template’s result: HashMap<String, ResultWireSpec> declarations, computes each value from the result body, and writes it through ctx.wires.write(name, value) onto the per-fiber op-template kernel’s input slot. Wrappers later in the stack (e.g. MetricsDispenser) read freshly through ctx.wires.get(name), so SRD-40b §5.2 metric evaluation sees the values landed this cycle — no HashMap intermediary.

Insertion order in the wrapper stack (SRD-40b §5.2): inner adapter → ResultDispenser → MetricsDispenser (Phase E).

Source grammars (SRD-40b §5.1):

  • count — built-in; OpResult::body.element_count().
  • ok — built-in; true iff the inner adapter returned Ok(_) (errors short-circuit before this wrapper’s body runs, so reaching this code already implies success — ok is true unless the result was a skip).
  • <path-expr> — JSON-pointer-style lookup into the result body. Supports bare names (field), dotted paths (rows.0.field), and bracketed indices (rows[0].field).
  • <polydat-call> — DEFERRED. Recognized as anything containing a ( token; currently logged once and skipped. Phase E or a follow-up adds the GK-eval-against-result-context path.

Implementations§

Source§

impl ResultDispenser

Source

pub fn wrap( inner: Arc<dyn OpDispenser>, result_spec: Option<&ResultSpec>, interface_results: Option<&BTreeMap<String, String>>, ) -> Arc<dyn OpDispenser> ⓘ

Wrap an inner dispenser with result-as-GK exposure (SRD-40b §5.2’s result-as-GK adapter layer).

Always wraps. Per the SRD, this layer is part of the canonical per-cycle pipeline: it writes the magic externs (body / count / ok) into the op-template kernel’s input slots after the inner adapter returns, so any downstream wrapper (metrics, validation, conditional next op) reading those names through ctx.wires.get sees fresh values. Writes to slots the kernel didn’t allocate (the closure-binding economy’s DCE) silently no-op via WriteOutcome::NoSlot — no overhead for ops whose op-template kernel doesn’t reference any magic extern.

The optional result_spec adds additional dispenser-side dispatch slots (legacy SRD-40b §5.1 path-expr / count / ok map-shape forms). Kernel-driven entries (string-shape source blocks, polydat-call entries) need no per-cycle code here — add_result_bindings compiled them into the op-template kernel; the magic-extern population this wrapper always performs is what makes them resolve.

Trait Implementations§

Source§

impl OpDispenser for ResultDispenser

Source§

fn execute<'a>( &'a self, cycle: u64, ctx: &'a ExecCtx<'a>, ) -> Pin<Box<dyn Future<Output = Result<OpResult, ExecutionError>> + Send + 'a>>

Execute an operation for the given cycle. Read more
Source§

fn inner_dispenser(&self) -> Option<&dyn OpDispenser>

Returns the wrapped dispenser when this is a wrapper, None when this is a leaf (the adapter’s base dispenser — e.g. CQL raw / prepared / batch, HTTP, stdout, plotter, …). Read more
Source§

fn describe(&self) -> Option<String>

One-line description of the op this dispenser represents — typically the statement text / request shape with bind-point placeholders left unresolved ({table}, {key}, ?, …). Read more
Source§

fn describe_resolved(&self, wires: &dyn WireSource) -> Option<String>

Render the actual op the dispenser would fire for the given cycle — the dryrun-equivalent view of the statement after every bind point is interpolated. Read more
Source§

fn canonical_kernel(&self) -> Option<&Arc<dyn Kernel>>

SRD-68 invariant I-3 — the dispenser’s canonical Polydat Kernel, established at construction by map_op from its parent — the parent itself, or a kernel bound under it. Any engine: the executor finds the program to bind per fiber by program_id. Returns None for dispensers that don’t own a kernel (adapters with no Polydat needs, or wrappers that delegate to an inner dispenser). Read more
Source§

fn adapter_metrics(&self) -> Vec<(String, Labels, MetricValue)>

Snapshot adapter-specific metrics for inclusion in the capture snapshot. Read more
Source§

fn status_counters(&self) -> Vec<(&str, u64)>

Adapter-specific status line entries (cumulative, non-destructive read). Read more
Source§

fn rows_per_op(&self) -> usize

The op’s uniform per-invocation cursor consumption — how many consecutive wire ordinals one execute call reads and covers. Read more
Source§

impl WrappingDispenser for ResultDispenser

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> 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> 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> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. 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, 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