use of org.hisp.dhis.common.DimensionalItemId in project dhis2-core by dhis2.
the class ExpressionService2Test method testGetIndicatorDimensionalItemMap2.
@Test
void testGetIndicatorDimensionalItemMap2() {
Set<DimensionalItemId> itemIds = Sets.newHashSet(getId(opA));
Map<DimensionalItemId, DimensionalItemObject> expectedItemMap = ImmutableMap.of(getId(opA), opA);
when(dimensionService.getDataDimensionalItemObjectMap(itemIds)).thenReturn(expectedItemMap);
mockConstantService();
IndicatorType indicatorType = new IndicatorType("A", 100, false);
Indicator indicatorA = createIndicator('A', indicatorType);
indicatorA.setNumerator(expressionE);
indicatorA.setDenominator(expressionF);
List<Indicator> indicators = Arrays.asList(indicatorA);
Map<DimensionalItemId, DimensionalItemObject> itemMap = target.getIndicatorDimensionalItemMap(indicators);
Map<DimensionalItemObject, Object> valueMap = new HashMap<>();
valueMap.put(new DataElementOperand(deA, coc), 12d);
IndicatorValue value = target.getIndicatorValueObject(indicatorA, Collections.singletonList(period), itemMap, valueMap, null);
assertNotNull(value);
assertEquals(24d, value.getNumeratorValue(), DELTA);
assertEquals(12d, value.getDenominatorValue(), DELTA);
assertEquals(100, value.getMultiplier());
assertEquals(1, value.getDivisor());
assertEquals(100d, value.getFactor(), DELTA);
assertEquals(200d, value.getValue(), DELTA);
}
use of org.hisp.dhis.common.DimensionalItemId in project dhis2-core by dhis2.
the class ExpressionService2Test method testAnnualizedIndicatorValueWhenHavingNullPeriods.
@Test
void testAnnualizedIndicatorValueWhenHavingNullPeriods() {
Set<DimensionalItemId> itemIds = Sets.newHashSet(getId(opA));
Map<DimensionalItemId, DimensionalItemObject> expectedItemMap = ImmutableMap.of(getId(opA), opA);
when(dimensionService.getDataDimensionalItemObjectMap(itemIds)).thenReturn(expectedItemMap);
mockConstantService();
IndicatorType indicatorType = new IndicatorType("A", 100, false);
Indicator indicatorA = createIndicator('A', indicatorType);
indicatorA.setAnnualized(true);
indicatorA.setNumerator(expressionE);
indicatorA.setDenominator(expressionF);
Map<DimensionalItemObject, Object> valueMap = new HashMap<>();
valueMap.put(new DataElementOperand(deA, coc), 12d);
valueMap.put(new DataElementOperand(deB, coc), 34d);
valueMap.put(new DataElementOperand(deA, cocA, cocB), 46d);
valueMap.put(new DataElementOperand(deB, cocA), 10d);
Map<DimensionalItemId, DimensionalItemObject> itemMap = target.getIndicatorDimensionalItemMap(Arrays.asList(indicatorA));
IndicatorValue value = target.getIndicatorValueObject(indicatorA, null, itemMap, valueMap, null);
assertNotNull(value);
assertEquals(24d, value.getNumeratorValue(), DELTA);
assertEquals(12d, value.getDenominatorValue(), DELTA);
assertEquals(100, value.getMultiplier());
assertEquals(1, value.getDivisor());
assertEquals(100.0d, Precision.round(value.getFactor(), 2), DELTA);
assertEquals(200.0d, Precision.round(value.getValue(), 2), DELTA);
}
use of org.hisp.dhis.common.DimensionalItemId in project dhis2-core by dhis2.
the class DefaultPredictionService method predict.
@Override
public void predict(Predictor predictor, Date startDate, Date endDate, PredictionSummary predictionSummary) {
Expression generator = predictor.getGenerator();
Expression skipTest = predictor.getSampleSkipTest();
DataElement outputDataElement = predictor.getOutput();
DataType expressionDataType = DataType.fromValueType(outputDataElement.getValueType());
Map<DimensionalItemId, DimensionalItemObject> outputPeriodItemMap = new HashMap<>();
Map<DimensionalItemId, DimensionalItemObject> sampledItemMap = new HashMap<>();
expressionService.getExpressionDimensionalItemMaps(generator.getExpression(), PREDICTOR_EXPRESSION, expressionDataType, outputPeriodItemMap, sampledItemMap);
Set<String> orgUnitGroupIds = expressionService.getExpressionOrgUnitGroupIds(generator.getExpression(), PREDICTOR_EXPRESSION);
if (skipTest != null) {
expressionService.getExpressionDimensionalItemMaps(skipTest.getExpression(), PREDICTOR_SKIP_TEST, DataType.BOOLEAN, sampledItemMap, sampledItemMap);
orgUnitGroupIds.addAll(expressionService.getExpressionOrgUnitGroupIds(skipTest.getExpression(), PREDICTOR_SKIP_TEST));
}
Map<String, OrganisationUnitGroup> orgUnitGroupMap = orgUnitGroupIds.stream().map(organisationUnitGroupService::getOrganisationUnitGroup).filter(Objects::nonNull).collect(Collectors.toMap(OrganisationUnitGroup::getUid, g -> g));
Map<DimensionalItemId, DimensionalItemObject> itemMap = new HashMap<>(outputPeriodItemMap);
itemMap.putAll(sampledItemMap);
Set<DimensionalItemObject> outputPeriodItems = new HashSet<>(outputPeriodItemMap.values());
Set<DimensionalItemObject> sampledItems = new HashSet<>(sampledItemMap.values());
Set<DimensionalItemObject> items = new HashSet<>(itemMap.values());
List<Period> outputPeriods = getPeriodsBetweenDates(predictor.getPeriodType(), startDate, endDate);
Set<Period> existingOutputPeriods = getExistingPeriods(outputPeriods);
ListMap<Period, Period> samplePeriodsMap = getSamplePeriodsMap(outputPeriods, predictor);
Set<Period> allSamplePeriods = samplePeriodsMap.uniqueValues();
Set<Period> analyticsQueryPeriods = getAnalyticsQueryPeriods(sampledItems, allSamplePeriods, outputPeriodItems, existingOutputPeriods);
Set<Period> dataValueQueryPeriods = getDataValueQueryPeriods(analyticsQueryPeriods, existingOutputPeriods);
outputPeriods = periodService.reloadPeriods(outputPeriods);
CategoryOptionCombo defaultCategoryOptionCombo = categoryService.getDefaultCategoryOptionCombo();
CategoryOptionCombo outputOptionCombo = predictor.getOutputCombo() == null ? defaultCategoryOptionCombo : predictor.getOutputCombo();
DataElementOperand outputDataElementOperand = new DataElementOperand(outputDataElement, outputOptionCombo);
Date now = new Date();
boolean requireData = generator.getMissingValueStrategy() != NEVER_SKIP && (!items.isEmpty());
DimensionalItemObject forwardReference = addOuputToItems(outputDataElementOperand, items);
Set<OrganisationUnit> currentUserOrgUnits = new HashSet<>();
String storedBy = "system-process";
User currentUser = currentUserService.getCurrentUser();
if (currentUser != null) {
currentUserOrgUnits = currentUser.getOrganisationUnits();
storedBy = currentUser.getUsername();
}
PredictionDataConsolidator consolidator = new PredictionDataConsolidator(items, predictor.getOrganisationUnitDescendants().equals(DESCENDANTS), new PredictionDataValueFetcher(dataValueService, categoryService), new PredictionAnalyticsDataFetcher(analyticsService, categoryService));
PredictionWriter predictionWriter = new PredictionWriter(dataValueService, batchHandlerFactory);
predictionWriter.init(existingOutputPeriods, predictionSummary);
predictionSummary.incrementPredictors();
for (OrganisationUnitLevel orgUnitLevel : predictor.getOrganisationUnitLevels()) {
List<OrganisationUnit> orgUnits = organisationUnitService.getOrganisationUnitsAtOrgUnitLevels(Lists.newArrayList(orgUnitLevel), currentUserOrgUnits);
consolidator.init(currentUserOrgUnits, orgUnitLevel.getLevel(), orgUnits, dataValueQueryPeriods, analyticsQueryPeriods, existingOutputPeriods, outputDataElementOperand);
PredictionData data;
while ((data = consolidator.getData()) != null) {
List<DataValue> predictions = new ArrayList<>();
List<PredictionContext> contexts = PredictionContextGenerator.getContexts(outputPeriods, data.getValues(), defaultCategoryOptionCombo);
for (PredictionContext c : contexts) {
List<Period> samplePeriods = new ArrayList<>(samplePeriodsMap.get(c.getOutputPeriod()));
samplePeriods.removeAll(getSkippedPeriods(allSamplePeriods, itemMap, c.getPeriodValueMap(), skipTest, orgUnitGroupMap, data.getOrgUnit()));
if (requireData && !dataIsPresent(outputPeriodItems, c.getValueMap(), sampledItems, samplePeriods, c.getPeriodValueMap())) {
continue;
}
Object value = expressionService.getExpressionValue(ExpressionParams.builder().expression(predictor.getGenerator().getExpression()).parseType(PREDICTOR_EXPRESSION).dataType(expressionDataType).itemMap(itemMap).valueMap(c.getValueMap()).orgUnitGroupMap(orgUnitGroupMap).days(c.getOutputPeriod().getDaysInPeriod()).missingValueStrategy(generator.getMissingValueStrategy()).orgUnit(data.getOrgUnit()).samplePeriods(samplePeriods).periodValueMap(c.getPeriodValueMap()).build());
if (value != null || generator.getMissingValueStrategy() == NEVER_SKIP) {
String valueString = formatPrediction(value, outputDataElement);
if (valueString != null) {
DataValue prediction = new DataValue(outputDataElement, c.getOutputPeriod(), data.getOrgUnit(), outputOptionCombo, c.getAttributeOptionCombo(), valueString, storedBy, now, null);
carryPredictionForward(prediction, contexts, forwardReference);
predictions.add(prediction);
}
}
}
predictionWriter.write(predictions, data.getOldPredictions());
}
}
predictionWriter.flush();
}
use of org.hisp.dhis.common.DimensionalItemId in project dhis2-core by dhis2.
the class DataHandler method addIndicatorValues.
/**
* Adds indicator values to the given grid based on the given data query
* parameters.
*
* @param params the {@link DataQueryParams}.
* @param grid the grid.
*/
void addIndicatorValues(DataQueryParams params, Grid grid) {
if (!params.getIndicators().isEmpty() && !params.isSkipData()) {
DataQueryParams dataSourceParams = newBuilder(params).retainDataDimension(INDICATOR).withIncludeNumDen(false).build();
List<Indicator> indicators = resolveIndicatorExpressions(dataSourceParams);
// Try to get filters periods from dimension (pe), or else fall back
// to "startDate/endDate" periods
List<Period> filterPeriods = isNotEmpty(dataSourceParams.getTypedFilterPeriods()) ? dataSourceParams.getTypedFilterPeriods() : dataSourceParams.getStartEndDatesToSingleList();
// -----------------------------------------------------------------
// Get indicator values
// -----------------------------------------------------------------
Map<String, Map<String, Integer>> permutationOrgUnitTargetMap = getOrgUnitTargetMap(dataSourceParams, indicators);
List<List<DimensionItem>> dimensionItemPermutations = dataSourceParams.getDimensionItemPermutations();
Map<DimensionalItemId, DimensionalItemObject> itemMap = expressionService.getIndicatorDimensionalItemMap(indicators);
Map<String, List<DimensionItemObjectValue>> permutationDimensionItemValueMap = getPermutationDimensionItemValueMap(params, new ArrayList<>(itemMap.values()));
handleEmptyDimensionItemPermutations(dimensionItemPermutations);
for (Indicator indicator : indicators) {
for (List<DimensionItem> dimensionItems : dimensionItemPermutations) {
IndicatorValue value = getIndicatorValue(filterPeriods, itemMap, permutationOrgUnitTargetMap, permutationDimensionItemValueMap, indicator, dimensionItems);
addIndicatorValuesToGrid(params, grid, dataSourceParams, indicator, dimensionItems, value);
}
}
}
}
use of org.hisp.dhis.common.DimensionalItemId in project dhis2-core by dhis2.
the class DataElementGroupResolverTest method verifyExpressionIsNotResolvedWhenExpressionIsNotValid.
@Test
void verifyExpressionIsNotResolvedWhenExpressionIsNotValid() {
// arrange
dimensionalItemId = new DimensionalItemId(DimensionItemType.DATA_ELEMENT_OPERAND, uid1, uid2, uid3, createIndicatorExpression());
String expression = "lsdjflakjdflkajdslfhaglakujdhfg";
when(expressionService.getExpressionDimensionalItemIds(expression, INDICATOR_EXPRESSION)).thenReturn(Sets.newHashSet(dimensionalItemId));
// act
String resolvedExpression = resolver.resolve(expression);
// assert
assertEquals(expression, resolvedExpression);
}
Aggregations