RED-6467: Rearranged code so that query-objects are not re-used to see if it fixes transaction behavior

This commit is contained in:
Viktor Seifert 2023-04-17 12:33:37 +02:00
parent d8a0ec0467
commit 1fe598f407

View File

@ -2,6 +2,7 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import javax.persistence.EntityManager;
@ -36,24 +37,9 @@ class QueryExecutor {
EntityManager entityManager;
// The call to query.getResultList returns an untyped list, there is no way around that.
// So we suppress the warning.
// CAUTION: Make sure that the query actually returns a list of Strings.
@SuppressWarnings("unchecked")
@Transactional
public LinkedList<String> runUndeleteQueryInBatches(String typeId, Set<String> entries, long version, String tableName) {
String fetchSql = getFetchEntryValuesQuery(tableName);
Query fetchEntryValuesQuery = entityManager.createNativeQuery(fetchSql);
fetchEntryValuesQuery.setParameter("typeId", typeId);
String updateSql = getUpdateEntriesQuery(tableName);
Query updateEntriesQuery = entityManager.createNativeQuery(updateSql);
updateEntriesQuery.setParameter("typeId", typeId);
updateEntriesQuery.setParameter("version", version);
var results = new LinkedList<String>();
var entryList = new ArrayList<>(entries);
@ -65,11 +51,12 @@ class QueryExecutor {
break;
}
fetchEntryValuesQuery.setParameter("entries", entryList.subList(fromIndex, toIndex));
results.addAll(fetchEntryValuesQuery.getResultList());
var values = entryList.subList(fromIndex, toIndex);
updateEntriesQuery.setParameter("entries", entryList.subList(fromIndex, toIndex));
updateEntriesQuery.executeUpdate();
var entryValues = executeFetchValuesQuery(typeId, tableName, values);
results.addAll(entryValues);
executeUpdateQuery(typeId, version, tableName, values);
fromIndex += ELEMENT_CHUNK_SIZE;
toIndex += ELEMENT_CHUNK_SIZE;
@ -79,6 +66,35 @@ class QueryExecutor {
}
private void executeUpdateQuery(String typeId, long version, String tableName, List<String> values) {
String updateSql = getUpdateEntriesQuery(tableName);
Query updateEntriesQuery = entityManager.createNativeQuery(updateSql);
updateEntriesQuery.setParameter("typeId", typeId);
updateEntriesQuery.setParameter("version", version);
updateEntriesQuery.setParameter("entries", values);
updateEntriesQuery.executeUpdate();
}
// The call to query.getResultList returns an untyped list, there is no way around that.
// So we suppress the warning.
// CAUTION: Make sure that the query actually returns a list of Strings.
@SuppressWarnings("unchecked")
private List<String> executeFetchValuesQuery(String typeId, String tableName, List<String> values) {
String fetchSql = getFetchEntryValuesQuery(tableName);
Query fetchEntryValuesQuery = entityManager.createNativeQuery(fetchSql);
fetchEntryValuesQuery.setParameter("typeId", typeId);
fetchEntryValuesQuery.setParameter("entries", values);
return fetchEntryValuesQuery.getResultList();
}
private String getFetchEntryValuesQuery(String tableName) {
return FETCH_ENTRY_VALUES_QUERY.replace("::tableName::", tableName);