Search in sources :

Example 26 with Relationship

use of org.hisp.dhis.dxf2.events.trackedentity.Relationship in project dhis2-core by dhis2.

the class AbstractRelationshipService method createDAORelationship.

private org.hisp.dhis.relationship.Relationship createDAORelationship(Relationship relationship) {
    RelationshipType relationshipType = relationshipTypeCache.get(relationship.getRelationshipType());
    org.hisp.dhis.relationship.Relationship daoRelationship = new org.hisp.dhis.relationship.Relationship();
    RelationshipItem fromItem = null;
    RelationshipItem toItem = null;
    daoRelationship.setRelationshipType(relationshipType);
    if (relationship.getRelationship() != null) {
        daoRelationship.setUid(relationship.getRelationship());
    }
    // FROM
    if (relationshipType.getFromConstraint().getRelationshipEntity().equals(TRACKED_ENTITY_INSTANCE)) {
        fromItem = new RelationshipItem();
        fromItem.setTrackedEntityInstance(trackedEntityInstanceCache.get(getUidOfRelationshipItem(relationship.getFrom())));
    } else if (relationshipType.getFromConstraint().getRelationshipEntity().equals(PROGRAM_INSTANCE)) {
        fromItem = new RelationshipItem();
        fromItem.setProgramInstance(programInstanceCache.get(getUidOfRelationshipItem(relationship.getFrom())));
    } else if (relationshipType.getFromConstraint().getRelationshipEntity().equals(PROGRAM_STAGE_INSTANCE)) {
        fromItem = new RelationshipItem();
        fromItem.setProgramStageInstance(programStageInstanceCache.get(getUidOfRelationshipItem(relationship.getFrom())));
    }
    // TO
    if (relationshipType.getToConstraint().getRelationshipEntity().equals(TRACKED_ENTITY_INSTANCE)) {
        toItem = new RelationshipItem();
        toItem.setTrackedEntityInstance(trackedEntityInstanceCache.get(getUidOfRelationshipItem(relationship.getTo())));
    } else if (relationshipType.getToConstraint().getRelationshipEntity().equals(PROGRAM_INSTANCE)) {
        toItem = new RelationshipItem();
        toItem.setProgramInstance(programInstanceCache.get(getUidOfRelationshipItem(relationship.getTo())));
    } else if (relationshipType.getToConstraint().getRelationshipEntity().equals(PROGRAM_STAGE_INSTANCE)) {
        toItem = new RelationshipItem();
        toItem.setProgramStageInstance(programStageInstanceCache.get(getUidOfRelationshipItem(relationship.getTo())));
    }
    daoRelationship.setFrom(fromItem);
    daoRelationship.setTo(toItem);
    daoRelationship.setKey(RelationshipUtils.generateRelationshipKey(daoRelationship));
    daoRelationship.setInvertedKey(RelationshipUtils.generateRelationshipInvertedKey(daoRelationship));
    return daoRelationship;
}
Also used : Relationship(org.hisp.dhis.dxf2.events.trackedentity.Relationship) RelationshipType(org.hisp.dhis.relationship.RelationshipType) RelationshipItem(org.hisp.dhis.relationship.RelationshipItem)

Example 27 with Relationship

use of org.hisp.dhis.dxf2.events.trackedentity.Relationship in project dhis2-core by dhis2.

the class AbstractRelationshipService method prepareCaches.

