Skip to main content

Boundary

Enum Boundary 

Source
pub enum Boundary {
    GroundFact,
    HeadAggregation,
    BodyNegation,
    BodyIsExpr,
    InsufficientPositiveAtoms {
        positive_count: usize,
    },
    JoinKeysExceedBinaryFallbackLimit {
        context: ExecutorContext,
        count: usize,
        limit: usize,
    },
    UnsupportedKeyType {
        var: String,
        ty: ScalarType,
    },
}
Expand description

One reason a rule is ineligible for multiway planning.

Boundaries are reported independently — a rule that is both negated and over the key limit produces two boundaries, not one “first-failed” boundary. This makes the eligibility report stable against ordering changes in future analyzer passes.

Variants§

§

GroundFact

The rule is a ground fact (no body to plan).

§

HeadAggregation

The rule head contains an aggregation expression. Multiway joins underneath an aggregation re-introduce the aggregation-boundary problem the binary lowering already handles via GroupBy + Project; we leave that machinery intact rather than re-derive it inside multiway.

§

BodyNegation

The body contains a crate::ast::BodyLiteral::Negated literal. Negated literals lower to set difference (Diff) in the binary path — multiway has no equivalent at this stage of the planner foundation.

§

BodyIsExpr

The body contains a crate::ast::BodyLiteral::IsExpr computed binding. Binding-via-expression introduces a dependency between body literals that the join graph alone does not capture.

§

InsufficientPositiveAtoms

The body has fewer than two positive atoms. Multiway needs at least two atoms to be meaningful; one-atom or zero-atom bodies are not multiway candidates regardless of executor.

Fields

§positive_count: usize

Observed number of positive body atoms.

§

JoinKeysExceedBinaryFallbackLimit

The total number of distinct join-key variables exceeds the binary-fallback executor’s pack_keys limit. Carried as a runtime value so the explain output can name the count. See BINARY_FALLBACK_KEY_LIMIT.

Fields

§context: ExecutorContext

Executor context whose key-width cap was exceeded.

§count: usize

Observed distinct join-key count.

§limit: usize

Hard limit for the selected executor context.

§

UnsupportedKeyType

A join-key variable has a [ScalarType] not supported by the executor under consideration.

Emitted by analyze_typed when a join-key vertex has a known type (derived from a body atom’s relation schema — see crate::hypergraph::typed::evaluate_rule_typed and the typed fixpoint variants) that is outside WCOJ_SUPPORTED_KEY_TYPES. Structural analyze never emits this variant.

Locked policy (PR 5): unknown ≠ unsupported. A vertex whose type cannot be derived from the supplied crate::hypergraph::RefRelationStore is not flagged here. Transitive type propagation across recursive SCC predicates is a follow-up slice.

Fields

§var: String

Source name of the variable whose type is unsupported.

§ty: ScalarType

Inferred scalar type that the executor cannot handle.

Trait Implementations§

Source§

impl Clone for Boundary

Source§

fn clone(&self) -> Boundary

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Boundary

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Eq for Boundary

Source§

impl PartialEq for Boundary

Source§

fn eq(&self, other: &Boundary) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl StructuralPartialEq for Boundary

Auto Trait Implementations§

Blanket Implementations§

§

impl<T> Allocation for T
where T: RefUnwindSafe + Send + Sync,

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

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

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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.