private <T, W extends BoundedWindow> SideInputHandler<T, W> forIterableSideInput( List<WindowedValue<T>> broadcastVariable, Coder<T> elementCoder, Coder<W> windowCoder) { ImmutableMultimap.Builder<Object, T> windowToValuesBuilder = ImmutableMultimap.builder(); for (WindowedValue<T> windowedValue : broadcastVariable) { for (BoundedWindow boundedWindow : windowedValue.getWindows()) { @SuppressWarnings("unchecked") W window = (W) boundedWindow; windowToValuesBuilder.put(windowCoder.structuralValue(window), windowedValue.getValue()); } } ImmutableMultimap<Object, T> windowToValues = windowToValuesBuilder.build(); return new SideInputHandler<T, W>() { @Override public Iterable<T> get(byte[] key, W window) { return windowToValues.get(windowCoder.structuralValue(window)); } @Override public Coder<T> resultCoder() { return elementCoder; } }; }
private <K, V, W extends BoundedWindow> SideInputHandler<V, W> forMultimapSideInput( List<WindowedValue<KV<K, V>>> broadcastVariable, Coder<K> keyCoder, Coder<V> valueCoder, Coder<W> windowCoder) { ImmutableMultimap.Builder<SideInputKey, V> multimap = ImmutableMultimap.builder(); for (WindowedValue<KV<K, V>> windowedValue : broadcastVariable) { K key = windowedValue.getValue().getKey(); V value = windowedValue.getValue().getValue(); for (BoundedWindow boundedWindow : windowedValue.getWindows()) { @SuppressWarnings("unchecked") W window = (W) boundedWindow; multimap.put( SideInputKey.of(keyCoder.structuralValue(key), windowCoder.structuralValue(window)), value); } } return new MultimapSideInputHandler<>(multimap.build(), keyCoder, valueCoder, windowCoder); }