From ac6b11089bae584808dfd3b2e1154ed283376534 Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Mon, 27 May 2024 12:43:25 +0200 Subject: [PATCH] RED-8339: Fixes --- .../service/ComponentLogService.java | 6 +- .../integration/client/ComponentClient.java | 10 + .../tests/ComponentOverrideTest.java | 91 +++ .../componentlog/exampleComponentLog.json | 655 ++++++++++++++++++ .../mapper/ComponentLogDocumentMapper.java | 17 +- .../CustomComponentRepositoryImpl.java | 7 +- .../service/ComponentLogMongoService.java | 7 +- 7 files changed, 780 insertions(+), 13 deletions(-) create mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ComponentClient.java create mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java create mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/exampleComponentLog.json diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java index ada3a840a..da069b0a8 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java @@ -124,10 +124,12 @@ public class ComponentLogService { if (optionalComponentLogEntry.isPresent()) { ComponentLogEntry componentToUpdate = optionalComponentLogEntry.get(); + componentToUpdate.setOverridden(true); componentToUpdate.setComponentValues(componentOverride.getComponentValues()); saveOverride(dossierId, fileId, componentToUpdate); auditOverride(dossierId, fileId, componentToUpdate); } else { + componentOverride.setOverridden(true); insertOverride(dossierId, fileId, componentOverride); auditOverride(dossierId, fileId, componentOverride); } @@ -144,9 +146,7 @@ public class ComponentLogService { private void insertOverride(String dossierId, String fileId, ComponentLogEntry componentToAdd) { - ComponentLog componentLog = fileManagementStorageService.getComponentLog(dossierId, fileId); - - componentLogMongoService.insertComponentLogEntries(dossierId, fileId, componentLog, List.of(componentToAdd)); + componentLogMongoService.insertComponentLogEntries(dossierId, fileId, List.of(componentToAdd)); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ComponentClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ComponentClient.java new file mode 100644 index 000000000..5a957df73 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ComponentClient.java @@ -0,0 +1,10 @@ +package com.iqser.red.service.peristence.v1.server.integration.client; + +import org.springframework.cloud.openfeign.FeignClient; + +import com.iqser.red.service.persistence.service.v2.api.external.resource.ComponentResource; + +@FeignClient(name = "ComponentResource", url = "http://localhost:28080") +public interface ComponentClient extends ComponentResource { + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java new file mode 100644 index 000000000..c660f1202 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java @@ -0,0 +1,91 @@ +package com.iqser.red.service.peristence.v1.server.integration.tests; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +import java.io.IOException; +import java.util.List; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.iqser.red.service.peristence.v1.server.integration.client.ComponentClient; +import com.iqser.red.service.peristence.v1.server.integration.client.DossierTemplateClient; +import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; +import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider; +import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog.ComponentLog; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.persistence.service.v2.api.external.model.Component; +import com.iqser.red.service.persistence.service.v2.api.external.model.ComponentValue; +import com.iqser.red.service.persistence.service.v2.api.external.model.EntityReference; + +public class ComponentOverrideTest extends AbstractPersistenceServerServiceTest { + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private DossierTesterAndProvider dossierTesterAndProvider; + + @Autowired + private FileTesterAndProvider fileTesterAndProvider; + + @Autowired + private ComponentClient componentClient; + + @Autowired + private DossierTemplateClient dossierTemplateClient; + + + @Test + public void testAddAndGetOverrides() throws IOException { + + var dossier = dossierTesterAndProvider.provideTestDossier(); + + var dossierTemplate = dossierTemplateClient.getDossierTemplate(dossier.getDossierTemplateId()); + + var file = fileTesterAndProvider.testAndProvideFile(dossier, "filename"); + + Component componentOverrideModel = Component.builder() + .name("Study_Title") + .componentValues(List.of(ComponentValue.builder() + .value("AAAA Strange Chemical Name And the rest of a title – With a dash and some more text") + .valueDescription("First found value of type title or else ''") + .componentRuleId("StudyTitle.0.0") + .entityReferences(List.of(EntityReference.builder() + .id("cf7f0d0c4c07918ce7d67b204f5fdb7d") + .type("title") + .entityRuleId("DOC.6.1") + .page(1) + .build())) + .build())) + .overridden(true) + .build(); + + var componentLogJson = new ClassPathResource("files/componentlog/exampleComponentLog.json"); + +// ComponentLog componentLog = objectMapper.readValue(componentLogJson.getInputStream(), ComponentLog.class); + + fileManagementStorageService.storeObject(dossier.getId(), file.getId(), FileType.COMPONENT_LOG, componentLogJson.getInputStream()); + ComponentLog componentLog = fileManagementStorageService.getComponentLog(dossier.getId(), file.getId()); + + componentClient.addOverride(dossierTemplate.getId(), dossier.getId(), file.getId(), componentOverrideModel); + + var overrides = componentClient.getOverrides(dossierTemplate.getId(), dossier.getId(), file.getId()); + + assertEquals(dossierTemplate.getId(), overrides.getDossierTemplateId()); + assertEquals(dossier.getId(), overrides.getDossierId()); + assertEquals(file.getId(), overrides.getFileId()); + + assertFalse(overrides.getComponentOverrideModels().isEmpty()); + + var sth = componentClient.getComponents(dossierTemplate.getId(), dossier.getId(), file.getId(), true); + + System.out.println(sth); + System.out.println("See ya"); + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/exampleComponentLog.json b/persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/exampleComponentLog.json new file mode 100644 index 000000000..5858a620e --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/exampleComponentLog.json @@ -0,0 +1,655 @@ +{ + "analysisNumber": 1, + "componentRulesVersion": 1, + "componentLogEntries": [ + { + "name": "Study_Title", + "componentValues": [ + { + "value": "Strange Chemical Name And the rest of a title – With a dash and some more text", + "originalValue": "Strange Chemical Name And the rest of a title – With a dash and some more text", + "valueDescription": "First found value of type title or else ''", + "componentRuleId": "StudyTitle.0.0", + "componentLogEntityReferences": [ + { + "id": "cf7f0d0c4c07918ce7d67b204f5fdb7d", + "type": "title", + "entityRuleId": "DOC.6.1", + "page": 1 + }, + { + "id": "cf7f0d0c4c07918ce7d67b204f5fdb7d", + "type": "title", + "entityRuleId": "DOC.6.1", + "page": 1 + } + ] + } + ], + "overridden": false + }, + { + "name": "Performing_Laboratory", + "componentValues": [ + { + "value": "Test Labor Deutschland AG, Switzerland", + "originalValue": "Test Labor Deutschland AG, Switzerland", + "valueDescription": "Laboratory name and country found!", + "componentRuleId": "PerformingLaboratory.1.0", + "componentLogEntityReferences": [ + { + "id": "cdfa1386cc0b1c665c7dfb1b8bd2a134", + "type": "laboratory_name", + "entityRuleId": "DOC.7.0", + "page": 1 + }, + { + "id": "281e6f46a8b400cfb66e02ed51cd6a7a", + "type": "laboratory_country", + "entityRuleId": "DOC.7.2", + "page": 1 + } + ] + }, + { + "value": "Test Labor Deutschland AG, Switzerland", + "originalValue": "Test Labor Deutschland AG, Switzerland", + "valueDescription": "Laboratory name and country found!", + "componentRuleId": "PerformingLaboratory.1.0", + "componentLogEntityReferences": [ + { + "id": "cdfa1386cc0b1c665c7dfb1b8bd2a134", + "type": "laboratory_name", + "entityRuleId": "DOC.7.0", + "page": 1 + }, + { + "id": "281e6f46a8b400cfb66e02ed51cd6a7a", + "type": "laboratory_country", + "entityRuleId": "DOC.7.2", + "page": 1 + } + ] + }, + { + "value": "Test Labor Deutschland AG, Switzerland", + "originalValue": "Test Labor Deutschland AG, Switzerland", + "valueDescription": "Laboratory name and country found!", + "componentRuleId": "PerformingLaboratory.1.0", + "componentLogEntityReferences": [ + { + "id": "cdfa1386cc0b1c665c7dfb1b8bd2a134", + "type": "laboratory_name", + "entityRuleId": "DOC.7.0", + "page": 1 + }, + { + "id": "281e6f46a8b400cfb66e02ed51cd6a7a", + "type": "laboratory_country", + "entityRuleId": "DOC.7.2", + "page": 1 + } + ] + }, + { + "value": "Test Labor Deutschland AG, Switzerland", + "originalValue": "Test Labor Deutschland AG, Switzerland", + "valueDescription": "Laboratory name and country found!", + "componentRuleId": "PerformingLaboratory.1.0", + "componentLogEntityReferences": [ + { + "id": "cdfa1386cc0b1c665c7dfb1b8bd2a134", + "type": "laboratory_name", + "entityRuleId": "DOC.7.0", + "page": 1 + }, + { + "id": "281e6f46a8b400cfb66e02ed51cd6a7a", + "type": "laboratory_country", + "entityRuleId": "DOC.7.2", + "page": 1 + } + ] + } + ], + "overridden": false + }, + { + "name": "Report_Number", + "componentValues": [ + { + "value": "11/111-111A", + "originalValue": "11/111-111A", + "valueDescription": "First found value of type report_number or else ''", + "componentRuleId": "ReportNumber.0.0", + "componentLogEntityReferences": [ + { + "id": "e2a93bcc72e9740bbfc19bd9cd982e01", + "type": "report_number", + "entityRuleId": "DOC.2.0", + "page": 1 + }, + { + "id": "e2a93bcc72e9740bbfc19bd9cd982e01", + "type": "report_number", + "entityRuleId": "DOC.2.0", + "page": 1 + } + ] + } + ], + "overridden": false + }, + { + "name": "GLP_Study", + "componentValues": [ + { + "value": "Yes", + "originalValue": "Yes", + "valueDescription": "Yes if present, No if not", + "componentRuleId": "GLPStudy.0.0", + "componentLogEntityReferences": [ + { + "id": "f898e5d91723480a4595d70371066a7f", + "type": "glp_study", + "entityRuleId": "DOC.8.0", + "page": 2 + }, + { + "id": "f898e5d91723480a4595d70371066a7f", + "type": "glp_study", + "entityRuleId": "DOC.8.0", + "page": 2 + }, + { + "id": "bb6817a9356ce9569d314a321aa44ad1", + "type": "glp_study", + "entityRuleId": "DOC.8.0", + "page": 11 + }, + { + "id": "bb6817a9356ce9569d314a321aa44ad1", + "type": "glp_study", + "entityRuleId": "DOC.8.0", + "page": 11 + } + ] + } + ], + "overridden": false + }, + { + "name": "Test_Guidelines_1", + "componentValues": [ + { + "value": "Nº 402: Acute Dermal Toxicity (09/10/2017)", + "originalValue": "Nº 402: Acute Dermal Toxicity (09/10/2017)", + "valueDescription": "OECD Number and guideline year mapped!", + "componentRuleId": "TestGuideline.0.0", + "componentLogEntityReferences": [ + { + "id": "fa103d7d55a67aff195a42d46cf5b1b1", + "type": "oecd_guideline_number", + "entityRuleId": "DOC.1.0", + "page": 1 + }, + { + "id": "a6a07692a60d3b8ef8d1261f23ab20c7", + "type": "oecd_guideline_year", + "entityRuleId": "DOC.1.0", + "page": 1 + } + ] + } + ], + "overridden": false + }, + { + "name": "Test_Guidelines_2", + "componentValues": [ + { + "value": "EPA 870.1200 (1998), EPA 870.1200 (1998), EC 440/2008, B.3 (2008), EC 440/2008, B.3 (2008)", + "originalValue": "EPA 870.1200 (1998), EPA 870.1200 (1998), EC 440/2008, B.3 (2008), EC 440/2008, B.3 (2008)", + "valueDescription": "Joining all values of type epa_guideline, ec_guideline with ', '", + "componentRuleId": "TestGuideline.2.0", + "componentLogEntityReferences": [ + { + "id": "80890bae7f2ea65c43f2e82ab847c424", + "type": "epa_guideline", + "entityRuleId": "DOC.1.0", + "page": 1 + }, + { + "id": "80890bae7f2ea65c43f2e82ab847c424", + "type": "epa_guideline", + "entityRuleId": "DOC.1.0", + "page": 1 + }, + { + "id": "7a23ea595ed928d777d00f1afa61f552", + "type": "ec_guideline", + "entityRuleId": "DOC.1.0", + "page": 1 + }, + { + "id": "7a23ea595ed928d777d00f1afa61f552", + "type": "ec_guideline", + "entityRuleId": "DOC.1.0", + "page": 1 + } + ] + } + ], + "overridden": false + }, + { + "name": "Experimental_Starting_Date", + "componentValues": [ + { + "value": "14/05/2010, 14/05/2010", + "originalValue": "14/05/2010, 14/05/2010", + "valueDescription": "Convert values of type 'experimental_start_date' to dd/MM/yyyy joined with ', '", + "componentRuleId": "StartDate.0.0", + "componentLogEntityReferences": [ + { + "id": "9819e3a491c9841ba76a526b215c2adf", + "type": "experimental_start_date", + "entityRuleId": "DOC.3.0", + "page": 3 + }, + { + "id": "9819e3a491c9841ba76a526b215c2adf", + "type": "experimental_start_date", + "entityRuleId": "DOC.3.0", + "page": 3 + } + ] + } + ], + "overridden": false + }, + { + "name": "Experimental_Completion_Date", + "componentValues": [ + { + "value": "21/05/2010, 21/05/2010", + "originalValue": "21/05/2010, 21/05/2010", + "valueDescription": "Convert values of type 'experimental_end_date' to dd/MM/yyyy joined with ', '", + "componentRuleId": "CompletionDate.0.0", + "componentLogEntityReferences": [ + { + "id": "9a2a7922adf21476bd8718f154fc1fb0", + "type": "experimental_end_date", + "entityRuleId": "DOC.4.0", + "page": 3 + }, + { + "id": "9a2a7922adf21476bd8718f154fc1fb0", + "type": "experimental_end_date", + "entityRuleId": "DOC.4.0", + "page": 3 + } + ] + } + ], + "overridden": false + }, + { + "name": "Certificate_of_Analysis_Batch_Identification", + "componentValues": [ + { + "value": "AAA111-111-111", + "originalValue": "AAA111-111-111", + "valueDescription": "Joining all unique values of type batch_number with ', '", + "componentRuleId": "AnalysisCertificate.0.0", + "componentLogEntityReferences": [ + { + "id": "2910c0d523ad15f9619e3c6b46200533", + "type": "batch_number", + "entityRuleId": "DOC.9.1", + "page": 6 + }, + { + "id": "2910c0d523ad15f9619e3c6b46200533", + "type": "batch_number", + "entityRuleId": "DOC.9.1", + "page": 6 + }, + { + "id": "b028246b799b7e32c0aef31e413c187f", + "type": "batch_number", + "entityRuleId": "DOC.9.1", + "page": 10 + }, + { + "id": "b028246b799b7e32c0aef31e413c187f", + "type": "batch_number", + "entityRuleId": "DOC.9.1", + "page": 10 + } + ] + } + ], + "overridden": false + }, + { + "name": "Species", + "componentValues": [ + { + "value": "rats", + "originalValue": "rats", + "valueDescription": "First found value of type species or else ''", + "componentRuleId": "Species.0.0", + "componentLogEntityReferences": [ + { + "id": "5f0b08c0e3d98545cd7647aac82b6bf2", + "type": "species", + "entityRuleId": "DOC.5.2", + "page": 7 + }, + { + "id": "5f0b08c0e3d98545cd7647aac82b6bf2", + "type": "species", + "entityRuleId": "DOC.5.2", + "page": 7 + }, + { + "id": "18ab2f51b57c2f91cea9350621e7152f", + "type": "species", + "entityRuleId": "DOC.5.2", + "page": 7 + }, + { + "id": "18ab2f51b57c2f91cea9350621e7152f", + "type": "species", + "entityRuleId": "DOC.5.2", + "page": 7 + }, + { + "id": "5557fd15f4c4e3e519cce0f47f64d3e1", + "type": "species", + "entityRuleId": "DOC.5.2", + "page": 7 + }, + { + "id": "5557fd15f4c4e3e519cce0f47f64d3e1", + "type": "species", + "entityRuleId": "DOC.5.2", + "page": 7 + }, + { + "id": "665743f4475ff7c82e642b2901376b28", + "type": "species", + "entityRuleId": "DOC.5.2", + "page": 7 + }, + { + "id": "665743f4475ff7c82e642b2901376b28", + "type": "species", + "entityRuleId": "DOC.5.2", + "page": 7 + } + ] + } + ], + "overridden": false + }, + { + "name": "Strain", + "componentValues": [ + { + "value": "Crl:WI Wistar", + "originalValue": "Crl:WI Wistar", + "valueDescription": "First found value of type strain or else ''", + "componentRuleId": "Strain.0.0", + "componentLogEntityReferences": [ + { + "id": "a77b13568f8d6885faabf90119dd9b40", + "type": "strain", + "entityRuleId": "DOC.5.3", + "page": 7 + }, + { + "id": "a77b13568f8d6885faabf90119dd9b40", + "type": "strain", + "entityRuleId": "DOC.5.3", + "page": 7 + }, + { + "id": "818d354d9dc4158e4c05e96de099f39c", + "type": "strain", + "entityRuleId": "DOC.5.3", + "page": 7 + }, + { + "id": "818d354d9dc4158e4c05e96de099f39c", + "type": "strain", + "entityRuleId": "DOC.5.3", + "page": 7 + } + ] + } + ], + "overridden": false + }, + { + "name": "Doses_mg_per_kg_bw", + "componentValues": [ + { + "value": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", + "originalValue": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", + "valueDescription": "Joining all values of type doses_(mg_kg_bw) with ' '", + "componentRuleId": "Necropsy.1.0", + "componentLogEntityReferences": [ + { + "id": "92b67bcf7b5f7f7bdfcb6d0991e6b4c2", + "type": "doses_(mg_kg_bw)", + "entityRuleId": "DOC.35.0", + "page": 4 + }, + { + "id": "92b67bcf7b5f7f7bdfcb6d0991e6b4c2", + "type": "doses_(mg_kg_bw)", + "entityRuleId": "DOC.35.0", + "page": 4 + }, + { + "id": "67e8421d095ed4c003ca2c21a120c00b", + "type": "doses_(mg_kg_bw)", + "entityRuleId": "DOC.35.0", + "page": 4 + }, + { + "id": "67e8421d095ed4c003ca2c21a120c00b", + "type": "doses_(mg_kg_bw)", + "entityRuleId": "DOC.35.0", + "page": 4 + } + ] + } + ], + "overridden": false + }, + { + "name": "Mortality_Statement", + "componentValues": [ + { + "value": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", + "originalValue": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", + "valueDescription": "Joining all values of type mortality_statement with ' '", + "componentRuleId": "MortalityStatement.0.0", + "componentLogEntityReferences": [ + { + "id": "08b4d86a822d87d6f4e7b1efdd364181", + "type": "mortality_statement", + "entityRuleId": "DOC.32.0", + "page": 8 + }, + { + "id": "08b4d86a822d87d6f4e7b1efdd364181", + "type": "mortality_statement", + "entityRuleId": "DOC.32.0", + "page": 8 + }, + { + "id": "cc1c76d7e9bd09483b1ffa91a0749c2c", + "type": "mortality_statement", + "entityRuleId": "DOC.32.0", + "page": 8 + }, + { + "id": "cc1c76d7e9bd09483b1ffa91a0749c2c", + "type": "mortality_statement", + "entityRuleId": "DOC.32.0", + "page": 8 + } + ] + } + ], + "overridden": false + }, + { + "name": "Weight_Behavior_Changes", + "componentValues": [ + { + "value": "", + "originalValue": "", + "valueDescription": "Joining all values of type with '\n'", + "componentRuleId": "WeightBehavior.0.0", + "componentLogEntityReferences": [] + } + ], + "overridden": false + }, + { + "name": "Necropsy_Findings", + "componentValues": [ + { + "value": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", + "originalValue": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", + "valueDescription": "Joining all values of type necropsy_findings with ' '", + "componentRuleId": "Necropsy.0.0", + "componentLogEntityReferences": [ + { + "id": "069397e80191213e72c792f177a22185", + "type": "necropsy_findings", + "entityRuleId": "DOC.17.0", + "page": 9 + }, + { + "id": "069397e80191213e72c792f177a22185", + "type": "necropsy_findings", + "entityRuleId": "DOC.17.0", + "page": 9 + } + ] + } + ], + "overridden": false + }, + { + "name": "Deviation_from_the_Guideline", + "componentValues": [ + { + "value": "There was no deviation from the guidelines and from the Study Plan.\nThere was no deviation from the guidelines and from the Study Plan.", + "originalValue": "There was no deviation from the guidelines and from the Study Plan.\nThere was no deviation from the guidelines and from the Study Plan.", + "valueDescription": "Joining all values of type guideline_deviation with '\n'", + "componentRuleId": "GuidelineDeviation.0.0", + "componentLogEntityReferences": [ + { + "id": "4553fb6da48b0c6d6d5d45860c7e473d", + "type": "guideline_deviation", + "entityRuleId": "DOC.11.0", + "page": 3 + }, + { + "id": "4553fb6da48b0c6d6d5d45860c7e473d", + "type": "guideline_deviation", + "entityRuleId": "DOC.11.0", + "page": 3 + } + ] + } + ], + "overridden": false + }, + { + "name": "Conclusion_LD50_Greater_than", + "componentValues": [ + { + "value": "", + "originalValue": "", + "valueDescription": "No entity of type 'ld50_greater' found", + "componentRuleId": "Conclusion.1.1", + "componentLogEntityReferences": [] + } + ], + "overridden": false + }, + { + "name": "Conclusion_LD50_mg_per_kg", + "componentValues": [ + { + "value": "", + "originalValue": "", + "valueDescription": "Joining all unique values of type with ', '", + "componentRuleId": "Conclusion.0.0", + "componentLogEntityReferences": [] + } + ], + "overridden": false + }, + { + "name": "Conclusion_Minimum_Confidence", + "componentValues": [ + { + "value": "", + "originalValue": "", + "valueDescription": "Joining all unique values of type with ', '", + "componentRuleId": "Conclusion.2.0", + "componentLogEntityReferences": [] + } + ], + "overridden": false + }, + { + "name": "Conclusion_Maximum_Confidence", + "componentValues": [ + { + "value": "", + "originalValue": "", + "valueDescription": "Joining all unique values of type with ', '", + "componentRuleId": "Conclusion.3.0", + "componentLogEntityReferences": [] + } + ], + "overridden": false + }, + { + "name": "Study_Conclusion", + "componentValues": [ + { + "value": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", + "originalValue": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", + "valueDescription": "Joining all values of type study_conclusion with ' '", + "componentRuleId": "StudyConclusion.0.0", + "componentLogEntityReferences": [ + { + "id": "d9c491f44d607083e9e6609b19498d21", + "type": "study_conclusion", + "entityRuleId": "DOC.15.0", + "page": 4 + }, + { + "id": "d9c491f44d607083e9e6609b19498d21", + "type": "study_conclusion", + "entityRuleId": "DOC.15.0", + "page": 4 + } + ] + } + ], + "overridden": false + } + ] +} \ No newline at end of file diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/mapper/ComponentLogDocumentMapper.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/mapper/ComponentLogDocumentMapper.java index 67dafef80..5d251f240 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/mapper/ComponentLogDocumentMapper.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/mapper/ComponentLogDocumentMapper.java @@ -1,5 +1,6 @@ package com.iqser.red.service.persistence.service.v1.api.shared.mongo.mapper; +import java.util.ArrayList; import java.util.List; import org.mapstruct.Mapper; @@ -20,8 +21,20 @@ public interface ComponentLogDocumentMapper { @Mapping(source = "components", target = "componentLogEntries") ComponentLog fromComponentLogDocument(ComponentLogDocument componentLogDocument); + default List toComponentDocuments(String dossierId, String fileId, List componentLogEntries) { + List componentDocuments = new ArrayList<>(); - List toComponentDocuments(List componentLogEntries); + String componentLogId = getComponentLogId(dossierId, fileId); + for (ComponentLogEntry componentLogEntry : componentLogEntries) { + ComponentDocument componentDocument = new ComponentDocument(); + componentDocument.setId(getComponentId(componentLogId, componentLogEntry.getName())); + componentDocument.setComponentLogId(componentLogId); + componentDocument.setName(componentLogEntry.getName()); + componentDocument.setOverrideValues(componentLogEntry.getComponentValues()); + componentDocuments.add(componentDocument); + } + return componentDocuments; + } @Mapping(source = "overrideValues", target = "componentValues") @@ -29,10 +42,12 @@ public interface ComponentLogDocumentMapper { @Mapping(expression = "java(getComponentLogId(dossierId, fileId))", target = "id") + @Mapping(expression = "java(toComponentDocuments(dossierId, fileId, componentLog.getComponentLogEntries()))", target = "components") ComponentLogDocument toComponentLogDocument(String dossierId, String fileId, ComponentLog componentLog); @Mapping(expression = "java(getComponentId(componentLogId, componentLogEntry.getName()))", target = "id") + @Mapping(source = "componentLogEntry.componentValues", target = "overrideValues") ComponentDocument toComponentDocument(String componentLogId, ComponentLogEntry componentLogEntry); diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepositoryImpl.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepositoryImpl.java index 344e0f8ca..72a23adef 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepositoryImpl.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepositoryImpl.java @@ -29,9 +29,10 @@ public class CustomComponentRepositoryImpl implements CustomComponentRepository @Override public List findOverrides(String fileId, String dossierId) { - LookupOperation lookupOperation = LookupOperation.newLookup().from("componentDocument").localField("components").foreignField("_id").as("componentDocs"); + LookupOperation lookupOperation = LookupOperation.newLookup().from("components").localField("overrideValues").foreignField("_id").as("componentDocs"); - AggregationOperation matchOperation = match(Criteria.where("fileId").is(fileId).and("dossierId").is(dossierId)); + AggregationOperation matchOperation = match(Criteria.where("componentLogId").is(dossierId + "/" + fileId)); +// AggregationOperation matchOperation = match(Criteria.where("fileId").is(fileId).and("dossierId").is(dossierId)); AggregationOperation unwindOperation = unwind("componentDocs"); @@ -41,7 +42,7 @@ public class CustomComponentRepositoryImpl implements CustomComponentRepository Aggregation aggregation = newAggregation(matchOperation, lookupOperation, unwindOperation, matchNonEmptyOverrides, replaceRootOperation); - AggregationResults results = mongoTemplate.aggregate(aggregation, "componentLogDocument", ComponentDocument.class); + AggregationResults results = mongoTemplate.aggregate(aggregation, "component-logs", ComponentDocument.class); return results.getMappedResults(); } diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java index ee954e8da..ff6acde63 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java @@ -97,20 +97,15 @@ public class ComponentLogMongoService { } - public void insertComponentLogEntries(String dossierId, String fileId, ComponentLog componentLog, List componentLogEntries) { + public void insertComponentLogEntries(String dossierId, String fileId, List componentLogEntries) { String componentLogId = mapper.getComponentLogId(dossierId, fileId); - ComponentLogDocument componentLogDocument = mapper.toComponentLogDocument(dossierId, fileId, componentLog); - List componentDocuments = componentLogEntries.stream() .map(componentLogEntry -> mapper.toComponentDocument(componentLogId, componentLogEntry)) .toList(); - componentLogDocument.getComponents().addAll(componentDocuments); - componentDocumentRepository.insert(componentDocuments); - componentLogDocumentRepository.save(componentLogDocument); }