=== 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 2013-02-21 18:18:15 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/DataQueryParams.java 2013-02-22 17:24:41 +0000 @@ -178,39 +178,39 @@ } /** - * Creates a list of dimensions which are relevant to completeness queries. + * Creates a list of dimension indexes which are relevant to completeness queries. */ - public List getCompletenessDimensions() + public List getCompletenessDimensionIndexes() { - List list = new ArrayList(); + List indexes = new ArrayList(); - for ( Dimension dim : dimensions ) + for ( int i = 0; i < dimensions.size(); i++ ) { - if ( COMPLETENESS_DIMENSION_TYTPES.contains( dim.getType() ) ) + if ( COMPLETENESS_DIMENSION_TYTPES.contains( dimensions.get( i ).getType() ) ) { - list.add( dim ); + indexes.add( i ); } } - return list; + return indexes; } /** - * Creates a list of dimensions which are relevant to completeness queries. + * Creates a list of filter indexes which are relevant to completeness queries. */ - public List getCompletenessFilters() + public List getCompletenessFilterIndexes() { - List list = new ArrayList(); + List indexes = new ArrayList(); - for ( Dimension dim : filters ) + for ( int i = 0; i < filters.size(); i++ ) { - if ( COMPLETENESS_DIMENSION_TYTPES.contains( dim.getType() ) ) + if ( COMPLETENESS_DIMENSION_TYTPES.contains( filters.get( i ).getType() ) ) { - list.add( dim ); + indexes.add( i ); } } - return list; + return indexes; } /** @@ -236,6 +236,14 @@ { return getInputDimensionNamesAsList().indexOf( DATAELEMENT_DIM_ID ); } + + /** + * Returns the index of the data set dimension in the dimension map. + */ + public int getDataSetDimensionIndex() + { + return getInputDimensionNamesAsList().indexOf( DATASET_DIM_ID ); + } /** * Returns the index of the category option combo dimension in the dimension map. === 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-02-21 18:18:15 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultAnalyticsService.java 2013-02-22 17:24:41 +0000 @@ -55,6 +55,7 @@ import java.util.Set; import java.util.concurrent.Future; +import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hisp.dhis.analytics.AggregationType; @@ -92,6 +93,7 @@ import org.hisp.dhis.period.comparator.PeriodComparator; import org.hisp.dhis.system.grid.ListGrid; import org.hisp.dhis.system.util.ConversionUtils; +import org.hisp.dhis.system.util.ListUtils; import org.hisp.dhis.system.util.MathUtils; import org.hisp.dhis.system.util.SystemUtils; import org.hisp.dhis.system.util.Timer; @@ -107,6 +109,7 @@ //TODO completeness //TODO make sure data x dims are successive + //TODO max value limit, 5000? @Autowired private AnalyticsManager analyticsManager; @@ -213,7 +216,7 @@ grid.addValues( DimensionOption.getOptionIdentifiers( row ) ); grid.addValue( MathUtils.getRounded( value, 1 ) ); } - } + } } } } @@ -252,20 +255,34 @@ Map aggregatedDataMap = getAggregatedCompletenessValueMap( dataSourceParams ); DataQueryParams dataTargetParams = new DataQueryParams( params ); - dataTargetParams.setDimensions( dataTargetParams.getCompletenessDimensions() ); - dataTargetParams.setFilters( dataTargetParams.getCompletenessFilters() ); + dataTargetParams.setDimensions( ListUtils.getAll( dataTargetParams.getDimensions(), dataTargetParams.getCompletenessDimensionIndexes() ) ); + dataTargetParams.setFilters( ListUtils.getAll( dataTargetParams.getFilters(), dataTargetParams.getCompletenessFilterIndexes() ) ); dataTargetParams.setAggregationType( AggregationType.COUNT ); dataTargetParams.setSkipPartitioning( true ); Map targetMap = getAggregatedCompletenessTargetMap( dataTargetParams ); //TODO + Integer periodIndex = dataSourceParams.getPeriodDimensionIndex(); + Integer dataSetIndex = dataSourceParams.getDataSetDimensionIndex(); + + //TODO time aggregation for completeness, use data set period type and period.getPeriodSpan + for ( Map.Entry entry : aggregatedDataMap.entrySet() ) { List row = new ArrayList( Arrays.asList( entry.getKey().split( DIMENSION_SEP ) ) ); - grid.addRow(); - grid.addValues( row.toArray() ); - grid.addValue( entry.getValue() ); + List targetRow = ListUtils.getAll( row, dataTargetParams.getCompletenessDimensionIndexes() ); + String targetKey = StringUtils.join( targetRow, DIMENSION_SEP ); + Double target = targetMap.get( targetKey ); + + if ( target != null && entry.getValue() != null ) + { + double value = entry.getValue() / target; + + grid.addRow(); + grid.addValues( row.toArray() ); + grid.addValue( value ); + } } } === modified file 'dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/ListUtils.java' --- dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/ListUtils.java 2013-02-12 16:05:31 +0000 +++ dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/ListUtils.java 2013-02-22 17:24:41 +0000 @@ -47,23 +47,53 @@ * @param list the list to remove elements from. * @param indexes the indexes for the elements to remove. */ - public static void removeAll( List list, Integer... indexes ) + public static void removeAll( List list, List indexes ) { if ( list == null || indexes == null ) { return; } - List inx = new ArrayList( Arrays.asList( indexes ) ); - Collections.sort( inx, Collections.reverseOrder() ); + Collections.sort( indexes, Collections.reverseOrder() ); - for ( Integer index : inx ) + for ( Integer index : indexes ) { list.remove( (int) index ); } } /** + * Removes from the given list the elements at the given indexes. + * + * @param indexes the list to remove elements from. + * @param indexes the indexes for the elements to remove. + */ + public static void removeAll( List list, Integer... indexes ) + { + List inx = new ArrayList( Arrays.asList( indexes ) ); + + removeAll( list, inx ); + } + + /** + * Returns a sublist of the given list with the elements at the given indexes. + * + * @param list the list to select from. + * @param indexes the indexes of the elements in the list to select. + */ + public static List getAll( List list, List indexes ) + { + List elements = new ArrayList(); + + for ( Integer index : indexes ) + { + elements.add( list.get( index ) ); + } + + return elements; + } + + /** * Checks whether the given list contains duplicates. List entries are compared * using the given comparator. *