Skip to content

dogs3: HalfJoinTactic for the proxy half-join tactic; BlobList public - #1020

Closed
frankmcsherry wants to merge 2 commits into
TimelyDataflow:master-nextfrom
frankmcsherry:phj-2-dogs3-proxy-tactic
Closed

frankmcsherry wants to merge 2 commits into
TimelyDataflow:master-nextfrom
frankmcsherry:phj-2-dogs3-proxy-tactic

Conversation

@frankmcsherry

Copy link
Copy Markdown
Member

Builds on #1019; only the last commit is new.

differential's ProxyHalfJoinTactic implements dogs3's HalfJoinTactic by calling its prepare. The trait is dogs3's, so the impl lives here, and it is five lines.

BlobList, the generic release batcher, is now public. Every HalfJoinTactic needs a batcher that agrees with it on when an update is released, and BlobList is the one for Vec containers. A backend with its own container type writes its own, as DDIR's columnar HalfJoinBatcher does.

Test

tests/proxy_half_join.rs runs the proxy half join over the vec backend against the cursor half join in one dataflow, on random inputs, strict and not, at one and two workers, with blocks of several sizes. It passes.

🤖 Generated with Claude Code

https://claude.ai/code/session_019XsakwFGwtESwZ1gSYwG4o

frankmcsherry and others added 2 commits October 23, 2026 23:41
The half join had no seam between its time logic and its data: dogs3's
HalfJoinTactic reads the arrangement's batches itself. ProxyHalfJoinTactic
owns the total-order comparison, strictness, the output time rule (the
update's own time, and its data time joined with the arranged time) and
blocking; ProxyHalfJoinBackend owns key matching, value proxies and output
containers, like the join and reduce backends. Matches are pairs of
positions into the block's two presented sides, which `cross` is handed
back, so a backend evaluates the time rule in its own layout; a time per
match in the tactic measured at a third of a half-join-heavy tick.

Arranged times are presented as stored: advancing them by a frontier
moves them in the total order relative to incomparable stream times, so
the backend is given no lower bound to advance by. The arranged side is a
bridge with the join's contract, sorted and consolidated by
((key, val), time); the stream side is in key order only.

VecHalfJoinBackend is the reference backend. The test checks the tactic
against the definition over product times, strict and not, several block
sizes, and colliding hashes.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
Claude-Session: https://claude.ai/code/session_019XsakwFGwtESwZ1gSYwG4o
differential's ProxyHalfJoinTactic implements dogs3's HalfJoinTactic by
calling its `prepare`; the trait is dogs3's, so the impl lives here. The
generic release batcher BlobList is public: every HalfJoinTactic needs a
batcher that agrees with it on when an update is released, and this is
the one for Vec containers; a backend with its own container type writes
its own, as DDIR's columnar one does.

The test runs the proxy half join over the vec backend against the cursor
half join in one dataflow on random inputs, strict and not, at one and two
workers, with blocks of several sizes.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
Claude-Session: https://claude.ai/code/session_019XsakwFGwtESwZ1gSYwG4o
@frankmcsherry

Copy link
Copy Markdown
Member Author

Replaced by #1022, which moves the proxy half-join tactic into dogs3, built on int_proxy's public surface.

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