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()); + } + }