← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 16657: Fixed bug - The exception thrown when to click Aggregate and Save button in Manual aggregation.

 

------------------------------------------------------------
revno: 16657
committer: Tran Chau<tran.hispvietnam@xxxxxxxxx>
branch nick: dhis2
timestamp: Mon 2014-09-08 21:40:15 +0700
message:
  Fixed bug - The exception thrown when to click Aggregate and Save button in Manual aggregation.
modified:
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/caseaggregation/CaseAggregationCondition.java
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/caseaggregation/CaseAggregationConditionService.java
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/caseaggregation/CaseAggregationConditionStore.java
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/DefaultCaseAggregationConditionService.java
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/hibernate/HibernateCaseAggregationConditionStore.java
  dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/caseaggregation/CaseAggregationResultAction.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/caseaggregation/CaseAggregationCondition.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/caseaggregation/CaseAggregationCondition.java	2014-08-29 06:39:13 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/caseaggregation/CaseAggregationCondition.java	2014-09-08 14:40:15 +0000
@@ -95,6 +95,11 @@
     public static String MINUS_ATTRIBUTE_OPERATOR = "ATTRDATEDIFF";
 
     public static String AUTO_STORED_BY = "aggregated_from_tracker";
+    
+    public static final String PARAM_PERIOD_START_DATE = "PERIOD_START_DATE";
+    public static final String PARAM_PERIOD_END_DATE = "PARAM_PERIOD_END_DATE";
+    public static final String PARAM_PERIOD_ID = "PERIOD_ID";
+    public static final String PARAM_PERIOD_ISO_DATE = "PERIOD_ISO_DATE";
 
     public static final String regExp = "\\[(" + OBJECT_ORGUNIT_COMPLETE_PROGRAM_STAGE + "|" + OBJECT_PROGRAM + "|"
         + OBJECT_PROGRAM_STAGE_PROPERTY + "|" + OBJECT_PROGRAM_STAGE + "|" + OBJECT_TRACKED_ENTITY_PROGRAM_STAGE_PROPERTY

=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/caseaggregation/CaseAggregationConditionService.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/caseaggregation/CaseAggregationConditionService.java	2014-08-03 16:27:47 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/caseaggregation/CaseAggregationConditionService.java	2014-09-08 14:40:15 +0000
@@ -184,29 +184,15 @@
      *        3 month, last 6 month and last 12 month
      */
     void aggregate( List<CaseAggregateSchedule> caseAggregateSchedules, String taskStrategy );
-
-    /**
-     * Return a data value table aggregated of a query builder formula
-     * 
-     * @param caseAggregationCondition The query builder expression
-     * @param orgunitIds The ids of organisation unit where to aggregate data
-     *        value
-     * @param period The date range for aggregate data value
-     * @param format
-     * @param i18n
-     */
-    Grid getAggregateValue( CaseAggregationCondition caseAggregationCondition, Collection<Integer> orgunitIds,
-        Period period, I18nFormat format, I18n i18n );
-
+    
     /**
      * Insert value aggregated from a {@link CaseAggregationCondition}
      * 
-     * @param caseAggregationCondition CaseAggregationCondition
+     * @param caseAggregationConditions {@link CaseAggregationCondition
      * @param orgunitIds The list of {@link OrganisationUnit} ids
-     * @param period {@link Period}
+     * @param periods {@link Period}
      */
-    void insertAggregateValue( CaseAggregationCondition caseAggregationCondition, Collection<Integer> orgunitIds,
-        Period period );
+    void insertAggregateValue( Collection<CaseAggregationCondition> caseAggregationConditions, Collection<Integer> orgunitIds, Collection<Period> periods );
 
     /**
      * Retrieve the details of each {@link DataValue} which are generated by a
@@ -275,4 +261,17 @@
      * @return
      */
     int countCaseAggregationCondition( Collection<DataElement> dataElements, String key );
+    
+    /**
+     * Return a data value table aggregated of a query builder formula
+     * 
+     * @param caseAggregationConditions The collection of query builder expressions
+     * @param orgunitIds The ids of organisation unit where to aggregate data
+     *        value
+     * @param period The collections of date ranges for aggregate data value
+     * @param format
+     * @param i18n
+     */
+    List<Grid> getAggregateValue( Collection<CaseAggregationCondition> caseAggregationConditions, Collection<Integer> orgunitIds,
+        Collection<Period> periods, I18nFormat format, I18n i18n );
 }

=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/caseaggregation/CaseAggregationConditionStore.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/caseaggregation/CaseAggregationConditionStore.java	2014-08-29 18:08:10 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/caseaggregation/CaseAggregationConditionStore.java	2014-09-08 14:40:15 +0000
@@ -86,19 +86,6 @@
     Collection<Period> getPeriods( String periodTypeName, String taskStrategy );
 
     /**
-     * Return a data value table aggregated of a query builder formula
-     * 
-     * @param caseAggregationCondition The query builder expression
-     * @param orgunitIds The ids of organisation unit where to aggregate data
-     *        value
-     * @param period The date range for aggregate data value
-     * @param format
-     * @param i18n
-     */
-    Grid getAggregateValue( CaseAggregationCondition caseAggregationCondition, Collection<Integer> orgunitIds,
-        Period period, int attributeOptioncomboId, I18nFormat format, I18n i18n );
-
-    /**
      * Retrieve the details of each {@link DataValue} which are generated by a
      * {@link CaseAggregationCondition}
      * 
@@ -115,14 +102,15 @@
     /**
      * Insert data values into database directly
      * 
-     * @param caseAggregationCondition The query builder expression
-     * @param orgunitIds The ids of organisation unit where to aggregate data
+     * @param sql SQL filter events
+     * @param dataElementId The id of aggregate data element
+     * @param optionComboId The id of category option combo
+     * @param orgunitIds The id collection of organisation units where to aggregate data
      *        value
      * @param period The date range for aggregate data value
      */
-    void insertAggregateValue( String expression, String operator, Integer dataElementId, Integer optionComboId, 
-        int attributeOptioncomboId, Integer deSumId, Collection<Integer> orgunitIds, Period period );
-
+    void insertAggregateValue( String sql, int dataElementId, int optionComboId, Collection<Integer> orgunitIds, Period period );
+    
     /**
      * Return standard SQL from query builder formula
      * 
@@ -140,12 +128,18 @@
      *        element values. This fill is null for other operators.
      * @param orgunitId The id of organisation unit where to aggregate data
      *        value
-     * @param startDate Start date
-     * @param endDate End date
      */
     String parseExpressionToSql( boolean isInsert, String caseExpression, String operator, Integer aggregateDeId,
         String aggregateDeName, Integer optionComboId, String optionComboName,  int attributeOptioncomboId, Integer deSumId,
-        Collection<Integer> orgunitIds, Period period );
+        Collection<Integer> orgunitIds );
+    
+    /**
+     * Return standard SQL from query builder formula
+     * @param aggregationCondition {@link CaseAggregationCondition}
+     * @param attributeOptionComboId 
+     * 
+     */
+    String parseExpressionToSql( boolean isInsert, CaseAggregationCondition aggregationCondition, int attributeOptionComboId, Collection<Integer> orgunitIds );
 
     /**
      * Aggregate data values for the dataset by periods with a organisation unit
@@ -185,4 +179,23 @@
      * @return
      */
     int count( Collection<DataElement> dataElements, String key );
+    
+    public Collection<Integer> getServiceOrgunit();
+    
+    Grid getAggregateValue( String sql, I18nFormat format, I18n i18n );
+
+
+    /**
+     * Insert data values into database directly
+     * 
+     * @param sql SQL filter events
+     * @param dataElement The aggregate data element
+     * @param optionCombo The category option combo
+     * @param attributeOptionCombo 
+     * @param orgunitIds The id collection of organisation units where to aggregate data
+     *        value
+     * @param period The date range for aggregate data value
+     */
+     void insertAggregateValue( String sql, DataElement dataElement, DataElementCategoryOptionCombo optionCombo,
+        DataElementCategoryOptionCombo attributeOptionCombo, Collection<Integer> orgunitIds, Period period );
 }

=== modified file 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/DefaultCaseAggregationConditionService.java'
--- dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/DefaultCaseAggregationConditionService.java	2014-08-29 18:08:10 +0000
+++ dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/DefaultCaseAggregationConditionService.java	2014-09-08 14:40:15 +0000
@@ -29,10 +29,14 @@
  */
 
 import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.OBJECT_ORGUNIT_COMPLETE_PROGRAM_STAGE;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.OBJECT_TRACKED_ENTITY_ATTRIBUTE;
 import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.OBJECT_PROGRAM;
 import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.OBJECT_PROGRAM_STAGE;
 import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.OBJECT_PROGRAM_STAGE_DATAELEMENT;
