From 45d75dc147b00352af2a03fd9d29d8b27019cdd9 Mon Sep 17 00:00:00 2001 From: maverickstuder Date: Tue, 26 Mar 2024 17:16:31 +0100 Subject: [PATCH] RED-8702: Explore document databases to store entityLog * added new update service for partial updates to entity log documents without modification to entry documents --- .../tests/EntityLogMongoServiceTest.java | 32 ++++++++++++++++ .../entitylog/EntityLogChanges.java | 6 ++- .../mongo/mapper/EntityLogDocumentMapper.java | 1 - .../EntityLogDocumentRepository.java | 5 +++ .../EntityLogEntryDocumentRepository.java | 9 +++++ .../EntityLogDocumentUpdateService.java | 35 ++++++++++++++++++ .../mongo/service/EntityLogMongoService.java | 37 +++++++++++++++++-- 7 files changed, 120 insertions(+), 5 deletions(-) create mode 100644 persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/EntityLogDocumentUpdateService.java 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 a3fcc8d64..220c265a1 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 @@ -256,4 +256,36 @@ public class EntityLogMongoServiceTest extends AbstractPersistenceServerServiceT } + + + @Test + @SneakyThrows + public void testUpdateEntityLogWithoutEntries() { + + var file = new ClassPathResource(ENTITY_LOG3_BEFORE); + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.registerModule(new JavaTimeModule()); + + EntityLog entityLog = objectMapper.readValue(file.getInputStream(), EntityLog.class); + + entityLogMongoService.insertEntityLog(TEST_DOSSIER_ID, TEST_FILE3_ID, entityLog); + + Optional found = entityLogMongoService.findEntityLogByDossierIdAndFileId(TEST_DOSSIER_ID, TEST_FILE3_ID); + assertTrue(found.isPresent()); + assertEquals(found.get().getEntityLogEntry().size(), 1706); + + file = new ClassPathResource(ENTITY_LOG3_AFTER); + + entityLog = objectMapper.readValue(file.getInputStream(), EntityLog.class); + entityLog.setAnalysisNumber(entityLog.getAnalysisNumber() + 1); + + entityLogMongoService.saveEntityLogWithoutEntries(TEST_DOSSIER_ID, TEST_FILE3_ID, entityLog); + + found = entityLogMongoService.findEntityLogByDossierIdAndFileId(TEST_DOSSIER_ID, TEST_FILE3_ID); + assertTrue(found.isPresent()); + assertEquals(found.get().getEntityLogEntry().size(), 1706); + assertEquals(found.get().getAnalysisNumber(), 9); + + } + } 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 1bfb03b4b..e133d701a 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 @@ -1,5 +1,8 @@ package com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog; +import java.util.ArrayList; +import java.util.List; + import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -12,6 +15,7 @@ import lombok.NoArgsConstructor; public class EntityLogChanges { private EntityLog entityLog; - private boolean hasChanges; + private List newEntityLogEntries = new ArrayList<>(); + private List updatedEntityLogEntries = new ArrayList<>(); } 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/EntityLogDocumentMapper.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/mapper/EntityLogDocumentMapper.java index c5752edc6..57c55082d 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/mapper/EntityLogDocumentMapper.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/mapper/EntityLogDocumentMapper.java @@ -21,7 +21,6 @@ public interface EntityLogDocumentMapper { @Mapping(target = "entityLogEntry", source = "entityLogEntryDocuments") EntityLog fromLogDocument(EntityLogDocument entityLogDocument); - @Mapping(target = "id", source = "entityLogEntryDocument.entryId") EntityLogEntry fromLogEntryDocument(EntityLogEntryDocument entityLogEntryDocument); 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 cf7207ad9..9f6c9e990 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 @@ -14,4 +14,9 @@ public interface EntityLogDocumentRepository extends MongoRepository findAnalysisNumberById(@Param("_id") String id); + + + @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 3f34fda26..a73896f0e 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 @@ -20,6 +20,15 @@ public interface EntityLogEntryDocumentRepository extends MongoRepository findByEntityLogId(String entityLogId); + + @Query("{ 'entityLogId' : ?0, 'containingNodeId' : { $exists: true, $not: { $size: 0 } } }") + List findByEntityLogIdAndContainingNodeIdNotEmpty(String entityLogId); + + + @Query("{ 'id' : { $in: ?0 }, 'containingNodeId' : { $exists: true, $not: { $size: 0 } } }") + List findAllByIdAndContainingNodeIdNotEmpty(List ids); + + @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/EntityLogDocumentUpdateService.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/EntityLogDocumentUpdateService.java new file mode 100644 index 000000000..8302db0f1 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/EntityLogDocumentUpdateService.java @@ -0,0 +1,35 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.mongo.service; + +import org.bson.Document; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.Update; +import org.springframework.stereotype.Repository; +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.mongo.document.EntityLogDocument; +import com.iqser.red.service.persistence.service.v1.api.shared.mongo.mapper.EntityLogDocumentMapper; + +@Service +public class EntityLogDocumentUpdateService { + + private final MongoTemplate mongoTemplate; + private final EntityLogDocumentMapper mapper = EntityLogDocumentMapper.INSTANCE; + + + public EntityLogDocumentUpdateService(MongoTemplate mongoTemplate) {this.mongoTemplate = mongoTemplate;} + + + public void updateEntityLogDocumentWithoutEntries(String dossierId, String fileId, EntityLog entityLog) { + + Document doc = new Document(); + mongoTemplate.getConverter().write(mapper.toLogDocument(dossierId, fileId, entityLog), doc); + doc.remove("entityLogEntryDocuments"); + Update update = new Update(); + doc.forEach(update::set); + mongoTemplate.updateFirst(Query.query(Criteria.where("_id").is(mapper.getLogId(dossierId, fileId))), update, EntityLogDocument.class); + } + +} 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 a1a8ab373..b8137bd98 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 @@ -1,6 +1,7 @@ package com.iqser.red.service.persistence.service.v1.api.shared.mongo.service; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Optional; @@ -20,12 +21,16 @@ public class EntityLogMongoService { private final EntityLogDocumentRepository entityLogDocumentRepository; private final EntityLogEntryDocumentRepository entityLogEntryDocumentRepository; + private final EntityLogDocumentUpdateService entityLogDocumentUpdateService; private final EntityLogDocumentMapper mapper = EntityLogDocumentMapper.INSTANCE; - public EntityLogMongoService(EntityLogDocumentRepository entityLogDocumentRepository, EntityLogEntryDocumentRepository entityLogEntryDocumentRepository) { + + public EntityLogMongoService(EntityLogDocumentRepository entityLogDocumentRepository, EntityLogEntryDocumentRepository entityLogEntryDocumentRepository, + EntityLogDocumentUpdateService entityLogDocumentUpdateService) { this.entityLogDocumentRepository = entityLogDocumentRepository; this.entityLogEntryDocumentRepository = entityLogEntryDocumentRepository; + this.entityLogDocumentUpdateService = entityLogDocumentUpdateService; } @@ -110,6 +115,7 @@ public class EntityLogMongoService { .toList()); } + public void deleteEntityLogEntries(String dossierId, String fileId, List entityLogEntries) { String entityLogId = mapper.getLogId(dossierId, fileId); @@ -159,6 +165,7 @@ public class EntityLogMongoService { } + public List findAllEntityLogEntriesWithManualChanges(String dossierId, String fileId) { return entityLogEntryDocumentRepository.findByEntityLogIdAndManualChangesNotEmpty(mapper.getLogId(dossierId, fileId)) @@ -177,12 +184,36 @@ public class EntityLogMongoService { } - public List findAllEntriesByDossierIdAndFileId(String dossierId, String fileId) { + public List findAllEntityLogEntriesWithContainingNodeIdsWithEntryIdsIn(String dossierId, String fileId, Collection entryIds) { - return entityLogEntryDocumentRepository.findByEntityLogId(mapper.getLogId(dossierId, fileId)) + String entityLogId = mapper.getLogId(dossierId, fileId); + List ids = entryIds.stream() + .map(entryId -> mapper.getLogEntryId(entityLogId, entryId)) + .toList(); + + return entityLogEntryDocumentRepository.findAllByIdAndContainingNodeIdNotEmpty(ids) .stream() .map(mapper::fromLogEntryDocument) .toList(); } + public List findAllEntityLogEntriesWithContainingNodeIds(String dossierId, String fileId) { + + return entityLogEntryDocumentRepository.findByEntityLogIdAndContainingNodeIdNotEmpty(mapper.getLogId(dossierId, fileId)) + .stream() + .map(mapper::fromLogEntryDocument) + .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); + } + + }