Fix native query for SQL_Server. (#732)
This commit is contained in:
@@ -11,6 +11,7 @@ package org.eclipse.hawkbit.repository.jpa;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.EnumMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@@ -106,7 +107,16 @@ public class JpaDeploymentManagement implements DeploymentManagement {
|
|||||||
*/
|
*/
|
||||||
private static final int ACTION_PAGE_LIMIT = 1000;
|
private static final int ACTION_PAGE_LIMIT = 1000;
|
||||||
|
|
||||||
private static final String QUERY_DELETE_ACTIONS_BY_STATE_AND_LAST_MODIFIED = "DELETE FROM sp_action WHERE tenant=#tenant AND status IN (%s) AND last_modified_at<#last_modified_at LIMIT 1000";
|
private static final String QUERY_DELETE_ACTIONS_BY_STATE_AND_LAST_MODIFIED_DEFAULT = "DELETE FROM sp_action WHERE tenant=#tenant AND status IN (%s) AND last_modified_at<#last_modified_at LIMIT "
|
||||||
|
+ ACTION_PAGE_LIMIT;
|
||||||
|
|
||||||
|
private static final EnumMap<Database, String> QUERY_DELETE_ACTIONS_BY_STATE_AND_LAST_MODIFIED;
|
||||||
|
|
||||||
|
static {
|
||||||
|
QUERY_DELETE_ACTIONS_BY_STATE_AND_LAST_MODIFIED = new EnumMap<>(Database.class);
|
||||||
|
QUERY_DELETE_ACTIONS_BY_STATE_AND_LAST_MODIFIED.put(Database.SQL_SERVER, "DELETE TOP (" + ACTION_PAGE_LIMIT
|
||||||
|
+ ") FROM sp_action WHERE tenant=#tenant AND status IN (%s) AND last_modified_at<#last_modified_at ");
|
||||||
|
}
|
||||||
|
|
||||||
private final EntityManager entityManager;
|
private final EntityManager entityManager;
|
||||||
private final ActionRepository actionRepository;
|
private final ActionRepository actionRepository;
|
||||||
@@ -713,7 +723,7 @@ public class JpaDeploymentManagement implements DeploymentManagement {
|
|||||||
final int statusCount = status.size();
|
final int statusCount = status.size();
|
||||||
final Status[] statusArr = status.toArray(new Status[statusCount]);
|
final Status[] statusArr = status.toArray(new Status[statusCount]);
|
||||||
|
|
||||||
final String queryStr = String.format(QUERY_DELETE_ACTIONS_BY_STATE_AND_LAST_MODIFIED,
|
final String queryStr = String.format(getQueryForDeleteActionsByStatusAndLastModifiedBeforeString(database),
|
||||||
formatInClauseWithNumberKeys(statusCount));
|
formatInClauseWithNumberKeys(statusCount));
|
||||||
final Query deleteQuery = entityManager.createNativeQuery(queryStr);
|
final Query deleteQuery = entityManager.createNativeQuery(queryStr);
|
||||||
|
|
||||||
@@ -726,6 +736,11 @@ public class JpaDeploymentManagement implements DeploymentManagement {
|
|||||||
return deleteQuery.executeUpdate();
|
return deleteQuery.executeUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String getQueryForDeleteActionsByStatusAndLastModifiedBeforeString(Database database) {
|
||||||
|
return QUERY_DELETE_ACTIONS_BY_STATE_AND_LAST_MODIFIED.getOrDefault(database,
|
||||||
|
QUERY_DELETE_ACTIONS_BY_STATE_AND_LAST_MODIFIED_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
private static String formatInClauseWithNumberKeys(final int count) {
|
private static String formatInClauseWithNumberKeys(final int count) {
|
||||||
return formatInClause(IntStream.range(0, count).mapToObj(String::valueOf).collect(Collectors.toList()));
|
return formatInClause(IntStream.range(0, count).mapToObj(String::valueOf).collect(Collectors.toList()));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user