private String aggregate(AggregatedValue reference, PatternModelAcceptor<?> acceptor) throws SpecificationBuilderException { String resultVariableName = acceptor.createVirtualVariable(); PatternCall call = reference.getCall(); Pattern patternRef = call.getPatternRef(); List<String> variableNames = getVariableNames(call.getParameters(), acceptor); AggregatorExpression aggregator = reference.getAggregator(); if (aggregator instanceof CountAggregator) { acceptor.acceptPatternMatchCounter(variableNames, patternRef, resultVariableName); } else { throw new SpecificationBuilderException("Unsupported aggregator expression type {1} in pattern {2}.", new String[] { aggregator.eClass().getName(), patternFQN }, "Unsupported aggregator expression", pattern); } return resultVariableName; }
/** * @param valueReference * @return all variables from the ValueReference object. (Either referenced directly, or referenced throught an * AggregatedValue.) */ public static Set<Variable> getVariablesFromValueReference(ValueReference valueReference) { Set<Variable> resultSet = new HashSet<Variable>(); if (valueReference != null) { if (valueReference instanceof VariableValue) { resultSet.add(((VariableValue) valueReference).getValue().getVariable()); } else if (valueReference instanceof AggregatedValue) { AggregatedValue aggregatedValue = (AggregatedValue) valueReference; for (ValueReference valueReferenceInner : aggregatedValue.getCall().getParameters()) { for (Variable variable : getVariablesFromValueReference(valueReferenceInner)) { resultSet.add(variable); } } } else if (valueReference instanceof FunctionEvaluationValue) { FunctionEvaluationValue eval = (FunctionEvaluationValue) valueReference; final List<Variable> usedVariables = CorePatternLanguageHelper.getUsedVariables(eval.getExpression(), containerPatternBody(eval).getVariables()); resultSet.addAll(usedVariables); } } return resultSet; }
if (aggregatedValue.getAggregator() instanceof CountAggregator) { return EcorePackage.Literals.EINT;
for (ValueReference valueReferenceInner : aggregatedValue.getCall().getParameters()) { for (Variable variable : getUnnamedVariablesFromValueReference(valueReferenceInner, false)) { if (variable.getName().startsWith("_")) {
/** * Contexts: * ValueReference returns AggregatedValue * AnnotationValueReference returns AggregatedValue * ComputationValue returns AggregatedValue * AggregatedValue returns AggregatedValue * * Constraint: * (aggregator=AggregatorExpression call=PatternCall) */ protected void sequence_AggregatedValue(ISerializationContext context, AggregatedValue semanticObject) { if (errorAcceptor != null) { if (transientValues.isValueTransient(semanticObject, PatternLanguagePackage.Literals.AGGREGATED_VALUE__AGGREGATOR) == ValueTransient.YES) errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, PatternLanguagePackage.Literals.AGGREGATED_VALUE__AGGREGATOR)); if (transientValues.isValueTransient(semanticObject, PatternLanguagePackage.Literals.AGGREGATED_VALUE__CALL) == ValueTransient.YES) errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, PatternLanguagePackage.Literals.AGGREGATED_VALUE__CALL)); } SequenceFeeder feeder = createSequencerFeeder(context, semanticObject); feeder.accept(grammarAccess.getAggregatedValueAccess().getAggregatorAggregatorExpressionParserRuleCall_1_0(), semanticObject.getAggregator()); feeder.accept(grammarAccess.getAggregatedValueAccess().getCallPatternCallParserRuleCall_2_0(), semanticObject.getCall()); feeder.finish(); }