From 51010c07d2c1975d4e2808169e79e10df4eed5c0 Mon Sep 17 00:00:00 2001 From: corinaolariu Date: Wed, 13 Nov 2024 10:37:47 +0200 Subject: [PATCH 1/2] RED-10425 - Annotation added twice when bulk-force while auto-analysis is disabled - check for link with dictionary entry in the entity log after the found terms are received for an addbulklocal - unit test added --- ...SearchTermOccurrencesResponseReceiver.java | 40 ++++- .../tests/ManualRedactionTest.java | 148 ++++++++++++++++++ 2 files changed, 180 insertions(+), 8 deletions(-) diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/queue/SearchTermOccurrencesResponseReceiver.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/queue/SearchTermOccurrencesResponseReceiver.java index dd2837135..33912b535 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/queue/SearchTermOccurrencesResponseReceiver.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/queue/SearchTermOccurrencesResponseReceiver.java @@ -1,6 +1,7 @@ package com.iqser.red.service.persistence.management.v1.processor.service.queue; import java.io.IOException; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; @@ -21,12 +22,16 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.iqser.red.service.persistence.management.v1.processor.model.websocket.AnalyseStatus; import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.EntityLogService; import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.websocket.WebsocketService; import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; import com.iqser.red.service.persistence.service.v1.api.shared.model.BulkLocalResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.FoundTerm; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLog; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryState; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualAnnotationResponse; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle; @@ -56,6 +61,7 @@ public class SearchTermOccurrencesResponseReceiver { AuditPersistenceService auditPersistenceService; FileStatusPersistenceService fileStatusPersistenceService; WebsocketService webSocketService; + EntityLogService entityLogService; @RabbitHandler @@ -85,17 +91,20 @@ public class SearchTermOccurrencesResponseReceiver { var dossier = dossierManagementService.getDossierById(response.getDossierId(), false, false); + var entityLog = entityLogService.getEntityLog(response.getDossierId(), response.getFileId(), new ArrayList<>(), false); + Set addRedactionRequests = response.getFoundTerms() .stream() .map(term -> AddRedactionRequestModel.builder() - .type(response.getType()) - .value(term.value()) - .reason(response.getReason()) - .legalBasis(response.getLegalBasis()) - .positions(convertPositions(term.positions())) - .section(response.getSection()) - .comment(response.getComment() == null ? null : new AddCommentRequestModel(response.getComment())) - .build()) + .type(response.getType()) + .value(term.value()) + .reason(response.getReason()) + .legalBasis(response.getLegalBasis()) + .positions(convertPositions(term.positions())) + .section(response.getSection()) + .comment(response.getComment() == null ? null : new AddCommentRequestModel(response.getComment())) + .sourceId(getAnnotationId(entityLog, term)) + .build()) .collect(Collectors.toSet()); log.info("Received manual redaction requests for file {} in dossier {} after term search", response.getFileId(), dossier.getId()); @@ -125,6 +134,21 @@ public class SearchTermOccurrencesResponseReceiver { } + private String getAnnotationId(EntityLog entityLog, FoundTerm term) { + + var optionalEntry = entityLog.getEntityLogEntry() + .stream() + .filter(entry -> entry.getValue().equals(term.value()) + && entry.getPositions().equals(term.positions()) + && (entry.isDictionaryEntry() || entry.isDossierDictionaryEntry())) + .findFirst(); + if (optionalEntry.isPresent()) { + return optionalEntry.get().getId(); + } + return null; + } + + private List convertPositions(List positions) { return positions.stream() diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java index 094b1c43f..2d2936f9f 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java @@ -4174,4 +4174,152 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { } } } + + @Test + public void testSingleForceAndBulkForceOnDictEntryAutomaticAnalysisOff() { + + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + var dossier = dossierTesterAndProvider.provideTestDossier(dossierTemplate); + var file = fileTesterAndProvider.testAndProvideFile(dossier); + + fileStatusPersistenceService.toggleAutomaticAnalysis(file.getId(), true); + whenGetEntityLogInvocation(); + + var type1 = typeProvider.testAndProvideType(dossierTemplate, dossier, "test1", false, 70); + + List entityLogEntries = new ArrayList<>(); + String legal2 = "Legal 2"; + String legal3 = "Legal 3"; + String darthVader = "Darth Vader"; + List position1 = List.of(new Position(56.8f, 528.9f, 120.96f, 12.64f, 1)); + List position2 = List.of(new Position(56.8f, 501.3f, 120.96f, 12.64f, 1)); + List position3 = List.of(new Position(56.8f, 473.7f, 120.96f, 12.64f, 1)); + List position4 = List.of(new Position(56.8f, 446.1f, 120.96f, 12.64f, 1)); + entityLogEntries.add(EntityLogEntry.builder() + .id("AnnotationId1") + .type(type1.getType()) + .value(darthVader) + .entryType(EntryType.ENTITY) + .state(EntryState.SKIPPED) + .section("section") + .legalBasis("Legal 1") + .engines(Set.of(Engine.DOSSIER_DICTIONARY)) + .dictionaryEntry(true) + .dossierDictionaryEntry(true) + .positions(position1) + .build()); + entityLogEntries.add(EntityLogEntry.builder() + .id("AnnotationId2") + .type(type1.getType()) + .value(darthVader) + .entryType(EntryType.ENTITY) + .state(EntryState.SKIPPED) + .section("section") + .legalBasis("Legal 1") + .engines(Set.of(Engine.DOSSIER_DICTIONARY)) + .dictionaryEntry(true) + .dossierDictionaryEntry(true) + .positions(position2) + .build()); + entityLogEntries.add(EntityLogEntry.builder() + .id("AnnotationId3") + .type(type1.getType()) + .value(darthVader) + .entryType(EntryType.ENTITY) + .state(EntryState.SKIPPED) + .section("section") + .legalBasis("Legal 1") + .engines(Set.of(Engine.DOSSIER_DICTIONARY)) + .dictionaryEntry(true) + .dossierDictionaryEntry(true) + .positions(position3) + .build()); + entityLogEntries.add(EntityLogEntry.builder() + .id("AnnotationId4") + .type(type1.getType()) + .value(darthVader) + .entryType(EntryType.ENTITY) + .state(EntryState.SKIPPED) + .section("section") + .legalBasis("Legal 1") + .engines(Set.of(Engine.DOSSIER_DICTIONARY)) + .dictionaryEntry(true) + .dossierDictionaryEntry(true) + .positions(position4) + .build()); +// } + var entityLog = new EntityLog(1, 1, entityLogEntries, null, 0, 0, 0, 0); + fileManagementStorageService.saveEntityLog(dossier.getId(), file.getId(), entityLog); + + // single force + manualRedactionClient.forceRedactionBulk(dossier.getId(), file.getId(), Set.of(ForceRedactionRequestModel.builder() + .annotationId("AnnotationId1") + .legalBasis(legal2) + .build())); + + var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), true, false); + + assertEquals(allManualRedactions.getForceRedactions().size(), 1); + assertEquals(allManualRedactions.getEntriesToAdd().size(), 1); + var entryToAdd = allManualRedactions.getEntriesToAdd() + .stream() + .findFirst() + .get(); + assertFalse(entryToAdd.isAddToDictionary()); + assertFalse(entryToAdd.isAddToDossierDictionary()); + assertEquals(entryToAdd.getValue(), darthVader); + + //bulk force + manualRedactionClient.addRedactionBulkLocal(dossier.getId(), + file.getId(), + AddRedactionBulkLocalRequestModel.builder() + .type(type1.getType()) + .value(darthVader) + .legalBasis(legal3) + .reason("reason") + .section("section") + .positions(List.of(new Rectangle(56.8f, 528.9f, 120.96f, 12.64f, 0))) + .build()); + List foundTerms = new ArrayList<>(); + foundTerms.add(new FoundTerm(position1, darthVader)); + foundTerms.add(new FoundTerm(position2, darthVader)); + foundTerms.add(new FoundTerm(position3, darthVader)); + foundTerms.add(new FoundTerm(position4, darthVader)); + + BulkLocalResponse addValueBackResponse = BulkLocalResponse.builder() + .fileId(file.getId()) + .dossierId(dossier.getId()) + .type(type1.getType()) + .legalBasis(legal3) + .reason("reason") + .section("section") + .foundTerms(foundTerms) + .userId("user") + .build(); + searchTermOccurrencesResponseReceiver.receive(addValueBackResponse); + + allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), true, false); + // check that there is a link to the dictionary entries. the merge of entity log will take case of them based on the sourceId + assertEquals(allManualRedactions.getForceRedactions().size(), 1); + assertEquals(allManualRedactions.getEntriesToAdd().size(), 5); + var addLocalBulk1 = allManualRedactions.getEntriesToAdd().stream().filter(e -> convertPositions(position1).equals(e.getPositions())).findFirst(); + assertThat(addLocalBulk1.isPresent()).isTrue(); + assertThat(addLocalBulk1.get().getSourceId()).isEqualTo("AnnotationId1"); + var addLocalBulk2 = allManualRedactions.getEntriesToAdd().stream().filter(e -> convertPositions(position2).equals(e.getPositions())).findFirst(); + assertThat(addLocalBulk2.isPresent()).isTrue(); + assertThat(addLocalBulk2.get().getSourceId()).isEqualTo("AnnotationId2"); + var addLocalBulk3 = allManualRedactions.getEntriesToAdd().stream().filter(e -> convertPositions(position3).equals(e.getPositions())).findFirst(); + assertThat(addLocalBulk3.isPresent()).isTrue(); + assertThat(addLocalBulk3.get().getSourceId()).isEqualTo("AnnotationId3"); + var addLocalBulk4 = allManualRedactions.getEntriesToAdd().stream().filter(e -> convertPositions(position4).equals(e.getPositions())).findFirst(); + assertThat(addLocalBulk4.isPresent()).isTrue(); + assertThat(addLocalBulk4.get().getSourceId()).isEqualTo("AnnotationId4"); + } + + private List convertPositions(List positions) { + + return positions.stream() + .map(position -> Rectangle.builder().page(position.getPageNumber()).height(position.h()).width(position.w()).topLeftX(position.x()).topLeftY(position.y()).build()) + .toList(); + } } From ab2a0a446e9cbe9d8a1cacf7eb0a768826bee6ad Mon Sep 17 00:00:00 2001 From: corinaolariu Date: Wed, 13 Nov 2024 13:31:52 +0200 Subject: [PATCH 2/2] RED-10425 - Annotation added twice when bulk-force while auto-analysis is disabled - use a custom query to get the dictionary entity log entries with the found value and positions list needed instead of the entire entity log - add index for entityLogId and value --- ...SearchTermOccurrencesResponseReceiver.java | 44 +++++++++---------- .../changelog/mongo.changelog-tenant.xml | 9 ++-- .../tenant/7-add-entity-log-value-index.xml | 23 ++++++++++ .../tests/ManualRedactionTest.java | 1 - .../EntityLogEntryDocumentRepository.java | 10 +++++ .../mongo/service/EntityLogMongoService.java | 14 ++++++ 6 files changed, 74 insertions(+), 27 deletions(-) create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/tenant/7-add-entity-log-value-index.xml diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/queue/SearchTermOccurrencesResponseReceiver.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/queue/SearchTermOccurrencesResponseReceiver.java index 33912b535..fe4e07c5e 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/queue/SearchTermOccurrencesResponseReceiver.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/queue/SearchTermOccurrencesResponseReceiver.java @@ -1,7 +1,6 @@ package com.iqser.red.service.persistence.management.v1.processor.service.queue; import java.io.IOException; -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; @@ -13,7 +12,6 @@ import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextImpl; import org.springframework.stereotype.Service; @@ -22,7 +20,6 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.iqser.red.service.persistence.management.v1.processor.model.websocket.AnalyseStatus; import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; -import com.iqser.red.service.persistence.management.v1.processor.service.EntityLogService; import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; @@ -30,8 +27,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.websock import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; import com.iqser.red.service.persistence.service.v1.api.shared.model.BulkLocalResponse; import com.iqser.red.service.persistence.service.v1.api.shared.model.FoundTerm; -import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLog; -import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryState; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLogEntry; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualAnnotationResponse; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle; @@ -39,6 +35,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.Audit import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddCommentRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddRedactionRequestModel; +import com.iqser.red.service.persistence.service.v1.api.shared.mongo.service.EntityLogMongoService; import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import lombok.AccessLevel; @@ -61,7 +58,7 @@ public class SearchTermOccurrencesResponseReceiver { AuditPersistenceService auditPersistenceService; FileStatusPersistenceService fileStatusPersistenceService; WebsocketService webSocketService; - EntityLogService entityLogService; + EntityLogMongoService entityLogMongoService; @RabbitHandler @@ -91,20 +88,26 @@ public class SearchTermOccurrencesResponseReceiver { var dossier = dossierManagementService.getDossierById(response.getDossierId(), false, false); - var entityLog = entityLogService.getEntityLog(response.getDossierId(), response.getFileId(), new ArrayList<>(), false); + var foundValue = response.getFoundTerms() + .get(0).value(); + List> positionsList = response.getFoundTerms() + .stream() + .map(FoundTerm::positions) + .collect(Collectors.toList()); + var entityLogEntries = entityLogMongoService.findDictionaryEntityLogEntriesByValueAndPositions(response.getDossierId(), response.getFileId(), foundValue, positionsList); Set addRedactionRequests = response.getFoundTerms() .stream() .map(term -> AddRedactionRequestModel.builder() - .type(response.getType()) - .value(term.value()) - .reason(response.getReason()) - .legalBasis(response.getLegalBasis()) - .positions(convertPositions(term.positions())) - .section(response.getSection()) - .comment(response.getComment() == null ? null : new AddCommentRequestModel(response.getComment())) - .sourceId(getAnnotationId(entityLog, term)) - .build()) + .type(response.getType()) + .value(term.value()) + .reason(response.getReason()) + .legalBasis(response.getLegalBasis()) + .positions(convertPositions(term.positions())) + .section(response.getSection()) + .comment(response.getComment() == null ? null : new AddCommentRequestModel(response.getComment())) + .sourceId(getAnnotationId(entityLogEntries, term)) + .build()) .collect(Collectors.toSet()); log.info("Received manual redaction requests for file {} in dossier {} after term search", response.getFileId(), dossier.getId()); @@ -134,13 +137,10 @@ public class SearchTermOccurrencesResponseReceiver { } - private String getAnnotationId(EntityLog entityLog, FoundTerm term) { + private String getAnnotationId(Set entityLogEntries, FoundTerm term) { - var optionalEntry = entityLog.getEntityLogEntry() - .stream() - .filter(entry -> entry.getValue().equals(term.value()) - && entry.getPositions().equals(term.positions()) - && (entry.isDictionaryEntry() || entry.isDossierDictionaryEntry())) + var optionalEntry = entityLogEntries.stream() + .filter(entry -> entry.getPositions().equals(term.positions())) .findFirst(); if (optionalEntry.isPresent()) { return optionalEntry.get().getId(); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/mongo.changelog-tenant.xml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/mongo.changelog-tenant.xml index 8a00cca7f..5b65033db 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/mongo.changelog-tenant.xml +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/mongo.changelog-tenant.xml @@ -4,9 +4,10 @@ xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.20.xsd"> - - - - + + + + + diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/tenant/7-add-entity-log-value-index.xml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/tenant/7-add-entity-log-value-index.xml new file mode 100644 index 000000000..5f2045835 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/tenant/7-add-entity-log-value-index.xml @@ -0,0 +1,23 @@ + + + + + + + { + "entityLogId": 1, + "value": 1, + } + + + {name: "entityLogId_value_index"} + + + + + \ No newline at end of file diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java index 2d2936f9f..feb12234f 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java @@ -4247,7 +4247,6 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { .dossierDictionaryEntry(true) .positions(position4) .build()); -// } var entityLog = new EntityLog(1, 1, entityLogEntries, null, 0, 0, 0, 0); fileManagementStorageService.saveEntityLog(dossier.getId(), file.getId(), entityLog); 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/EntityLogEntryDocumentRepository.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/EntityLogEntryDocumentRepository.java index 929b8d674..15c44109d 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/EntityLogEntryDocumentRepository.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/EntityLogEntryDocumentRepository.java @@ -8,6 +8,7 @@ import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.mongodb.repository.Query; import org.springframework.stereotype.Repository; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.EntityLogEntryDocument; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository.projections.EntryWithManualChangesProjection; @@ -91,4 +92,13 @@ public interface EntityLogEntryDocumentRepository extends MongoRepository findAppliedEntitiesWhereLegalBasisEmpty(); + @Query("{ 'entityLogId': ?0," + + " 'value': ?1, " + + " '$or': [ { 'dictionaryEntry': true }, { 'dossierDictionaryEntry': true } ], " + + " 'positions': { $in: ?2 } " + + "}") + List findDictionaryEntityLogEntriesByValueAndPositions(String entityLogId, + String value, + List> positionsList); + } 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/EntityLogMongoService.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/EntityLogMongoService.java index 0d4e1d593..884c1f6ea 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/EntityLogMongoService.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/EntityLogMongoService.java @@ -12,6 +12,7 @@ import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLog; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLogEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.EntityLogDocument; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.EntityLogEntryDocument; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.exception.DocumentNotFoundException; @@ -407,4 +408,17 @@ public class EntityLogMongoService { .collect(Collectors.toSet()); } + public Set findDictionaryEntityLogEntriesByValueAndPositions(String dossierId, + String fileId, + String value, + List> positionsList) { + + return new HashSet<>(entityLogEntryDocumentRepository.findDictionaryEntityLogEntriesByValueAndPositions(mapper.getLogId(dossierId, fileId), + value, + positionsList) + .stream() + .map(mapper::fromLogEntryDocument) + .toList()); + } + }