+import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.OBJECT_TRACKED_ENTITY_ATTRIBUTE;
+import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.PARAM_PERIOD_END_DATE;
+import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.PARAM_PERIOD_START_DATE;
+import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.PARAM_PERIOD_ID;
+import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.PARAM_PERIOD_ISO_DATE;
 import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.SEPARATOR_ID;
 import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.SEPARATOR_OBJECT;
 import static org.hisp.dhis.i18n.I18nUtils.i18n;
@@ -62,6 +66,7 @@
 import org.hisp.dhis.program.ProgramStage;
 import org.hisp.dhis.program.ProgramStageService;
 import org.hisp.dhis.system.util.ConcurrentUtils;
+import org.hisp.dhis.system.util.DateUtils;
 import org.hisp.dhis.system.util.SystemUtils;
 import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
 import org.hisp.dhis.trackedentity.TrackedEntityAttributeService;
@@ -425,16 +430,39 @@
         ConcurrentUtils.waitForCompletion( futures );
     }
 
-    public Grid getAggregateValue( CaseAggregationCondition caseAggregationCondition, Collection<Integer> orgunitIds,
-        Period period, I18nFormat format, I18n i18n )
+    @Override
+    public List<Grid> getAggregateValue( Collection<CaseAggregationCondition> caseAggregationConditions, Collection<Integer> orgunitIds,
+        Collection<Period> periods, I18nFormat format, I18n i18n )
     {
-        periodService.reloadPeriod( period );
+        Collection<Integer> _orgunitIds = aggregationConditionStore.getServiceOrgunit();
+        _orgunitIds.retainAll( orgunitIds );
+        if ( _orgunitIds.size() > 0 )
+        {
+            int attributeOptioncomboId = categoryService.getDefaultDataElementCategoryOptionCombo().getId();
+            List<Grid> grids = new ArrayList<>();
+            for ( CaseAggregationCondition condition : caseAggregationConditions )
+            {  
+                String sql = aggregationConditionStore.parseExpressionToSql( false, condition, attributeOptioncomboId, _orgunitIds );
+                for ( Period period : periods )
+                {
+                    period =  periodService.reloadPeriod( period );
+                    String periodSQL = sql;
+                    periodSQL = replacePeriodSql( periodSQL, period );
+                   
+                    Grid grid = aggregationConditionStore.getAggregateValue( periodSQL, format, i18n );
+                    grid.setTitle( condition.getDisplayName() );
+                    grid.setSubtitle( format.formatPeriod( period ) );
 
-        int attributeOptioncomboId = categoryService.getDefaultDataElementCategoryOptionCombo().getId();
+                    grids.add( grid );
+                }
+            }
+            
+            return grids;
+        }
         
-        return aggregationConditionStore.getAggregateValue( caseAggregationCondition, orgunitIds, period, attributeOptioncomboId, format, i18n );
+        return null;
     }
-
+    
     @Override
     public Grid getAggregateValueDetails( CaseAggregationCondition aggregationCondition, OrganisationUnit orgunit,
         Period period, I18nFormat format, I18n i18n )
@@ -445,19 +473,28 @@
         return aggregationConditionStore.getAggregateValueDetails( aggregationCondition, orgunit, period, nonRegistrationProgram, format, i18n  );
     }
 
-    public void insertAggregateValue( CaseAggregationCondition caseAggregationCondition,
-        Collection<Integer> orgunitIds, Period period )
+    @Override
+    public void insertAggregateValue( Collection<CaseAggregationCondition> caseAggregationConditions,
+        Collection<Integer> orgunitIds, Collection<Period> periods )
     {
-        periodService.reloadPeriod( period );
-
-        Integer deSumId = (caseAggregationCondition.getDeSum() == null) ? null : caseAggregationCondition.getDeSum()
-            .getId();
-
-        int attributeOptioncomboId = categoryService.getDefaultDataElementCategoryOptionCombo().getId();
-        
-        aggregationConditionStore.insertAggregateValue( caseAggregationCondition.getAggregationExpression(),
-            caseAggregationCondition.getOperator(), caseAggregationCondition.getAggregationDataElement().getId(),
-            caseAggregationCondition.getOptionCombo().getId(), attributeOptioncomboId, deSumId, orgunitIds, period );
+        Collection<Integer> _orgunitIds = aggregationConditionStore.getServiceOrgunit();
+        _orgunitIds.retainAll( orgunitIds );
+        if ( _orgunitIds.size() > 0 )
+        {
+            DataElementCategoryOptionCombo attributeOptioncombo = categoryService.getDefaultDataElementCategoryOptionCombo();
+            for( CaseAggregationCondition caseAggregationCondition : caseAggregationConditions )
+            {
+                String sql = aggregationConditionStore.parseExpressionToSql(false, caseAggregationCondition, attributeOptioncombo.getId(), _orgunitIds );
+    
+                for ( Period period : periods )
+                {
+                    period = periodService.reloadPeriod( period );
+                    sql = replacePeriodSql( sql, period );
+                    aggregationConditionStore.insertAggregateValue( sql, caseAggregationCondition.getAggregationDataElement(), 
+                        caseAggregationCondition.getOptionCombo(), attributeOptioncombo, _orgunitIds, period );
+                }
+            }
+        }
     }
 
     @Override
@@ -478,8 +515,10 @@
 
         int attributeOptioncomboId = categoryService.getDefaultDataElementCategoryOptionCombo().getId();
         
-        return aggregationConditionStore.parseExpressionToSql( isInsert, caseExpression, operator, aggregateDeId,
-            aggregateDeName, optionComboId, optionComboName, attributeOptioncomboId, deSumId, orgunitIds, period );
+        String sql = aggregationConditionStore.parseExpressionToSql( isInsert, caseExpression, operator, aggregateDeId,
+            aggregateDeName, optionComboId, optionComboName, attributeOptioncomboId, deSumId, orgunitIds );
+        
+        return replacePeriodSql( sql, period );
     }
 
     @Override
@@ -492,6 +531,17 @@
     // Support Methods
     // -------------------------------------------------------------------------
 
+    private String replacePeriodSql( String sql, Period period )
+    {
+        sql = sql.replaceAll( "COMBINE", "" );
+        sql = sql.replaceAll( PARAM_PERIOD_START_DATE,  DateUtils.getMediumDateString( period.getStartDate() ));
+        sql = sql.replaceAll( PARAM_PERIOD_END_DATE,  DateUtils.getMediumDateString( period.getEndDate() ));
+        sql = sql.replaceAll( PARAM_PERIOD_ID,  period.getId() + "" );
+        sql = sql.replaceAll( PARAM_PERIOD_ISO_DATE, period.getIsoDate() );
+
+        return sql;
+    }
+    
     @Async
     private Future<?> aggregateValueManager( ConcurrentLinkedQueue<CaseAggregateSchedule> caseAggregateSchedule,
         String taskStrategy )
@@ -581,7 +631,7 @@
             }
 
         }
-System.out.println("\n\n\n ==== \n false ");
+
         return false;
     }
 }

=== modified file 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/hibernate/HibernateCaseAggregationConditionStore.java'
--- dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/hibernate/HibernateCaseAggregationConditionStore.java	2014-08-31 09:14:47 +0000
+++ dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/hibernate/HibernateCaseAggregationConditionStore.java	2014-09-08 14:40:15 +0000
@@ -36,6 +36,10 @@
 import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.OBJECT_PROGRAM_STAGE_PROPERTY;
 import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.OBJECT_TRACKED_ENTITY_ATTRIBUTE;
 import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.OBJECT_TRACKED_ENTITY_PROGRAM_STAGE_PROPERTY;
+import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.PARAM_PERIOD_END_DATE;
+import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.PARAM_PERIOD_ID;
+import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.PARAM_PERIOD_ISO_DATE;
+import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.PARAM_PERIOD_START_DATE;
 import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.SEPARATOR_ID;
 import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.SEPARATOR_OBJECT;
 import static org.hisp.dhis.scheduling.CaseAggregateConditionSchedulingManager.TASK_AGGREGATE_QUERY_BUILDER_LAST_12_MONTH;
@@ -68,16 +72,21 @@
 import org.hisp.dhis.dataelement.DataElement;
 import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo;
 import org.hisp.dhis.dataelement.DataElementService;
