RED-8702: Explore document databases to store entityLog

* added new update service for partial updates to entity log documents without modification to entry documents
This commit is contained in:
maverickstuder 2024-03-26 17:16:31 +01:00
parent e7e9d88238
commit 45d75dc147
7 changed files with 120 additions and 5 deletions

View File

@ -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<EntityLog> 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);
}
}

View File

@ -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<EntityLogEntry> newEntityLogEntries = new ArrayList<>();
private List<EntityLogEntry> updatedEntityLogEntries = new ArrayList<>();
}

View File

@ -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);

View File

@ -14,4 +14,9 @@ public interface EntityLogDocumentRepository extends MongoRepository<EntityLogDo
@Query(value = "{ '_id' : ?0 }", fields = "{ 'analysisNumber' : 1 }")
Optional<EntityLogDocument> findAnalysisNumberById(@Param("_id") String id);
@Query(value = "{ '_id': ?0 }", fields = "{ 'entityLogEntryDocuments': 0 }")
Optional<EntityLogDocument> findEntityLogDocumentWithoutEntriesById(String id);
}

View File

@ -20,6 +20,15 @@ public interface EntityLogEntryDocumentRepository extends MongoRepository<Entity
@Query("{ 'entityLogId' : ?0}")
List<EntityLogEntryDocument> findByEntityLogId(String entityLogId);
@Query("{ 'entityLogId' : ?0, 'containingNodeId' : { $exists: true, $not: { $size: 0 } } }")
List<EntityLogEntryDocument> findByEntityLogIdAndContainingNodeIdNotEmpty(String entityLogId);
@Query("{ 'id' : { $in: ?0 }, 'containingNodeId' : { $exists: true, $not: { $size: 0 } } }")
List<EntityLogEntryDocument> findAllByIdAndContainingNodeIdNotEmpty(List<String> ids);
@Query(value = "{ 'entityLogId' : ?0}", delete = true)
void deleteByEntityLogId(String entityLogId);
}

View File

@ -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);
}
}

View File

@ -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<EntityLogEntry> entityLogEntries) {
String entityLogId = mapper.getLogId(dossierId, fileId);
@ -159,6 +165,7 @@ public class EntityLogMongoService {
}
public List<EntityLogEntry> findAllEntityLogEntriesWithManualChanges(String dossierId, String fileId) {
return entityLogEntryDocumentRepository.findByEntityLogIdAndManualChangesNotEmpty(mapper.getLogId(dossierId, fileId))
@ -177,12 +184,36 @@ public class EntityLogMongoService {
}
public List<EntityLogEntry> findAllEntriesByDossierIdAndFileId(String dossierId, String fileId) {
public List<EntityLogEntry> findAllEntityLogEntriesWithContainingNodeIdsWithEntryIdsIn(String dossierId, String fileId, Collection<String> entryIds) {
return entityLogEntryDocumentRepository.findByEntityLogId(mapper.getLogId(dossierId, fileId))
String entityLogId = mapper.getLogId(dossierId, fileId);
List<String> ids = entryIds.stream()
.map(entryId -> mapper.getLogEntryId(entityLogId, entryId))
.toList();
return entityLogEntryDocumentRepository.findAllByIdAndContainingNodeIdNotEmpty(ids)
.stream()
.map(mapper::fromLogEntryDocument)
.toList();
}
public List<EntityLogEntry> findAllEntityLogEntriesWithContainingNodeIds(String dossierId, String fileId) {
return entityLogEntryDocumentRepository.findByEntityLogIdAndContainingNodeIdNotEmpty(mapper.getLogId(dossierId, fileId))
.stream()
.map(mapper::fromLogEntryDocument)
.toList();
}
public Optional<EntityLog> 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);
}
}