=== modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultAnalyticsService.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultAnalyticsService.java 2013-03-09 14:35:08 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultAnalyticsService.java 2013-03-10 13:51:37 +0000 @@ -116,6 +116,7 @@ //TODO filter values must be merged if split //TODO completeness on time //TODO make sure data x dims are successive + //TODO optimize when in and de are specified, and in-de is part of de @Autowired private AnalyticsManager analyticsManager; === 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 2013-03-08 16:18:21 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/JdbcAnalyticsManager.java 2013-03-10 13:51:37 +0000 @@ -91,6 +91,7 @@ public Future> getAggregatedDataValues( DataQueryParams params ) { ListMap dataPeriodAggregationPeriodMap = params.getDataPeriodAggregationPeriodMap(); + params.replaceAggregationPeriodsWithDataPeriods( dataPeriodAggregationPeriodMap ); List dimensions = params.getQueryDimensions(); @@ -118,7 +119,9 @@ sql += "sum(value)"; } - sql += " as value from " + params.getTableName() + " "; + sql += " as value from "; + + sql += params.getTableName() + " "; for ( Dimension dim : dimensions ) { @@ -151,45 +154,22 @@ log.info( sql ); - Map map = new HashMap(); - - SqlRowSet rowSet = null; + Map map = null; try { - rowSet = jdbcTemplate.queryForRowSet( sql ); + map = getKeyValueMap( params, sql ); } catch ( BadSqlGrammarException ex ) { log.info( "Query failed, likely because the requested analytics table does not exist", ex ); - return new AsyncResult>( map ); - } - - while ( rowSet.next() ) - { - Double value = rowSet.getDouble( VALUE_ID ); - - if ( !measureCriteriaSatisfied( params, value ) ) - { - continue; - } - - StringBuilder key = new StringBuilder(); - - for ( Dimension dim : dimensions ) - { - key.append( rowSet.getString( dim.getDimensionName() ) + DIMENSION_SEP ); - } - - key.deleteCharAt( key.length() - 1 ); - - map.put( key.toString(), value ); + return new AsyncResult>( new HashMap() ); } replaceDataPeriodsWithAggregationPeriods( map, params, dataPeriodAggregationPeriodMap ); - return new AsyncResult>( map ); + return new AsyncResult>( map ); } public void replaceDataPeriodsWithAggregationPeriods( Map dataValueMap, DataQueryParams params, ListMap dataPeriodAggregationPeriodMap ) @@ -232,7 +212,46 @@ // ------------------------------------------------------------------------- // Supportive methods // ------------------------------------------------------------------------- + + /** + * Retrieves data from the database based on the given query and SQL and puts + * into a value key and value mapping. + */ + private Map getKeyValueMap( DataQueryParams params, String sql ) + throws BadSqlGrammarException + { + Map map = new HashMap(); + + SqlRowSet rowSet = jdbcTemplate.queryForRowSet( sql ); + + while ( rowSet.next() ) + { + Double value = rowSet.getDouble( VALUE_ID ); + + if ( !measureCriteriaSatisfied( params, value ) ) + { + continue; + } + + StringBuilder key = new StringBuilder(); + + for ( Dimension dim : params.getQueryDimensions() ) + { + key.append( rowSet.getString( dim.getDimensionName() ) + DIMENSION_SEP ); + } + + key.deleteCharAt( key.length() - 1 ); + + map.put( key.toString(), value ); + } + + return map; + } + /** + * Checks if the measure criteria specified for the given query are satisfied + * for the given value. + */ private boolean measureCriteriaSatisfied( DataQueryParams params, Double value ) { if ( value == null ) @@ -273,6 +292,10 @@ return true; } + /** + * Generates a comma-delimited string based on the dimension names of the + * given dimensions. + */ private String getCommaDelimitedString( Collection dimensions ) { final StringBuilder builder = new StringBuilder();