dhis2-devs team mailing list archive
-
dhis2-devs team
-
Mailing list archive
-
Message #32992
[Branch ~dhis2-devs-core/dhis2/trunk] Rev 16788: Analytics. Impl support for average (time and org unit dimensions) aggregation operator for data ...
------------------------------------------------------------
revno: 16788
committer: Lars Helge Overland <larshelge@xxxxxxxxx>
branch nick: dhis2
timestamp: Wed 2014-09-24 09:43:19 +0200
message:
Analytics. Impl support for average (time and org unit dimensions) aggregation operator for data element
modified:
dhis-2/dhis-api/src/main/java/org/hisp/dhis/analytics/AggregationType.java
dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElement.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/DefaultQueryPlanner.java
dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/JdbcAnalyticsManager.java
dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/resources/org/hisp/dhis/dd/i18n_module.properties
dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/dataElementForm.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/analytics/AggregationType.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/analytics/AggregationType.java 2014-09-23 12:47:54 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/analytics/AggregationType.java 2014-09-24 07:43:19 +0000
@@ -35,7 +35,9 @@
{
SUM( "sum" ),
AVERAGE_SUM_INT( "avg_sum_int" ), // Sum in organisation unit hierarchy
- AVERAGE_SUM_INT_DISAGGREGATION( "avg_sum_int_disaggregation" ),
+ AVERAGE_SUM_INT_DISAGGREGATION( "avg_sum_int_disaggregation" ), // Sum in organisation unit hierarchy
+ AVERAGE_INT( "avg_int" ),
+ AVERAGE_INT_DISAGGREGATION( "avg_int_disaggregation" ),
AVERAGE_BOOL( "avg" ),
COUNT( "count" ),
STDDEV( "stddev" ),
=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElement.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElement.java 2014-09-23 07:43:22 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElement.java 2014-09-24 07:43:19 +0000
@@ -100,6 +100,7 @@
public static final String AGGREGATION_OPERATOR_SUM = "sum";
public static final String AGGREGATION_OPERATOR_AVERAGE_SUM = "average"; // Sum in organisation unit
+ public static final String AGGREGATION_OPERATOR_AVERAGE = "avg";
public static final String AGGREGATION_OPERATOR_COUNT = "count";
public static final String AGGREGATION_OPERATOR_STDDEV = "stddev";
public static final String AGGREGATION_OPERATOR_VARIANCE = "variance";
=== 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 2014-09-23 11:41:51 +0000
+++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/DataQueryParams.java 2014-09-24 07:43:19 +0000
@@ -29,6 +29,7 @@
*/
import static org.hisp.dhis.analytics.AggregationType.AVERAGE_SUM_INT_DISAGGREGATION;
+import static org.hisp.dhis.analytics.AggregationType.AVERAGE_INT_DISAGGREGATION;
import static org.hisp.dhis.common.DimensionType.DATASET;
import static org.hisp.dhis.common.DimensionType.ORGANISATIONUNIT;
import static org.hisp.dhis.common.DimensionType.ORGANISATIONUNIT_GROUPSET;
@@ -649,6 +650,14 @@
}
/**
+ * Indicates whether the aggregation type is of type disaggregation.
+ */
+ public boolean isDisaggregation()
+ {
+ return isAggregationType( AVERAGE_SUM_INT_DISAGGREGATION ) || isAggregationType( AVERAGE_INT_DISAGGREGATION );
+ }
+
+ /**
* Replaces the periods of this query with the corresponding data periods.
* Sets the period type to the data period type. This method is relevant only
* when then the data period type has lower frequency than the aggregation
@@ -657,7 +666,7 @@
*/
public void replaceAggregationPeriodsWithDataPeriods( ListMap<NameableObject, NameableObject> dataPeriodAggregationPeriodMap )
{
- if ( isAggregationType( AVERAGE_SUM_INT_DISAGGREGATION ) && dataPeriodType != null )
+ if ( isDisaggregation() && dataPeriodType != null )
{
this.periodType = this.dataPeriodType.getName();
=== modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultQueryPlanner.java'
--- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultQueryPlanner.java 2014-09-23 11:41:51 +0000
+++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultQueryPlanner.java 2014-09-24 07:43:19 +0000
@@ -28,9 +28,6 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-import static org.hisp.dhis.analytics.AggregationType.AVERAGE_BOOL;
-import static org.hisp.dhis.analytics.AggregationType.AVERAGE_SUM_INT;
-import static org.hisp.dhis.analytics.AggregationType.AVERAGE_SUM_INT_DISAGGREGATION;
import static org.hisp.dhis.analytics.AggregationType.SUM;
import static org.hisp.dhis.analytics.DataQueryParams.LEVEL_PREFIX;
import static org.hisp.dhis.common.DimensionalObject.CATEGORYOPTIONCOMBO_DIM_ID;
@@ -39,10 +36,13 @@
import static org.hisp.dhis.common.DimensionalObject.INDICATOR_DIM_ID;
import static org.hisp.dhis.common.DimensionalObject.ORGUNIT_DIM_ID;
import static org.hisp.dhis.common.DimensionalObject.PERIOD_DIM_ID;
+import static org.hisp.dhis.dataelement.DataElement.AGGREGATION_OPERATOR_AVERAGE;
import static org.hisp.dhis.dataelement.DataElement.AGGREGATION_OPERATOR_AVERAGE_SUM;
import static org.hisp.dhis.dataelement.DataElement.VALUE_TYPE_BOOL;
+import static org.hisp.dhis.dataelement.DataElement.VALUE_TYPE_INT;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Set;
@@ -81,6 +81,8 @@
implements QueryPlanner
{
private static final Log log = LogFactory.getLog( DefaultQueryPlanner.class );
+
+ private static final List<String> AVERAGE_AGG_OPERATORS = Arrays.asList( AGGREGATION_OPERATOR_AVERAGE_SUM, AGGREGATION_OPERATOR_AVERAGE );
@Autowired
private OrganisationUnitService organisationUnitService;
@@ -242,7 +244,7 @@
for ( DataQueryParams byAggregationType : groupedByAggregationType )
{
- if ( AVERAGE_SUM_INT_DISAGGREGATION.equals( byAggregationType.getAggregationType() ) )
+ if ( byAggregationType.isDisaggregation() )
{
List<DataQueryParams> groupedByDataPeriodType = groupByDataPeriodType( byAggregationType );
@@ -719,7 +721,37 @@
PeriodType aggregationPeriodType, PeriodType dataPeriodType )
{
AggregationType aggregationType = null;
-
+
+ boolean disaggregation = isDisaggregation( aggregationOperator, aggregationPeriodType, dataPeriodType );
+ boolean number = VALUE_TYPE_INT.equals( valueType );
+
+ if ( AVERAGE_AGG_OPERATORS.contains( aggregationOperator ) && VALUE_TYPE_BOOL.equals( valueType ) )
+ {
+ aggregationType = AggregationType.AVERAGE_BOOL;
+ }
+ else if ( DataElement.AGGREGATION_OPERATOR_AVERAGE_SUM.equals( aggregationOperator ) && number && disaggregation )
+ {
+ aggregationType = AggregationType.AVERAGE_SUM_INT_DISAGGREGATION;
+ }
+ else if ( DataElement.AGGREGATION_OPERATOR_AVERAGE_SUM.equals( aggregationOperator ) && number )
+ {
+ aggregationType = AggregationType.AVERAGE_SUM_INT;
+ }
+ else if ( DataElement.AGGREGATION_OPERATOR_AVERAGE.equals( aggregationOperator ) && number && disaggregation )
+ {
+ aggregationType = AggregationType.AVERAGE_INT_DISAGGREGATION;
+ }
+ else if ( DataElement.AGGREGATION_OPERATOR_AVERAGE.equals( aggregationOperator ) && number )
+ {
+ aggregationType = AggregationType.AVERAGE_INT;
+ }
+ else
+ {
+ aggregationType = AggregationType.fromValue( aggregationOperator );
+ }
+
+ //
+ /*
if ( AGGREGATION_OPERATOR_AVERAGE_SUM.equals( aggregationOperator ) )
{
if ( VALUE_TYPE_BOOL.equals( valueType ) )
@@ -741,12 +773,21 @@
else
{
aggregationType = AggregationType.fromValue( aggregationOperator );
- }
+ }*/
return aggregationType;
}
/**
+ * Indicates whether disaggregation is allowed for the given input.
+ */
+ private boolean isDisaggregation( String aggregationOperator,
+ PeriodType aggregationPeriodType, PeriodType dataPeriodType )
+ {
+ return dataPeriodType != null && aggregationPeriodType != null && aggregationPeriodType.getFrequencyOrder() < dataPeriodType.getFrequencyOrder();
+ }
+
+ /**
* Creates a mapping between the period type and the data element for the
* given data elements.
*/
=== modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/JdbcAnalyticsManager.java'
--- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/JdbcAnalyticsManager.java 2014-09-23 11:41:51 +0000
+++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/JdbcAnalyticsManager.java 2014-09-24 07:43:19 +0000
@@ -29,8 +29,9 @@
*/
import static org.hisp.dhis.analytics.AggregationType.AVERAGE_BOOL;
+import static org.hisp.dhis.analytics.AggregationType.AVERAGE_INT;
+import static org.hisp.dhis.analytics.AggregationType.AVERAGE_INT_DISAGGREGATION;
import static org.hisp.dhis.analytics.AggregationType.AVERAGE_SUM_INT;
-import static org.hisp.dhis.analytics.AggregationType.AVERAGE_SUM_INT_DISAGGREGATION;
import static org.hisp.dhis.analytics.AggregationType.COUNT;
import static org.hisp.dhis.analytics.AggregationType.MAX;
import static org.hisp.dhis.analytics.AggregationType.MIN;
@@ -161,7 +162,7 @@
public void replaceDataPeriodsWithAggregationPeriods( Map<String, Object> dataValueMap, DataQueryParams params, ListMap<NameableObject, NameableObject> dataPeriodAggregationPeriodMap )
{
- if ( params.isAggregationType( AVERAGE_SUM_INT_DISAGGREGATION ) )
+ if ( params.isDisaggregation() )
{
int periodIndex = params.getPeriodDimensionIndex();
@@ -231,6 +232,10 @@
sql += "sum(daysxvalue) / " + days;
}
+ else if ( params.isAggregationType( AVERAGE_INT ) || params.isAggregationType( AVERAGE_INT_DISAGGREGATION ) )
+ {
+ sql += "avg(value)";
+ }
else if ( params.isAggregationType( AVERAGE_BOOL ) )
{
sql += "sum(daysxvalue) / sum(daysno) * 100";
@@ -255,7 +260,7 @@
{
sql += "max(value)";
}
- else // SUM, AVERAGE_INT_DISAGGREGATION and undefined //TODO
+ else // SUM, AVERAGE_SUM_INT_DISAGGREGATION and undefined //TODO
{
sql += "sum(value)";
}
=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/resources/org/hisp/dhis/dd/i18n_module.properties'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/resources/org/hisp/dhis/dd/i18n_module.properties 2014-09-23 07:43:22 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/resources/org/hisp/dhis/dd/i18n_module.properties 2014-09-24 07:43:19 +0000
@@ -239,4 +239,4 @@
category_option_combo = Category Option Combo
intro_category_option_combo = View and edit data element category option combos. Category Option Combo are fine-grained break-downs of catagory.
edit_data_element_category_option_combo = Edit data element category option combo
-average_sum_in_org_unit_hierarchy=Average (Sum in org unit hierarchy)
\ No newline at end of file
+average_sum_in_org_unit_hierarchy=Average (sum in org unit hierarchy)
\ No newline at end of file
=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/dataElementForm.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/dataElementForm.vm 2014-09-23 07:43:22 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/dataElementForm.vm 2014-09-24 07:43:19 +0000
@@ -128,6 +128,7 @@
<select id="aggregationOperatorSelect" name="aggregationOperator">
<option value="sum" #if( $!dataElement.aggregationOperator == 'sum' ) selected="selected" #end>$i18n.getString( "sum" )</option>
<option value="average" #if( $!dataElement.aggregationOperator == 'average' ) selected="selected" #end>$i18n.getString( "average_sum_in_org_unit_hierarchy" )</option>
+ <option value="avg" #if( $!dataElement.aggregationOperator == 'avg' ) selected="selected" #end>$i18n.getString( "average" )</option>
<option value="count" #if( $!dataElement.aggregationOperator == 'count' ) selected="selected" #end>$i18n.getString( "count" )</option>
<option value="stddev" #if( $!dataElement.aggregationOperator == 'stddev' ) selected="selected" #end>$i18n.getString( "stddev" )</option>
<option value="variance" #if( $!dataElement.aggregationOperator == 'variance' ) selected="selected" #end>$i18n.getString( "variance" )</option>