private void prepareCaches(List<Relationship> relationships, User user) {
    Map<RelationshipEntity, List<String>> relationshipEntities = new HashMap<>();
    Map<String, List<Relationship>> relationshipTypeMap = relationships.stream().collect(Collectors.groupingBy(Relationship::getRelationshipType));
    // Find all the RelationshipTypes first, so we know what the uids refer
    // to
    Query query = Query.from(schemaService.getDynamicSchema(RelationshipType.class));
    query.setUser(user);
    query.add(Restrictions.in("id", relationshipTypeMap.keySet()));
    queryService.query(query).forEach(rt -> relationshipTypeCache.put(rt.getUid(), (RelationshipType) rt));
    // Group all uids into their respective RelationshipEntities
    relationshipTypeCache.values().forEach(relationshipType -> {
        List<String> fromUids = relationshipTypeMap.get(relationshipType.getUid()).stream().map((r) -> getUidOfRelationshipItem(r.getFrom())).collect(Collectors.toList());
        List<String> toUids = relationshipTypeMap.get(relationshipType.getUid()).stream().map((r) -> getUidOfRelationshipItem(r.getTo())).collect(Collectors.toList());
        // Merge existing results with newly found ones.
        relationshipEntities.merge(relationshipType.getFromConstraint().getRelationshipEntity(), fromUids, (old, _new) -> ListUtils.union(old, _new));
        relationshipEntities.merge(relationshipType.getToConstraint().getRelationshipEntity(), toUids, (old, _new) -> ListUtils.union(old, _new));
    });
    // Find and put all Relationship members in their respective cache
    if (relationshipEntities.get(TRACKED_ENTITY_INSTANCE) != null) {
        teiDaoService.getTrackedEntityInstancesByUid(relationshipEntities.get(TRACKED_ENTITY_INSTANCE), user).forEach(tei -> trackedEntityInstanceCache.put(tei.getUid(), tei));
    }
    if (relationshipEntities.get(PROGRAM_INSTANCE) != null) {
        Query piQuery = Query.from(schemaService.getDynamicSchema(ProgramInstance.class));
        piQuery.setUser(user);
        piQuery.add(Restrictions.in("id", relationshipEntities.get(PROGRAM_INSTANCE)));
        queryService.query(piQuery).forEach(pi -> programInstanceCache.put(pi.getUid(), (ProgramInstance) pi));
    }
    if (relationshipEntities.get(PROGRAM_STAGE_INSTANCE) != null) {
        Query psiQuery = Query.from(schemaService.getDynamicSchema(ProgramStageInstance.class));
        psiQuery.setUser(user);
        psiQuery.add(Restrictions.in("id", relationshipEntities.get(PROGRAM_STAGE_INSTANCE)));
        queryService.query(psiQuery).forEach(psi -> programStageInstanceCache.put(psi.getUid(), (ProgramStageInstance) psi));
    }
}
Also used : EventService(org.hisp.dhis.dxf2.events.event.EventService) Restrictions(org.hisp.dhis.query.Restrictions) StringUtils(org.apache.commons.lang3.StringUtils) RelationshipUtils(org.hisp.dhis.commons.util.RelationshipUtils) Relationship(org.hisp.dhis.dxf2.events.trackedentity.Relationship) ImportSummary(org.hisp.dhis.dxf2.importsummary.ImportSummary) RelationshipConstraint(org.hisp.dhis.relationship.RelationshipConstraint) PROGRAM_STAGE_INSTANCE(org.hisp.dhis.relationship.RelationshipEntity.PROGRAM_STAGE_INSTANCE) Map(java.util.Map) ProgramInstance(org.hisp.dhis.program.ProgramInstance) EnrollmentService(org.hisp.dhis.dxf2.events.enrollment.EnrollmentService) Query(org.hisp.dhis.query.Query) UserService(org.hisp.dhis.user.UserService) ListUtils(org.hisp.dhis.commons.collection.ListUtils) TrackedEntityInstance(org.hisp.dhis.trackedentity.TrackedEntityInstance) SchemaService(org.hisp.dhis.schema.SchemaService) Collectors(java.util.stream.Collectors) QueryService(org.hisp.dhis.query.QueryService) Event(org.hisp.dhis.dxf2.events.event.Event) ImportReportMode(org.hisp.dhis.dxf2.metadata.feedback.ImportReportMode) Objects(java.util.Objects) List(java.util.List) TrackerAccessManager(org.hisp.dhis.trackedentity.TrackerAccessManager) Optional(java.util.Optional) Enrollment(org.hisp.dhis.dxf2.events.enrollment.Enrollment) PagingAndSortingCriteriaAdapter(org.hisp.dhis.webapi.controller.event.webrequest.PagingAndSortingCriteriaAdapter) HashMap(java.util.HashMap) ProgramStageInstance(org.hisp.dhis.program.ProgramStageInstance) Function(java.util.function.Function) PROGRAM_INSTANCE(org.hisp.dhis.relationship.RelationshipEntity.PROGRAM_INSTANCE) ArrayList(java.util.ArrayList) RelationshipParams(org.hisp.dhis.dxf2.events.RelationshipParams) Lists(com.google.common.collect.Lists) DbmsManager(org.hisp.dhis.dbms.DbmsManager) ImportConflicts(org.hisp.dhis.dxf2.importsummary.ImportConflicts) RelationshipType(org.hisp.dhis.relationship.RelationshipType) User(org.hisp.dhis.user.User) TRACKED_ENTITY_INSTANCE(org.hisp.dhis.relationship.RelationshipEntity.TRACKED_ENTITY_INSTANCE) ImportStatus(org.hisp.dhis.dxf2.importsummary.ImportStatus) RelationshipEntity(org.hisp.dhis.relationship.RelationshipEntity) TrackedEntityInstanceService(org.hisp.dhis.dxf2.events.trackedentity.TrackedEntityInstanceService) TrackedEntityInstanceParams(org.hisp.dhis.dxf2.events.TrackedEntityInstanceParams) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) ImportOptions(org.hisp.dhis.dxf2.common.ImportOptions) ImportSummaries(org.hisp.dhis.dxf2.importsummary.ImportSummaries) RelationshipItem(org.hisp.dhis.relationship.RelationshipItem) CurrentUserService(org.hisp.dhis.user.CurrentUserService) DateUtils(org.hisp.dhis.util.DateUtils) Transactional(org.springframework.transaction.annotation.Transactional) Query(org.hisp.dhis.query.Query) HashMap(java.util.HashMap) ProgramInstance(org.hisp.dhis.program.ProgramInstance) RelationshipType(org.hisp.dhis.relationship.RelationshipType) List(java.util.List) ArrayList(java.util.ArrayList) RelationshipEntity(org.hisp.dhis.relationship.RelationshipEntity) ProgramStageInstance(org.hisp.dhis.program.ProgramStageInstance)

