use of org.hisp.dhis.expression.ParseType.PREDICTOR_EXPRESSION 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();
}
Aggregations