← Back to team overview

dhis2-devs team mailing list archive

[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 ) );