Example 28 with Relationship

use of org.hisp.dhis.dxf2.events.trackedentity.Relationship in project dhis2-core by dhis2.

the class AbstractRelationshipService method addRelationships.

@Override
@Transactional
public ImportSummaries addRelationships(List<Relationship> relationships, ImportOptions importOptions) {
    List<List<Relationship>> partitions = Lists.partition(relationships, FLUSH_FREQUENCY);
    importOptions = updateImportOptions(importOptions);
    ImportSummaries importSummaries = new ImportSummaries();
    for (List<Relationship> _relationships : partitions) {
        reloadUser(importOptions);
        prepareCaches(_relationships, importOptions.getUser());
        for (Relationship relationship : _relationships) {
            importSummaries.addImportSummary(addRelationship(relationship, importOptions));
        }
        clearSession();
    }
    return importSummaries;
}
Also used : Relationship(org.hisp.dhis.dxf2.events.trackedentity.Relationship) List(java.util.List) ArrayList(java.util.ArrayList) ImportSummaries(org.hisp.dhis.dxf2.importsummary.ImportSummaries) Transactional(org.springframework.transaction.annotation.Transactional)

Example 29 with Relationship

use of org.hisp.dhis.dxf2.events.trackedentity.Relationship in project dhis2-core by dhis2.

the class AbstractRelationshipService method deleteRelationships.

