From 91fa6be0926150fb91c6b81d18b0d80ea42583c2 Mon Sep 17 00:00:00 2001 From: Glenn Renfro Date: Thu, 18 Feb 2016 19:07:39 -0500 Subject: [PATCH] SCT-79 Support sqlserver resolves spring-cloud/spring-cloud-task#79 --- .../support/OraclePagingQueryProvider.java | 16 +++++- .../SqlPagingQueryProviderFactoryBean.java | 2 + .../database/support/SqlPagingQueryUtils.java | 32 +++--------- .../support/SqlServerPagingQueryProvider.java | 50 +++++++++++++++++++ .../task/repository/support/DatabaseType.java | 3 +- .../support/TaskRepositoryInitializer.java | 3 ++ .../cloud/task/schema-sqlserver.sql | 18 +++++++ .../FindAllPagingQueryProviderTests.java | 10 +++- .../WhereClausePagingQueryProviderTests.java | 10 +++- .../src/main/asciidoc/getting-started.adoc | 1 + 10 files changed, 117 insertions(+), 28 deletions(-) create mode 100644 spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/database/support/SqlServerPagingQueryProvider.java create mode 100644 spring-cloud-task-core/src/main/resources/org/springframework/cloud/task/schema-sqlserver.sql diff --git a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/database/support/OraclePagingQueryProvider.java b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/database/support/OraclePagingQueryProvider.java index a639f3cf..f0b3ec6b 100644 --- a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/database/support/OraclePagingQueryProvider.java +++ b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/database/support/OraclePagingQueryProvider.java @@ -29,7 +29,21 @@ public class OraclePagingQueryProvider extends AbstractSqlPagingQueryProvider { @Override public String getPageQuery(Pageable pageable) { int offset = pageable.getOffset()+1; - return SqlPagingQueryUtils.generateRowNumSqlQueryWithNesting(this, getSelectClause(), getSelectClause(), false, "TMP_ROW_NUM >= " + return generateRowNumSqlQueryWithNesting(getSelectClause(), false, "TMP_ROW_NUM >= " + offset + " AND TMP_ROW_NUM < " + (offset+pageable.getPageSize())); } + + private String generateRowNumSqlQueryWithNesting(String selectClause, + boolean remainingPageQuery, + String rowNumClause) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ").append(selectClause).append(" FROM (SELECT ").append(selectClause) + .append(", ").append("ROWNUM as TMP_ROW_NUM"); + sql.append(" FROM (SELECT ").append(selectClause).append(" FROM ").append(this.getFromClause()); + SqlPagingQueryUtils.buildWhereClause(this, remainingPageQuery, sql); + sql.append(" ORDER BY ").append(SqlPagingQueryUtils.buildSortClause(this)); + sql.append(")) WHERE ").append(rowNumClause); + + return sql.toString(); + } } diff --git a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/database/support/SqlPagingQueryProviderFactoryBean.java b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/database/support/SqlPagingQueryProviderFactoryBean.java index 7471e754..174ea095 100644 --- a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/database/support/SqlPagingQueryProviderFactoryBean.java +++ b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/database/support/SqlPagingQueryProviderFactoryBean.java @@ -22,6 +22,7 @@ import static org.springframework.cloud.task.repository.support.DatabaseType.H2; import static org.springframework.cloud.task.repository.support.DatabaseType.MYSQL; import static org.springframework.cloud.task.repository.support.DatabaseType.ORACLE; import static org.springframework.cloud.task.repository.support.DatabaseType.POSTGRES; +import static org.springframework.cloud.task.repository.support.DatabaseType.SQLSERVER; import java.util.HashMap; import java.util.Map; @@ -66,6 +67,7 @@ public class SqlPagingQueryProviderFactoryBean implements FactoryBean= " + + offset + " AND TMP_ROW_NUM < " + (offset+pageable.getPageSize())); + } + + private String generateRowNumSqlQueryWithNesting(String selectClause, + boolean remainingPageQuery, + String rowNumClause) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ").append(selectClause).append(" FROM (SELECT ").append(selectClause) + .append(", ").append("ROW_NUMBER() OVER (ORDER BY ") + .append(SqlPagingQueryUtils.buildSortClause(this)) + .append(") AS TMP_ROW_NUM ") + .append(" FROM ").append(getFromClause()); + SqlPagingQueryUtils.buildWhereClause(this, remainingPageQuery, sql); + sql.append(") TASK_EXECUTION_PAGE "); + sql.append(" WHERE ").append(rowNumClause); + sql.append(" ORDER BY ").append(SqlPagingQueryUtils.buildSortClause(this)); + return sql.toString(); + } +} diff --git a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/support/DatabaseType.java b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/support/DatabaseType.java index a03af9f2..575c5ff1 100644 --- a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/support/DatabaseType.java +++ b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/support/DatabaseType.java @@ -39,7 +39,8 @@ public enum DatabaseType { H2("H2"), ORACLE("Oracle"), MYSQL("MySQL"), - POSTGRES("PostgreSQL"); + POSTGRES("PostgreSQL"), + SQLSERVER("Microsoft SQL Server"); private static final Map dbNameMap; diff --git a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/support/TaskRepositoryInitializer.java b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/support/TaskRepositoryInitializer.java index 79b9c7f9..d4ff9ad3 100644 --- a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/support/TaskRepositoryInitializer.java +++ b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/support/TaskRepositoryInitializer.java @@ -99,6 +99,9 @@ public final class TaskRepositoryInitializer implements InitializingBean { if ("mysql".equals(platform)) { platform = "mysql"; } + if ("sqlserver".equals(platform)){ + platform = "sqlserver"; + } ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); String schemaLocation = schema; schemaLocation = schemaLocation.replace("@@platform@@", platform); diff --git a/spring-cloud-task-core/src/main/resources/org/springframework/cloud/task/schema-sqlserver.sql b/spring-cloud-task-core/src/main/resources/org/springframework/cloud/task/schema-sqlserver.sql new file mode 100644 index 00000000..92e11a78 --- /dev/null +++ b/spring-cloud-task-core/src/main/resources/org/springframework/cloud/task/schema-sqlserver.sql @@ -0,0 +1,18 @@ +CREATE TABLE TASK_EXECUTION ( + TASK_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY , + START_TIME DATETIME DEFAULT NULL , + END_TIME DATETIME DEFAULT NULL , + TASK_NAME VARCHAR(100) , + EXIT_CODE INTEGER , + EXIT_MESSAGE VARCHAR(2500) , + LAST_UPDATED DATETIME +); + +CREATE TABLE TASK_EXECUTION_PARAMS ( + TASK_EXECUTION_ID BIGINT NOT NULL , + TASK_PARAM VARCHAR(250) , + constraint TASK_EXEC_PARAMS_FK foreign key (TASK_EXECUTION_ID) + references TASK_EXECUTION(TASK_EXECUTION_ID) +) ; + +CREATE TABLE TASK_SEQ (ID BIGINT IDENTITY); diff --git a/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/database/support/FindAllPagingQueryProviderTests.java b/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/database/support/FindAllPagingQueryProviderTests.java index eb570b6e..d5326b4c 100644 --- a/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/database/support/FindAllPagingQueryProviderTests.java +++ b/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/database/support/FindAllPagingQueryProviderTests.java @@ -61,7 +61,15 @@ public class FindAllPagingQueryProviderTests { {"MySQL","SELECT TASK_EXECUTION_ID, START_TIME, END_TIME, TASK_NAME, " + "EXIT_CODE, EXIT_MESSAGE, LAST_UPDATED FROM " + "%PREFIX%EXECUTION ORDER BY START_TIME DESC, " - + "TASK_EXECUTION_ID DESC LIMIT 0, 10"} + + "TASK_EXECUTION_ID DESC LIMIT 0, 10"}, + {"Microsoft SQL Server","SELECT TASK_EXECUTION_ID, START_TIME, END_TIME, " + + "TASK_NAME, EXIT_CODE, EXIT_MESSAGE, LAST_UPDATED FROM " + + "(SELECT TASK_EXECUTION_ID, START_TIME, END_TIME, TASK_NAME, " + + "EXIT_CODE, EXIT_MESSAGE, LAST_UPDATED, ROW_NUMBER() " + + "OVER (ORDER BY START_TIME DESC, TASK_EXECUTION_ID DESC) AS " + + "TMP_ROW_NUM FROM %PREFIX%EXECUTION) TASK_EXECUTION_PAGE " + + "WHERE TMP_ROW_NUM >= 1 AND TMP_ROW_NUM < 11 ORDER BY START_TIME DESC, " + + "TASK_EXECUTION_ID DESC"} }); } diff --git a/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/database/support/WhereClausePagingQueryProviderTests.java b/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/database/support/WhereClausePagingQueryProviderTests.java index 06d421ca..e3cb8f34 100644 --- a/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/database/support/WhereClausePagingQueryProviderTests.java +++ b/spring-cloud-task-core/src/test/java/org/springframework/cloud/task/repository/database/support/WhereClausePagingQueryProviderTests.java @@ -66,7 +66,15 @@ public class WhereClausePagingQueryProviderTests { + "EXIT_CODE, EXIT_MESSAGE, LAST_UPDATED FROM " + "%PREFIX%EXECUTION WHERE TASK_EXECUTION_ID = '0000' " + "ORDER BY START_TIME DESC, " - + "TASK_EXECUTION_ID DESC LIMIT 0, 10"} + + "TASK_EXECUTION_ID DESC LIMIT 0, 10"}, + {"Microsoft SQL Server","SELECT TASK_EXECUTION_ID, START_TIME, END_TIME, " + + "TASK_NAME, EXIT_CODE, EXIT_MESSAGE, LAST_UPDATED FROM " + + "(SELECT TASK_EXECUTION_ID, START_TIME, END_TIME, TASK_NAME, " + + "EXIT_CODE, EXIT_MESSAGE, LAST_UPDATED, ROW_NUMBER() " + + "OVER (ORDER BY START_TIME DESC, TASK_EXECUTION_ID DESC) AS " + + "TMP_ROW_NUM FROM %PREFIX%EXECUTION WHERE TASK_EXECUTION_ID = " + + "'0000') TASK_EXECUTION_PAGE WHERE TMP_ROW_NUM >= 1 " + + "AND TMP_ROW_NUM < 11 ORDER BY START_TIME DESC, TASK_EXECUTION_ID DESC"} }); } diff --git a/spring-cloud-task-docs/src/main/asciidoc/getting-started.adoc b/spring-cloud-task-docs/src/main/asciidoc/getting-started.adoc index 3392df6e..0d7ef0cd 100644 --- a/spring-cloud-task-docs/src/main/asciidoc/getting-started.adoc +++ b/spring-cloud-task-docs/src/main/asciidoc/getting-started.adoc @@ -34,6 +34,7 @@ utilize a supported database. Below is a list of the ones currently supported: - MySql - Oracle - Postgres +- SqlServer [[getting-started-developing-first-task]] == Developing your first Spring Cloud Task application