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 · 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 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 · 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 Eq for Boundary

Source§

impl StructuralPartialEq for Boundary

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> 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.
§

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