=== modified file 'dhis-2/dhis-services/dhis-service-aggregationengine-default/src/main/java/org/hisp/dhis/aggregation/impl/indicator/IndicatorAggregation.java' --- dhis-2/dhis-services/dhis-service-aggregationengine-default/src/main/java/org/hisp/dhis/aggregation/impl/indicator/IndicatorAggregation.java 2010-12-06 21:06:40 +0000 +++ dhis-2/dhis-services/dhis-service-aggregationengine-default/src/main/java/org/hisp/dhis/aggregation/impl/indicator/IndicatorAggregation.java 2011-05-20 13:18:16 +0000 @@ -33,8 +33,9 @@ import static org.hisp.dhis.system.util.MathUtils.calculateExpression; import java.util.Date; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; import org.hisp.dhis.aggregation.impl.cache.AggregationCache; import org.hisp.dhis.dataelement.DataElement; @@ -52,8 +53,6 @@ */ public class IndicatorAggregation { - private static final Pattern FORMULA_PATTERN = Pattern.compile( ExpressionService.FORMULA_EXPRESSION ); - // ------------------------------------------------------------------------- // Dependencies // ------------------------------------------------------------------------- @@ -71,6 +70,13 @@ { this.dataElementService = dataElementService; } + + private ExpressionService expressionService; + + public void setExpressionService( ExpressionService expressionService ) + { + this.expressionService = expressionService; + } private DataElementCategoryService categoryService; @@ -143,46 +149,20 @@ return factor; } - /** - * Converts an expression on the form
- * [34] + [23], where the numbers are IDs of DataElements, to the form
- * 200 + 450, where the numbers are the values of the DataValues registered - * for the Period and source. - * - * @return The generated expression - */ - private String generateExpression( String formula, Date startDate, Date endDate, OrganisationUnit organisationUnit ) - { - try - { - Matcher matcher = FORMULA_PATTERN.matcher( formula ); - - StringBuffer buffer = new StringBuffer(); - - while ( matcher.find() ) - { - String match = matcher.group(); - - DataElementOperand operand = DataElementOperand.getOperand( match ); - - DataElement dataElement = dataElementService.getDataElement( operand.getDataElementId() ); - - DataElementCategoryOptionCombo optionCombo = !operand.isTotal() ? categoryService.getDataElementCategoryOptionCombo( operand.getOptionComboId() ) : null; - - Double aggregatedValue = aggregationCache.getAggregatedDataValue( dataElement, optionCombo, startDate, endDate, organisationUnit ); - - match = aggregatedValue == null ? ExpressionService.NULL_REPLACEMENT : String.valueOf( aggregatedValue ); - - matcher.appendReplacement( buffer, match ); - } - - matcher.appendTail( buffer ); - - return buffer.toString(); - } - catch ( NumberFormatException ex ) + private String generateExpression( String expression, Date startDate, Date endDate, OrganisationUnit organisationUnit ) + { + Set operands = expressionService.getOperandsInExpression( expression ); + + Map valueMap = new HashMap(); + + for ( DataElementOperand operand : operands ) { - throw new RuntimeException( "Illegal DataElement id", ex ); + DataElement dataElement = dataElementService.getDataElement( operand.getDataElementId() ); + DataElementCategoryOptionCombo optionCombo = !operand.isTotal() ? categoryService.getDataElementCategoryOptionCombo( operand.getOptionComboId() ) : null; + + valueMap.put( operand, aggregationCache.getAggregatedDataValue( dataElement, optionCombo, startDate, endDate, organisationUnit ) ); } + + return expressionService.generateExpression( expression, valueMap ); } } === modified file 'dhis-2/dhis-services/dhis-service-aggregationengine-default/src/main/resources/META-INF/dhis/beans.xml' --- dhis-2/dhis-services/dhis-service-aggregationengine-default/src/main/resources/META-INF/dhis/beans.xml 2010-07-04 11:50:16 +0000 +++ dhis-2/dhis-services/dhis-service-aggregationengine-default/src/main/resources/META-INF/dhis/beans.xml 2011-05-20 13:18:16 +0000 @@ -87,6 +87,8 @@ ref="org.hisp.dhis.dataelement.DataElementService"/> +