You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
streaming engine 4/9: not, not-join, or and Distinct (#473) #546
From #545 (plan docs/superpowers/plans/2026-10-14-545-joins.md, decision 1): bound floats now join by IEEE == (0.0 = -0.0, NaN equals nothing), via Value's Hash. One comparison is left for #546: apply_not_clause / apply_not_join_clause (and their rule-derived variants) substitute bound values into the body as constants (substitute_pattern), so a bound float is matched there within f64::EPSILON by match_component. AntiJoin should use the same IEEE rule, and record the changed answers in CHANGELOG.
Executor (breaking): a value a not / not-join body takes from the outer row now compares as a join does (IEEE float ==, -0.0 == 0.0, keyword = ref to the entity it names). Four paths substituted it as a literal and matched floats within f64::EPSILON.
Engine:AntiJoin. A closed body runs once into a hash set of JoinKeys. Any other body, or one whose first pattern's entity is imported, runs per outer row from a Seed (Operator::rewind). Bodies are ordered by optimizer::plan_seeded.
Deviation from spec §4.4: a body whose first pattern has a constant entity is hashed, not correlated (plan decision 7).
Negation through a rule, and or, stay on the executor for now.
Envelope at 10M: not_probe 8.7 s → 0.29 s; not_join_hash capped (60 s) → 0.57 s; peak RSS 1.2–1.5 GiB → 6–9 MiB. Other workloads unchanged.
Next: PR 2, or / or-join (plan steps 10–15). This issue stays open until it merges.
Activity
adityamukho commentedon Oct 14, 2026
From #545 (plan
docs/superpowers/plans/2026-10-14-545-joins.md, decision 1): bound floats now join by IEEE==(0.0=-0.0, NaN equals nothing), viaValue'sHash. One comparison is left for #546:apply_not_clause/apply_not_join_clause(and their rule-derived variants) substitute bound values into the body as constants (substitute_pattern), so a bound float is matched there withinf64::EPSILONbymatch_component.AntiJoinshould use the same IEEE rule, and record the changed answers in CHANGELOG.fuzz(datalog_eval): count partial bindings in the join guard (#597) (#…
Merge pull request #614 from project-minigraf/docs/546-spec
docs: CHANGELOG, test counts and module notes for #546 PR 1
docs(changelog): #546 PR 1 envelope measurements
Merge pull request #624 from project-minigraf/feat/546-not
adityamukho commentedon Oct 19, 2026
PR 1 of 2 merged on
v3: #624 (c501f54), docs-site project-minigraf/minigraf-docs#23.not/not-joinbody takes from the outer row now compares as a join does (IEEE float==,-0.0 == 0.0, keyword = ref to the entity it names). Four paths substituted it as a literal and matched floats withinf64::EPSILON.AntiJoin. A closed body runs once into a hash set ofJoinKeys. Any other body, or one whose first pattern's entity is imported, runs per outer row from aSeed(Operator::rewind). Bodies are ordered byoptimizer::plan_seeded.or, stay on the executor for now.not_probe8.7 s → 0.29 s;not_join_hashcapped (60 s) → 0.57 s; peak RSS 1.2–1.5 GiB → 6–9 MiB. Other workloads unchanged.Next: PR 2,
or/or-join(plan steps 10–15). This issue stays open until it merges.docs: or/or-join on the engine and the executor fixes (#546)
docs(changelog): or_2 measurements (#546)
Merge pull request #626 from project-minigraf/feat/546-or
adityamukho commentedon Oct 19, 2026
Done on
v3:not/not-joinin PR #624,or/or-joinin PR #626 (docs: minigraf-docs#23, #24). Follow-up found along the way: #625.fix(rules): repeat a stratum that recurses through a not/or rule (#633)…
fix(or): an or branch meets a keyword value as the entity it names (#637