use of org.apache.beam.sdk.transforms.reflect.DoFnSignature.Parameter in project beam by apache.
the class DoFnSignatures method analyzeOnTimerMethod.
@VisibleForTesting
static DoFnSignature.OnTimerMethod analyzeOnTimerMethod(ErrorReporter errors, TypeDescriptor<? extends DoFn<?, ?>> fnClass, Method m, String timerId, TypeDescriptor<?> inputT, TypeDescriptor<?> outputT, FnAnalysisContext fnContext) {
errors.checkArgument(void.class.equals(m.getReturnType()), "Must return void");
Type[] params = m.getGenericParameterTypes();
MethodAnalysisContext methodContext = MethodAnalysisContext.create();
boolean requiresStableInput = m.isAnnotationPresent(DoFn.RequiresStableInput.class);
@Nullable TypeDescriptor<? extends BoundedWindow> windowT = getWindowType(fnClass, m);
List<Parameter> extraParameters = new ArrayList<>();
ErrorReporter onTimerErrors = errors.forMethod(DoFn.OnTimer.class, m);
for (int i = 0; i < params.length; ++i) {
Parameter parameter = analyzeExtraParameter(onTimerErrors, fnContext, methodContext, ParameterDescription.of(m, i, fnClass.resolveType(params[i]), Arrays.asList(m.getParameterAnnotations()[i])), inputT, outputT);
checkParameterOneOf(errors, parameter, ALLOWED_ON_TIMER_PARAMETERS);
extraParameters.add(parameter);
}
return DoFnSignature.OnTimerMethod.create(m, timerId, requiresStableInput, windowT, extraParameters);
}
use of org.apache.beam.sdk.transforms.reflect.DoFnSignature.Parameter in project beam by apache.
the class DoFnSignatures method analyzeOnWindowExpirationMethod.
@VisibleForTesting
static DoFnSignature.OnWindowExpirationMethod analyzeOnWindowExpirationMethod(ErrorReporter errors, TypeDescriptor<? extends DoFn<?, ?>> fnClass, Method m, TypeDescriptor<?> inputT, TypeDescriptor<?> outputT, FnAnalysisContext fnContext) {
errors.checkArgument(void.class.equals(m.getReturnType()), "Must return void");
Type[] params = m.getGenericParameterTypes();
MethodAnalysisContext methodContext = MethodAnalysisContext.create();
boolean requiresStableInput = m.isAnnotationPresent(DoFn.RequiresStableInput.class);
@Nullable TypeDescriptor<? extends BoundedWindow> windowT = getWindowType(fnClass, m);
List<Parameter> extraParameters = new ArrayList<>();
ErrorReporter onWindowExpirationErrors = errors.forMethod(DoFn.OnWindowExpiration.class, m);
for (int i = 0; i < params.length; ++i) {
Parameter parameter = analyzeExtraParameter(onWindowExpirationErrors, fnContext, methodContext, ParameterDescription.of(m, i, fnClass.resolveType(params[i]), Arrays.asList(m.getParameterAnnotations()[i])), inputT, outputT);
checkParameterOneOf(errors, parameter, ALLOWED_ON_WINDOW_EXPIRATION_PARAMETERS);
extraParameters.add(parameter);
}
return DoFnSignature.OnWindowExpirationMethod.create(m, requiresStableInput, windowT, extraParameters);
}
use of org.apache.beam.sdk.transforms.reflect.DoFnSignature.Parameter in project beam by apache.
the class DoFnSignatures method analyzeFinishBundleMethod.
@VisibleForTesting
static DoFnSignature.BundleMethod analyzeFinishBundleMethod(ErrorReporter errors, TypeDescriptor<? extends DoFn<?, ?>> fnT, Method m, TypeDescriptor<?> inputT, TypeDescriptor<?> outputT, FnAnalysisContext fnContext) {
errors.checkArgument(void.class.equals(m.getReturnType()), "Must return void");
Type[] params = m.getGenericParameterTypes();
MethodAnalysisContext methodContext = MethodAnalysisContext.create();
for (int i = 0; i < params.length; ++i) {
Parameter extraParam = analyzeExtraParameter(errors, fnContext, methodContext, ParameterDescription.of(m, i, fnT.resolveType(params[i]), Arrays.asList(m.getParameterAnnotations()[i])), inputT, outputT);
methodContext.addParameter(extraParam);
}
for (Parameter parameter : methodContext.getExtraParameters()) {
checkParameterOneOf(errors, parameter, ALLOWED_FINISH_BUNDLE_PARAMETERS);
}
return DoFnSignature.BundleMethod.create(m, methodContext.extraParameters);
}
use of org.apache.beam.sdk.transforms.reflect.DoFnSignature.Parameter in project beam by apache.
the class DoFnSignatures method analyzeNewWatermarkEstimatorMethod.
@VisibleForTesting
static DoFnSignature.NewWatermarkEstimatorMethod analyzeNewWatermarkEstimatorMethod(ErrorReporter errors, TypeDescriptor<? extends DoFn<?, ?>> fnT, Method m, TypeDescriptor<?> inputT, TypeDescriptor<?> outputT, TypeDescriptor<?> restrictionT, TypeDescriptor<?> watermarkEstimatorStateT, FnAnalysisContext fnContext) {
// Method is of the form:
// @NewWatermarkEstimator
// WatermarkEstimatorT newWatermarkEstimator(... parameters ...);
Type[] params = m.getGenericParameterTypes();
TypeDescriptor<?> watermarkEstimatorT = fnT.resolveType(m.getGenericReturnType());
TypeDescriptor<?> expectedWatermarkEstimatorT = watermarkEstimatorTypeOf(watermarkEstimatorStateT);
errors.checkArgument(watermarkEstimatorT.isSubtypeOf(expectedWatermarkEstimatorT), "Returns %s, but must return a subtype of %s", format(watermarkEstimatorT), format(expectedWatermarkEstimatorT));
MethodAnalysisContext methodContext = MethodAnalysisContext.create();
TypeDescriptor<? extends BoundedWindow> windowT = getWindowType(fnT, m);
for (int i = 0; i < params.length; ++i) {
Parameter extraParam = analyzeExtraParameter(errors, fnContext, methodContext, ParameterDescription.of(m, i, fnT.resolveType(params[i]), Arrays.asList(m.getParameterAnnotations()[i])), inputT, outputT);
if (extraParam instanceof SchemaElementParameter) {
errors.throwIllegalArgument("Schema @%s are not supported for @%s method. Found %s, did you mean to use %s?", format(DoFn.Element.class), format(DoFn.NewWatermarkEstimator.class), format(((SchemaElementParameter) extraParam).elementT()), format(inputT));
} else if (extraParam instanceof RestrictionParameter) {
errors.checkArgument(restrictionT.equals(((RestrictionParameter) extraParam).restrictionT()), "Uses restriction type %s, but @%s method uses restriction type %s", format(((RestrictionParameter) extraParam).restrictionT()), format(DoFn.GetInitialWatermarkEstimatorState.class), format(restrictionT));
} else if (extraParam instanceof WatermarkEstimatorStateParameter) {
errors.checkArgument(watermarkEstimatorStateT.equals(((WatermarkEstimatorStateParameter) extraParam).estimatorStateT()), "Uses watermark estimator state type %s, but @%s method uses watermark estimator state type %s", format(((WatermarkEstimatorStateParameter) extraParam).estimatorStateT()), format(DoFn.GetInitialWatermarkEstimatorState.class), format(watermarkEstimatorStateT));
}
methodContext.addParameter(extraParam);
}
for (Parameter parameter : methodContext.getExtraParameters()) {
checkParameterOneOf(errors, parameter, ALLOWED_NEW_WATERMARK_ESTIMATOR_PARAMETERS);
}
return DoFnSignature.NewWatermarkEstimatorMethod.create(m, fnT.resolveType(m.getGenericReturnType()), windowT, methodContext.getExtraParameters());
}
use of org.apache.beam.sdk.transforms.reflect.DoFnSignature.Parameter in project beam by apache.
the class DoFnSignatures method analyzeGetSizeMethod.
@VisibleForTesting
static DoFnSignature.GetSizeMethod analyzeGetSizeMethod(ErrorReporter errors, TypeDescriptor<? extends DoFn<?, ?>> fnT, Method m, TypeDescriptor<?> inputT, TypeDescriptor<?> outputT, TypeDescriptor<?> restrictionT, FnAnalysisContext fnContext) {
// Method is of the form:
// @GetSize
// double getSize(... parameters ...);
Type[] params = m.getGenericParameterTypes();
errors.checkArgument(m.getGenericReturnType().equals(Double.TYPE), "Returns %s, but must return a double", format(TypeDescriptor.of(m.getGenericReturnType())));
MethodAnalysisContext methodContext = MethodAnalysisContext.create();
TypeDescriptor<? extends BoundedWindow> windowT = getWindowType(fnT, m);
for (int i = 0; i < params.length; ++i) {
Parameter extraParam = analyzeExtraParameter(errors, fnContext, methodContext, ParameterDescription.of(m, i, fnT.resolveType(params[i]), Arrays.asList(m.getParameterAnnotations()[i])), inputT, outputT);
if (extraParam instanceof SchemaElementParameter) {
errors.throwIllegalArgument("Schema @%s are not supported for @%s method. Found %s, did you mean to use %s?", format(DoFn.Element.class), format(DoFn.GetSize.class), format(((SchemaElementParameter) extraParam).elementT()), format(inputT));
} else if (extraParam instanceof RestrictionParameter) {
errors.checkArgument(restrictionT.equals(((RestrictionParameter) extraParam).restrictionT()), "Uses restriction type %s, but @%s method uses restriction type %s", format(((RestrictionParameter) extraParam).restrictionT()), format(DoFn.GetInitialRestriction.class), format(restrictionT));
}
methodContext.addParameter(extraParam);
}
for (Parameter parameter : methodContext.getExtraParameters()) {
checkParameterOneOf(errors, parameter, ALLOWED_GET_SIZE_PARAMETERS);
}
return DoFnSignature.GetSizeMethod.create(m, windowT, methodContext.getExtraParameters());
}
Aggregations