+import org.hisp.dhis.datavalue.DataValue;
+import org.hisp.dhis.datavalue.DataValueService;
 import org.hisp.dhis.i18n.I18n;
 import org.hisp.dhis.i18n.I18nFormat;
 import org.hisp.dhis.jdbc.StatementBuilder;
 import org.hisp.dhis.organisationunit.OrganisationUnit;
+import org.hisp.dhis.organisationunit.OrganisationUnitService;
 import org.hisp.dhis.period.CalendarPeriodType;
 import org.hisp.dhis.period.Period;
+import org.hisp.dhis.period.PeriodService;
 import org.hisp.dhis.period.PeriodType;
 import org.hisp.dhis.system.grid.ListGrid;
 import org.hisp.dhis.system.util.DateUtils;
 import org.hisp.dhis.system.util.TextUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.RowMapper;
 import org.springframework.jdbc.support.rowset.SqlRowSet;
@@ -101,8 +110,6 @@
 
     private static final String IN_CONDITION_COUNT_X_TIMES = "COUNT";
 
-    public static final String STORED_BY_DHIS_SYSTEM = "aggregated_from_tracker";
-
     // -------------------------------------------------------------------------
     // Dependencies
     // -------------------------------------------------------------------------
@@ -127,6 +134,15 @@
     {
         this.dataElementService = dataElementService;
     }
+
+    @Autowired
+    DataValueService dataValueService;
+    
+    @Autowired
+    private PeriodService periodService;
+    
+    @Autowired
+    private OrganisationUnitService orgunitService;
     
     // -------------------------------------------------------------------------
     // Implementation Methods
@@ -143,20 +159,20 @@
     public int count( Collection<DataElement> dataElements, String key )
     {
         Criteria criteria = getCriteria();
-        
-        if( dataElements!= null )
-        {
-            criteria.add(  Restrictions.in( "aggregationDataElement", dataElements ) );
-        }
-        if( key != null )
-        {
-            criteria.add(  Restrictions.ilike( "name", "%" + key + "%" ) );
-        }
-        
-        Number rs = ( Number ) criteria.setProjection(Projections.rowCount()).uniqueResult();
+
+        if ( dataElements != null )
+        {
+            criteria.add( Restrictions.in( "aggregationDataElement", dataElements ) );
+        }
+        if ( key != null )
+        {
+            criteria.add( Restrictions.ilike( "name", "%" + key + "%" ) );
+        }
+
+        Number rs = (Number) criteria.setProjection( Projections.rowCount() ).uniqueResult();
         return rs != null ? rs.intValue() : 0;
     }
-    
+
     @Override
     public CaseAggregationCondition get( DataElement dataElement, DataElementCategoryOptionCombo optionCombo )
     {
@@ -166,67 +182,49 @@
 
     @SuppressWarnings( "unchecked" )
     @Override
-    public Collection<CaseAggregationCondition> get( Collection<DataElement> dataElements, String key, Integer first, Integer max )
+    public Collection<CaseAggregationCondition> get( Collection<DataElement> dataElements, String key, Integer first,
+        Integer max )
     {
         Criteria criteria = getCriteria();
-        
-        if( dataElements!= null )
-        {
-            criteria.add(  Restrictions.in( "aggregationDataElement", dataElements ) );
-        }
-        if( key != null )
-        {
-            criteria.add(  Restrictions.ilike( "name", "%" + key + "%" ) );
-        }
-        
-        if( first != null && max != null )
+
+        if ( dataElements != null )
+        {
+            criteria.add( Restrictions.in( "aggregationDataElement", dataElements ) );
+        }
+        if ( key != null )
+        {
+            criteria.add( Restrictions.ilike( "name", "%" + key + "%" ) );
+        }
+
+        if ( first != null && max != null )
         {
             criteria.setFirstResult( first );
             criteria.setMaxResults( max );
         }
-        
-        criteria.addOrder(Order.desc("name"));
-        
+
+        criteria.addOrder( Order.desc( "name" ) );
+
         return criteria.list();
     }
 
-    public Grid getAggregateValue( CaseAggregationCondition caseAggregationCondition, Collection<Integer> orgunitIds,
-        Period period, int attributeOptioncomboId, I18nFormat format, I18n i18n )
+    public Grid getAggregateValue( String sql, I18nFormat format, I18n i18n )
     {
-        Collection<Integer> _orgunitIds = getServiceOrgunit();
-        _orgunitIds.retainAll( orgunitIds );
-
-        if ( _orgunitIds.size() > 0 )
-        {
-            Grid grid = new ListGrid();
-            grid.setTitle( caseAggregationCondition.getDisplayName() );
-            grid.setSubtitle( format.formatPeriod( period ) );
-
-            grid.addHeader( new GridHeader( i18n.getString( "dataelementid" ), true, true ) );
-            grid.addHeader( new GridHeader( i18n.getString( "categoryoptioncomboid" ), true, true ) );
-            grid.addHeader( new GridHeader( i18n.getString( "periodid" ), true, true ) );
-            grid.addHeader( new GridHeader( i18n.getString( "organisationunitid" ), true, true ) );
-            grid.addHeader( new GridHeader( i18n.getString( "storedby" ), true, true ) );
-            grid.addHeader( new GridHeader( i18n.getString( "dataelementname" ), false, true ) );
-            grid.addHeader( new GridHeader( i18n.getString( "categoryoptioncomboname" ), false, true ) );
-            grid.addHeader( new GridHeader( i18n.getString( "organisationunitname" ), false, true ) );
-            grid.addHeader( new GridHeader( i18n.getString( "value" ), false, true ) );
-
-            Integer deSumId = (caseAggregationCondition.getDeSum() == null) ? null : caseAggregationCondition
-                .getDeSum().getId();
-            String sql = parseExpressionToSql( false, caseAggregationCondition.getAggregationExpression(),
-                caseAggregationCondition.getOperator(), caseAggregationCondition.getAggregationDataElement().getId(),
-                caseAggregationCondition.getAggregationDataElement().getDisplayName(), caseAggregationCondition
-                    .getOptionCombo().getId(), caseAggregationCondition.getOptionCombo().getDisplayName(), attributeOptioncomboId, deSumId,
-                _orgunitIds, period );
-
-            SqlRowSet rs = jdbcTemplate.queryForRowSet( sql );
-            grid.addRows( rs );
-
-            return grid;
-        }
-
-        return null;
+        Grid grid = new ListGrid();
+
+        grid.addHeader( new GridHeader( i18n.getString( "dataelementid" ), true, true ) );
+        grid.addHeader( new GridHeader( i18n.getString( "categoryoptioncomboid" ), true, true ) );
+        grid.addHeader( new GridHeader( i18n.getString( "periodid" ), true, true ) );
+        grid.addHeader( new GridHeader( i18n.getString( "organisationunitid" ), true, true ) );
+        grid.addHeader( new GridHeader( i18n.getString( "storedby" ), true, true ) );
+        grid.addHeader( new GridHeader( i18n.getString( "dataelementname" ), false, true ) );
+        grid.addHeader( new GridHeader( i18n.getString( "categoryoptioncomboname" ), false, true ) );
+        grid.addHeader( new GridHeader( i18n.getString( "organisationunitname" ), false, true ) );
+        grid.addHeader( new GridHeader( i18n.getString( "value" ), false, true ) );
+
+        SqlRowSet rs = jdbcTemplate.queryForRowSet( sql );
+        grid.addRows( rs );
+
+        return grid;
     }
 
     @Override
@@ -259,95 +257,144 @@
         int index = 1;
         while ( rs.next() )
         {
-        	grid.addRow();
-        	for ( int i = 1; i <= cols; i++ )
-            {
-            	Object value = rs.getObject( i );
-            	if( i==1 )
-            	{
-            		if( !value.toString().equals(idValue) )
-		        	{
-		        		grid.addValue( index );
-		        		idValue = value.toString();
-		        		index ++;
-		        	}
-            		else
-            		{
-            			grid.addValue( "" );
-            		}
-            	}
-            	else
-            	{
-            		grid.addValue( value );
-            	}
-            }
+            grid.addRow();
+            for ( int i = 1; i <= cols; i++ )
+            {
+                Object value = rs.getObject( i );
+                if ( i == 1 )
+                {
+                    if ( !value.toString().equals( idValue ) )
+                    {
+                        grid.addValue( index );
+                        idValue = value.toString();
+                        index++;
+                    }
+                    else
+                    {
+                        grid.addValue( "" );
+                    }
+                }
+                else
+                {
+                    grid.addValue( value );
+                }
+            }
+        }
+    }
+
+    @Override
+    public void insertAggregateValue( String sql, DataElement dataElement, DataElementCategoryOptionCombo optionCombo, 
+        DataElementCategoryOptionCombo attributeOptionCombo, Collection<Integer> orgunitIds, Period period )
+    {        
+        try
+        {
+            SqlRowSet row = jdbcTemplate.queryForRowSet(sql);
+            while (row.next())
+            {
+                int value = row.getInt("value");
+                OrganisationUnit source = orgunitService.getOrganisationUnit( row.getInt( "sourceid" ) );
+                
+                DataValue dataValue = dataValueService.getDataValue( dataElement, period, source, optionCombo );
+                
+                if ( dataValue == null && value != 0 )
+                {
+                    dataValue = new DataValue( dataElement, period, source, optionCombo, attributeOptionCombo );
+                    dataValue.setValue( value + "" );
+                    dataValue.setStoredBy( row.getString("storedby") );
+                    dataValueService.addDataValue( dataValue );
+                }
+                else if ( dataValue != null && value == 0 )
+                {
+                    dataValueService.deleteDataValue( dataValue );
+                }
+                else if ( dataValue != null && value != 0 )
+                {
+                    dataValue.setValue( value + "" );
+                    dataValueService.updateDataValue( dataValue );
+                } 
+            }
+        }
+        catch ( Exception ex )
+        {
+            ex.printStackTrace();
         }
     }
     
