@Test public void testNewInputReplacesPreviousInput() { // new input should completely replace old input // the creation of the Iterable that has the side input // contents happens upstream. this is also where // accumulation/discarding is decided. SideInputHandler sideInputHandler = new SideInputHandler(ImmutableList.of(view1), InMemoryStateInternals.<Void>forKey(null)); IntervalWindow window = new IntervalWindow(new Instant(0), new Instant(WINDOW_MSECS_1)); // add a first value for view1 sideInputHandler.addSideInputValue( view1, valuesInWindow(materializeValuesFor(View.asIterable(), "Hello"), new Instant(0), window)); assertThat(sideInputHandler.get(view1, window), contains("Hello")); // subsequent values should replace existing values sideInputHandler.addSideInputValue( view1, valuesInWindow( materializeValuesFor(View.asIterable(), "Ciao", "Buongiorno"), new Instant(0), window)); assertThat(sideInputHandler.get(view1, window), contains("Ciao", "Buongiorno")); }
@Test public void getAfterWriteReturnsPaneInWindow() throws Exception { ImmutableList.Builder<WindowedValue<?>> valuesBuilder = ImmutableList.builder(); for (Object materializedValue : materializeValuesFor(View.asMap(), KV.of("one", 1))) { valuesBuilder.add( WindowedValue.of( materializedValue, new Instant(1L), FIRST_WINDOW, PaneInfo.ON_TIME_AND_ONLY_FIRING)); } for (Object materializedValue : materializeValuesFor(View.asMap(), KV.of("two", 2))) { valuesBuilder.add( WindowedValue.of( materializedValue, new Instant(20L), FIRST_WINDOW, PaneInfo.ON_TIME_AND_ONLY_FIRING)); } container.write(mapView, valuesBuilder.build()); Map<String, Integer> viewContents = container.createReaderForViews(ImmutableList.of(mapView)).get(mapView, FIRST_WINDOW); assertThat(viewContents, hasEntry("one", 1)); assertThat(viewContents, hasEntry("two", 2)); assertThat(viewContents.size(), is(2)); }
@Test public void testMultipleWindows() { SideInputHandler sideInputHandler = new SideInputHandler(ImmutableList.of(view1), InMemoryStateInternals.<Void>forKey(null)); // two windows that we'll later use for adding elements/retrieving side input IntervalWindow firstWindow = new IntervalWindow(new Instant(0), new Instant(WINDOW_MSECS_1)); IntervalWindow secondWindow = new IntervalWindow(new Instant(1000), new Instant(1000 + WINDOW_MSECS_2)); // add a first value for view1 in the first window sideInputHandler.addSideInputValue( view1, valuesInWindow( materializeValuesFor(View.asIterable(), "Hello"), new Instant(0), firstWindow)); assertThat(sideInputHandler.get(view1, firstWindow), contains("Hello")); // add something for second window of view1 sideInputHandler.addSideInputValue( view1, valuesInWindow( materializeValuesFor(View.asIterable(), "Arrivederci"), new Instant(0), secondWindow)); assertThat(sideInputHandler.get(view1, secondWindow), contains("Arrivederci")); // contents for first window should be unaffected assertThat(sideInputHandler.get(view1, firstWindow), contains("Hello")); }
@Test public void writeForMultipleIdenticalElementsInSameWindowSucceeds() throws Exception { ImmutableList.Builder<WindowedValue<?>> valuesBuilder = ImmutableList.builder(); for (Object materializedValue : materializeValuesFor(View.asIterable(), 44, 44)) { valuesBuilder.add( WindowedValue.of( materializedValue, FIRST_WINDOW.maxTimestamp().minus(200L), FIRST_WINDOW, PaneInfo.ON_TIME_AND_ONLY_FIRING)); } container.write(iterableView, valuesBuilder.build()); assertThat( container .createReaderForViews(ImmutableList.of(iterableView)) .get(iterableView, FIRST_WINDOW), contains(44, 44)); }
@Test public void testMultipleSideInputs() { SideInputHandler sideInputHandler = new SideInputHandler( ImmutableList.of(view1, view2), InMemoryStateInternals.<Void>forKey(null)); // two windows that we'll later use for adding elements/retrieving side input IntervalWindow firstWindow = new IntervalWindow(new Instant(0), new Instant(WINDOW_MSECS_1)); // add value for view1 in the first window sideInputHandler.addSideInputValue( view1, valuesInWindow( materializeValuesFor(View.asIterable(), "Hello"), new Instant(0), firstWindow)); assertThat(sideInputHandler.get(view1, firstWindow), contains("Hello")); // view2 should not have any data assertFalse(sideInputHandler.isReady(view2, firstWindow)); // also add some data for view2 sideInputHandler.addSideInputValue( view2, valuesInWindow( materializeValuesFor(View.asIterable(), "Salut"), new Instant(0), firstWindow)); assertTrue(sideInputHandler.isReady(view2, firstWindow)); assertThat(sideInputHandler.get(view2, firstWindow), contains("Salut")); // view1 should not be affected by that assertThat(sideInputHandler.get(view1, firstWindow), contains("Hello")); }
public void isReadyForSomeNotReadyViewsFalseUntilElements() { ImmutableList.Builder<WindowedValue<?>> mapValuesBuilder = ImmutableList.builder(); for (Object materializedValue : materializeValuesFor(View.asMap(), KV.of("one", 1))) { mapValuesBuilder.add( WindowedValue.of( for (Object materializedValue : materializeValuesFor(View.asMap(), KV.of("too", 2))) { newMapValuesBuilder.add( WindowedValue.of( for (Object materializedValue : materializeValuesFor(View.asSingleton(), 1.25)) { singletonValuesBuilder.add( WindowedValue.of(
@Test public void finishDoesNotOverwriteWrittenElements() throws Exception { ImmutableList.Builder<WindowedValue<?>> valuesBuilder = ImmutableList.builder(); for (Object materializedValue : materializeValuesFor(View.asMap(), KV.of("one", 1))) { valuesBuilder.add( WindowedValue.of( materializedValue, new Instant(1L), SECOND_WINDOW, PaneInfo.createPane(true, false, Timing.EARLY))); } for (Object materializedValue : materializeValuesFor(View.asMap(), KV.of("two", 2))) { valuesBuilder.add( WindowedValue.of( materializedValue, new Instant(20L), SECOND_WINDOW, PaneInfo.createPane(true, false, Timing.EARLY))); } container.write(mapView, valuesBuilder.build()); immediatelyInvokeCallback(mapView, SECOND_WINDOW); Map<String, Integer> viewContents = container.createReaderForViews(ImmutableList.of(mapView)).get(mapView, SECOND_WINDOW); assertThat(viewContents, hasEntry("one", 1)); assertThat(viewContents, hasEntry("two", 2)); assertThat(viewContents.size(), is(2)); }
@Test public void getReturnsLatestPaneInWindow() throws Exception { ImmutableList.Builder<WindowedValue<?>> valuesBuilder = ImmutableList.builder(); for (Object materializedValue : materializeValuesFor(View.asMap(), KV.of("one", 1))) { valuesBuilder.add( WindowedValue.of( PaneInfo.createPane(true, false, Timing.EARLY))); for (Object materializedValue : materializeValuesFor(View.asMap(), KV.of("two", 2))) { valuesBuilder.add( WindowedValue.of( for (Object materializedValue : materializeValuesFor(View.asMap(), KV.of("three", 3))) { overwriteValuesBuilder.add( WindowedValue.of(
@Test public void writeForElementInMultipleWindowsSucceeds() throws Exception { ImmutableList.Builder<WindowedValue<?>> valuesBuilder = ImmutableList.builder(); for (Object materializedValue : materializeValuesFor(View.asSingleton(), 2.875)) { valuesBuilder.add( WindowedValue.of( materializedValue, FIRST_WINDOW.maxTimestamp().minus(200L), ImmutableList.of(FIRST_WINDOW, SECOND_WINDOW), PaneInfo.ON_TIME_AND_ONLY_FIRING)); } container.write(singletonView, valuesBuilder.build()); assertThat( container .createReaderForViews(ImmutableList.of(singletonView)) .get(singletonView, FIRST_WINDOW), equalTo(2.875)); assertThat( container .createReaderForViews(ImmutableList.of(singletonView)) .get(singletonView, SECOND_WINDOW), equalTo(2.875)); }
BoundedWindow second = new TestBoundedWindow(new Instant(899999L)); ImmutableList.Builder<WindowedValue<?>> valuesBuilder = ImmutableList.builder(); for (Object materializedValue : materializeValuesFor(View.asIterable(), 1)) { valuesBuilder.add( WindowedValue.of( materializedValue, new Instant(1222), window, PaneInfo.ON_TIME_AND_ONLY_FIRING)); for (Object materializedValue : materializeValuesFor(View.asIterable(), 2)) { valuesBuilder.add( WindowedValue.of( for (Object materializedValue : materializeValuesFor(View.asIterable(), 4444)) { overwrittenValuesBuilder.add( WindowedValue.of(
WindowedValue<Integer> wv1 = WindowedValue.valueInGlobalWindow(1); WindowedValue<Iterable<?>> sideInput = WindowedValue.valueInGlobalWindow(materializeValuesFor(View.asSingleton(), 22));
@Test public void testIsReady() { SideInputHandler sideInputHandler = new SideInputHandler( ImmutableList.of(view1, view2), InMemoryStateInternals.<Void>forKey(null)); IntervalWindow firstWindow = new IntervalWindow(new Instant(0), new Instant(WINDOW_MSECS_1)); IntervalWindow secondWindow = new IntervalWindow(new Instant(0), new Instant(WINDOW_MSECS_2)); // side input should not yet be ready assertFalse(sideInputHandler.isReady(view1, firstWindow)); // add a value for view1 sideInputHandler.addSideInputValue( view1, valuesInWindow( materializeValuesFor(View.asIterable(), "Hello"), new Instant(0), firstWindow)); // now side input should be ready assertTrue(sideInputHandler.isReady(view1, firstWindow)); // second window input should still not be ready assertFalse(sideInputHandler.isReady(view1, secondWindow)); }