From d447a08c69106520ce63261cfc9755f9aaf7f787 Mon Sep 17 00:00:00 2001 From: maverickstuder Date: Wed, 27 Mar 2024 17:35:39 +0100 Subject: [PATCH] RED-8702: Explore document databases to store entityLog * added new repository queries for redaction-service partial entry querying --- .../tests/EntityLogMongoServiceTest.java | 4 +- .../entitylog/EntityLogChanges.java | 4 ++ .../EntityLogDocumentRepository.java | 7 ++- .../EntityLogEntryDocumentRepository.java | 16 ++++++- .../mongo/service/EntityLogMongoService.java | 48 +++++++++++++++---- 5 files changed, 63 insertions(+), 16 deletions(-) diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EntityLogMongoServiceTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EntityLogMongoServiceTest.java index 220c265a1..88a604235 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EntityLogMongoServiceTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EntityLogMongoServiceTest.java @@ -125,10 +125,10 @@ public class EntityLogMongoServiceTest extends AbstractPersistenceServerServiceT var latest = entityLogMongoService.findLatestAnalysisNumber(TEST_DOSSIER_ID, TEST_FILE3_ID) .orElseThrow(); - var latestChangedEntries = entityLogMongoService.findAllEntityLogEntriesByAnalysisNumber(TEST_DOSSIER_ID, TEST_FILE3_ID, latest); + var latestChangedEntries = entityLogMongoService.findEntityLogEntriesByAnalysisNumber(TEST_DOSSIER_ID, TEST_FILE3_ID, latest); assertEquals(latestChangedEntries.size(), 490); - var manuallyChangedEntries = entityLogMongoService.findAllEntityLogEntriesWithManualChanges(TEST_DOSSIER_ID, TEST_FILE3_ID); + var manuallyChangedEntries = entityLogMongoService.findEntityLogEntriesWithManualChanges(TEST_DOSSIER_ID, TEST_FILE3_ID); assertEquals(manuallyChangedEntries.size(), 1014); String NEW_ENTITY_LOG_ENTRY = """ diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLogChanges.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLogChanges.java index e133d701a..dcf5ee6fc 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLogChanges.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/entitylog/EntityLogChanges.java @@ -18,4 +18,8 @@ public class EntityLogChanges { private List newEntityLogEntries = new ArrayList<>(); private List updatedEntityLogEntries = new ArrayList<>(); + public boolean hasChanges() { + return !newEntityLogEntries.isEmpty() || !updatedEntityLogEntries.isEmpty(); + } + } 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/EntityLogDocumentRepository.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/EntityLogDocumentRepository.java index 9f6c9e990..e86c5c124 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/EntityLogDocumentRepository.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/EntityLogDocumentRepository.java @@ -4,7 +4,6 @@ import java.util.Optional; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.mongodb.repository.Query; -import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.EntityLogDocument; @@ -12,11 +11,11 @@ import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.En @Repository public interface EntityLogDocumentRepository extends MongoRepository { - @Query(value = "{ '_id' : ?0 }", fields = "{ 'analysisNumber' : 1 }") - Optional findAnalysisNumberById(@Param("_id") String id); + @Query(value = "{ 'id' : ?0 }", fields = "{ 'analysisNumber' : 1 }") + Optional findAnalysisNumberById(String id); - @Query(value = "{ '_id': ?0 }", fields = "{ 'entityLogEntryDocuments': 0 }") + @Query(value = "{ 'id': ?0 }", fields = "{ 'entityLogEntryDocuments': 0 }") Optional findEntityLogDocumentWithoutEntriesById(String id); } 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 a73896f0e..0872dc0bd 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 @@ -1,6 +1,8 @@ package com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository; +import java.util.Collection; import java.util.List; +import java.util.Set; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.mongodb.repository.Query; @@ -14,9 +16,11 @@ public interface EntityLogEntryDocumentRepository extends MongoRepository findByEntityLogIdAndManualChangesNotEmpty(String entityLogId); + @Query("{ 'entityLogId' : ?0, 'changes.analysisNumber' : ?1 }") List findByEntityLogIdAndChangesAnalysisNumber(String entityLogId, int analysisNumber); + @Query("{ 'entityLogId' : ?0}") List findByEntityLogId(String entityLogId); @@ -25,10 +29,18 @@ public interface EntityLogEntryDocumentRepository extends MongoRepository findByEntityLogIdAndContainingNodeIdNotEmpty(String entityLogId); - @Query("{ 'id' : { $in: ?0 }, 'containingNodeId' : { $exists: true, $not: { $size: 0 } } }") - List findAllByIdAndContainingNodeIdNotEmpty(List ids); + @Query("{ 'entityLogId' : ?0 , 'containingNodeId' : { $exists: true, $eq: { $size: 0 } } }") + List findByEntityLogIdAndContainingNodeIdEmpty(String entityLogId); + + + @Query(value = "{ 'id' : { $in: ?0 }, 'containingNodeId' : { $exists: true, $not: { $size: 0 } } }", fields = "{ 'containingNodeId.0': 1 }") + List findContainingNodeIdForAllByIdAndContainingNodeIdNotEmpty(List ids); + + @Query("{ 'entityLogId' : ?0, $or: [ { 'containingNodeId' : { $exists: true, $eq: { $size: 0 } } }, { 'containingNodeId.0' : { $in: ?1 } } ] }") + List findByEntityLogIdAndNotContainedOrFirstContainedByElementInList(String entityLogId, Collection containingNodeIds); @Query(value = "{ 'entityLogId' : ?0}", delete = true) void deleteByEntityLogId(String entityLogId); + } 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 b8137bd98..fb8c87a97 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 @@ -4,6 +4,8 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; import org.springframework.stereotype.Service; @@ -25,7 +27,8 @@ public class EntityLogMongoService { private final EntityLogDocumentMapper mapper = EntityLogDocumentMapper.INSTANCE; - public EntityLogMongoService(EntityLogDocumentRepository entityLogDocumentRepository, EntityLogEntryDocumentRepository entityLogEntryDocumentRepository, + public EntityLogMongoService(EntityLogDocumentRepository entityLogDocumentRepository, + EntityLogEntryDocumentRepository entityLogEntryDocumentRepository, EntityLogDocumentUpdateService entityLogDocumentUpdateService) { this.entityLogDocumentRepository = entityLogDocumentRepository; @@ -165,8 +168,7 @@ public class EntityLogMongoService { } - - public List findAllEntityLogEntriesWithManualChanges(String dossierId, String fileId) { + public List findEntityLogEntriesWithManualChanges(String dossierId, String fileId) { return entityLogEntryDocumentRepository.findByEntityLogIdAndManualChangesNotEmpty(mapper.getLogId(dossierId, fileId)) .stream() @@ -175,7 +177,7 @@ public class EntityLogMongoService { } - public List findAllEntityLogEntriesByAnalysisNumber(String dossierId, String fileId, int analysisNumber) { + public List findEntityLogEntriesByAnalysisNumber(String dossierId, String fileId, int analysisNumber) { return entityLogEntryDocumentRepository.findByEntityLogIdAndChangesAnalysisNumber(mapper.getLogId(dossierId, fileId), analysisNumber) .stream() @@ -184,20 +186,48 @@ public class EntityLogMongoService { } - public List findAllEntityLogEntriesWithContainingNodeIdsWithEntryIdsIn(String dossierId, String fileId, Collection entryIds) { + public Set findFirstContainingNodeIdForEachEntry(String dossierId, String fileId, Collection entryIds) { String entityLogId = mapper.getLogId(dossierId, fileId); List ids = entryIds.stream() .map(entryId -> mapper.getLogEntryId(entityLogId, entryId)) .toList(); - return entityLogEntryDocumentRepository.findAllByIdAndContainingNodeIdNotEmpty(ids) + return entityLogEntryDocumentRepository.findContainingNodeIdForAllByIdAndContainingNodeIdNotEmpty(ids) + .stream() + .filter(entityLogEntryDocument -> !entityLogEntryDocument.getContainingNodeId().isEmpty()) + .map((EntityLogEntryDocument entityLogEntryDocument) -> entityLogEntryDocument.getContainingNodeId() + .get(0)) + .collect(Collectors.toSet()); + } + + + public List findEntityLogEntriesNotContainedOrFirstContainedByElementInList(String dossierId, String fileId, Collection nodeIds) { + + String entityLogId = mapper.getLogId(dossierId, fileId); + + return entityLogEntryDocumentRepository.findByEntityLogIdAndNotContainedOrFirstContainedByElementInList(entityLogId, nodeIds) .stream() .map(mapper::fromLogEntryDocument) .toList(); } - public List findAllEntityLogEntriesWithContainingNodeIds(String dossierId, String fileId) { + + public List findEntityLogEntriesWithEntryIdsIn(String dossierId, String fileId, Collection entryIds) { + + String entityLogId = mapper.getLogId(dossierId, fileId); + List ids = entryIds.stream() + .map(entryId -> mapper.getLogEntryId(entityLogId, entryId)) + .toList(); + + return entityLogEntryDocumentRepository.findAllById(ids) + .stream() + .map(mapper::fromLogEntryDocument) + .toList(); + } + + + public List findEntityLogEntriesWithContainingNodeIds(String dossierId, String fileId) { return entityLogEntryDocumentRepository.findByEntityLogIdAndContainingNodeIdNotEmpty(mapper.getLogId(dossierId, fileId)) .stream() @@ -205,15 +235,17 @@ public class EntityLogMongoService { .toList(); } + public Optional findEntityLogWithoutEntries(String dossierId, String fileId) { + return entityLogDocumentRepository.findEntityLogDocumentWithoutEntriesById(mapper.getLogId(dossierId, fileId)) .map(mapper::fromLogDocument); } public void saveEntityLogWithoutEntries(String dossierId, String fileId, EntityLog entityLog) { + entityLogDocumentUpdateService.updateEntityLogDocumentWithoutEntries(dossierId, fileId, entityLog); } - }