-    public void insertAggregateValue( String expression, String operator, Integer dataElementId, Integer optionComboId, int attributeOptioncomboId, 
-        Integer deSumId, Collection<Integer> orgunitIds, Period period )
-    {
-        // Delete all data value from this period which created from DHIS-system
-        // after to run Aggregate Query Builder
-        String periodtypeSql = "select periodtypeid from periodtype where name='" + period.getPeriodType().getName()
-            + "'";
-        int periodTypeId = jdbcTemplate.queryForObject( periodtypeSql, Integer.class );
-        String periodSql = "select periodid from period where periodtypeid=" + periodTypeId + " and startdate='"
-            + DateUtils.getMediumDateString( period.getStartDate() ) + "' and enddate='"
-            + DateUtils.getMediumDateString( period.getEndDate() ) + "'";
-        SqlRowSet rs = jdbcTemplate.queryForRowSet( periodSql );
-        int periodid = 0;
-
-        if ( rs.next() )
-        {
-            periodid = rs.getInt( "periodid" );
-        }
-
-        if ( periodid == 0 )
-        {
-            String insertSql = "insert into period (periodtypeid,startdate,enddate) " + " VALUES " + "("
-                + period.getPeriodType().getId() + ",'" + DateUtils.getMediumDateString( period.getStartDate() )
-                + "','" + DateUtils.getMediumDateString( period.getEndDate() ) + "' )";
-            jdbcTemplate.execute( insertSql );
-
-            period.setId( jdbcTemplate.queryForObject( insertSql, Integer.class ) );
-        }
-        else
-        {
-            period.setId( periodid );
-
-            String deleteDataValueSql = "delete from datavalue where dataelementid=" + dataElementId
-                + " and categoryoptioncomboid=" + optionComboId + " and sourceid in ("
-                + TextUtils.getCommaDelimitedString( orgunitIds ) + ") and periodid=" + periodid + "";
-
-            jdbcTemplate.execute( deleteDataValueSql );
-        }
-
-        // insert data elements into database directly
-
-        String sql = parseExpressionToSql( true, expression, operator, dataElementId, "dataelementname", optionComboId,
-            "optionComboname", attributeOptioncomboId, deSumId, orgunitIds, period );
-        jdbcTemplate.execute( sql );
-    }
-
-    @Override
-    public String parseExpressionToSql( boolean isInsert, String caseExpression, String operator,
-        Integer aggregateDeId, String aggregateDeName, Integer optionComboId, String optionComboName, int attributeOptioncomboId, Integer deSumId,
-        Collection<Integer> orgunitIds, Period period )
-    { 
+    @Override
+    public void insertAggregateValue( String sql, int dataElementId, int optionComboId, Collection<Integer> orgunitIds,
+        Period period )
+    {
+        try
+        {
+            int periodId = 0;
+            periodId = jdbcTemplate.queryForInt(  "select periodid from period where periodtypeid = ( select periodtypeid from periodtype where name='"
+                    + period.getPeriodType().getName()
+                    + "' )"
+                    + " and startdate='"
+                    + DateUtils.getMediumDateString( period.getStartDate() )
+                    + "' and enddate='"
+                    + DateUtils.getMediumDateString( period.getEndDate() ) + "'" );
+            
+            if ( periodId == 0 )
+            {
+                String insertSql = "insert into period (periodid, periodtypeid,startdate,enddate) " + " VALUES " + "("
+                    + statementBuilder.getAutoIncrementValue() + ","+ period.getPeriodType().getId() + ",'" + DateUtils.getMediumDateString( period.getStartDate() )
+                    + "','" + DateUtils.getMediumDateString( period.getEndDate() ) + "' )";
+                
+               jdbcTemplate.update( insertSql );
+            }
+            else
+            {
+                String deleteDataValueSql = "delete from datavalue where dataelementid=" + dataElementId
+                    + " and categoryoptioncomboid=" + optionComboId + " and sourceid in ("
+                    + TextUtils.getCommaDelimitedString( orgunitIds ) + ") "
+                        + "and periodid = " + periodId;
+               jdbcTemplate.update( deleteDataValueSql );
+            }
+
+            jdbcTemplate.update( sql );
+
+        }
+        catch ( Exception ex )
+        {
+            ex.printStackTrace();
+        }
+    }
+
+    @Override
+    public String parseExpressionToSql( boolean isInsert, CaseAggregationCondition aggregationCondition,
+        int attributeOptionComboId, Collection<Integer> orgunitIds )
+    {
+        String caseExpression = aggregationCondition.getAggregationExpression();
+        String operator = aggregationCondition.getOperator();
+        Integer aggregateDeId = aggregationCondition.getAggregationDataElement().getId();
+        String aggregateDeName = aggregationCondition.getAggregationDataElement().getName();
+        Integer optionComboId = aggregationCondition.getOptionCombo().getId();
+        String optionComboName = aggregationCondition.getOptionCombo().getName();
+        Integer deSumId = (aggregationCondition.getDeSum() == null) ? null : aggregationCondition.getDeSum().getId();
+
+        return parseExpressionToSql( isInsert, caseExpression, operator, aggregateDeId, aggregateDeName, optionComboId,
+            optionComboName, attributeOptionComboId, deSumId, orgunitIds );
+    }
+
+    @Override
+    public String parseExpressionToSql( boolean isInsert, String caseExpression, String operator, Integer aggregateDeId,
+        String aggregateDeName, Integer optionComboId, String optionComboName,  int attributeOptioncomboId, Integer deSumId,
+        Collection<Integer> orgunitIds )
+    {
         String sql = "SELECT '" + aggregateDeId + "' as dataelementid, '" + optionComboId
             + "' as categoryoptioncomboid, '" + attributeOptioncomboId
-            + "' as attributeoptioncomboid, ou.organisationunitid as sourceid, '" + period.getId() + "' as periodid,'"
+            + "' as attributeoptioncomboid, ou.organisationunitid as sourceid, '" + PARAM_PERIOD_ID + "' as periodid,'"
             + CaseAggregationCondition.AUTO_STORED_BY + "' as storedby, ";
 
         if ( isInsert )
         {
-            sql = "INSERT INTO datavalue (dataelementid, categoryoptioncomboid, attributeoptioncomboid, sourceid, periodid, storedby, value) "
-                + sql;
+            sql = "INSERT INTO datavalue (dataelementid, categoryoptioncomboid, attributeoptioncomboid, sourceid, periodid, storedby, lastupdated, followup, created, value) "
+                + sql + " now(), false, now(), ";
         }
         else
         {
-            sql += "'" + period.getIsoDate() + "' as periodIsoDate,'" + aggregateDeName + "' as dataelementname, '"
+            sql += "'" + PARAM_PERIOD_ISO_DATE + "' as periodIsoDate,'" + aggregateDeName + "' as dataelementname, '"
                 + optionComboName + "' as categoryoptioncomboname, ou.name as organisationunitname, ";
         }
 
@@ -356,9 +403,7 @@
         {
             if ( hasOrgunitProgramStageCompleted( caseExpression ) )
             {
-                sql += createSQL( caseExpression, operator, orgunitIds,
-                    DateUtils.getMediumDateString( period.getStartDate() ),
-                    DateUtils.getMediumDateString( period.getEndDate() ) );
+                sql += createSQL( caseExpression, operator, orgunitIds );
             }
             else
             {
@@ -394,93 +439,81 @@
                     sql += " INNER JOIN organisationunit ou ON ou.organisationunitid=psi.organisationunitid ";
                 }
 
-                sql += " WHERE "
-                    + createSQL( caseExpression, operator, orgunitIds,
-                        DateUtils.getMediumDateString( period.getStartDate() ),
-                        DateUtils.getMediumDateString( period.getEndDate() ) );
+                sql += " WHERE " + createSQL( caseExpression, operator, orgunitIds );
 
                 sql += "GROUP BY ou.organisationunitid, ou.name";
             }
         }
         else
-        { 
+        {
             sql += " " + operator + "( cast( pdv.value as " + statementBuilder.getDoubleColumnType() + " ) ) ";
             sql += "FROM trackedentitydatavalue pdv ";
             sql += "    INNER JOIN programstageinstance psi  ";
             sql += "            ON psi.programstageinstanceid = pdv.programstageinstanceid ";
             sql += "    INNER JOIN organisationunit ou ";
             sql += "            ON ou.organisationunitid=psi.organisationunitid ";
-            sql += "WHERE executiondate >='" + DateUtils.getMediumDateString( period.getStartDate() ) + "'  ";
-            sql += "    AND executiondate <='" + DateUtils.getMediumDateString( period.getEndDate() )
-                + "' AND pdv.dataelementid=" + deSumId;
+            sql += "WHERE executiondate >='" + PARAM_PERIOD_START_DATE + "'  ";
+            sql += "    AND executiondate <='" + PARAM_PERIOD_END_DATE + "' AND pdv.dataelementid=" + deSumId;
 
             if ( caseExpression != null && !caseExpression.isEmpty() )
             {
-                sql += " AND "
-                    + createSQL( caseExpression, operator, orgunitIds,
-                        DateUtils.getMediumDateString( period.getStartDate() ),
-                        DateUtils.getMediumDateString( period.getEndDate() ) );
+                sql += " AND " + createSQL( caseExpression, operator, orgunitIds );
             }
 
             sql += "GROUP BY ou.organisationunitid, ou.name";
-
+            
         }
 
-        sql = sql.replaceAll( "COMBINE", "" );
-
         return sql;
     }
 
     @Override
     public void runAggregate( Collection<Integer> orgunitIds, CaseAggregateSchedule dataSet, Collection<Period> periods, int attributeOptioncomboId )
     {
-        String sql = "select caseaggregationconditionid, aggregationdataelementid, optioncomboid, "
-            + " cagg.aggregationexpression as caseexpression, cagg.operator as caseoperator, cagg.desum as desumid "
-            + "     from caseaggregationcondition cagg inner join datasetmembers dm "
-            + "             on cagg.aggregationdataelementid=dm.dataelementid inner join dataset ds "
-            + "             on ds.datasetid = dm.datasetid inner join periodtype pt "
-            + "             on pt.periodtypeid=ds.periodtypeid inner join dataelement de "
-            + "             on de.dataelementid=dm.dataelementid where ds.datasetid = " + dataSet.getDataSetId();
-
-        SqlRowSet rs = jdbcTemplate.queryForRowSet( sql );
-
-         while ( rs.next() )
-        {
-            for ( Period period : periods )
+        Collection<Integer> _orgunitIds = getServiceOrgunit();
+
+        if ( orgunitIds == null )
+        {
+            orgunitIds = new HashSet<>();
+            orgunitIds.addAll( _orgunitIds );
+        }
+        else
+        {
+            orgunitIds.retainAll( _orgunitIds );
+        }
+        
+        if(orgunitIds.size() > 0 )
+        {
+            String sql = "select caseaggregationconditionid, aggregationdataelementid, optioncomboid, "
+                + " cagg.aggregationexpression as caseexpression, cagg.operator as caseoperator, cagg.desum as desumid "
+                + "     from caseaggregationcondition cagg inner join datasetmembers dm "
+                + "             on cagg.aggregationdataelementid=dm.dataelementid inner join dataset ds "
+                + "             on ds.datasetid = dm.datasetid inner join periodtype pt "
+                + "             on pt.periodtypeid=ds.periodtypeid inner join dataelement de "
+                + "             on de.dataelementid=dm.dataelementid where ds.datasetid = " + dataSet.getDataSetId();
+    
+            SqlRowSet rs = jdbcTemplate.queryForRowSet( sql );
+    
+             while ( rs.next() )
             {
-                // -------------------------------------------------------------
-                // Get formula, agg-dataelement and option-combo
-                // -------------------------------------------------------------
-
-                int dataelementId = rs.getInt( "aggregationdataelementid" );
-                int optionComboId = rs.getInt( "optioncomboid" );
-                String caseExpression = rs.getString( "caseexpression" );
-                String caseOperator = rs.getString( "caseoperator" );
-                int deSumId = rs.getInt( "desumid" );
-
-                Collection<Integer> _orgunitIds = getServiceOrgunit();
-
-                if ( orgunitIds == null )
-                {
-                    orgunitIds = new HashSet<>();
-                    orgunitIds.addAll( _orgunitIds );
-                }
-                else
-                {
-                    orgunitIds.retainAll( _orgunitIds );
-                }
-
-                // ---------------------------------------------------------------------
-                // Aggregation
-                // ---------------------------------------------------------------------
-
-                if ( !orgunitIds.isEmpty() )
-                {
-                    insertAggregateValue( caseExpression, caseOperator, dataelementId, optionComboId, attributeOptioncomboId, deSumId,
-                        orgunitIds, period );
-                }
+                 String caseExpression = rs.getString( "caseexpression" );
+                 int dataElementId = rs.getInt( "aggregationdataelementid" );
+                 int optionComboId = rs.getInt( "optioncomboid" );
+                 String caseOperator = rs.getString( "caseoperator" );
+                 int deSumId = rs.getInt( "desumid" );
+                 String insertParamsSql = parseExpressionToSql( true, caseExpression, caseOperator, dataElementId, "de_name", optionComboId, "optioncombo_name", attributeOptioncomboId, deSumId, _orgunitIds );
+                 
+                for ( Period period : periods )
+                {
+                    String insertSql = replacePeriodSql( insertParamsSql, period );
+                    
+                    if ( !orgunitIds.isEmpty() )
+                    { 
+                        insertAggregateValue( insertSql, dataElementId, optionComboId, _orgunitIds, period );
+                    }
+                }
+    
             }
-
         }
     }
 
@@ -494,11 +527,8 @@
      * @param deType Aggregate Data element type
      * @param orgunitIds The ids of organisation units where to aggregate data
      *        value
-     * @param startDate Start date
-     * @param endDate End date
      */
-    private String createSQL( String caseExpression, String operator, Collection<Integer> orgunitIds, String startDate,
-        String endDate )
+    private String createSQL( String caseExpression, String operator, Collection<Integer> orgunitIds )
     {
         caseExpression = caseExpression.replaceAll( "\"", "'" );
         boolean orgunitCompletedProgramStage = false;
@@ -522,7 +552,7 @@
             minus2SQLMap.put(
                 idx2,
                 getConditionForMisus2DataElement( orgunitIds, ids1[1], ids1[2], ids2[1], ids2[2],
-                    matcherMinus2.group( 6 ) + matcherMinus2.group( 7 ), startDate, endDate ) );
+                    matcherMinus2.group( 6 ) + matcherMinus2.group( 7 ) ) );
 
             caseExpression = caseExpression.replace( matcherMinus2.group( 0 ),
                 CaseAggregationCondition.MINUS_DATAELEMENT_OPERATOR + "_" + idx2 );
@@ -538,21 +568,18 @@
         Pattern patternAttrMinus2 = Pattern.compile( CaseAggregationCondition.minusAttributeRegExp );
         Matcher matcherAttrMinus2 = patternAttrMinus2.matcher( caseExpression );
         while ( matcherAttrMinus2.find() )
-        { 
-           String attribute1 = matcherAttrMinus2.group( 2 );
-           String attribute2 = matcherAttrMinus2.group( 5 );
-           String compareSide = matcherAttrMinus2.group( 6 ) + matcherAttrMinus2.group( 7 );
-           minus2AttributeSQLMap.put(
-                idx1,
-                getConditionForMisus2Attribute(attribute1, attribute2, compareSide ));
-               
+        {
+            String attribute1 = matcherAttrMinus2.group( 2 );
+            String attribute2 = matcherAttrMinus2.group( 5 );
+            String compareSide = matcherAttrMinus2.group( 6 ) + matcherAttrMinus2.group( 7 );
+            minus2AttributeSQLMap.put( idx1, getConditionForMisus2Attribute( attribute1, attribute2, compareSide ) );
+
             caseExpression = caseExpression.replace( matcherAttrMinus2.group( 0 ),
                 CaseAggregationCondition.MINUS_ATTRIBUTE_OPERATOR + "_" + idx1 );
 
             idx1++;
         }
 
-        
         // Get minus(date dataelement, date) out from the expression and run
         // them later
 
@@ -567,7 +594,7 @@
             minusSQLMap.put(
                 idx,
                 getConditionForMinusDataElement( orgunitIds, Integer.parseInt( ids[1] ), Integer.parseInt( ids[2] ),
-                    matcherMinus.group( 4 ), startDate, endDate ) );
+                    matcherMinus.group( 4 ) ) );
 
             caseExpression = caseExpression.replace( matcherMinus.group( 0 ), CaseAggregationCondition.MINUS_OPERATOR
                 + "_" + idx );
