dhis2-devs team mailing list archive
-
dhis2-devs team
-
Mailing list archive
-
Message #38092
[Branch ~dhis2-devs-core/dhis2/trunk] Rev 19449: ProgramIndicatorService, added methods for getting attributes and constants in expressions
Merge authors:
Lars Helge Øverland (larshelge)
------------------------------------------------------------
revno: 19449 [merge]
committer: Lars Helge Overland <larshelge@xxxxxxxxx>
branch nick: dhis2
timestamp: Thu 2015-06-18 12:58:51 +0200
message:
ProgramIndicatorService, added methods for getting attributes and constants in expressions
modified:
dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramIndicatorService.java
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/data/DefaultAnalyticsService.java
dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/program/DefaultProgramIndicatorService.java
dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceTest.java
--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk
Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== 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<ProgramIndicator> 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<String, Double> valueMap );
+
+ /**
* Get indicator values of all program indicators defined for a TrackedEntityInstance
*
* @param programInstance ProgramInstance
@@ -158,21 +158,33 @@
*/
String filterIsValid( String filter );
+ Set<DataElement> getDataElementsInIndicators( Set<ProgramIndicator> 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<ProgramStageDataElement> getProgramStageDataElementsInExpression( ProgramIndicator indicator );
+ Set<ProgramStageDataElement> getProgramStageDataElementsInExpression( String expression );
+
+ Set<TrackedEntityAttribute> getAttributesInIndicators( Set<ProgramIndicator> 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<TrackedEntityAttribute> getAttributesInExpression( ProgramIndicator indicator );
+ Set<TrackedEntityAttribute> getAttributesInExpression( String expression );
+
+ Set<Constant> getConstantsInIndicators( Set<ProgramIndicator> indicators );
+
+ /**
+ * Get all {@link Constant} part of the expression of the expression.
+ *
+ * @param expression the expression.
+ * @return a set of Constants.
+ */
+ Set<Constant> 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<String> 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<String, Double> 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<String, String> getProgramIndicatorValues( ProgramInstance programInstance )
{
Map<String, String> result = new HashMap<>();
@@ -419,11 +455,29 @@
}
@Override
- public Set<ProgramStageDataElement> getProgramStageDataElementsInExpression( ProgramIndicator indicator )
+ public Set<DataElement> getDataElementsInIndicators( Set<ProgramIndicator> indicators )
+ {
+ Set<DataElement> dataElements = new HashSet<>();
+
+ for ( ProgramIndicator indicator : indicators )
+ {
+ Set<ProgramStageDataElement> psds = getProgramStageDataElementsInExpression( indicator.getExpression() );
+
+ for ( ProgramStageDataElement psd : psds )
+ {
+ dataElements.add( psd.getDataElement() );
+ }
+ }
+
+ return dataElements;
+ }
+
+ @Override
+ public Set<ProgramStageDataElement> getProgramStageDataElementsInExpression( String expression )
{
Set<ProgramStageDataElement> 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<TrackedEntityAttribute> getAttributesInExpression( ProgramIndicator indicator )
+ public Set<TrackedEntityAttribute> getAttributesInIndicators( Set<ProgramIndicator> indicators )
+ {
+ Set<TrackedEntityAttribute> attributes = new HashSet<>();
+
+ for ( ProgramIndicator indicator : indicators )
+ {
+ attributes.addAll( getAttributesInExpression( indicator.getExpression() ) );
+ }
+
+ return attributes;
+ }
+
+ @Override
+ public Set<TrackedEntityAttribute> getAttributesInExpression( String expression )
{
Set<TrackedEntityAttribute> 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<Constant> getConstantsInIndicators( Set<ProgramIndicator> indicators )
+ {
+ Set<Constant> constants = new HashSet<>();
+
+ for ( ProgramIndicator indicator : indicators )
+ {
+ constants.addAll( getConstantsInExpression( indicator.getExpression() ) );
+ }
+
+ return constants;
+ }
+
+ @Override
+ public Set<Constant> getConstantsInExpression( String expression )
+ {
+ Set<Constant> 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<ProgramStageDataElement> elements = programIndicatorService
- .getProgramStageDataElementsInExpression( indicatorE );
+ .getProgramStageDataElementsInExpression( indicatorE.getExpression() );
assertEquals( 2, elements.size() );
@@ -437,7 +437,7 @@
@Test
public void testGetAttributesInExpression()
{
- Set<TrackedEntityAttribute> attributes = programIndicatorService.getAttributesInExpression( indicatorE );
+ Set<TrackedEntityAttribute> attributes = programIndicatorService.getAttributesInExpression( indicatorE.getExpression() );
assertEquals( 2, attributes.size() );
assertTrue( attributes.contains( atA ) );