@Override public Coder<T> getOutputCoder() { return iterableCoder.getElemCoder(); }
@Override public Coder<T> getDefaultOutputCoder() { return iterableCoder.getElemCoder(); }
@Override public List<? extends Coder<?>> getComponents(IterableCoder<?> from) { return Collections.singletonList(from.getElemCoder()); }
@Override public Object structuralValue(Iterable<T> value) { ArrayList<Object> result = new ArrayList<>(); for (T elem : value) { result.add(getElemCoder().structuralValue(elem)); } return result; }
/** Retrieves the {@link Coder} for the secondary key-value pairs. */ @SuppressWarnings("unchecked") private static <PrimaryKeyT, SecondaryKeyT, ValueT> KvCoder<SecondaryKeyT, ValueT> getSecondaryKeyValueCoder( Coder<KV<PrimaryKeyT, Iterable<KV<SecondaryKeyT, ValueT>>>> inputCoder) { if (!(inputCoder instanceof KvCoder)) { throw new IllegalStateException("SortValues requires its input to use KvCoder"); } @SuppressWarnings("unchecked") KvCoder<PrimaryKeyT, Iterable<KV<SecondaryKeyT, ValueT>>> kvCoder = (KvCoder<PrimaryKeyT, Iterable<KV<SecondaryKeyT, ValueT>>>) (inputCoder); if (!(kvCoder.getValueCoder() instanceof IterableCoder)) { throw new IllegalStateException( "SortValues requires the values be encoded with IterableCoder"); } IterableCoder<KV<SecondaryKeyT, ValueT>> iterableCoder = (IterableCoder<KV<SecondaryKeyT, ValueT>>) (kvCoder.getValueCoder()); if (!(iterableCoder.getElemCoder() instanceof KvCoder)) { throw new IllegalStateException( "SortValues requires the secondary key-value pairs to use KvCoder"); } return (KvCoder<SecondaryKeyT, ValueT>) (iterableCoder.getElemCoder()); }
@Override public CloudObject toCloudObject(IterableCoder target, SdkComponents sdkComponents) { CloudObject result = CloudObject.forClassName(CloudObjectKinds.KIND_STREAM); Structs.addBoolean(result, PropertyNames.IS_STREAM_LIKE, true); return addComponents( result, Collections.<Coder<?>>singletonList(target.getElemCoder()), sdkComponents); }
@Override public TypeDescriptor<Iterable<T>> getEncodedTypeDescriptor() { return new TypeDescriptor<Iterable<T>>() {}.where( new TypeParameter<T>() {}, getElemCoder().getEncodedTypeDescriptor()); } }
public Coder<V> getValueCoder(Coder<KV<K, Iterable<WindowedValue<V>>>> inputCoder) { // Coder<Iterable<...>> --> IterableCoder<...> Coder<Iterable<WindowedValue<V>>> iterableWindowedValueCoder = getKvCoder(inputCoder).getValueCoder(); checkArgument( iterableWindowedValueCoder instanceof IterableCoder, "%s requires a %s<..., %s> but got a %s", getClass().getSimpleName(), KvCoder.class.getSimpleName(), IterableCoder.class.getSimpleName(), iterableWindowedValueCoder); IterableCoder<WindowedValue<V>> iterableCoder = (IterableCoder<WindowedValue<V>>) iterableWindowedValueCoder; // Coder<WindowedValue<...>> --> WindowedValueCoder<...> Coder<WindowedValue<V>> iterableElementCoder = iterableCoder.getElemCoder(); checkArgument( iterableElementCoder instanceof WindowedValueCoder, "%s requires a %s<..., %s<%s>> but got a %s", getClass().getSimpleName(), KvCoder.class.getSimpleName(), IterableCoder.class.getSimpleName(), WindowedValueCoder.class.getSimpleName(), iterableElementCoder); WindowedValueCoder<V> windowedValueCoder = (WindowedValueCoder<V>) iterableElementCoder; return windowedValueCoder.getValueCoder(); }
private KvCoder<K, InputT> getKvCoder( Coder<? extends KV<K, ? extends Iterable<InputT>>> inputCoder) { if (!(inputCoder instanceof KvCoder)) { throw new IllegalStateException("Combine.GroupedValues requires its input to use KvCoder"); } @SuppressWarnings({"unchecked", "rawtypes"}) KvCoder<K, ? extends Iterable<InputT>> kvCoder = (KvCoder) inputCoder; Coder<K> keyCoder = kvCoder.getKeyCoder(); Coder<? extends Iterable<InputT>> kvValueCoder = kvCoder.getValueCoder(); if (!(kvValueCoder instanceof IterableCoder)) { throw new IllegalStateException( "Combine.GroupedValues requires its input values to use " + "IterableCoder"); } @SuppressWarnings("unchecked") IterableCoder<InputT> inputValuesCoder = (IterableCoder<InputT>) kvValueCoder; Coder<InputT> inputValueCoder = inputValuesCoder.getElemCoder(); return KvCoder.of(keyCoder, inputValueCoder); }
@Override public PCollection<KV<K, Iterable<V>>> expand( PCollection<KV<K, Iterable<WindowedValue<V>>>> input) { @SuppressWarnings("unchecked") KvCoder<K, Iterable<WindowedValue<V>>> inputKvCoder = (KvCoder<K, Iterable<WindowedValue<V>>>) input.getCoder(); Coder<K> keyCoder = inputKvCoder.getKeyCoder(); Coder<Iterable<WindowedValue<V>>> inputValueCoder = inputKvCoder.getValueCoder(); IterableCoder<WindowedValue<V>> inputIterableValueCoder = (IterableCoder<WindowedValue<V>>) inputValueCoder; Coder<WindowedValue<V>> inputIterableElementCoder = inputIterableValueCoder.getElemCoder(); WindowedValueCoder<V> inputIterableWindowedValueCoder = (WindowedValueCoder<V>) inputIterableElementCoder; Coder<V> inputIterableElementValueCoder = inputIterableWindowedValueCoder.getValueCoder(); Coder<Iterable<V>> outputValueCoder = IterableCoder.of(inputIterableElementValueCoder); Coder<KV<K, Iterable<V>>> outputKvCoder = KvCoder.of(keyCoder, outputValueCoder); return PCollection.createPrimitiveOutputInternal( input.getPipeline(), windowingStrategy, input.isBounded(), outputKvCoder); } }
return new IntervalWindow(end.minus(span), span); } else if (s.equals(getUrn(StandardCoders.Enum.ITERABLE))) { Coder elementCoder = ((IterableCoder) coder).getElemCoder(); List<Object> elements = (List<Object>) value; List<Object> convertedElements = new ArrayList<>();