@@ -618,18 +645,17 @@
                 String compareValue = expression[index].replace( "[" + match + "]", "" ).trim();
 
                 boolean isExist = compareValue.equals( IS_NULL ) ? false : true;
-                condition = getConditionForDataElement( isExist, programId, programStageId, dataElementId, orgunitIds,
-                    startDate, endDate );
+                condition = getConditionForDataElement( isExist, programId, programStageId, dataElementId, orgunitIds );
             }
 
             else if ( info[0].equalsIgnoreCase( OBJECT_PROGRAM_PROPERTY ) )
             {
-                condition = getConditionForProgramProperty( operator, startDate, endDate, info[1] );
+                condition = getConditionForProgramProperty( operator, info[1] );
             }
             else if ( info[0].equalsIgnoreCase( OBJECT_PROGRAM ) )
             {
                 String[] ids = info[1].split( SEPARATOR_ID );
-                condition = getConditionForProgram( ids[0], operator, orgunitIds, startDate, endDate );
+                condition = getConditionForProgram( ids[0], operator, orgunitIds );
                 if ( ids.length > 1 )
                 {
                     condition += ids[1];
@@ -640,25 +666,25 @@
                 String[] ids = info[1].split( SEPARATOR_ID );
                 if ( ids.length == 2 && ids[1].equals( IN_CONDITION_COUNT_X_TIMES ) )
                 {
-                    condition = getConditionForCountProgramStage( ids[0], operator, orgunitIds, startDate, endDate );
+                    condition = getConditionForCountProgramStage( ids[0], operator, orgunitIds );
                 }
                 else
                 {
-                    condition = getConditionForProgramStage( ids[0], orgunitIds, startDate, endDate );
+                    condition = getConditionForProgramStage( ids[0], orgunitIds );
                 }
             }
             else if ( info[0].equalsIgnoreCase( OBJECT_PROGRAM_STAGE_PROPERTY ) )
             {
-                condition = getConditionForProgramStageProperty( info[1], operator, orgunitIds, startDate, endDate );
+                condition = getConditionForProgramStageProperty( info[1], operator, orgunitIds );
             }
             else if ( info[0].equalsIgnoreCase( OBJECT_TRACKED_ENTITY_PROGRAM_STAGE_PROPERTY ) )
             {
-                condition = getConditionForTrackedEntityProgramStageProperty( info[1], operator, startDate, endDate );
+                condition = getConditionForTrackedEntityProgramStageProperty( info[1], operator );
             }
             else if ( info[0].equalsIgnoreCase( OBJECT_ORGUNIT_COMPLETE_PROGRAM_STAGE ) )
             {
                 sqlOrgunitCompleted += getConditionForOrgunitProgramStageCompleted( info[1], operator, orgunitIds,
-                    startDate, endDate, orgunitCompletedProgramStage );
+                    orgunitCompletedProgramStage );
                 orgunitCompletedProgramStage = true;
             }
 
