use of org.hisp.dhis.category.CategoryService in project dhis2-core by dhis2.
the class DefaultDataValueSetService method createDataValueSetImportContext.
private ImportContext createDataValueSetImportContext(ImportOptions options, DataValueSet data) {
options = ObjectUtils.firstNonNull(options, ImportOptions.getDefaultImportOptions());
final User currentUser = currentUserService.getCurrentUser();
boolean auditEnabled = config.isEnabled(CHANGELOG_AGGREGATE);
boolean hasSkipAuditAuth = currentUser != null && currentUser.isAuthorized(Authorities.F_SKIP_DATA_IMPORT_AUDIT);
boolean skipAudit = (options.isSkipAudit() && hasSkipAuditAuth) || !auditEnabled;
SystemSettingManager settings = systemSettingManager;
IdScheme dataElementIdScheme = createIdScheme(data.getDataElementIdSchemeProperty(), options, IdSchemes::getDataElementIdScheme);
IdScheme orgUnitIdScheme = createIdScheme(data.getOrgUnitIdSchemeProperty(), options, IdSchemes::getOrgUnitIdScheme);
IdScheme categoryOptComboIdScheme = createIdScheme(data.getCategoryOptionComboIdSchemeProperty(), options, IdSchemes::getCategoryOptionComboIdScheme);
IdScheme dataSetIdScheme = createIdScheme(data.getDataSetIdSchemeProperty(), options, IdSchemes::getDataSetIdScheme);
return ImportContext.builder().importOptions(options).summary(new ImportSummary().setImportOptions(options)).isIso8601(calendarService.getSystemCalendar().isIso8601()).skipLockExceptionCheck(!lockExceptionStore.anyExists()).i18n(i18nManager.getI18n()).currentUser(currentUser).currentOrgUnits(currentUserService.getCurrentUserOrganisationUnits()).hasSkipAuditAuth(hasSkipAuditAuth).skipAudit(skipAudit).idScheme(createIdScheme(data.getIdSchemeProperty(), options, IdSchemes::getIdScheme)).dataElementIdScheme(dataElementIdScheme).orgUnitIdScheme(orgUnitIdScheme).categoryOptComboIdScheme(categoryOptComboIdScheme).dataSetIdScheme(dataSetIdScheme).strategy(data.getStrategy() != null ? ImportStrategy.valueOf(data.getStrategy()) : options.getImportStrategy()).dryRun(data.getDryRun() != null ? data.getDryRun() : options.isDryRun()).skipExistingCheck(options.isSkipExistingCheck()).strictPeriods(options.isStrictPeriods() || settings.getBoolSetting(SettingKey.DATA_IMPORT_STRICT_PERIODS)).strictDataElements(options.isStrictDataElements() || settings.getBoolSetting(SettingKey.DATA_IMPORT_STRICT_DATA_ELEMENTS)).strictCategoryOptionCombos(options.isStrictCategoryOptionCombos() || settings.getBoolSetting(SettingKey.DATA_IMPORT_STRICT_CATEGORY_OPTION_COMBOS)).strictAttrOptionCombos(options.isStrictAttributeOptionCombos() || settings.getBoolSetting(SettingKey.DATA_IMPORT_STRICT_ATTRIBUTE_OPTION_COMBOS)).strictOrgUnits(options.isStrictOrganisationUnits() || settings.getBoolSetting(SettingKey.DATA_IMPORT_STRICT_ORGANISATION_UNITS)).requireCategoryOptionCombo(options.isRequireCategoryOptionCombo() || settings.getBoolSetting(SettingKey.DATA_IMPORT_REQUIRE_CATEGORY_OPTION_COMBO)).requireAttrOptionCombo(options.isRequireAttributeOptionCombo() || settings.getBoolSetting(SettingKey.DATA_IMPORT_REQUIRE_ATTRIBUTE_OPTION_COMBO)).forceDataInput(inputUtils.canForceDataInput(currentUser, options.isForce())).dataElementCallable(new IdentifiableObjectCallable<>(identifiableObjectManager, DataElement.class, dataElementIdScheme, null)).orgUnitCallable(new IdentifiableObjectCallable<>(identifiableObjectManager, OrganisationUnit.class, orgUnitIdScheme, trimToNull(data.getOrgUnit()))).categoryOptionComboCallable(new CategoryOptionComboAclCallable(categoryService, categoryOptComboIdScheme, null)).attributeOptionComboCallable(new CategoryOptionComboAclCallable(categoryService, categoryOptComboIdScheme, null)).periodCallable(new PeriodCallable(periodService, null, trimToNull(data.getPeriod()))).dataValueBatchHandler(batchHandlerFactory.createBatchHandler(DataValueBatchHandler.class).init()).auditBatchHandler(skipAudit ? null : batchHandlerFactory.createBatchHandler(DataValueAuditBatchHandler.class).init()).singularNameForType(klass -> schemaService.getDynamicSchema(klass).getSingular()).build();
}
use of org.hisp.dhis.category.CategoryService 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.category.CategoryService in project dhis2-core by dhis2.
the class EventAnalyticsDimensionsServiceTest method setup.
@BeforeEach
void setup() {
ProgramStageService programStageService = mock(ProgramStageService.class);
CategoryService categoryService = mock(CategoryService.class);
Program program = mock(Program.class);
ProgramStage programStage = mock(ProgramStage.class);
when(programStageService.getProgramStage(any())).thenReturn(programStage);
when(programStage.getProgram()).thenReturn(program);
when(program.getDataElements()).thenReturn(allValueTypeDataElements());
when(program.getProgramIndicators()).thenReturn(Collections.emptySet());
when(program.getTrackedEntityAttributes()).thenReturn(allValueTypeTEAs());
eventAnalyticsDimensionsService = new DefaultEventAnalyticsDimensionsService(programStageService, categoryService);
}
use of org.hisp.dhis.category.CategoryService in project dhis2-core by dhis2.
the class Validator method validate.
/**
* Evaluates validation rules for a collection of organisation units. This
* method breaks the job down by organisation unit. It assigns the
* evaluation for each organisation unit to a task that can be evaluated
* independently in a multi-threaded environment.
* <p/>
* Return early with no results if there are no organisation units or no
* validation rules.
*
* @return a collection of any validations that were found
*/
public static List<ValidationResult> validate(ValidationRunContext context, ApplicationContext applicationContext, AnalyticsService analyticsService) {
CategoryService categoryService = applicationContext.getBean(CategoryService.class);
int threadPoolSize = getThreadPoolSize(context);
if (threadPoolSize == 0 || context.getPeriodTypeXs().isEmpty()) {
return new ArrayList<>(context.getValidationResults());
}
ExecutorService executor = Executors.newFixedThreadPool(threadPoolSize);
List<List<OrganisationUnit>> orgUnitLists = Lists.partition(context.getOrgUnits(), ValidationRunContext.ORG_UNITS_PER_TASK);
for (List<OrganisationUnit> orgUnits : orgUnitLists) {
ValidationTask task = (ValidationTask) applicationContext.getBean(DataValidationTask.NAME);
task.init(orgUnits, context, analyticsService);
executor.execute(task);
}
executor.shutdown();
try {
executor.awaitTermination(6, TimeUnit.HOURS);
} catch (InterruptedException e) {
executor.shutdownNow();
}
reloadAttributeOptionCombos(context.getValidationResults(), categoryService);
return new ArrayList<>(context.getValidationResults());
}
Aggregations