new AggregationMetadata.ParameterMetadata(STATE), new AggregationMetadata.ParameterMetadata(NULLABLE_BLOCK_INPUT_CHANNEL, valueType), new AggregationMetadata.ParameterMetadata(BLOCK_INPUT_CHANNEL, keyType), new AggregationMetadata.ParameterMetadata(BLOCK_INDEX), new AggregationMetadata.ParameterMetadata(INPUT_CHANNEL, BIGINT));
Class<?> parameterType = parameterTypes[i]; BytecodeExpression getChannel = channels.invoke("get", Object.class, constantInt(inputChannel)).cast(int.class); switch (parameterMetadata.getParameterType()) { case STATE: expressions.add(scope.getThis().getField(stateField.get(stateIndex))); break; default: throw new IllegalArgumentException("Unsupported parameter type: " + parameterMetadata.getParameterType());
for (int i = 0; i < parameterMetadatas.size(); i++) { ParameterMetadata parameterMetadata = parameterMetadatas.get(i); switch (parameterMetadata.getParameterType()) { case STATE: block.append(scope.getThis().getField(stateField.get(stateIndex))); BytecodeBlock getBlockBytecode = new BytecodeBlock() .getVariable(parameterVariables.get(inputChannel)); pushStackType(scope, block, parameterMetadata.getSqlType(), getBlockBytecode, parameters[i], callSiteBinder); inputChannel++; break; default: throw new IllegalArgumentException("Unsupported parameter type: " + parameterMetadata.getParameterType());
switch (metadata.getParameterType()) { case INPUT_CHANNEL: case BLOCK_INPUT_CHANNEL:
for (int i = 0; i < parameters.length; i++) { ParameterMetadata parameterMetadata = parameterMetadatas.get(i); switch (parameterMetadata.getParameterType()) { case STATE: block.append(scope.getThis().getField(stateField)); BytecodeBlock getBlockBytecode = new BytecodeBlock() .getVariable(parameterVariables.get(inputChannel)); pushStackType(scope, block, parameterMetadata.getSqlType(), getBlockBytecode, parameters[i], callSiteBinder); inputChannel++; break; default: throw new IllegalArgumentException("Unsupported parameter type: " + parameterMetadata.getParameterType());
if (isBlock) { if (nullable) { return new ParameterMetadata(NULLABLE_BLOCK_INPUT_CHANNEL, typeManager.getType(signature)); return new ParameterMetadata(BLOCK_INPUT_CHANNEL, typeManager.getType(signature)); return new ParameterMetadata(INPUT_CHANNEL, typeManager.getType(signature)); return new ParameterMetadata(BLOCK_INDEX); return new ParameterMetadata(SAMPLE_WEIGHT);
new AggregationMetadata.ParameterMetadata(STATE), new AggregationMetadata.ParameterMetadata(NULLABLE_BLOCK_INPUT_CHANNEL, valueType), new AggregationMetadata.ParameterMetadata(BLOCK_INPUT_CHANNEL, keyType), new AggregationMetadata.ParameterMetadata(BLOCK_INDEX), new AggregationMetadata.ParameterMetadata(INPUT_CHANNEL, BIGINT));
checkArgument(stateInterface == parameters[0], "First argument of aggregation input function must be %s", stateInterface.getSimpleName()); checkArgument(parameters.length > 0, "Aggregation input function must have at least one parameter"); checkArgument(parameterMetadatas.get(0).getParameterType() == STATE, "First parameter must be state"); for (int i = 1; i < parameters.length; i++) { ParameterMetadata metadata = parameterMetadatas.get(i); switch (metadata.getParameterType()) { case BLOCK_INPUT_CHANNEL: case NULLABLE_BLOCK_INPUT_CHANNEL: case INPUT_CHANNEL: checkArgument(SUPPORTED_PARAMETER_TYPES.contains(parameters[i]), "Unsupported type: %s", parameters[i].getSimpleName()); checkArgument(parameters[i] == metadata.getSqlType().getJavaType(), "Expected method %s parameter %s type to be %s (%s)", method, i, metadata.getSqlType().getJavaType().getName(), metadata.getSqlType()); break; case BLOCK_INDEX: break; default: throw new IllegalArgumentException("Unsupported parameter: " + metadata.getParameterType());
protected InternalAggregationFunction generateAggregation(Type type) { DynamicClassLoader classLoader = new DynamicClassLoader(AbstractMinMaxNAggregationFunction.class.getClassLoader()); BlockComparator comparator = typeToComparator.apply(type); List<Type> inputTypes = ImmutableList.of(type, BIGINT); MinMaxNStateSerializer stateSerializer = new MinMaxNStateSerializer(comparator, type); Type intermediateType = stateSerializer.getSerializedType(); ArrayType outputType = new ArrayType(type); List<ParameterMetadata> inputParameterMetadata = ImmutableList.of( new ParameterMetadata(STATE), new ParameterMetadata(BLOCK_INPUT_CHANNEL, type), new ParameterMetadata(INPUT_CHANNEL, BIGINT), new ParameterMetadata(BLOCK_INDEX)); AggregationMetadata metadata = new AggregationMetadata( generateAggregationName(getSignature().getName(), type, inputTypes), inputParameterMetadata, INPUT_FUNCTION.bindTo(comparator).bindTo(type), null, null, COMBINE_FUNCTION, OUTPUT_FUNCTION.bindTo(outputType), MinMaxNState.class, stateSerializer, new MinMaxNStateFactory(), outputType, false); GenericAccumulatorFactoryBinder factory = new AccumulatorCompiler().generateAccumulatorFactoryBinder(metadata, classLoader); return new InternalAggregationFunction(getSignature().getName(), inputTypes, intermediateType, outputType, true, false, factory); }
private List<ParameterMetadata> getParameterMetadata(@Nullable Method method, boolean sampleWeightAllowed) { if (method == null) { return null; } ImmutableList.Builder<ParameterMetadata> builder = ImmutableList.builder(); builder.add(new ParameterMetadata(STATE)); Annotation[][] annotations = method.getParameterAnnotations(); // Start at 1 because 0 is the STATE for (int i = 1; i < annotations.length; i++) { builder.add(fromAnnotations(annotations[i], method.getDeclaringClass() + "." + method.getName(), typeManager, sampleWeightAllowed)); } return builder.build(); }
private static List<ParameterMetadata> createInputParameterMetadata(Type value) { return ImmutableList.of(new ParameterMetadata(STATE), new ParameterMetadata(BLOCK_INPUT_CHANNEL, value), new ParameterMetadata(BLOCK_INDEX)); }
private static List<ParameterMetadata> createInputParameterMetadata(Type value, Type key) { return ImmutableList.of(new ParameterMetadata(STATE), new ParameterMetadata(NULLABLE_BLOCK_INPUT_CHANNEL, value), new ParameterMetadata(NULLABLE_BLOCK_INPUT_CHANNEL, key), new ParameterMetadata(BLOCK_INDEX)); }
private static List<ParameterMetadata> createInputParameterMetadata(Type keyType, Type valueType) { return ImmutableList.of(new ParameterMetadata(STATE), new ParameterMetadata(BLOCK_INPUT_CHANNEL, keyType), new ParameterMetadata(NULLABLE_BLOCK_INPUT_CHANNEL, valueType), new ParameterMetadata(BLOCK_INDEX)); }
private static List<ParameterMetadata> createInputParameterMetadata(Type keyType, Type valueType) { return ImmutableList.of(new ParameterMetadata(STATE), new ParameterMetadata(BLOCK_INPUT_CHANNEL, keyType), new ParameterMetadata(NULLABLE_BLOCK_INPUT_CHANNEL, valueType), new ParameterMetadata(BLOCK_INDEX)); }
private static List<ParameterMetadata> createInputParameterMetadata(Type value) { return ImmutableList.of(new ParameterMetadata(STATE), new ParameterMetadata(BLOCK_INPUT_CHANNEL, value), new ParameterMetadata(BLOCK_INDEX)); }
private static List<ParameterMetadata> createInputParameterMetadata(Type value) { return ImmutableList.of(new ParameterMetadata(STATE), new ParameterMetadata(BLOCK_INPUT_CHANNEL, value), new ParameterMetadata(BLOCK_INDEX)); }
private static List<ParameterMetadata> createInputParameterMetadata(Type type) { return ImmutableList.of(new ParameterMetadata(STATE), new ParameterMetadata(NULLABLE_BLOCK_INPUT_CHANNEL, type), new ParameterMetadata(BLOCK_INDEX)); }
public static int countInputChannels(List<ParameterMetadata> metadatas) { int parameters = 0; for (ParameterMetadata metadata : metadatas) { if (metadata.getParameterType() == INPUT_CHANNEL || metadata.getParameterType() == BLOCK_INPUT_CHANNEL || metadata.getParameterType() == NULLABLE_BLOCK_INPUT_CHANNEL) { parameters++; } } return parameters; }
private static List<ParameterMetadata> createInputParameterMetadata(Type type) { return ImmutableList.of(new ParameterMetadata(STATE), new ParameterMetadata(BLOCK_INPUT_CHANNEL, type), new ParameterMetadata(BLOCK_INDEX)); }
private static List<ParameterMetadata> createInputParameterMetadata(Type type) { return ImmutableList.of( new ParameterMetadata(STATE), new ParameterMetadata(INPUT_CHANNEL, type)); }