=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramIndicatorService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramIndicatorService.java 2015-06-18 09:34:41 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramIndicatorService.java 2015-06-18 10:54:01 +0000 @@ -32,6 +32,8 @@ import java.util.Map; import java.util.Set; +import org.hisp.dhis.constant.Constant; +import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.trackedentity.TrackedEntityAttribute; /** @@ -103,16 +105,6 @@ List getAllProgramIndicators(); /** - * Calculate a program indicator value based on program stage instance and an - * indicator. - * - * @param programIndicator ProgramIndicator - * @param programInstance ProgramInstance - * @return Indicator value - */ - String getProgramIndicatorValue( ProgramIndicator programIndicator, ProgramStageInstance programStageInstance ); - - /** * Calculate a program indicator value based on program instance and an * indicator. * @@ -123,6 +115,14 @@ String getProgramIndicatorValue( ProgramIndicator programIndicator, ProgramInstance programInstance ); /** + * Calculate a program indicator value based on the given arguments. + * + * @param valueMap map containing keys for data elements, attributes and + * constants with corresponding values. + */ + Double getProgramIndicatorValue( ProgramIndicator indicator, Map valueMap ); + + /** * Get indicator values of all program indicators defined for a TrackedEntityInstance * * @param programInstance ProgramInstance @@ -158,21 +158,33 @@ */ String filterIsValid( String filter ); + Set getDataElementsInIndicators( Set indicators ); + /** - * Get all {@link ProgramStageDataElement} part of the expression of the - * given indicator. + * Get all {@link ProgramStageDataElement} part of the expression. * - * @param indicator the ProgramIndicator. + * @param expression the expression. * @return a set of ProgramStageDataElements. */ - Set getProgramStageDataElementsInExpression( ProgramIndicator indicator ); + Set getProgramStageDataElementsInExpression( String expression ); + + Set getAttributesInIndicators( Set indicators ); /** - * Get all {@link TrackedEntityAttribute} part of the expression of the - * given indicator. + * Get all {@link TrackedEntityAttribute} part of the expression. * - * @param indicator the ProgramIndicator. + * @param expression the expression. * @return a set of TrackedEntityAttributes. */ - Set getAttributesInExpression( ProgramIndicator indicator ); + Set getAttributesInExpression( String expression ); + + Set getConstantsInIndicators( Set indicators ); + + /** + * Get all {@link Constant} part of the expression of the expression. + * + * @param expression the expression. + * @return a set of Constants. + */ + Set getConstantsInExpression( String expression ); } === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/DataQueryParams.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/DataQueryParams.java 2015-06-18 07:39:44 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/DataQueryParams.java 2015-06-18 10:54:01 +0000 @@ -88,6 +88,7 @@ import org.hisp.dhis.commons.collection.ListUtils; import com.google.common.collect.Lists; +import com.google.common.collect.Sets; /** * @author Lars Helge Overland @@ -457,6 +458,14 @@ */ public DataQueryParams removeDimensions( String... dimension ) { + return removeDimensions( Sets.newHashSet( dimension ) ); + } + + /** + * Removes the dimensions with the given identifiers. + */ + public DataQueryParams removeDimensions( Set dimension ) + { if ( dimension != null ) { for ( String dim : dimension ) @@ -496,7 +505,7 @@ } } } - + /** * Removes the filter with the given identifier. */ === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultAnalyticsService.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultAnalyticsService.java 2015-06-18 09:23:09 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultAnalyticsService.java 2015-06-18 10:54:01 +0000 @@ -285,7 +285,7 @@ grid.addHeader( new GridHeader( DataQueryParams.VALUE_ID, VALUE_HEADER_NAME, Double.class.getName(), false, false ) ); } - + /** * Adds indicator values to the given grid based on the given data query * parameters. @@ -1343,7 +1343,7 @@ DataQueryParams dataSourceParams = params.instance().removeDimensions( INDICATOR_DIM_ID, DATAELEMENT_DIM_ID, DATASET_DIM_ID, PROGRAM_DATAELEMENT_DIM_ID, PROGRAM_ATTRIBUTE_DIM_ID ); - dataSourceParams.getDimensions().add( DataQueryParams.DX_INDEX, new BaseDimensionalObject( + dataSourceParams.getDimensions().add( DX_INDEX, new BaseDimensionalObject( DATAELEMENT_DIM_ID, DimensionType.DATAELEMENT, dataElements ) ); return getAggregatedDataValueMap( dataSourceParams ); === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/program/DefaultProgramIndicatorService.java' --- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/program/DefaultProgramIndicatorService.java 2015-06-18 09:34:41 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/program/DefaultProgramIndicatorService.java 2015-06-18 10:54:01 +0000 @@ -39,15 +39,16 @@ import java.util.Set; import java.util.regex.Matcher; +import org.hisp.dhis.commons.util.ExpressionUtils; +import org.hisp.dhis.commons.util.TextUtils; import org.hisp.dhis.constant.Constant; import org.hisp.dhis.constant.ConstantService; import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.dataelement.DataElementService; +import org.hisp.dhis.expression.ExpressionService; import org.hisp.dhis.i18n.I18nService; import org.hisp.dhis.system.util.DateUtils; import org.hisp.dhis.system.util.MathUtils; -import org.hisp.dhis.commons.util.ExpressionUtils; -import org.hisp.dhis.commons.util.TextUtils; import org.hisp.dhis.trackedentity.TrackedEntityAttribute; import org.hisp.dhis.trackedentity.TrackedEntityAttributeService; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; @@ -183,14 +184,6 @@ } @Override - public String getProgramIndicatorValue( ProgramIndicator programIndicator, ProgramStageInstance programStageInstance ) - { - Double value = getValue( programIndicator, null, programStageInstance ); - - return value != null ? String.valueOf( value ) : null; - } - - @Override public String getProgramIndicatorValue( ProgramIndicator programIndicator, ProgramInstance programInstance ) { Double value = getValue( programIndicator, programInstance, null ); @@ -222,6 +215,49 @@ } @Override + public Double getProgramIndicatorValue( ProgramIndicator indicator, Map valueMap ) + { + StringBuffer buffer = new StringBuffer(); + + String expression = indicator.getExpression(); + + Matcher matcher = ProgramIndicator.EXPRESSION_PATTERN.matcher( expression ); + + while ( matcher.find() ) + { + String key = matcher.group( 1 ); + + Double value = null; + + //TODO query by program stage + + if ( ProgramIndicator.KEY_DATAELEMENT.equals( key ) ) + { + String de = matcher.group( 3 ); + + value = valueMap.get( de ); + } + else if ( ProgramIndicator.KEY_ATTRIBUTE.equals( key ) || ProgramIndicator.KEY_CONSTANT.equals( key ) ) + { + String uid = matcher.group( 2 ); + + value = valueMap.get( uid ); + } + + if ( value == null ) + { + return null; + } + + matcher.appendReplacement( buffer, Matcher.quoteReplacement( String.valueOf( value ) ) ); + } + + expression = TextUtils.appendTail( matcher, buffer ); + + return MathUtils.calculateExpression( expression ); + } + + @Override public Map getProgramIndicatorValues( ProgramInstance programInstance ) { Map result = new HashMap<>(); @@ -419,11 +455,29 @@ } @Override - public Set getProgramStageDataElementsInExpression( ProgramIndicator indicator ) + public Set getDataElementsInIndicators( Set indicators ) + { + Set dataElements = new HashSet<>(); + + for ( ProgramIndicator indicator : indicators ) + { + Set psds = getProgramStageDataElementsInExpression( indicator.getExpression() ); + + for ( ProgramStageDataElement psd : psds ) + { + dataElements.add( psd.getDataElement() ); + } + } + + return dataElements; + } + + @Override + public Set getProgramStageDataElementsInExpression( String expression ) { Set elements = new HashSet<>(); - Matcher matcher = ProgramIndicator.DATAELEMENT_PATTERN.matcher( indicator.getExpression() ); + Matcher matcher = ProgramIndicator.DATAELEMENT_PATTERN.matcher( expression ); while ( matcher.find() ) { @@ -443,11 +497,24 @@ } @Override - public Set getAttributesInExpression( ProgramIndicator indicator ) + public Set getAttributesInIndicators( Set indicators ) + { + Set attributes = new HashSet<>(); + + for ( ProgramIndicator indicator : indicators ) + { + attributes.addAll( getAttributesInExpression( indicator.getExpression() ) ); + } + + return attributes; + } + + @Override + public Set getAttributesInExpression( String expression ) { Set attributes = new HashSet<>(); - Matcher matcher = ProgramIndicator.ATTRIBUTE_PATTERN.matcher( indicator.getExpression() ); + Matcher matcher = ProgramIndicator.ATTRIBUTE_PATTERN.matcher( expression ); while ( matcher.find() ) { @@ -463,15 +530,50 @@ return attributes; } + + @Override + public Set getConstantsInIndicators( Set indicators ) + { + Set constants = new HashSet<>(); + + for ( ProgramIndicator indicator : indicators ) + { + constants.addAll( getConstantsInExpression( indicator.getExpression() ) ); + } + + return constants; + } + + @Override + public Set getConstantsInExpression( String expression ) + { + Set constants = new HashSet<>(); + + Matcher matcher = ExpressionService.CONSTANT_PATTERN.matcher( expression ); + + while ( matcher.find() ) + { + String co = matcher.group( 1 ); + + Constant constant = constantService.getConstant( co ); + + if ( constant != null ) + { + constants.add( constant ); + } + } + + return constants; + } // ------------------------------------------------------------------------- // Supportive methods // ------------------------------------------------------------------------- /** - * Get value for the given arguments. If programStageInstance argument is null, - * the program stage instance will be retrieved based on the given program - * instance in combination with the program stage from the indicator expression. + * Get indicator value for the given arguments. If programStageInstance + * argument is null, the program stage instance will be retrieved based on + * the given program instance in combination with the program stage from the indicator expression. * * @param indicator the indicator, must be not null. * @param programInstance the program instance, can be null. === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceTest.java' --- dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceTest.java 2015-06-18 09:34:41 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceTest.java 2015-06-18 10:54:01 +0000 @@ -426,7 +426,7 @@ public void testGetProgramStageDataElementsInExpression() { Set elements = programIndicatorService - .getProgramStageDataElementsInExpression( indicatorE ); + .getProgramStageDataElementsInExpression( indicatorE.getExpression() ); assertEquals( 2, elements.size() ); @@ -437,7 +437,7 @@ @Test public void testGetAttributesInExpression() { - Set attributes = programIndicatorService.getAttributesInExpression( indicatorE ); + Set attributes = programIndicatorService.getAttributesInExpression( indicatorE.getExpression() ); assertEquals( 2, attributes.size() ); assertTrue( attributes.contains( atA ) );