/** * Process the collected data and trigger timers. * @param inputWatermark current input watermark * @param processingTime processing time * @param synchronizedTime synchronized time */ private void processElementsAndTriggerTimers(final Watermark inputWatermark, final Instant processingTime, final Instant synchronizedTime) { for (final Map.Entry<K, List<WindowedValue<InputT>>> entry : keyToValues.entrySet()) { final K key = entry.getKey(); final List<WindowedValue<InputT>> values = entry.getValue(); // for each key // Process elements if (!values.isEmpty()) { final KeyedWorkItem<K, InputT> keyedWorkItem = KeyedWorkItems.elementsWorkItem(key, values); // The DoFnRunner interface requires WindowedValue, // but this windowed value is actually not used in the ReduceFnRunner internal. getDoFnRunner().processElement(WindowedValue.valueInGlobalWindow(keyedWorkItem)); } // Trigger timers triggerTimers(key, inputWatermark, processingTime, synchronizedTime); // Remove values values.clear(); } }
void startElement(WindowedValue<KV<InputT, RestrictionT>> windowedValue) throws Exception { tester.processElement( KeyedWorkItems.elementsWorkItem( "key".getBytes(StandardCharsets.UTF_8), Collections.singletonList(windowedValue))); }
@Override public final void process( ApexStreamTuple<WindowedValue<KV<K, V>>> tuple, OutputEmitter<ApexStreamTuple<? extends WindowedValue<?>>> outputEmitter) { if (tuple instanceof ApexStreamTuple.WatermarkTuple) { outputEmitter.emit(tuple); } else { for (WindowedValue<KV<K, V>> in : tuple.getValue().explodeWindows()) { KeyedWorkItem<K, V> kwi = KeyedWorkItems.elementsWorkItem( in.getValue().getKey(), Collections.singletonList(in.withValue(in.getValue().getValue()))); outputEmitter.emit(ApexStreamTuple.DataTuple.of(in.withValue(kwi))); } } } }
@Test public void testEncodeDecodeEqual() throws Exception { Iterable<TimerData> timers = ImmutableList.of( TimerData.of(StateNamespaces.global(), new Instant(500L), TimeDomain.EVENT_TIME)); Iterable<WindowedValue<Integer>> elements = ImmutableList.of( WindowedValue.valueInGlobalWindow(1), WindowedValue.valueInGlobalWindow(4), WindowedValue.valueInGlobalWindow(8)); KeyedWorkItemCoder<String, Integer> coder = KeyedWorkItemCoder.of(StringUtf8Coder.of(), VarIntCoder.of(), GlobalWindow.Coder.INSTANCE); CoderProperties.coderDecodeEncodeEqual(coder, KeyedWorkItems.workItem("foo", timers, elements)); CoderProperties.coderDecodeEncodeEqual(coder, KeyedWorkItems.elementsWorkItem("foo", elements)); CoderProperties.coderDecodeEncodeEqual(coder, KeyedWorkItems.timersWorkItem("foo", timers)); }