Analytics. Skipped exploding of indicator expressions and rather fetch data element values in potentially two requests, one for totals, one for option combos. This allows for using data element totals in indicators which are captured using different category combos / disaggregations.
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/DefaultAnalyticsService.java
dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/data/QueryPlannerTest.java
Your team DHIS 2 developers is subscribed to branch lp:dhis2.
=== 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 2015-04-10 10:38:22 +0000
+++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/DataQueryParams.java 2015-04-10 11:18:20 +0000
=== 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 2015-04-10 10:38:22 +0000
+++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultAnalyticsService.java 2015-04-10 11:54:45 +0000
-
Map<String, Double> aggregatedDataTotalsMap = getAggregatedDataValueMapTotals( params );
-
Map<String, Double> aggregatedDataOptionCombosMap = getAggregatedDataValueMapOptionCombos( params );
-
MapMap<String, DataElementOperand, Double> permOperandValueMap = new MapMap<>();
-
DataQueryParams.putPermutationOperandValueMap( permOperandValueMap, aggregatedDataTotalsMap, false );
-
DataQueryParams.putPermutationOperandValueMap( permOperandValueMap, aggregatedDataOptionCombosMap, true );
-
return permOperandValueMap;
-
}
-
/**
-
* Returns a mapping of dimension keys and aggregated values for the data
-
* element totals part of the indicators in the given query.
-
*
-
* @param params the data query parameters.
-
* @return a mapping of dimension keys and aggregated values.
-
*/
-
private Map<String, Double> getAggregatedDataValueMapTotals( DataQueryParams params )
-
{
-
List<Indicator> indicators = asTypedList( params.getIndicators() );
-
List<NameableObject> dataElements = asList( expressionService.getDataElementTotalsInIndicators( indicators ) );
-
if ( !dataElements.isEmpty() )
-
{
-
DataQueryParams dataSourceParams = params.instance().removeDimensions( DATAELEMENT_DIM_ID, DATASET_DIM_ID, INDICATOR_DIM_ID );
-
dataSourceParams.getDimensions().add( DataQueryParams.DE_IN_INDEX, new BaseDimensionalObject(
-
DATAELEMENT_DIM_ID, DimensionType.DATAELEMENT, dataElements ) );
-
return getAggregatedDataValueMap( dataSourceParams );
-
}
-
return new HashMap<>();
-
}
-
/**
-
* Returns a mapping of dimension keys and aggregated values for the data
-
* elements with category option combinations part of the indicators in the
-
* given query.
-
*
-
* @param params the data query parameters.
-
* @return a mapping of dimension keys and aggregated values.
-
*/
-
private Map<String, Double> getAggregatedDataValueMapOptionCombos( DataQueryParams params )
-
{
-
List<Indicator> indicators = asTypedList( params.getIndicators() );
-
List<NameableObject> dataElements = asList( expressionService.getDataElementWithOptionCombosInIndicators( indicators ) );
-
if ( !dataElements.isEmpty() )
-
{
-
DataQueryParams dataSourceParams = params.instance().removeDimensions( DATAELEMENT_DIM_ID, DATASET_DIM_ID, INDICATOR_DIM_ID );
-
dataSourceParams.getDimensions().add( DataQueryParams.DE_IN_INDEX, new BaseDimensionalObject(
-
DATAELEMENT_DIM_ID, DimensionType.DATAELEMENT, dataElements ) );
-
dataSourceParams.getDimensions().add( DataQueryParams.CO_IN_INDEX, new BaseDimensionalObject(
-
CATEGORYOPTIONCOMBO_DIM_ID, DimensionType.CATEGORY_OPTION_COMBO, new ArrayList<NameableObject>() ) );
-
return getAggregatedDataValueMap( dataSourceParams );
-
}
-
return new HashMap<>();
}
/**
=== 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 2015-04-10 10:38:22 +0000
+++ dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/data/QueryPlannerTest.java 2015-04-10 11:18:20 +0000
-
@Test
-
public void testGetPermutationOperandValueMapCocDisabled()
-
{
-
Map<String, Double> aggregatedDataMap = new HashMap<>();
-
aggregatedDataMap.put( deA.getUid() + DIMENSION_SEP + ouA.getUid() + DIMENSION_SEP + "200101", 1d );
-
aggregatedDataMap.put( deA.getUid() + DIMENSION_SEP + ouA.getUid() + DIMENSION_SEP + "200102", 2d );
-
aggregatedDataMap.put( deA.getUid() + DIMENSION_SEP + ouB.getUid() + DIMENSION_SEP + "200101", 3d );
-
aggregatedDataMap.put( deA.getUid() + DIMENSION_SEP + ouB.getUid() + DIMENSION_SEP + "200102", 4d );
-
aggregatedDataMap.put( deB.getUid() + DIMENSION_SEP + ouA.getUid() + DIMENSION_SEP + "200101", 5d );
-
aggregatedDataMap.put( deB.getUid() + DIMENSION_SEP + ouA.getUid() + DIMENSION_SEP + "200102", 6d );
-
aggregatedDataMap.put( deB.getUid() + DIMENSION_SEP + ouB.getUid() + DIMENSION_SEP + "200101", 7d );
-
aggregatedDataMap.put( deB.getUid() + DIMENSION_SEP + ouB.getUid() + DIMENSION_SEP + "200102", 8d );
-
MapMap<String, DataElementOperand, Double> permutationMap = new MapMap<>();
-
DataQueryParams.putPermutationOperandValueMap( permutationMap, aggregatedDataMap, false );
-
assertNotNull( permutationMap );
-
String ouAM1Key = ouA.getUid() + DIMENSION_SEP + "200101";
-
String ouAM2Key = ouA.getUid() + DIMENSION_SEP + "200102";
-
String ouBM1Key = ouB.getUid() + DIMENSION_SEP + "200101";
-
String ouBM2Key = ouB.getUid() + DIMENSION_SEP + "200102";
-
Map<DataElementOperand, Double> ouAM1 = permutationMap.get( ouAM1Key );
-
Map<DataElementOperand, Double> ouAM2 = permutationMap.get( ouAM2Key );
-
Map<DataElementOperand, Double> ouBM1 = permutationMap.get( ouBM1Key );
-
Map<DataElementOperand, Double> ouBM2 = permutationMap.get( ouBM2Key );
-
assertEquals( 2, ouAM1.size() );
-
assertEquals( 2, ouAM2.size() );
-
assertEquals( 2, ouBM1.size() );
-
assertEquals( 2, ouBM2.size() );
-
DataElementOperand deACoc = new DataElementOperand( deA.getUid(), null );
-
DataElementOperand deBCoc = new DataElementOperand( deB.getUid(), null );
-
Map<DataElementOperand, Double> ouAM1Expected = new HashMap<>();
-
ouAM1Expected.put( deACoc, 1d );
-
ouAM1Expected.put( deBCoc, 5d );
-
Map<DataElementOperand, Double> ouAM2Expected = new HashMap<>();
-
ouAM2Expected.put( deACoc, 2d );
-
ouAM2Expected.put( deBCoc, 6d );
-
Map<DataElementOperand, Double> ouBM1Expected = new HashMap<>();
-
ouBM1Expected.put( deACoc, 3d );
-
ouBM1Expected.put( deBCoc, 7d );
-
Map<DataElementOperand, Double> ouBM2Expected = new HashMap<>();
-
ouBM2Expected.put( deACoc, 4d );
-
ouBM2Expected.put( deBCoc, 8d );
-
assertEquals( ouAM1Expected, ouAM1 );
-
assertEquals( ouAM2Expected, ouAM2 );
-
assertEquals( ouBM1Expected, ouBM1 );
-
assertEquals( ouBM2Expected, ouBM2 );
-
}
-
@Test
-
public void testGetPermutationOperandValueMap()
-
{
-
Map<String, Double> aggregatedTotalsDataMap = new HashMap<>();
-
aggregatedTotalsDataMap.put( deA.getUid() + DIMENSION_SEP + ouA.getUid() + DIMENSION_SEP + "2000Q1", 1d );
-
aggregatedTotalsDataMap.put( deA.getUid() + DIMENSION_SEP + ouA.getUid() + DIMENSION_SEP + "2000Q2", 2d );
-
aggregatedTotalsDataMap.put( deA.getUid() + DIMENSION_SEP + ouB.getUid() + DIMENSION_SEP + "2000Q1", 3d );
-
aggregatedTotalsDataMap.put( deA.getUid() + DIMENSION_SEP + ouB.getUid() + DIMENSION_SEP + "2000Q2", 4d );
-
Map<String, Double> aggregatedCocDataMap = new HashMap<>();
-
aggregatedCocDataMap.put( deB.getUid() + DIMENSION_SEP + coc.getUid() + DIMENSION_SEP + ouA.getUid() + DIMENSION_SEP + "2000Q1", 5d );
-
aggregatedCocDataMap.put( deB.getUid() + DIMENSION_SEP + coc.getUid() + DIMENSION_SEP + ouA.getUid() + DIMENSION_SEP + "2000Q2", 6d );
-
aggregatedCocDataMap.put( deB.getUid() + DIMENSION_SEP + coc.getUid() + DIMENSION_SEP + ouB.getUid() + DIMENSION_SEP + "2000Q1", 7d );
-
aggregatedCocDataMap.put( deB.getUid() + DIMENSION_SEP + coc.getUid() + DIMENSION_SEP + ouB.getUid() + DIMENSION_SEP + "2000Q2", 8d );
-
MapMap<String, DataElementOperand, Double> permutationMap = new MapMap<>();
-
DataQueryParams.putPermutationOperandValueMap( permutationMap, aggregatedTotalsDataMap, false );
-
DataQueryParams.putPermutationOperandValueMap( permutationMap, aggregatedCocDataMap, true );
-
assertNotNull( permutationMap );
-
String ouAQ1Key = ouA.getUid() + DIMENSION_SEP + "2000Q1";
-
String ouAQ2Key = ouA.getUid() + DIMENSION_SEP + "2000Q2";
-
String ouBQ1Key = ouB.getUid() + DIMENSION_SEP + "2000Q1";
-
String ouBQ2Key = ouB.getUid() + DIMENSION_SEP + "2000Q2";
-
Map<DataElementOperand, Double> ouAQ1 = permutationMap.get( ouAQ1Key );
-
Map<DataElementOperand, Double> ouAQ2 = permutationMap.get( ouAQ2Key );
-
Map<DataElementOperand, Double> ouBQ1 = permutationMap.get( ouBQ1Key );
-
Map<DataElementOperand, Double> ouBQ2 = permutationMap.get( ouBQ2Key );
-
assertEquals( 2, ouAQ1.size() );
-
assertEquals( 2, ouAQ2.size() );
-
assertEquals( 2, ouBQ1.size() );
-
assertEquals( 2, ouBQ2.size() );
-
DataElementOperand deACoc = new DataElementOperand( deA.getUid(), null );
-
DataElementOperand deBCoc = new DataElementOperand( deB.getUid(), coc.getUid() );
-
Map<DataElementOperand, Double> ouAQ1Expected = new HashMap<>();
-
ouAQ1Expected.put( deACoc, 1d );
-
ouAQ1Expected.put( deBCoc, 5d );
-
Map<DataElementOperand, Double> ouAQ2Expected = new HashMap<>();
-
ouAQ2Expected.put( deACoc, 2d );
-
ouAQ2Expected.put( deBCoc, 6d );
-
Map<DataElementOperand, Double> ouBQ1Expected = new HashMap<>();
-
ouBQ1Expected.put( deACoc, 3d );
-
ouBQ1Expected.put( deBCoc, 7d );
-
Map<DataElementOperand, Double> ouBQ2Expected = new HashMap<>();
-
ouBQ2Expected.put( deACoc, 4d );
-
ouBQ2Expected.put( deBCoc, 8d );
-
assertEquals( ouAQ1Expected, ouAQ1 );
-
assertEquals( ouAQ2Expected, ouAQ2 );
-
assertEquals( ouBQ1Expected, ouBQ1 );
-
assertEquals( ouBQ2Expected, ouBQ2 );
-
}