Skip to content

corgi half join: check hashed keys per run and chunk, after time filtering - #954

Merged
frankmcsherry merged 2 commits into
TimelyDataflow:master-nextfrom
frankmcsherry:ddir-halfjoin-key-checks-v2
Oct 19, 2026
Merged

frankmcsherry merged 2 commits into
TimelyDataflow:master-nextfrom
frankmcsherry:ddir-halfjoin-key-checks-v2

Conversation

@frankmcsherry

Copy link
Copy Markdown
Member

Replaces #945.

A half-join pair whose identifiers match must also precede in time and, when keys are hashed, have equal real keys. This tests time first, then compares the surviving pairs' real keys with one equal_idx call per run and arranged chunk, in batches of at most BLOCK, instead of a compare_at per candidate pair. Since the per-run meet in #937, meet already produces each run's and chunk's pairs together, so no regrouping or combined column list is needed.

#945's collision test is kept: forged hash collisions, strict and not, with batches split by a small BLOCK. Making every key check pass fails it.

Triangles delta query (1M edges, mini-02, five alternating runs, medians): neutral, as expected with about one candidate per update. Load 1247 → 1255 ms at 1 worker, 448 → 455 ms at 4; triangle counts match. The change removes the allocating per-pair comparisons.

Tests: cargo test -p interactive -p ddir-server passes (191 passed, 5 ignored); no new clippy warnings.

🤖 Generated with Claude Code

https://claude.ai/code/session_019XsakwFGwtESwZ1gSYwG4o

…ering

A pair whose identifiers match must also precede in time and, when keys are hashed, have equal
real keys. Test time first, and compare the surviving pairs' real keys with one equal_idx call
per run and arranged chunk (in batches of at most BLOCK), instead of a compare_at per candidate.
The per-run meet already produces each run's and chunk's pairs together, so no regrouping is needed.

Replaces the approach in TimelyDataflow#945; its collision test is kept.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019XsakwFGwtESwZ1gSYwG4o
A run and chunk with no time-eligible pairs, or none since the last full batch, no longer enter
corgi with an empty comparison.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019XsakwFGwtESwZ1gSYwG4o
@frankmcsherry
frankmcsherry merged commit af3ff2c into TimelyDataflow:master-next Oct 19, 2026
6 checks passed
frankmcsherry added a commit to frankmcsherry/differential-dataflow that referenced this pull request Oct 19, 2026
… container-only interface

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019XsakwFGwtESwZ1gSYwG4o
frankmcsherry added a commit that referenced this pull request Oct 19, 2026
* dogs3 half join: ship each output with the unit's capabilities

A half-join tactic yielded each output container with a single time, so the driver could pick one
capability for it, and tactics split their output by capability. Timely stamps messages with
capability sets, so the driver now ships every container stamped with the unit's capabilities,
which cover every update it released. HalfJoinTactic::prep yields containers only.

The cursor tactic keeps one builder instead of one per capability. The corgi tactic drops its
per-row capability search and the gather that split each block by capability, and ships the
projected block whole. Replaces #947's one-capability special case.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019XsakwFGwtESwZ1gSYwG4o

* corgi half join: read #954's collision test through the container-only interface

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019XsakwFGwtESwZ1gSYwG4o

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant