Skip to content

[Python] Refactor MatchContinuously to use Watch#39352

Draft
Eliaaazzz wants to merge 4 commits into
apache:masterfrom
Eliaaazzz:agent/match-continuously-watch
Draft

[Python] Refactor MatchContinuously to use Watch#39352
Eliaaazzz wants to merge 4 commits into
apache:masterfrom
Eliaaazzz:agent/match-continuously-watch

Conversation

@Eliaaazzz

@Eliaaazzz Eliaaazzz commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

This PR is stacked on #39023 ([Python] Add Watch transform with growth_of polling SDF). Please review #39023 first; this PR contains the FileIO.MatchContinuously integration on top of that Watch transform.

This refactors the deduplicated FileIO.MatchContinuously path to use Watch.

MatchContinuously now uses Watch when has_deduplication=True. Normal deduplication is still by file path. When match_updated_files=True, the poll function timestamps each FileMetadata output with last_updated_in_seconds, and Watch(use_timestamp=True) emits the same path again when that timestamp changes. The has_deduplication=False path remains PeriodicImpulse plus MatchAll so every poll can re-emit all matches.

This PR also adds the small Watch API hook needed by the FileIO integration:

  • use_timestamp, an opt-in dedup mode that includes output event time in the dedup key.
  • TerminationCondition.on_poll_complete(now, state), so the FileIO stop window can count only polls at or after start_timestamp.

Validation:

  • python -m pytest -q sdks/python/apache_beam/io/watch_test.py sdks/python/apache_beam/io/fileio_test.py::MatchContinuouslyTest
  • git diff --check origin/python-watch-transform..HEAD

Thank you for your contribution! Follow this checklist to help us incorporate your contribution quickly and easily:

See the Contributor Guide for more tips on how to make review process smoother.

To check the build health, please visit https://github.com/apache/beam/blob/master/.test-infra/BUILD_STATUS.md

GitHub Actions Tests Status (on master branch)

Build python source distribution and wheels
Python tests
Java tests
Go tests

See CI.md for more information about GitHub Actions CI or the workflows README to see a list of phrases to trigger workflows.

Eliaaazzz added 2 commits July 7, 2026 23:42
Add an experimental Watch transform that watches a growing set of outputs
per input element. Watch.growth_of(poll_fn) runs a periodic poll loop as a
splittable DoFn and emits an unbounded PCollection of (input, output) pairs.

Each process() performs one poll round and self-checkpoints via
defer_remainder. New outputs are deduplicated with a stable 128-bit blake2b
hash of the encoded output, and a manual watermark estimator advances per
poll. Per-input termination supports never() and after_total_of(); polling
also stops when a poll returns PollResult.complete(). The DoFn is its own
RestrictionProvider, and restriction state serializes through a tagged
GrowthState coder.

Tests cover termination conditions, coder round-trips, the restriction
tracker claim/checkpoint/dedup logic, and DirectRunner end-to-end runs.
- Replace growth_of and the with_* builders with constructor arguments.
- Infer the output coder from PollFn.default_output_coder() or a
  PollResult[V] return annotation via the coder registry; require
  determinism only of the dedup key coder, converting it
  GroupByKey-style with as_deterministic_coder, and add
  output_key_fn/output_key_coder mirroring Java's
  outputKeyFn/outputKeyCoder.
- Rework the restriction tracker to Java's design: try_claim takes the
  (PollResult, termination_state) round and validates it against the
  restriction; try_split derives the replay primary and merged residual.
- Match Java's watermark handling: seed the estimator from the input
  timestamp and advance it to the poll watermark or earliest new output
  when resuming.
@Eliaaazzz
Eliaaazzz force-pushed the agent/match-continuously-watch branch from bb35430 to c7364c5 Compare July 16, 2026 14:23
@Eliaaazzz Eliaaazzz changed the title [Python] Add Watch transform for MatchContinuously [Python] Refactor MatchContinuously to use Watch Jul 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant