diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/EntryPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/EntryPersistenceService.java index 42c5be34e..3fd40f336 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/EntryPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/EntryPersistenceService.java @@ -4,6 +4,8 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import javax.persistence.EntityManager; +import javax.persistence.criteria.CriteriaBuilder; import javax.transaction.Transactional; import org.springframework.stereotype.Service; @@ -33,6 +35,8 @@ public class EntryPersistenceService { private final FalseRecommendationEntryRepository falseRecommendationEntryRepository; private final JDBCWriteUtils jdbcWriteUtils; + private final EntityManager entityManager; + @Transactional public void deleteEntries(String typeId, List values, long version, DictionaryEntryType dictionaryEntryType) { @@ -108,7 +112,10 @@ public class EntryPersistenceService { switch (dictionaryEntryType) { case ENTRY -> { - var undeletedEntries = entryRepository.undeleteEntries(typeId, entries, version); + // TODO Remove all but one implementation for undeletion, once it is clear which one works + //var undeletedEntries = entryRepository.undeleteEntries(typeId, entries, version); + List undeletedEntries = undeleteEntries(typeId, entries, version); + undeletedEntries.forEach(entries::remove); var entryEntities = entries.stream().map(e -> { @@ -154,6 +161,28 @@ public class EntryPersistenceService { } + private List undeleteEntries(String typeId, Set entries, long version) { + + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); + var undeleteEntriesQuery = criteriaBuilder.createCriteriaUpdate(DictionaryEntryEntity.class); + var entryRoot = undeleteEntriesQuery.from(DictionaryEntryEntity.class); + + var typeIdPred = criteriaBuilder.equal(entryRoot.get("typeId"), typeId); + var entriesPred = entryRoot.get("value").in(entries); + undeleteEntriesQuery.where(typeIdPred, entriesPred); + undeleteEntriesQuery.set("version", version); + undeleteEntriesQuery.set("deleted", false); + + entityManager.createQuery(undeleteEntriesQuery).executeUpdate(); + + var existingEntriesQuery = criteriaBuilder.createQuery(DictionaryEntryEntity.class); + entryRoot = existingEntriesQuery.from(DictionaryEntryEntity.class); + undeleteEntriesQuery.where(typeIdPred, criteriaBuilder.equal(entryRoot.get("deleted"), false)); + + return entityManager.createQuery(existingEntriesQuery).getResultStream().map(DictionaryEntryEntity::getValue).toList(); + } + + public void cloneEntries(String originalTypeId, String newTypeId) { entryRepository.cloneEntries(originalTypeId, newTypeId);