=== modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEventAnalyticsManager.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEventAnalyticsManager.java 2015-09-08 18:09:34 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEventAnalyticsManager.java 2015-10-12 11:46:32 +0000 @@ -39,6 +39,8 @@ import static org.hisp.dhis.system.util.MathUtils.getRounded; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; @@ -337,7 +339,7 @@ // ------------------------------------------------------------------------- /** - * Returns the count clause based on the output type. + * Returns the count clause based on value dimension and output type. * * TODO include output type if aggregation type is count */ @@ -381,6 +383,38 @@ } } } + + /** + * Returns columns based on value dimension and output type. + */ + private List getAggregateColumns( EventQueryParams params ) + { + EventOutputType outputType = params.getOutputType(); + + if ( params.hasValueDimension() ) + { + return Lists.newArrayList( statementBuilder.columnQuote( params.getValue().getUid() ) ); + } + else if ( params.hasProgramIndicatorDimension() ) + { + Set uids = ProgramIndicator.getDataElementAndAttributeIdentifiers( params.getProgramIndicator().getExpression() ); + + return uids.stream().map( uid -> statementBuilder.columnQuote( uid ) ).collect( Collectors.toList() ); + } + else + { + if ( EventOutputType.TRACKED_ENTITY_INSTANCE.equals( outputType ) && params.isProgramRegistration() ) + { + return Lists.newArrayList( "tei" ); + } + else if ( EventOutputType.ENROLLMENT.equals( outputType ) ) + { + return Lists.newArrayList( "pi" ); + } + } + + return Lists.newArrayList(); + } /** * Returns the dynamic select columns. Dimensions come first and query items @@ -426,11 +460,13 @@ private String getFromWhereMultiplePartitionsClause( EventQueryParams params, List fixedColumns ) { + List aggregateCols = getAggregateColumns( params ); + String sql = "from ("; for ( String partition : params.getPartitions().getPartitions() ) { - sql += "select " + getSelectString( fixedColumns ) + getSelectColumns( params ); + sql += "select " + getSelectString( fixedColumns ) + getSelectString( aggregateCols ) + getSelectColumns( params ); sql += " " + getFromWhereSinglePartitionClause( params, partition );