diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/RankDeDuplicationService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/RankDeDuplicationService.java index 97cdb2b71..afe3409ec 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/RankDeDuplicationService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/RankDeDuplicationService.java @@ -39,6 +39,7 @@ public class RankDeDuplicationService { private void deduplicate(String dossierTemplateId) { + log.info("deduplicate for dossierTemplateID: {}", dossierTemplateId); List allDossierTemplateTypes = dictionaryPersistenceService.getAllTypesForDossierTemplate(dossierTemplateId, false); TreeMap> typesSortedByRank = new TreeMap<>(allDossierTemplateTypes.stream() .collect(Collectors.groupingBy(TypeEntity::getRank, Collectors.toList()))); @@ -47,9 +48,9 @@ public class RankDeDuplicationService { // we create a map with every rank that needs to be updated and the value is the starting point for that rank Map rankToNewRankUpdateMap = new TreeMap<>(Collections.reverseOrder()); for (var typesByRankEntry : typesSortedByRank.entrySet()) { - log.debug(" {} - {}", typesByRankEntry.getKey(), typesByRankEntry.getValue().size()); + log.debug("Rank: {} - number of types {}", typesByRankEntry.getKey(), typesByRankEntry.getValue().size()); typesByRankEntry.getValue() - .forEach(t -> log.debug("type: {} - dtId: {} - dId: {}", t.getType(), t.getDossierTemplateId(), t.getDossierId())); + .forEach(t -> log.debug("type: {} - dtId: {} - dId: {} typeId: {}", t.getType(), t.getDossierTemplateId(), t.getDossierId(), t.getId())); if (typesByRankEntry.getValue().size() > 1) { if (typesByRankEntry.getKey() > lastRankOk) { @@ -74,14 +75,13 @@ public class RankDeDuplicationService { for (TypeEntity t : typesSortedByRank.get(rankToUpdateEntry.getKey())) { if (newRank != t.getRank()) { - log.info("Type {} with rank: {} will be updated to rank: {}", t.getType(), t.getRank(), newRank); - t.setRank(newRank); - dictionaryPersistenceService.updateType(t.getId(), t); + log.info("Type {} with rank: {} will be updated to rank: {} - typeId {}", t.getType(), t.getRank(), newRank, t.getId()); + dictionaryPersistenceService.updateRankForType(t.getId(), newRank); var dossierTypes = dictionaryPersistenceService.getAllDossierTypesForDossierTemplateAndType(dossierTemplateId, t.getType(), false); for (TypeEntity td : dossierTypes) { - td.setRank(newRank); - dictionaryPersistenceService.updateType(td.getId(), td); + log.info("Type {} with rank: {} will be updated to rank: {} - typeId {}", td.getType(), td.getRank(), newRank, td.getId()); + dictionaryPersistenceService.updateRankForType(td.getId(), newRank); } } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java index b20076c12..fc5d29440 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java @@ -90,7 +90,7 @@ public class DictionaryPersistenceService { if (!existingTypesForRank.isEmpty()) { for (var existingTypeValueForRank : existingTypesForRank) { if (!existingTypeValueForRank.isDeleted() && !existingTypeValueForRank.getType().equalsIgnoreCase(type)) { - throw new ConflictException("Rank already exists: " + rank + " on type: " + existingTypeValueForRank.getType()); + throw new ConflictException("Rank already exists: " + rank + " on type: " + existingTypeValueForRank.getType() + " type id: " + existingTypeValueForRank.getId()); } } } @@ -140,7 +140,7 @@ public class DictionaryPersistenceService { "version", "dossierDictionaryOnly"); } - typeRepository.save(type); + typeRepository.saveAndFlush(type); }); } @@ -287,4 +287,10 @@ public class DictionaryPersistenceService { } + @Transactional + public void updateRankForType(String typeId, int newRank) { + + typeRepository.updateRankForType(typeId, newRank); + } + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java index 9a48daf5e..06f6a7627 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java @@ -67,9 +67,9 @@ public interface TypeRepository extends JpaRepository { @Query(""" - select new com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.TypeRankSummary(t.dossierTemplateId, t.dossierId, t.rank, count(t)) - from TypeEntity t where t.dossierTemplateId = :dossierTemplateId and t.softDeletedTime is null - group by t.dossierTemplateId, t.dossierId, t.rank + select new com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.TypeRankSummary(t.dossierTemplateId, t.dossierId, t.rank, count(t)) + from TypeEntity t where t.dossierTemplateId = :dossierTemplateId and t.softDeletedTime is null + group by t.dossierTemplateId, t.dossierId, t.rank order by t.rank""") List findTypeRankSummaryList(@Param("dossierTemplateId") String dossierTemplateId); @@ -83,4 +83,9 @@ public interface TypeRepository extends JpaRepository { @Query("Update TypeEntity t set t.softDeletedTime = null where t.id = :typeId and t.softDeletedTime is not null") int unSoftDeleteTypeById(@Param("typeId") String typeId); + + @Modifying + @Query("Update TypeEntity t set t.rank = :newRank, t.version = t.version + 1 where t.id = :typeId") + void updateRankForType(@Param("typeId") String typeId, @Param("newRank") int newRank); + } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneAndExportWithDuplicateRanksTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneAndExportWithDuplicateRanksTest.java index 822208f24..f55879abd 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneAndExportWithDuplicateRanksTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneAndExportWithDuplicateRanksTest.java @@ -104,7 +104,7 @@ public class DossierTemplateCloneAndExportWithDuplicateRanksTest { private String dossierTemplateName = "Clone of " + dossierTemplateId; @Captor - private ArgumentCaptor captor; + private ArgumentCaptor captor; @BeforeEach @@ -221,63 +221,47 @@ public class DossierTemplateCloneAndExportWithDuplicateRanksTest { rankDeDuplicationService.deduplicate(); - TypeEntity caughtType; + verify(dictionaryPersistenceService, times(1)).updateRankForType(eq(toTypeId("type01", dossierTemplateId)), captor.capture()); + Assertions.assertEquals(captor.getValue(), 1); - verify(dictionaryPersistenceService, times(1)).updateType(eq(toTypeId("type01", dossierTemplateId)), captor.capture()); - caughtType = captor.getValue(); - Assertions.assertEquals(caughtType.getRank(), 1); + verify(dictionaryPersistenceService, times(1)).updateRankForType(eq(toTypeId("type02", dossierTemplateId)), captor.capture()); + Assertions.assertEquals(captor.getValue(), 2); - verify(dictionaryPersistenceService, times(1)).updateType(eq(toTypeId("type02", dossierTemplateId)), captor.capture()); - caughtType = captor.getValue(); - Assertions.assertEquals(caughtType.getRank(), 2); + verify(dictionaryPersistenceService, times(1)).updateRankForType(eq(toTypeId("type02", dossierTemplateId, dossierId)), captor.capture()); + Assertions.assertEquals(captor.getValue(), 2); - verify(dictionaryPersistenceService, times(1)).updateType(eq(toTypeId("type02", dossierTemplateId, dossierId)), captor.capture()); - caughtType = captor.getValue(); - Assertions.assertEquals(caughtType.getRank(), 2); + verify(dictionaryPersistenceService, times(1)).updateRankForType(eq(toTypeId("type22", dossierTemplateId)), captor.capture()); + Assertions.assertEquals(captor.getValue(), 3); - verify(dictionaryPersistenceService, times(1)).updateType(eq(toTypeId("type22", dossierTemplateId)), captor.capture()); - caughtType = captor.getValue(); - Assertions.assertEquals(caughtType.getRank(), 3); + verify(dictionaryPersistenceService, times(1)).updateRankForType(eq(toTypeId("type2", dossierTemplateId)), captor.capture()); + Assertions.assertEquals(captor.getValue(), 51); - verify(dictionaryPersistenceService, times(1)).updateType(eq(toTypeId("type2", dossierTemplateId)), captor.capture()); - caughtType = captor.getValue(); - Assertions.assertEquals(caughtType.getRank(), 51); + verify(dictionaryPersistenceService, times(1)).updateRankForType(eq(toTypeId("type3", dossierTemplateId)), captor.capture()); + Assertions.assertEquals(captor.getValue(), 52); - verify(dictionaryPersistenceService, times(1)).updateType(eq(toTypeId("type3", dossierTemplateId)), captor.capture()); - caughtType = captor.getValue(); - Assertions.assertEquals(caughtType.getRank(), 52); + verify(dictionaryPersistenceService, times(1)).updateRankForType(eq(toTypeId("type4", dossierTemplateId)), captor.capture()); + Assertions.assertEquals(captor.getValue(), 53); - verify(dictionaryPersistenceService, times(1)).updateType(eq(toTypeId("type4", dossierTemplateId)), captor.capture()); - caughtType = captor.getValue(); - Assertions.assertEquals(caughtType.getRank(), 53); + verify(dictionaryPersistenceService, times(1)).updateRankForType(eq(toTypeId("type5", dossierTemplateId)), captor.capture()); + Assertions.assertEquals(captor.getValue(), 54); - verify(dictionaryPersistenceService, times(1)).updateType(eq(toTypeId("type5", dossierTemplateId)), captor.capture()); - caughtType = captor.getValue(); - Assertions.assertEquals(caughtType.getRank(), 54); + verify(dictionaryPersistenceService, times(1)).updateRankForType(eq(toTypeId("type6", dossierTemplateId)), captor.capture()); + Assertions.assertEquals(captor.getValue(), 55); - verify(dictionaryPersistenceService, times(1)).updateType(eq(toTypeId("type6", dossierTemplateId)), captor.capture()); - caughtType = captor.getValue(); - Assertions.assertEquals(caughtType.getRank(), 55); + verify(dictionaryPersistenceService, times(1)).updateRankForType(eq(toTypeId("type7", dossierTemplateId)), captor.capture()); + Assertions.assertEquals(captor.getValue(), 56); - verify(dictionaryPersistenceService, times(1)).updateType(eq(toTypeId("type7", dossierTemplateId)), captor.capture()); - caughtType = captor.getValue(); - Assertions.assertEquals(caughtType.getRank(), 56); + verify(dictionaryPersistenceService, times(1)).updateRankForType(eq(toTypeId("type8", dossierTemplateId)), captor.capture()); + Assertions.assertEquals(captor.getValue(), 57); - verify(dictionaryPersistenceService, times(1)).updateType(eq(toTypeId("type8", dossierTemplateId)), captor.capture()); - caughtType = captor.getValue(); - Assertions.assertEquals(caughtType.getRank(), 57); + verify(dictionaryPersistenceService, times(1)).updateRankForType(eq(toTypeId("type9", dossierTemplateId)), captor.capture()); + Assertions.assertEquals(captor.getValue(), 58); - verify(dictionaryPersistenceService, times(1)).updateType(eq(toTypeId("type9", dossierTemplateId)), captor.capture()); - caughtType = captor.getValue(); - Assertions.assertEquals(caughtType.getRank(), 58); + verify(dictionaryPersistenceService, times(1)).updateRankForType(eq(toTypeId("type10", dossierTemplateId)), captor.capture()); + Assertions.assertEquals(captor.getValue(), 59); - verify(dictionaryPersistenceService, times(1)).updateType(eq(toTypeId("type10", dossierTemplateId)), captor.capture()); - caughtType = captor.getValue(); - Assertions.assertEquals(caughtType.getRank(), 59); - - verify(dictionaryPersistenceService, times(1)).updateType(eq(toTypeId("type11", dossierTemplateId)), captor.capture()); - caughtType = captor.getValue(); - Assertions.assertEquals(caughtType.getRank(), 60); + verify(dictionaryPersistenceService, times(1)).updateRankForType(eq(toTypeId("type11", dossierTemplateId)), captor.capture()); + Assertions.assertEquals(captor.getValue(), 60); }