Skip to main content

ExpandResponse

Struct ExpandResponse 

Source
pub struct ExpandResponse {
    pub reached: Vec<NodeId>,
    pub degrees: Vec<u32>,
    pub edges: Vec<EdgeRef>,
    pub truncated: Option<TruncationReason>,
    pub served_by: HopBackend,
}

Fields§

§reached: Vec<NodeId>§degrees: Vec<u32>

Each reached node’s degree in the authorized subgraph, index-aligned with reached. Empty unless the request asked for it.

The engine is the only party that can say: a reached node is an internal id and an EdgeRef names its endpoints by producer key, so nothing above this port can join the two without another read. Every edge counted has passed the caller’s scope, so this is the degree inside the authorized subgraph and never a global one the caller cannot see (Authorization Model: “degree ordering, budgets and truncation are computed on authorized rows only”). It is what lets a neighborhood projection keep the structural core when a hub exceeds the node budget (fr-neighborhood-projection).

A count is a lower bound when the hop reports EdgeScanCap: the scan stopped at the budget, so a node may have edges it did not see. The ranking is then approximate — which the truncation reason says.

§edges: Vec<EdgeRef>§truncated: Option<TruncationReason>

Never silent.

§served_by: HopBackend

Which backend produced this answer.

Found while building the prototype. The pattern backend declines by falling back, and the decline was recorded only in a log line. A log line is not something a test can assert on, so the suite could not tell a pattern hop that ran from one that failed and was silently served by the two-query hop instead – which is exactly what happened, for every traversal, when the pattern lost its anchor. Reporting the backend on the response is what makes “the pattern actually served this” an assertion rather than an assumption.

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<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, 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<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