@Override
@Transactional
public ImportSummaries deleteRelationships(List<Relationship> relationships, ImportOptions importOptions) {
    ImportSummaries importSummaries = new ImportSummaries();
    importOptions = updateImportOptions(importOptions);
    int counter = 0;
    for (Relationship relationship : relationships) {
        importSummaries.addImportSummary(deleteRelationship(relationship.getRelationship(), importOptions));
        if (counter % FLUSH_FREQUENCY == 0) {
            clearSession();
        }
        counter++;
    }
    return importSummaries;
}
Also used : Relationship(org.hisp.dhis.dxf2.events.trackedentity.Relationship) ImportSummaries(org.hisp.dhis.dxf2.importsummary.ImportSummaries) RelationshipConstraint(org.hisp.dhis.relationship.RelationshipConstraint) Transactional(org.springframework.transaction.annotation.Transactional)

Example 30 with Relationship

use of org.hisp.dhis.dxf2.events.trackedentity.Relationship in project dhis2-core by dhis2.

the class AbstractRelationshipService method processRelationshipList.

@Override
@Transactional
public ImportSummaries processRelationshipList(List<Relationship> relationships, ImportOptions importOptions) {
    ImportSummaries importSummaries = new ImportSummaries();
    importOptions = updateImportOptions(importOptions);
    List<Relationship> create = new ArrayList<>();
    List<Relationship> update = new ArrayList<>();
    List<Relationship> delete = new ArrayList<>();
    if (importOptions.getImportStrategy().isCreate()) {
        create.addAll(relationships);
    } else if (importOptions.getImportStrategy().isCreateAndUpdate()) {
        for (Relationship relationship : relationships) {
            sortCreatesAndUpdates(relationship, create, update);
        }
    } else if (importOptions.getImportStrategy().isUpdate()) {
        update.addAll(relationships);
    } else if (importOptions.getImportStrategy().isDelete()) {
        delete.addAll(relationships);
    } else if (importOptions.getImportStrategy().isSync()) {
        for (Relationship relationship : relationships) {
            sortCreatesAndUpdates(relationship, create, update);
        }
    }
    importSummaries.addImportSummaries(addRelationships(create, importOptions));
    importSummaries.addImportSummaries(updateRelationships(update, importOptions));
    importSummaries.addImportSummaries(deleteRelationships(delete, importOptions));
    if (ImportReportMode.ERRORS == importOptions.getReportMode()) {
        importSummaries.getImportSummaries().removeIf(is -> !is.hasConflicts());
    }
    return importSummaries;
}
Also used : Relationship(org.hisp.dhis.dxf2.events.trackedentity.Relationship) ArrayList(java.util.ArrayList) ImportSummaries(org.hisp.dhis.dxf2.importsummary.ImportSummaries) Transactional(org.springframework.transaction.annotation.Transactional)

Aggregations

Relationship (org.hisp.dhis.dxf2.events.trackedentity.Relationship)30 ImportSummary (org.hisp.dhis.dxf2.importsummary.ImportSummary)14 ArrayList (java.util.ArrayList)11 Transactional (org.springframework.transaction.annotation.Transactional)10 TrackedEntityInstance (org.hisp.dhis.dxf2.events.trackedentity.TrackedEntityInstance)9 Test (org.junit.jupiter.api.Test)9 List (java.util.List)8 RelationshipType (org.hisp.dhis.relationship.RelationshipType)7 Map (java.util.Map)6 Collectors (java.util.stream.Collectors)6 TrackedEntityInstanceParams (org.hisp.dhis.dxf2.events.TrackedEntityInstanceParams)6 Enrollment (org.hisp.dhis.dxf2.events.enrollment.Enrollment)6 ImportSummaries (org.hisp.dhis.dxf2.importsummary.ImportSummaries)6 Optional (java.util.Optional)5 Set (java.util.Set)5 Event (org.hisp.dhis.dxf2.events.event.Event)5 Lists (com.google.common.collect.Lists)4 Date (java.util.Date)4 HashMap (java.util.HashMap)4 CurrentUserService (org.hisp.dhis.user.CurrentUserService)4