use of org.apache.beam.sdk.transforms.windowing.PaneInfo.Timing in project beam by apache.
the class PaneInfoTest method testEncodingRoundTrip.
@Test
public void testEncodingRoundTrip() throws Exception {
Coder<PaneInfo> coder = PaneInfo.PaneInfoCoder.INSTANCE;
for (Timing timing : Timing.values()) {
long onTimeIndex = timing == Timing.EARLY ? -1 : 37;
CoderProperties.coderDecodeEncodeEqual(coder, PaneInfo.createPane(false, false, timing, 389, onTimeIndex));
CoderProperties.coderDecodeEncodeEqual(coder, PaneInfo.createPane(false, true, timing, 5077, onTimeIndex));
CoderProperties.coderDecodeEncodeEqual(coder, PaneInfo.createPane(true, false, timing, 0, 0));
CoderProperties.coderDecodeEncodeEqual(coder, PaneInfo.createPane(true, true, timing, 0, 0));
}
}
use of org.apache.beam.sdk.transforms.windowing.PaneInfo.Timing in project beam by apache.
the class PaneInfoTracker method describePane.
private <W> PaneInfo describePane(Object key, Instant windowMaxTimestamp, PaneInfo previousPane, boolean isFinal) {
boolean isFirst = previousPane == null;
Timing previousTiming = isFirst ? null : previousPane.getTiming();
long index = isFirst ? 0 : previousPane.getIndex() + 1;
long nonSpeculativeIndex = isFirst ? 0 : previousPane.getNonSpeculativeIndex() + 1;
Instant outputWM = timerInternals.currentOutputWatermarkTime();
Instant inputWM = timerInternals.currentInputWatermarkTime();
// True if it is not possible to assign the element representing this pane a timestamp
// which will make an ON_TIME pane for any following computation.
// Ie true if the element's latest possible timestamp is before the current output watermark.
boolean isLateForOutput = outputWM != null && windowMaxTimestamp.isBefore(outputWM);
// True if all emitted panes (if any) were EARLY panes.
// Once the ON_TIME pane has fired, all following panes must be considered LATE even
// if the output watermark is behind the end of the window.
boolean onlyEarlyPanesSoFar = previousTiming == null || previousTiming == Timing.EARLY;
// True is the input watermark hasn't passed the window's max timestamp.
boolean isEarlyForInput = !inputWM.isAfter(windowMaxTimestamp);
Timing timing;
if (isLateForOutput || !onlyEarlyPanesSoFar) {
// The output watermark has already passed the end of this window, or we have already
// emitted a non-EARLY pane. Irrespective of how this pane was triggered we must
// consider this pane LATE.
timing = Timing.LATE;
} else if (isEarlyForInput) {
// This is an EARLY firing.
timing = Timing.EARLY;
nonSpeculativeIndex = -1;
} else {
// This is the unique ON_TIME firing for the window.
timing = Timing.ON_TIME;
}
WindowTracing.debug("describePane: {} pane (prev was {}) for key:{}; windowMaxTimestamp:{}; " + "inputWatermark:{}; outputWatermark:{}; isLateForOutput:{}", timing, previousTiming, key, windowMaxTimestamp, inputWM, outputWM, isLateForOutput);
if (previousPane != null) {
// Timing transitions should follow EARLY* ON_TIME? LATE*
switch(previousTiming) {
case EARLY:
checkState(timing == Timing.EARLY || timing == Timing.ON_TIME || timing == Timing.LATE, "EARLY cannot transition to %s", timing);
break;
case ON_TIME:
checkState(timing == Timing.LATE, "ON_TIME cannot transition to %s", timing);
break;
case LATE:
checkState(timing == Timing.LATE, "LATE cannot transtion to %s", timing);
break;
case UNKNOWN:
break;
}
checkState(!previousPane.isLast(), "Last pane was not last after all.");
}
return PaneInfo.createPane(isFirst, isFinal, timing, index, nonSpeculativeIndex);
}