private void verifyInputWindowing(PCollection<KV<KeyT, ValueT>> input) { if (input.isBounded().equals(PCollection.IsBounded.UNBOUNDED)) { checkArgument( !input.getWindowingStrategy().equals(WindowingStrategy.globalDefault()), "Cannot work with %s and GLOBAL %s", PCollection.IsBounded.UNBOUNDED, WindowingStrategy.class.getSimpleName()); checkArgument( input.getWindowingStrategy().getTrigger().getClass().equals(DefaultTrigger.class), "Cannot work with %s trigger. Write works correctly only with %s", input.getWindowingStrategy().getTrigger().getClass().getSimpleName(), DefaultTrigger.class.getSimpleName()); checkArgument( input.getWindowingStrategy().getAllowedLateness().equals(Duration.ZERO), "Write does not allow late data."); } }
if (!sideInputCollection .getWindowingStrategy() .equals(firstSideInput.getWindowingStrategy())) {
@Override public PDone expand(PCollection<KV<KeyT, ValueT>> input) { // streamed pipeline must have defined configuration transformation if (input.isBounded().equals(PCollection.IsBounded.UNBOUNDED) || !input.getWindowingStrategy().equals(WindowingStrategy.globalDefault())) { checkArgument( configTransform != null, "Writing of unbounded data can be processed only with configuration transformation provider. See %s.withConfigurationTransform()", Write.class); } verifyInputWindowing(input); TypeDescriptor<Configuration> configType = new TypeDescriptor<Configuration>() {}; input .getPipeline() .getCoderRegistry() .registerCoderForType(configType, new ConfigurationCoder()); PCollectionView<Configuration> configView = createConfigurationView(input); return processJob(input, configView); }