=== 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 2013-05-02 03:31:45 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/caseaggregation/CaseAggregationCondition.java 2013-05-17 08:24:11 +0000 @@ -84,6 +84,8 @@ public static String OBJECT_PROGRAM_PROPERTY_INCIDENT_DATE = "dateOfIncident"; public static String OBJECT_PROGRAM_PROPERTY_ENROLLEMENT_DATE = "enrollmentDate"; + + public static String MINUS_OPERATOR = "MINUS"; public static String AUTO_STORED_BY = "DHIS-SYSTEM"; @@ -93,6 +95,10 @@ + OBJECT_PATIENT_ATTRIBUTE + "|" + OBJECT_PATIENT_PROPERTY + "|" + OBJECT_PROGRAM_PROPERTY + ")" + SEPARATOR_OBJECT + "([a-zA-Z0-9@#\\- ]+[" + SEPARATOR_ID + "[a-zA-Z0-9]*]*)" + "\\]"; + public static final String dataelementRegExp = MINUS_OPERATOR + "{1}\\s*\\(\\s*(\\[" + OBJECT_PROGRAM_STAGE_DATAELEMENT + + SEPARATOR_OBJECT + "([0-9]+" + SEPARATOR_ID + "[0-9]+" + SEPARATOR_ID + "[0-9]+)+\\])\\s*(,)+\\s*(" + + OBJECT_PROGRAM_PROPERTY_INCIDENT_DATE + "|" + OBJECT_PROGRAM_PROPERTY_ENROLLEMENT_DATE + ")+\\s*\\)\\s*"; + // ------------------------------------------------------------------------- // Fields // ------------------------------------------------------------------------- === modified file 'dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/caseaggregation/jdbc/JdbcCaseAggregationConditionManager.java' --- dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/caseaggregation/jdbc/JdbcCaseAggregationConditionManager.java 2013-05-14 09:31:21 +0000 +++ dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/caseaggregation/jdbc/JdbcCaseAggregationConditionManager.java 2013-05-17 08:24:11 +0000 @@ -49,8 +49,10 @@ import java.util.Calendar; import java.util.Collection; import java.util.Date; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.Future; import java.util.regex.Matcher; @@ -365,7 +367,7 @@ sql += "GROUP BY ou.organisationunitid, ou.name"; } - + System.out.println( "\n\n === \n " + sql ); sql = sql.replaceAll( "COMBINE", "" ); return sql; @@ -584,6 +586,28 @@ String sqlOrgunitCompleted = ""; + // Get minus(date, date) out from the expression and run them later + + Map minusSQLMap = new HashMap(); + int idx = 0; + Pattern patternMinus = Pattern.compile( CaseAggregationCondition.dataelementRegExp ); + Matcher matcherMinus = patternMinus.matcher( caseExpression ); + while ( matcherMinus.find() ) + { + String[] ids = matcherMinus.group( 2 ).split( SEPARATOR_ID ); + + minusSQLMap.put( + idx, + getConditionForMinusDataElement( orgunitIds, Integer.parseInt( ids[1] ), Integer.parseInt( ids[2] ), + matcherMinus.group( 4 ), startDate, endDate ) ); + + caseExpression = caseExpression.replace( matcherMinus.group( 0 ), CaseAggregationCondition.MINUS_OPERATOR + + "_" + idx ); + + idx++; + } + + // Run nornal expression String[] expression = caseExpression.split( "(AND|OR)" ); caseExpression = caseExpression.replaceAll( "AND", " ) AND " ); caseExpression = caseExpression.replaceAll( "OR", " ) OR " ); @@ -696,7 +720,14 @@ sql = sql.replaceAll( IN_CONDITION_END_SIGN, ")" ); sql = sql.replaceAll( IS_NULL, " " ); + System.out.println("\n\n minusSQLMap " + minusSQLMap ); + for ( int key = 0; key < idx; key++ ) + { + sql = sql.replace( CaseAggregationCondition.MINUS_OPERATOR + "_" + key, minusSQLMap.get( key ) ); + } + return sql + " ) "; + } /** @@ -714,8 +745,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>='" + startDate + + "' AND _psi.executionDate <= '" + endDate + "' "; if ( !programStageId.equals( IN_CONDITION_GET_ALL ) ) { @@ -911,6 +942,20 @@ return sql; } + private String getConditionForMinusDataElement( Collection orgunitIds, Integer programStageId, + Integer dataElementId, String compareSide, String startDate, String endDate ) + { + return " EXISTS ( SELECT * FROM patientdatavalue _pdv inner join programstageinstance _psi " + + " ON _pdv.programstageinstanceid=_psi.programstageinstanceid " + + " JOIN programinstance _pi ON _pi.programinstanceid=_psi.programinstanceid " + + " WHERE psi.programstageinstanceid=_pdv.programstageinstanceid " + + " AND _pdv.dataelementid=" + dataElementId + + " AND _psi.organisationunitid in (" + TextUtils.getCommaDelimitedString( orgunitIds ) + + ") " + " AND _psi.programstageid = " + programStageId + " AND _psi.executionDate>='" + + startDate + "' AND _psi.executionDate <= '" + endDate + "' " + + " AND ( DATE(_pdv.value) - DATE(" + compareSide + ") ) "; + } + /** * Return the Ids of organisation units which patients registered or events * happened. === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/resources/org/hisp/dhis/patient/i18n_module.properties' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/resources/org/hisp/dhis/patient/i18n_module.properties 2013-05-16 07:31:48 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/resources/org/hisp/dhis/patient/i18n_module.properties 2013-05-17 08:24:11 +0000 @@ -394,4 +394,10 @@ completed = Completed events = Events display_on_all_orgunits = Display on all organisation units -other_program_stages = Other program stages \ No newline at end of file +other_program_stages = Other program stages +minus = Minus +minus_with_dateOfIncident = MINUS TO INCIDENT DATE +minus_with_enrollmentDate = MINUS TO ENROLLMENT DATE +and_operator = AND +or_operator = OR +combine_operator = COMBINE \ No newline at end of file === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/caseAggregation.vm' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/caseAggregation.vm 2013-04-24 08:29:12 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/caseAggregation.vm 2013-05-17 08:24:11 +0000 @@ -30,12 +30,12 @@ - - - - - - + + + + + + #parse( "/dhis-web-maintenance-patient/caseAggregationList.vm" ) === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/caseAggregationForm.vm' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/caseAggregationForm.vm 2013-05-15 04:01:06 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/caseAggregationForm.vm 2013-05-17 08:24:11 +0000 @@ -8,40 +8,46 @@
$i18n.getString( "name" )$i18n.getString( "operations" )
$i18n.getString( "name" )$i18n.getString( "operations" )
- - - - - - - - - - + + + +
$i18n.getString("display_name") - + + +  
$i18n.getString( "sort_by" ) - $i18n.getString("name") - $i18n.getString("code")     - - -
- - -
+ +
+ + + + + + + + + +
$i18n.getString("display_name") + +
$i18n.getString( "sort_by" ) + $i18n.getString("name") + $i18n.getString("code")     +
+
@@ -103,25 +109,26 @@ === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/caseAggregationList.vm' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/caseAggregationList.vm 2013-04-24 08:33:05 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/caseAggregationList.vm 2013-05-17 08:24:11 +0000 @@ -1,6 +1,5 @@ -#set( $mark = true ) #foreach( $aggregationCondition in $aggregationConditions ) - + - - #set( $mark = !$mark ) #end \ No newline at end of file
- - - - - - -     - - - -     - - - - -     - - - + + + + + + + + +     + + + + +

+ + +     + + +    
$encoder.htmlEncode( $aggregationCondition.displayName ) $i18n.getString( 'edit' ) @@ -8,7 +7,5 @@ $i18n.getString( 'remove' ) $i18n.getString( 'show_details' )