@Override public boolean equals(Object other) { if (other == null || !(other instanceof ComposedKeyedWorkItem)) { return false; } KeyedWorkItem<?, ?> that = (KeyedWorkItem<?, ?>) other; return Objects.equals(this.key, that.key()) && Iterables.elementsEqual(this.timersIterable(), that.timersIterable()) && Iterables.elementsEqual(this.elementsIterable(), that.elementsIterable()); }
@Override public void encode(KeyedWorkItem<K, ElemT> value, OutputStream outStream) throws CoderException, IOException { keyCoder.encode(value.key(), outStream); timersCoder.encode(value.timersIterable(), outStream); elemsCoder.encode(value.elementsIterable(), outStream); }
private static <T> BoundedWindow getUnderlyingWindow(KeyedWorkItem<byte[], T> kwi) { if (Iterables.isEmpty(kwi.elementsIterable())) { // ProcessFn sets only a single timer. TimerData timer = Iterables.getOnlyElement(kwi.timersIterable()); return ((WindowNamespace) timer.getNamespace()).getWindow(); } else { // KWI must have a single element in elementsIterable, because it follows a GBK by a // uniquely generated key. // Additionally, windows must be exploded before GBKIntoKeyedWorkItems, so there's also // only a single window. WindowedValue<T> value = Iterables.getOnlyElement(kwi.elementsIterable()); return Iterables.getOnlyElement(value.getWindows()); } }
@Override public void processElement(WindowedValue<KeyedWorkItem<K, InputT>> elem) { Iterable<WindowedValue<InputT>> nonLateElements = lateDataFilter.filter(elem.getValue().key(), elem.getValue().elementsIterable()); KeyedWorkItem<K, InputT> keyedWorkItem = KeyedWorkItems.workItem( elem.getValue().key(), elem.getValue().timersIterable(), nonLateElements); doFnRunner.processElement(elem.withValue(keyedWorkItem)); }
@ProcessElement public void processElement(ProcessContext c) throws Exception { KeyedWorkItem<K, InputT> keyedWorkItem = c.element(); K key = keyedWorkItem.key(); StateInternals stateInternals = stateInternalsFactory.stateInternalsForKey(key); TimerInternals timerInternals = timerInternalsFactory.timerInternalsForKey(key); ReduceFnRunner<K, InputT, OutputT, W> reduceFnRunner = new ReduceFnRunner<>( key, windowingStrategy, ExecutableTriggerStateMachine.create( TriggerStateMachines.stateMachineForTrigger( TriggerTranslation.toProto(windowingStrategy.getTrigger()))), stateInternals, timerInternals, outputWindowedValue(), sideInputReader, reduceFn, c.getPipelineOptions()); reduceFnRunner.processElements(keyedWorkItem.elementsIterable()); reduceFnRunner.onTimers(keyedWorkItem.timersIterable()); reduceFnRunner.persist(); } }
TimerInternals.TimerData timer = Iterables.getOnlyElement(c.element().timersIterable(), null); boolean isSeedCall = (timer == null); StateNamespace stateNamespace;