← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 16558: Support a formula for retrieving the number of days between DATE attribue-values in aggregate que...

 

------------------------------------------------------------
revno: 16558
committer: Tran Chau<tran.hispvietnam@xxxxxxxxx>
branch nick: dhis2
timestamp: Fri 2014-08-29 13:39:13 +0700
message:
  Support a formula for retrieving the number of days between DATE attribue-values in aggregate query builder formulas.
modified:
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/caseaggregation/CaseAggregationCondition.java
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/hibernate/HibernateCaseAggregationConditionStore.java
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/resources/org/hisp/dhis/trackedentity/i18n_module.properties
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/caseAggregationForm.vm


--
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-05-12 14:37:40 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/caseaggregation/CaseAggregationCondition.java	2014-08-29 06:39:13 +0000
@@ -91,6 +91,8 @@
     public static String MINUS_OPERATOR = "DATEDIFF";
 
     public static String MINUS_DATAELEMENT_OPERATOR = "DEDATEDIFF";
+    
+    public static String MINUS_ATTRIBUTE_OPERATOR = "ATTRDATEDIFF";
 
     public static String AUTO_STORED_BY = "aggregated_from_tracker";
 
@@ -108,6 +110,10 @@
         + OBJECT_PROGRAM_STAGE_DATAELEMENT + SEPARATOR_OBJECT + "([0-9]+" + SEPARATOR_ID + "[0-9]+" + SEPARATOR_ID
         + "[0-9]+)+\\])\\s*(,)\\s*(\\[" + OBJECT_PROGRAM_STAGE_DATAELEMENT + SEPARATOR_OBJECT + "([0-9]+"
         + SEPARATOR_ID + "[0-9]+" + SEPARATOR_ID + "[0-9]+)+\\])\\s*\\)\\s*(>=|<=|!=|>|<|=){1}\\s*([0-9]+)";
+    public static final String minusAttributeRegExp = MINUS_ATTRIBUTE_OPERATOR + "{1}\\s*\\(\\s*(\\["
+        + OBJECT_TRACKED_ENTITY_ATTRIBUTE + SEPARATOR_OBJECT + "([0-9]+)+\\])\\s*(,)\\s*(\\[" 
+        + OBJECT_TRACKED_ENTITY_ATTRIBUTE + SEPARATOR_OBJECT + "([0-9]+)+\\])\\s*\\)\\s*(>=|<=|!=|>|<|=){1}\\s*([0-9]+)";
+
 
     // -------------------------------------------------------------------------
     // Fields

=== 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-26 12:43:04 +0000
+++ dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/hibernate/HibernateCaseAggregationConditionStore.java	2014-08-29 06:39:13 +0000
@@ -507,7 +507,7 @@
 
         String sqlOrgunitCompleted = "";
 
-        // Get minus(date dataelement, date dataelement) out from the expression
+        // Get minus(DATE dataelement, DATE dataelement) out from the expression
         // and run them later
 
         Map<Integer, String> minus2SQLMap = new HashMap<>();
@@ -530,6 +530,29 @@
             idx2++;
         }
 
+        // Get minus(DATE attribute, DATE attribute) out from the expression
+        // and run them later
+
+        Map<Integer, String> minus2AttributeSQLMap = new HashMap<>();
+        int idx1 = 0;
+        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 ));
+               
+            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
 
@@ -669,6 +692,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 ) );
+        }
+
 
         return sql + " ) ";
     }
@@ -949,6 +979,18 @@
             + endDate
             + "' ) AS d2 WHERE DATE(d1.value ) - DATE(d2.value) " + compareSide;
     }
+    
+    private String getConditionForMisus2Attribute(String attribute1, String attribute2, String compareSide)
+    {
+         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 "
+            + " WHERE _teav.trackedentityinstanceid=p.trackedentityinstanceid  "
+            + " and  _teav.trackedentityattributeid =  " + attribute2 + " ) as a2 "
+            + " WHERE DATE(a1.value ) - DATE(a2.value) " + compareSide;
+    }
+
 
     /**
      * Return the Ids of organisation units which entity instances registered or

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/resources/org/hisp/dhis/trackedentity/i18n_module.properties'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/resources/org/hisp/dhis/trackedentity/i18n_module.properties	2014-08-18 14:21:48 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/resources/org/hisp/dhis/trackedentity/i18n_module.properties	2014-08-29 06:39:13 +0000
@@ -504,4 +504,5 @@
 auto_save_tracked_entity_registration_forms = Auto-save tracked entity registration forms
 filter_by_program = Filter by program 
 enter_an_attribute = Enter an attribute
-enter_a_key = Enter a key
\ No newline at end of file
+enter_a_key = Enter a key
+minus_with_attribute = Attribute date diff
\ No newline at end of file

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/caseAggregationForm.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/caseAggregationForm.vm	2014-08-11 13:54:43 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/caseAggregationForm.vm	2014-08-29 06:39:13 +0000
@@ -180,6 +180,7 @@
 			<input type='button' style="width:175px;" onclick='insertOperator( "DATEDIFF( , enrollmentDate) " );' value="$i18n.getString('minus_with_enrollmentDate')" />
 			<input type='button' style="width:175px;" onclick='insertOperator( "DATEDIFF( , executionDate) " );' value="$i18n.getString('minus_with_executionDate')" />
 			<input type='button' style="width:175px;" onclick='insertOperator( "DEDATEDIFF( , ) " );' value="$i18n.getString('minus_with_dataelement')" />
+			<input type='button' style="width:175px;" onclick='insertOperator( "ATTRDATEDIFF( , ) " );' value="$i18n.getString('minus_with_attribute')" />
 			<span style='padding-left:110px'>
 				<input type='button' style="width:45px;" align="right" alt="$i18n.getString( 'clear' )" onclick="byId('aggregationCondition').value='';" value="$i18n.getString('clear')" />
 			</span>