=== 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-03-10 16:13:56 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/DataQueryParams.java 2013-03-11 08:24:17 +0000 @@ -28,7 +28,10 @@ */ import static org.hisp.dhis.analytics.AggregationType.AVERAGE_INT_DISAGGREGATION; -import static org.hisp.dhis.analytics.DimensionType.*; +import static org.hisp.dhis.analytics.DimensionType.DATASET; +import static org.hisp.dhis.analytics.DimensionType.ORGANISATIONUNIT; +import static org.hisp.dhis.analytics.DimensionType.ORGANISATIONUNIT_GROUPSET; +import static org.hisp.dhis.system.util.CollectionUtils.emptyIfNull; import java.util.ArrayList; import java.util.Arrays; @@ -43,12 +46,12 @@ import org.apache.commons.lang.StringUtils; import org.hisp.dhis.common.CombinationGenerator; import org.hisp.dhis.common.IdentifiableObject; +import org.hisp.dhis.common.ListMap; import org.hisp.dhis.dataelement.DataElementOperand; import org.hisp.dhis.dataset.DataSet; import org.hisp.dhis.period.Period; import org.hisp.dhis.period.PeriodType; import org.hisp.dhis.system.util.CollectionUtils; -import org.hisp.dhis.common.ListMap; import org.hisp.dhis.system.util.ListUtils; import org.hisp.dhis.system.util.MapMap; import org.hisp.dhis.system.util.MathUtils; @@ -72,7 +75,7 @@ public static final List DATA_DIMS = Arrays.asList( INDICATOR_DIM_ID, DATAELEMENT_DIM_ID, DATASET_DIM_ID ); public static final List FIXED_DIMS = Arrays.asList( DATA_X_DIM_ID, INDICATOR_DIM_ID, DATAELEMENT_DIM_ID, DATASET_DIM_ID, PERIOD_DIM_ID, ORGUNIT_DIM_ID ); - public static final int MAX_DIM_OPT_PERM = 5000; + public static final int MAX_DIM_OPT_PERM = 10000; private static final List COMPLETENESS_DIMENSION_TYPES = Arrays.asList( DATASET, ORGANISATIONUNIT, ORGANISATIONUNIT_GROUPSET ); @@ -359,15 +362,28 @@ } /** - * Returns the number of dimension option permutations. + * Returns the number of dimension option permutations. Merges the three data + * dimensions into one prior to the calculation. */ public int getNumberOfDimensionOptionPermutations() { int total = 1; - for ( Dimension dim : dimensions ) + DataQueryParams query = new DataQueryParams( this ); + + query.getDimensions().add( new Dimension( DATA_X_DIM_ID ) ); + + query.getDimension( DATA_X_DIM_ID ).getItems().addAll( emptyIfNull( query.getDimensionOptions( INDICATOR_DIM_ID ) ) ); + query.getDimension( DATA_X_DIM_ID ).getItems().addAll( emptyIfNull( query.getDimensionOptions( DATAELEMENT_DIM_ID ) ) ); + query.getDimension( DATA_X_DIM_ID ).getItems().addAll( emptyIfNull( query.getDimensionOptions( DATASET_DIM_ID ) ) ); + + query.removeDimension( INDICATOR_DIM_ID ); + query.removeDimension( DATAELEMENT_DIM_ID ); + query.removeDimension( DATASET_DIM_ID ); + + for ( Dimension dim : query.getDimensions() ) { - total *= dim.getItems().size(); + total *= Math.max( dim.getItems().size(), 1 ); } return total; === 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 2013-03-10 16:13:56 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultQueryPlanner.java 2013-03-11 08:24:17 +0000 @@ -109,7 +109,7 @@ if ( params.getNumberOfDimensionOptionPermutations() > MAX_DIM_OPT_PERM ) { - violation = "Table exceeds max number of cells: " + MAX_DIM_OPT_PERM; + violation = "Table exceeds max number of cells: " + MAX_DIM_OPT_PERM + " (" + params.getNumberOfDimensionOptionPermutations() + ")"; } if ( !params.getDuplicateDimensions().isEmpty() ) === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/data/QueryPlannerTest.java' --- dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/data/QueryPlannerTest.java 2013-03-10 16:13:56 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/data/QueryPlannerTest.java 2013-03-11 08:24:17 +0000 @@ -314,6 +314,29 @@ assertEquals( PERIOD_DIM_ID, permutation.get( 1 ).getDimension() ); } } + + /** + * First, combines data elements and data sets into one data dimension and + * returns (2 + 3) * 3 * 2 = 30. Second, ignores any data dimension and + * returns 3 * 2 = 6. + */ + @Test + public void testGetNumberOfDimensionOptionPermutations() + { + DataQueryParams params = new DataQueryParams(); + params.setDataElements( getList( deA, deB ) ); + params.setDataSets( getList( dsA, dsB, dsC ) ); + params.setOrganisationUnits( getList( ouA, ouB, ouC ) ); + params.setPeriods( getList( createPeriod( "2000Q1" ), createPeriod( "2000Q2" ) ) ); + + assertEquals( 30, params.getNumberOfDimensionOptionPermutations() ); + + params = new DataQueryParams(); + params.setOrganisationUnits( getList( ouA, ouB, ouC ) ); + params.setPeriods( getList( createPeriod( "2000Q1" ), createPeriod( "2000Q2" ) ) ); + + assertEquals( 6, params.getNumberOfDimensionOptionPermutations() ); + } @Test public void testGetDataPeriodAggregationPeriodMap()