@@ -692,14 +718,13 @@
             sql = sql
                 .replace( CaseAggregationCondition.MINUS_DATAELEMENT_OPERATOR + "_" + key, minus2SQLMap.get( key ) );
         }
-        
+
         for ( int key = 0; key < idx1; key++ )
         {
-            sql = sql
-                .replace( CaseAggregationCondition.MINUS_ATTRIBUTE_OPERATOR + "_" + key, minus2AttributeSQLMap.get( key ) );
+            sql = sql.replace( CaseAggregationCondition.MINUS_ATTRIBUTE_OPERATOR + "_" + key,
+                minus2AttributeSQLMap.get( key ) );
         }
 
-
         return sql + " ) ";
     }
 
@@ -708,7 +733,7 @@
      * 
      */
     private String getConditionForDataElement( boolean isExist, int programId, String programStageId,
-        int dataElementId, Collection<Integer> orgunitIds, String startDate, String endDate )
+        int dataElementId, Collection<Integer> orgunitIds )
     {
         String keyExist = (isExist == true) ? "EXISTS" : "NOT EXISTS";
 
@@ -718,8 +743,8 @@
             + "ON _pi.programinstanceid=_psi.programinstanceid "
             + "WHERE psi.programstageinstanceid=_pdv.programstageinstanceid AND _pdv.dataelementid=" + dataElementId
             + "  AND _psi.organisationunitid in (" + TextUtils.getCommaDelimitedString( orgunitIds ) + ")  "
-            + "  AND _pi.programid = " + programId + " AND _psi.executionDate>='" + startDate
-            + "' AND _psi.executionDate <= '" + endDate + "' ";
+            + "  AND _pi.programid = " + programId + " AND _psi.executionDate>='" + PARAM_PERIOD_START_DATE
+            + "' AND _psi.executionDate <= '" + PARAM_PERIOD_END_DATE + "' ";
 
         if ( !programStageId.equals( IN_CONDITION_GET_ALL ) )
         {
@@ -738,10 +763,10 @@
                 sql += " AND _pdv.value ";
             }
         }
-        
-        if( !isExist )
+
+        if ( !isExist )
         {
-            sql = "(" + sql + " ) AND " + getConditionForProgramStage( programStageId, orgunitIds, startDate, endDate ) + ")";
+            sql = "(" + sql + " ) AND " + getConditionForProgramStage( programStageId, orgunitIds ) + ")";
         }
 
         return sql;
