@Test public void testAfterPaneWithGlobalWindowsAndCombining() throws Exception { Duration windowDuration = Duration.millis(10); ReduceFnTester<Integer, Integer, IntervalWindow> tester = ReduceFnTester.combining( FixedWindows.of(windowDuration), AfterPane.<IntervalWindow>elementCountAtLeast(2), AccumulationMode.DISCARDING_FIRED_PANES, new SumIntegerFn().<String>asKeyedFn(), VarIntCoder.of(), Duration.millis(100)); tester.injectElements( TimestampedValue.of(1, new Instant(1)), TimestampedValue.of(2, new Instant(9))); assertThat( tester.extractOutput(), Matchers.contains(WindowMatchers.isSingleWindowedValue(Matchers.equalTo(3), 1, 0, 10))); // This element should not be output because that trigger (which was one-time) has already // gone off. tester.injectElements(TimestampedValue.of(6, new Instant(2))); assertThat(tester.extractOutput(), Matchers.emptyIterable()); assertTrue(tester.isMarkedFinished(new IntervalWindow(new Instant(0), new Instant(10)))); assertFalse(tester.isMarkedFinished(new IntervalWindow(new Instant(10), new Instant(20)))); tester.assertHasOnlyGlobalAndFinishedSetsFor( new IntervalWindow(new Instant(0), new Instant(10))); }
@Test public void testAfterPaneWithFixedWindow() throws Exception { Duration windowDuration = Duration.millis(10); ReduceFnTester<Integer, Iterable<Integer>, IntervalWindow> tester = ReduceFnTester.nonCombining( FixedWindows.of(windowDuration), AfterPane.<IntervalWindow>elementCountAtLeast(2), AccumulationMode.DISCARDING_FIRED_PANES, Duration.millis(100)); tester.injectElements( TimestampedValue.of(1, new Instant(1)), // first in window [0, 10) TimestampedValue.of(2, new Instant(9))); assertThat( tester.extractOutput(), Matchers.contains( WindowMatchers.isSingleWindowedValue(Matchers.containsInAnyOrder(1, 2), 1, 0, 10))); // This element belongs in the window that has already fired. It should not be re-output because // that trigger (which was one-time) has already gone off. tester.injectElements(TimestampedValue.of(6, new Instant(2))); assertThat(tester.extractOutput(), Matchers.emptyIterable()); assertTrue(tester.isMarkedFinished(new IntervalWindow(new Instant(0), new Instant(10)))); assertFalse(tester.isMarkedFinished(new IntervalWindow(new Instant(10), new Instant(20)))); tester.assertHasOnlyGlobalAndFinishedSetsFor( new IntervalWindow(new Instant(0), new Instant(10))); }
@Test public void testAfterPaneWithMerging() throws Exception { Duration windowDuration = Duration.millis(10); ReduceFnTester<Integer, Iterable<Integer>, IntervalWindow> tester = ReduceFnTester.nonCombining( Sessions.withGapDuration(windowDuration), AfterPane.<IntervalWindow>elementCountAtLeast(2), AccumulationMode.DISCARDING_FIRED_PANES, Duration.millis(100)); assertThat(tester.extractOutput(), Matchers.emptyIterable()); tester.injectElements( TimestampedValue.of(1, new Instant(1)), // in [1, 11) TimestampedValue.of(2, new Instant(2))); // in [2, 12) assertThat( tester.extractOutput(), Matchers.contains( WindowMatchers.isSingleWindowedValue(Matchers.containsInAnyOrder(1, 2), 1, 1, 12))); // Because we closed the previous window, we don't have it around to merge with. tester.injectElements( TimestampedValue.of(3, new Instant(7)), // in [7, 17) TimestampedValue.of(4, new Instant(8))); // in [8, 18) assertThat( tester.extractOutput(), Matchers.contains( WindowMatchers.isSingleWindowedValue(Matchers.containsInAnyOrder(3, 4), 7, 7, 18))); assertTrue(tester.isMarkedFinished(new IntervalWindow(new Instant(1), new Instant(12)))); tester.assertHasOnlyGlobalAndFinishedSetsFor( new IntervalWindow(new Instant(1), new Instant(12)), new IntervalWindow(new Instant(7), new Instant(18))); }