use of org.hisp.dhis.analytics.DataQueryGroups in project dhis2-core by dhis2.
the class QueryPlannerTest method planQueryStartEndDateQueryGrouperB.
/**
* Splits in 4 queries for each period to satisfy optimal for a total
* of 4 queries, because all queries have different periods.
*/
@Test
public void planQueryStartEndDateQueryGrouperB() {
DataQueryParams params = DataQueryParams.newBuilder().withDataElements(getList(deA, deB)).withOrganisationUnits(getList(ouA)).withFilterPeriods(getList(createPeriod("200101"), createPeriod("200102"), createPeriod("200103"), createPeriod("200104"))).build();
List<Function<DataQueryParams, List<DataQueryParams>>> queryGroupers = Lists.newArrayList();
queryGroupers.add(q -> queryPlanner.groupByStartEndDate(q));
QueryPlannerParams plannerParams = QueryPlannerParams.newBuilder().withOptimalQueries(4).withTableName(ANALYTICS_TABLE_NAME).withQueryGroupers(queryGroupers).build();
DataQueryGroups queryGroups = queryPlanner.planQuery(params, plannerParams);
List<DataQueryParams> queries = queryGroups.getAllQueries();
assertEquals(2, queries.size());
assertEquals(1, queryGroups.getSequentialQueries().size());
assertEquals(2, queryGroups.getLargestGroupSize());
for (DataQueryParams query : queries) {
assertNotNull(query.getStartDate());
assertNotNull(query.getEndDate());
assertDimensionNameNotNull(query);
assertNull(query.getFilter(PERIOD_DIM_ID));
}
}
use of org.hisp.dhis.analytics.DataQueryGroups in project dhis2-core by dhis2.
the class DefaultAnalyticsService method getAggregatedValueMap.
/**
* Generates a mapping between a dimension key and the aggregated value. The
* dimension key is a concatenation of the identifiers of the dimension items
* separated by "-".
*
* @param params the {@link DataQueryParams}.
* @param tableName the table name to use for the query.
* @param queryGroupers the list of additional query groupers to use for
* query planning, use empty list for none.
* @return a mapping between a dimension key and aggregated values.
*/
private Map<String, Object> getAggregatedValueMap(DataQueryParams params, String tableName, List<Function<DataQueryParams, List<DataQueryParams>>> queryGroupers) {
queryPlanner.validateMaintenanceMode();
int optimalQueries = MathUtils.getWithin(getProcessNo(), 1, MAX_QUERIES);
int maxLimit = params.isIgnoreLimit() ? 0 : (Integer) systemSettingManager.getSystemSetting(SettingKey.ANALYTICS_MAX_LIMIT);
Timer timer = new Timer().start().disablePrint();
QueryPlannerParams plannerParams = QueryPlannerParams.newBuilder().withOptimalQueries(optimalQueries).withTableName(tableName).withQueryGroupers(queryGroupers).build();
DataQueryGroups queryGroups = queryPlanner.planQuery(params, plannerParams);
timer.getSplitTime("Planned analytics query, got: " + queryGroups.getLargestGroupSize() + " for optimal: " + optimalQueries);
Map<String, Object> map = new HashMap<>();
for (List<DataQueryParams> queries : queryGroups.getSequentialQueries()) {
List<Future<Map<String, Object>>> futures = new ArrayList<>();
for (DataQueryParams query : queries) {
futures.add(analyticsManager.getAggregatedDataValues(query, maxLimit));
}
for (Future<Map<String, Object>> future : futures) {
try {
Map<String, Object> taskValues = future.get();
if (taskValues != null) {
map.putAll(taskValues);
}
} catch (Exception ex) {
log.error(DebugUtils.getStackTrace(ex));
log.error(DebugUtils.getStackTrace(ex.getCause()));
throw new RuntimeException("Error during execution of aggregation query task", ex);
}
}
}
timer.getTime("Got analytics values");
return map;
}
use of org.hisp.dhis.analytics.DataQueryGroups in project dhis2-core by dhis2.
the class QueryPlannerTest method planQueryK.
/**
* Splits in 4 queries on data sets to satisfy optimal for a total of 4
* queries.
*/
@Test
void planQueryK() {
DataQueryParams params = DataQueryParams.newBuilder().withReportingRates(getList(rrA, rrB, rrC, rrD)).withOrganisationUnits(getList(ouA, ouB, ouC, ouD, ouE)).withPeriods(getList(createPeriod("2000Q1"), createPeriod("2000Q2"), createPeriod("2000Q3"), createPeriod("2000Q4"), createPeriod("2001Q1"), createPeriod("2001Q2"))).build();
QueryPlannerParams plannerParams = QueryPlannerParams.newBuilder().withOptimalQueries(4).withTableType(ANALYTICS_TABLE_TYPE).build();
DataQueryGroups queryGroups = queryPlanner.planQuery(params, plannerParams);
List<DataQueryParams> queries = queryGroups.getAllQueries();
assertEquals(4, queries.size());
for (DataQueryParams query : queries) {
assertTrue(samePeriodType(query.getPeriods()));
assertDimensionNameNotNull(query);
}
}
use of org.hisp.dhis.analytics.DataQueryGroups in project dhis2-core by dhis2.
the class DataHandler method getAggregatedValueMap.
/**
* Generates a mapping between a dimension key and the aggregated value. The
* dimension key is a concatenation of the identifiers of the dimension
* items separated by "-".
*
* @param params the {@link DataQueryParams}.
* @param tableType the {@link AnalyticsTableType}.
* @param queryGroupers the list of additional query groupers to use for
* query planning, use empty list for none.
* @return a mapping between a dimension key and aggregated values.
*/
private Map<String, Object> getAggregatedValueMap(DataQueryParams params, AnalyticsTableType tableType, List<Function<DataQueryParams, List<DataQueryParams>>> queryGroupers) {
queryValidator.validateMaintenanceMode();
int optimalQueries = getWithin(getProcessNo(), 1, MAX_QUERIES);
int maxLimit = params.isIgnoreLimit() ? 0 : systemSettingManager.getIntSetting(ANALYTICS_MAX_LIMIT);
Timer timer = new Timer().start().disablePrint();
QueryPlannerParams plannerParams = QueryPlannerParams.newBuilder().withOptimalQueries(optimalQueries).withTableType(tableType).withQueryGroupers(queryGroupers).build();
DataQueryGroups queryGroups = queryPlanner.planQuery(params, plannerParams);
timer.getSplitTime("Planned analytics query, got: " + queryGroups.getLargestGroupSize() + " for optimal: " + optimalQueries);
Map<String, Object> map = new HashMap<>();
for (List<DataQueryParams> queries : queryGroups.getSequentialQueries()) {
executeQueries(tableType, maxLimit, map, queries);
}
timer.getTime("Got analytics values");
return map;
}
use of org.hisp.dhis.analytics.DataQueryGroups in project dhis2-core by dhis2.
the class QueryPlannerTest method planQueryForFirstOrLastAggregationType.
private void planQueryForFirstOrLastAggregationType(AnalyticsAggregationType analyticsAggregationType) {
DataQueryParams params = DataQueryParams.newBuilder().withDataElements(getList(deA)).withOrganisationUnits(getList(ouA)).withPeriods(getList(createPeriod("200101"), createPeriod("200102"), createPeriod("200103"), createPeriod("200104"))).withAggregationType(analyticsAggregationType).build();
QueryPlannerParams plannerParams = QueryPlannerParams.newBuilder().withOptimalQueries(4).withTableType(ANALYTICS_TABLE_TYPE).build();
DataQueryGroups queryGroups = queryPlanner.planQuery(params, plannerParams);
List<DataQueryParams> queries = queryGroups.getAllQueries();
assertEquals(4, queries.size());
for (DataQueryParams query : queries) {
assertEquals(1, query.getPeriods().size());
assertNotNull(query.getDimension(PERIOD_DIM_ID));
assertEquals(MonthlyPeriodType.NAME.toLowerCase(), query.getDimension(PERIOD_DIM_ID).getDimensionName());
}
}
Aggregations