@@ -756,7 +781,6 @@
         boolean isExist )
     {
         String sql = "  SELECT * FROM trackedentityattributevalue _pav ";
-            
 
         if ( attributeId.split( SEPARATOR_ID ).length == 2 )
         {
@@ -764,23 +788,26 @@
             {
                 sql += " inner join programinstance _pi on _pav.trackedentityinstanceid=_pi.trackedentityinstanceid ";
                 sql += " inner join programstageinstance _psi on _pi.programinstanceid=_psi.programinstanceid ";
-                    
+
                 attributeId = attributeId.split( SEPARATOR_ID )[0];
-                sql += " WHERE _pav.trackedentityinstanceid=pi.trackedentityinstanceid AND _pav.trackedentityattributeid=" + attributeId + " AND DATE(_psi.executiondate) - DATE( _pav.value ) ";
+                sql += " WHERE _pav.trackedentityinstanceid=pi.trackedentityinstanceid AND _pav.trackedentityattributeid="
+                    + attributeId + " AND DATE(_psi.executiondate) - DATE( _pav.value ) ";
             }
-            else  if ( attributeId.split( SEPARATOR_ID )[1].equals( CaseAggregationCondition.FORMULA_AGE ) )
+            else if ( attributeId.split( SEPARATOR_ID )[1].equals( CaseAggregationCondition.FORMULA_AGE ) )
             {
                 sql += " inner join programinstance _pi on _pav.trackedentityinstanceid=_pi.trackedentityinstanceid ";
-                    
+
                 attributeId = attributeId.split( SEPARATOR_ID )[0];
-                sql += " WHERE _pav.trackedentityinstanceid=pi.trackedentityinstanceid AND _pav.trackedentityattributeid=" + attributeId + " AND DATE(_psi.enrollmentdate) - DATE( _pav.value ) ";
+                sql += " WHERE _pav.trackedentityinstanceid=pi.trackedentityinstanceid AND _pav.trackedentityattributeid="
+                    + attributeId + " AND DATE(_psi.enrollmentdate) - DATE( _pav.value ) ";
             }
         }
         else
         {
-            sql += " WHERE _pav.trackedentityinstanceid=pi.trackedentityinstanceid AND _pav.trackedentityattributeid=" + attributeId;
-            
-            if( isExist )
+            sql += " WHERE _pav.trackedentityinstanceid=pi.trackedentityinstanceid AND _pav.trackedentityattributeid="
+                + attributeId;
+
+            if ( isExist )
             {
                 sql += " AND _pav.value ";
             }
@@ -803,12 +830,11 @@
      * [PC:executionDate]
      * 
      */
-    private String getConditionForTrackedEntityProgramStageProperty( String propertyName, String operator,
-        String startDate, String endDate )
+    private String getConditionForTrackedEntityProgramStageProperty( String propertyName, String operator )
     {
         String sql = " EXISTS ( SELECT _psi.programstageinstanceid from programstageinstance _psi "
             + "WHERE _psi.programstageinstanceid=psi.programstageinstanceid AND ( _psi.executionDate BETWEEN '"
-            + startDate + "' AND '" + endDate + "') AND " + propertyName;
+            + PARAM_PERIOD_START_DATE + "' AND '" + PARAM_PERIOD_END_DATE + "') AND " + propertyName;
 
         return sql;
     }
@@ -819,16 +845,13 @@
      * days between date of enrollment and date of incident.
      * 
      */
-    private String getConditionForProgramProperty( String operator, String startDate, String endDate, String property )
+    private String getConditionForProgramProperty( String operator, String property )
     {
         String sql = " EXISTS ( SELECT _pi.programinstanceid FROM programinstance as _pi WHERE _pi.programinstanceid=pi.programinstanceid AND "
             + "pi.enrollmentdate >= '"
-            + startDate
+            + PARAM_PERIOD_START_DATE
             + "' AND pi.enrollmentdate <= '"
-            + endDate
-            + "' AND "
-            + property
-            + " ";
+            + PARAM_PERIOD_END_DATE + "' AND " + property + " ";
 
         return sql;
     }
@@ -838,15 +861,17 @@
      * program. E.g [PG:1]
      * 
      */
-    private String getConditionForProgram( String programId, String operator, Collection<Integer> orgunitIds,
-        String startDate, String endDate )
+    private String getConditionForProgram( String programId, String operator, Collection<Integer> orgunitIds )
     {
         String sql = " EXISTS ( SELECT * FROM programinstance as _pi inner join trackedentityinstance _p on _p.trackedentityinstanceid=_pi.trackedentityinstanceid "
             + "WHERE _pi.trackedentityinstanceid=pi.trackedentityinstanceid AND _pi.programid="
             + programId
             + " AND _p.organisationunitid in ("
             + TextUtils.getCommaDelimitedString( orgunitIds )
-            + ") AND _pi.enrollmentdate >= '" + startDate + "' AND _pi.enrollmentdate <= '" + endDate + "' ";
+            + ") AND _pi.enrollmentdate >= '"
+            + PARAM_PERIOD_START_DATE
+            + "' AND _pi.enrollmentdate <= '"
+            + PARAM_PERIOD_END_DATE + "' ";
 
         return sql;
     }
@@ -856,13 +881,13 @@
      * [PS:1]
      * 
      */
-    private String getConditionForProgramStage( String programStageId, Collection<Integer> orgunitIds,
-        String startDate, String endDate )
+    private String getConditionForProgramStage( String programStageId, Collection<Integer> orgunitIds )
     {
         String sql = " EXISTS ( SELECT _psi.programstageinstanceid FROM programstageinstance _psi "
             + "WHERE _psi.programstageinstanceid=psi.programstageinstanceid " + "AND _psi.programstageid="
-            + programStageId + "  AND _psi.executiondate >= '" + startDate + "' AND _psi.executiondate <= '" + endDate
-            + "' AND _psi.organisationunitid in (" + TextUtils.getCommaDelimitedString( orgunitIds ) + ")  ";
+            + programStageId + "  AND _psi.executiondate >= '" + PARAM_PERIOD_START_DATE
+            + "' AND _psi.executiondate <= '" + PARAM_PERIOD_END_DATE + "' AND _psi.organisationunitid in ("
+            + TextUtils.getCommaDelimitedString( orgunitIds ) + ")  ";
 
         return sql;
     }
@@ -874,13 +899,13 @@
      * 
      */
     private String getConditionForCountProgramStage( String programStageId, String operator,
-        Collection<Integer> orgunitIds, String startDate, String endDate )
+        Collection<Integer> orgunitIds )
     {
         String sql = " EXISTS ( SELECT _psi.programstageinstanceid FROM programstageinstance as _psi "
             + "WHERE psi.programstageinstanceid=_psi.programstageinstanceid AND _psi.organisationunitid in ("
             + TextUtils.getCommaDelimitedString( orgunitIds ) + ") and _psi.programstageid = " + programStageId + " "
-            + "AND _psi.executionDate >= '" + startDate + "' AND _psi.executionDate <= '" + endDate + "' "
-            + "GROUP BY _psi.programinstanceid,_psi.programstageinstanceid "
+            + "AND _psi.executionDate >= '" + PARAM_PERIOD_START_DATE + "' AND _psi.executionDate <= '"
+            + PARAM_PERIOD_END_DATE + "' " + "GROUP BY _psi.programinstanceid,_psi.programstageinstanceid "
             + "HAVING count(_psi.programstageinstanceid) ";
 
         return sql;
@@ -892,13 +917,13 @@
      * and due-date. E.g [PSP:DATE@executionDate#-DATE@dueDate#]
      * 
      */
-    private String getConditionForProgramStageProperty( String property, String operator,
-        Collection<Integer> orgunitIds, String startDate, String endDate )
+    private String getConditionForProgramStageProperty( String property, String operator, Collection<Integer> orgunitIds )
     {
         String sql = " EXISTS ( SELECT * FROM programstageinstance _psi "
-            + "WHERE psi.programstageinstanceid=_psi.programstageinstanceid AND _psi.executiondate >= '" + startDate
-            + "' AND _psi.executiondate <= '" + endDate + "' AND _psi.organisationunitid in ("
-            + TextUtils.getCommaDelimitedString( orgunitIds ) + ") AND " + property + " ";
+            + "WHERE psi.programstageinstanceid=_psi.programstageinstanceid AND _psi.executiondate >= '"
+            + PARAM_PERIOD_START_DATE + "' AND _psi.executiondate <= '" + PARAM_PERIOD_END_DATE
+            + "' AND _psi.organisationunitid in (" + TextUtils.getCommaDelimitedString( orgunitIds ) + ") AND "
+            + property + " ";
 
         return sql;
     }
@@ -911,7 +936,7 @@
      * 
      */
     private String getConditionForOrgunitProgramStageCompleted( String programStageId, String operator,
-        Collection<Integer> orgunitIds, String startDate, String endDate, boolean flag )
+        Collection<Integer> orgunitIds, boolean flag )
     {
         String sql = "";
         if ( !flag )
@@ -922,14 +947,14 @@
 
         sql += " AND EXISTS ( SELECT programstageinstanceid FROM programstageinstance _psi "
             + " WHERE _psi.organisationunitid=ou.organisationunitid AND _psi.programstageid = " + programStageId
-            + " AND _psi.completed=true AND _psi.executiondate >= '" + startDate + "' AND _psi.executiondate <= '"
-            + endDate + "' ) ";
+            + " AND _psi.completed=true AND _psi.executiondate >= '" + PARAM_PERIOD_START_DATE
+            + "' AND _psi.executiondate <= '" + PARAM_PERIOD_END_DATE + "' ) ";
 
         return sql;
     }
 
     private String getConditionForMinusDataElement( Collection<Integer> orgunitIds, Integer programStageId,
-        Integer dataElementId, String compareSide, String startDate, String endDate )
+        Integer dataElementId, String compareSide )
     {
         return " EXISTS ( SELECT _pdv.value FROM trackedentitydatavalue _pdv inner join programstageinstance _psi "
             + "                         ON _pdv.programstageinstanceid=_psi.programstageinstanceid "
@@ -938,13 +963,12 @@
             + "                  AND _pdv.dataelementid=" + dataElementId
             + "                 AND _psi.organisationunitid in (" + TextUtils.getCommaDelimitedString( orgunitIds )
             + ") " + "                 AND _psi.programstageid = " + programStageId
-            + " AND ( _psi.executionDate BETWEEN '" + startDate + "' AND '" + endDate + "') "
-            + "                 AND ( DATE(_pdv.value) - DATE(" + compareSide + ") ) ";
+            + " AND ( _psi.executionDate BETWEEN '" + PARAM_PERIOD_START_DATE + "' AND '" + PARAM_PERIOD_END_DATE
+            + "') " + "                 AND ( DATE(_pdv.value) - DATE(" + compareSide + ") ) ";
     }
 
     private String getConditionForMisus2DataElement( Collection<Integer> orgunitIds, String programStageId1,
-        String dataElementId1, String programStageId2, String dataElementId2, String compareSide, String startDate,
-        String endDate )
+        String dataElementId1, String programStageId2, String dataElementId2, String compareSide )
     {
         return " EXISTS ( SELECT * FROM ( SELECT _pdv.value FROM trackedentitydatavalue _pdv "
             + "                 INNER JOIN programstageinstance _psi ON _pdv.programstageinstanceid=_psi.programstageinstanceid "
@@ -957,10 +981,10 @@
             + "                 AND _psi.programstageid = "
             + programStageId1
             + "                 AND _psi.executionDate>='"
-            + startDate
+            + PARAM_PERIOD_START_DATE
             + "'  "
             + "                 AND _psi.executionDate <= '"
-            + endDate
+            + PARAM_PERIOD_END_DATE
             + "' ) AS d1 cross join "
             + "         (  SELECT _pdv.value FROM trackedentitydatavalue _pdv INNER JOIN programstageinstance _psi "
             + "                        ON _pdv.programstageinstanceid=_psi.programstageinstanceid "
@@ -973,16 +997,16 @@
             + "                 AND _psi.programstageid =  "
             + programStageId2
             + "                 AND _psi.executionDate>='"
-            + startDate
+            + PARAM_PERIOD_START_DATE
             + "'  "
             + "                 AND _psi.executionDate <= '"
-            + endDate
+            + PARAM_PERIOD_END_DATE
             + "' ) AS d2 WHERE DATE(d1.value ) - DATE(d2.value) " + compareSide;
     }
-    
-    private String getConditionForMisus2Attribute(String attribute1, String attribute2, String compareSide)
+
+    private String getConditionForMisus2Attribute( String attribute1, String attribute2, String compareSide )
     {
-         return " EXISTS ( SELECT * FROM (  SELECT _teav.value FROM trackedentityattributevalue _teav "
+        return " EXISTS ( SELECT * FROM (  SELECT _teav.value FROM trackedentityattributevalue _teav "
             + " WHERE _teav.trackedentityinstanceid=p.trackedentityinstanceid "
             + " and _teav.trackedentityattributeid = " + attribute1 + " ) as a1 , "
             + " ( SELECT _teav.value FROM trackedentityattributevalue _teav "
@@ -991,13 +1015,13 @@
             + " WHERE DATE(a1.value ) - DATE(a2.value) " + compareSide;
     }
 
-
     /**
      * Return the Ids of organisation units which entity instances registered or
      * events happened.
      * 
      */
-    private Collection<Integer> getServiceOrgunit()
+    @Override
+    public Collection<Integer> getServiceOrgunit()
     {
         String sql = "(select distinct organisationunitid from trackedentityinstance)";
         sql += " UNION ";
@@ -1020,16 +1044,13 @@
         Period period, boolean nonRegistrationProgram )
     {
         String sql = "SELECT ";
-        
+
         Collection<Integer> orgunitIds = new HashSet<>();
         orgunitIds.add( orgunitId );
 
         if ( hasOrgunitProgramStageCompleted( caseExpression ) )
         {
-            sql += "ou.name "
-                + createSQL( caseExpression, operator, orgunitIds,
-                    DateUtils.getMediumDateString( period.getStartDate() ),
-                    DateUtils.getMediumDateString( period.getEndDate() ) );
+            sql += "ou.name " + createSQL( caseExpression, operator, orgunitIds );
         }
         else if ( nonRegistrationProgram )
         {
@@ -1051,18 +1072,16 @@
             sql += "INNER JOIN programinstance as pi on p.trackedentityinstanceid=pi.trackedentityinstanceid  ";
             sql += "INNER JOIN program pg on pg.programid=pi.programid  ";
             sql += "INNER JOIN programstage pgs on pgs.programid=pg.programid  ";
-            
-            if( hasDataelementCriteria( caseExpression ) )
+
+            if ( hasDataelementCriteria( caseExpression ) )
             {
                 sql += " INNER JOIN programstageinstance psi on pi.programinstanceid=psi.programinstanceid ";
                 sql += " INNER JOIN organisationunit ou on ou.organisationunitid=psi.organisationunitid ";
                 sql += " INNER JOIN trackedentitydatavalue pdv on pdv.programstageinstanceid=psi.programstageinstanceid ";
             }
-        }       
+        }
 
-        sql += " WHERE "
-            + createSQL( caseExpression, operator, orgunitIds, DateUtils.getMediumDateString( period.getStartDate() ),
-                DateUtils.getMediumDateString( period.getEndDate() ) );
+        sql += " WHERE " + createSQL( caseExpression, operator, orgunitIds );
 
         sql = sql.replaceAll( "COMBINE", "" );
 
@@ -1075,6 +1094,8 @@
             sql += " ORDER BY  p.trackedentityinstanceid ";
         }
 
+        sql = replacePeriodSql( sql, period );
+
         return sql;
     }
 
@@ -1148,11 +1169,12 @@
             {
                 periodid = rs.getInt( "periodid" );
             }
-            
+
             if ( periodid == null )
             {
                 String insertSql = "insert into period (periodid, periodtypeid,startdate,enddate) " + " VALUES " + "("
-                		+ statementBuilder.getAutoIncrementValue() +"," + periodTypeId + ",'" + start + "','" + end + "' )";
+                    + statementBuilder.getAutoIncrementValue() + "," + periodTypeId + ",'" + start + "','" + end
+                    + "' )";
                 jdbcTemplate.execute( insertSql );
 
                 period.setId( jdbcTemplate.queryForObject( sql, Integer.class ) );
@@ -1231,6 +1253,17 @@
 
         return false;
     }
+
+   
+    private String replacePeriodSql( String sql, Period period )
+    {
+        sql = sql.replaceAll( "COMBINE", "" );
+        sql = sql.replaceAll( PARAM_PERIOD_START_DATE, DateUtils.getMediumDateString( period.getStartDate() ) );
+        sql = sql.replaceAll( PARAM_PERIOD_END_DATE, DateUtils.getMediumDateString( period.getEndDate() ) );
+        sql = sql.replaceAll( PARAM_PERIOD_ID, period.getId() + "" );
+        sql = sql.replaceAll( PARAM_PERIOD_ISO_DATE, period.getIsoDate() );
+
+        return sql;
+    }
     
-
 }

=== modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/caseaggregation/CaseAggregationResultAction.java'
--- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/caseaggregation/CaseAggregationResultAction.java	2014-08-15 07:40:20 +0000
+++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/caseaggregation/CaseAggregationResultAction.java	2014-09-08 14:40:15 +0000
@@ -165,7 +165,7 @@
         DataSet selectedDataSet = dataSetService.getDataSet( dataSetId );
 
         Collection<CaseAggregationCondition> aggregationConditions = aggregationConditionService
-            .getCaseAggregationConditions( selectedDataSet.getDataElements(), null, null , null );
+            .getCaseAggregationConditions( selectedDataSet.getDataElements(), null, null, null );
 
         // ---------------------------------------------------------------------
         // Get selected periods list
@@ -212,20 +212,14 @@
         // Aggregation
         // ---------------------------------------------------------------------
 
-        for ( CaseAggregationCondition condition : aggregationConditions )
-        {
-            for ( Period period : periods )
-            {
-                if ( autoSave )
-                {
-                    aggregationConditionService.insertAggregateValue( condition, orgunitIds, period );
-                }
-                else
-                {
-                    grids.add( aggregationConditionService.getAggregateValue( condition, orgunitIds, period, format,
-                        i18n ) );
-                }
-            }
+        if ( autoSave )
+        {
+            aggregationConditionService.insertAggregateValue( aggregationConditions, orgunitIds, periods );
+        }
+        else
+        {
+            grids = aggregationConditionService.getAggregateValue( aggregationConditions, orgunitIds, periods, format,
+                i18n );
         }
         return SUCCESS;
     }