diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/AbstractSqlPagingQueryProvider.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/AbstractSqlPagingQueryProvider.java index 254204b89..9b84ad5af 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/AbstractSqlPagingQueryProvider.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/AbstractSqlPagingQueryProvider.java @@ -18,6 +18,7 @@ package org.springframework.batch.item.database.support; import javax.sql.DataSource; import org.springframework.util.Assert; +import org.springframework.util.StringUtils; import org.springframework.dao.InvalidDataAccessApiUsageException; import java.util.List; @@ -56,14 +57,7 @@ public abstract class AbstractSqlPagingQueryProvider implements PagingQueryProvi * @param selectClause SELECT clause part of SQL query string */ public void setSelectClause(String selectClause) { - String keyWord = "select "; - String temp = selectClause.trim(); - if (temp.toLowerCase().startsWith(keyWord) && temp.length() > keyWord.length()) { - this.selectClause = temp.substring(keyWord.length()); - } - else { - this.selectClause = temp; - } + this.selectClause = removeKeyWord("select", selectClause); } /** @@ -78,14 +72,7 @@ public abstract class AbstractSqlPagingQueryProvider implements PagingQueryProvi * @param fromClause FROM clause part of SQL query string */ public void setFromClause(String fromClause) { - String keyWord = "from "; - String temp = fromClause.trim(); - if (temp.toLowerCase().startsWith(keyWord) && temp.length() > keyWord.length()) { - this.fromClause = temp.substring(keyWord.length()); - } - else { - this.fromClause = temp; - } + this.fromClause = removeKeyWord("from", fromClause); } /** @@ -100,13 +87,11 @@ public abstract class AbstractSqlPagingQueryProvider implements PagingQueryProvi * @param whereClause WHERE clause part of SQL query string */ public void setWhereClause(String whereClause) { - String keyWord = "where "; - String temp = whereClause.trim(); - if (temp.toLowerCase().startsWith(keyWord) && temp.length() > keyWord.length()) { - this.whereClause = temp.substring(keyWord.length()); + if (StringUtils.hasText(whereClause)) { + this.whereClause = removeKeyWord("where", whereClause); } else { - this.whereClause = temp; + this.whereClause = null; } } @@ -182,4 +167,15 @@ public abstract class AbstractSqlPagingQueryProvider implements PagingQueryProvi public abstract String generateJumpToItemQuery(int itemIndex, int pageSize); + private String removeKeyWord(String keyWord, String clause) { + String temp = clause.trim(); + String keyWordString = keyWord + " "; + if (temp.toLowerCase().startsWith(keyWordString) && temp.length() > keyWordString.length()) { + return temp.substring(keyWordString.length()); + } + else { + return temp; + } + } + } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/Db2PagingQueryProvider.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/Db2PagingQueryProvider.java index 37265212a..e9b17b955 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/Db2PagingQueryProvider.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/Db2PagingQueryProvider.java @@ -1,7 +1,22 @@ +/* + * Copyright 2006-2008 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.springframework.batch.item.database.support; /** - * Oracle implementation of a {@link PagingQueryProvider} using + * DB2 implementation of a {@link PagingQueryProvider} using * database specific features. * * @author Thomas Risberg @@ -11,31 +26,16 @@ public class Db2PagingQueryProvider extends SqlWindowingPagingQueryProvider { @Override public String generateFirstPageQuery(int pageSize) { - StringBuilder sql = new StringBuilder(); - sql.append("SELECT ").append(getSelectClause()); - sql.append(" FROM ").append(getFromClause()); - sql.append(getWhereClause() == null ? "" : " WHERE " + getWhereClause()); - sql.append(" ORDER BY ").append(getSortKey()).append(" ASC"); - sql.append(" FETCH FIRST ").append(pageSize).append(" ROWS ONLY"); - - return sql.toString(); + return SqlPagingQueryUtils.generateLimitSqlQuery(this, false, buildLimitClause(pageSize)); } @Override public String generateRemainingPagesQuery(int pageSize) { - StringBuilder sql = new StringBuilder(); - sql.append("SELECT ").append(getSelectClause()); - sql.append(" FROM ").append(getFromClause()); - sql.append(" WHERE "); - if (getWhereClause() != null) { - sql.append(getWhereClause()); - sql.append(" AND "); - } - sql.append(getSortKey()).append(" > ").append(getSortKeyPlaceHolder()); - sql.append(" ORDER BY ").append(getSortKey()).append(" ASC"); - sql.append(" FETCH FIRST ").append(pageSize).append(" ROWS ONLY"); + return SqlPagingQueryUtils.generateLimitSqlQuery(this, true, buildLimitClause(pageSize)); + } - return sql.toString(); + private String buildLimitClause(int pageSize) { + return new StringBuilder().append("FETCH FIRST ").append(pageSize).append(" ROWS ONLY").toString(); } } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/HsqlPagingQueryProvider.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/HsqlPagingQueryProvider.java index 980f64f5d..c08977d86 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/HsqlPagingQueryProvider.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/HsqlPagingQueryProvider.java @@ -16,7 +16,7 @@ package org.springframework.batch.item.database.support; /** - * MySQL implementation of a {@link org.springframework.batch.item.database.support.PagingQueryProvider} using database specific features. + * HSQLDB implementation of a {@link org.springframework.batch.item.database.support.PagingQueryProvider} using database specific features. * * @author Thomas Risberg * @since 2.0 @@ -25,29 +25,16 @@ public class HsqlPagingQueryProvider extends AbstractSqlPagingQueryProvider { @Override public String generateFirstPageQuery(int pageSize) { - StringBuilder sql = new StringBuilder(); - sql.append("SELECT ").append("TOP ").append(pageSize).append(" ").append(getSelectClause()); - sql.append(" FROM ").append(getFromClause()); - sql.append(getWhereClause() == null ? "" : " WHERE " + getWhereClause()); - sql.append(" ORDER BY ").append(getSortKey()).append(" ASC"); - - return sql.toString(); + return SqlPagingQueryUtils.generateTopSqlQuery(this, false, buildTopClause(pageSize)); } @Override public String generateRemainingPagesQuery(int pageSize) { - StringBuilder sql = new StringBuilder(); - sql.append("SELECT ").append("TOP ").append(pageSize).append(" ").append(getSelectClause()); - sql.append(" FROM ").append(getFromClause()); - sql.append(" WHERE "); - if (getWhereClause() != null) { - sql.append(getWhereClause()); - sql.append(" AND "); - } - sql.append(getSortKey()).append(" > ").append(getSortKeyPlaceHolder()); - sql.append(" ORDER BY ").append(getSortKey()).append(" ASC"); + return SqlPagingQueryUtils.generateTopSqlQuery(this, true, buildTopClause(pageSize)); + } - return sql.toString(); + private String buildTopClause(int pageSize) { + return new StringBuilder().append("TOP ").append(pageSize).toString(); } @Override @@ -55,13 +42,8 @@ public class HsqlPagingQueryProvider extends AbstractSqlPagingQueryProvider { int page = itemIndex / pageSize; int offset = (page * pageSize) - 1; - StringBuilder sql = new StringBuilder(); - sql.append("SELECT LIMIT ").append(offset).append(" 1 ").append(getSortKey()).append(" AS SORT_KEY"); - sql.append(" FROM ").append(getFromClause()); - sql.append(getWhereClause() == null ? "" : " WHERE " + getWhereClause()); - sql.append(" ORDER BY ").append(getSortKey()).append(" ASC"); - - return sql.toString(); + String topClause = new StringBuilder().append("LIMIT ").append(offset).append(" 1").toString(); + return SqlPagingQueryUtils.generateTopJumpToQuery(this, topClause); } } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/MySqlPagingQueryProvider.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/MySqlPagingQueryProvider.java index 51bbd049a..cbc58b493 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/MySqlPagingQueryProvider.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/MySqlPagingQueryProvider.java @@ -16,7 +16,7 @@ package org.springframework.batch.item.database.support; /** - * MySQL implementation of a {@link PagingQueryProvider} using database specific features. + * MySQL implementation of a {@link PagingQueryProvider} using database specific features. * * @author Thomas Risberg * @since 2.0 @@ -25,31 +25,16 @@ public class MySqlPagingQueryProvider extends AbstractSqlPagingQueryProvider { @Override public String generateFirstPageQuery(int pageSize) { - StringBuilder sql = new StringBuilder(); - sql.append("SELECT ").append(getSelectClause()); - sql.append(" FROM ").append(getFromClause()); - sql.append(getWhereClause() == null ? "" : " WHERE " + getWhereClause()); - sql.append(" ORDER BY ").append(getSortKey()).append(" ASC"); - sql.append(" LIMIT ").append(pageSize); - - return sql.toString(); + return SqlPagingQueryUtils.generateLimitSqlQuery(this, false, buildLimitClause(pageSize)); } @Override public String generateRemainingPagesQuery(int pageSize) { - StringBuilder sql = new StringBuilder(); - sql.append("SELECT ").append(getSelectClause()); - sql.append(" FROM ").append(getFromClause()); - sql.append(" WHERE "); - if (getWhereClause() != null) { - sql.append(getWhereClause()); - sql.append(" AND "); - } - sql.append(getSortKey()).append(" > ").append(getSortKeyPlaceHolder()); - sql.append(" ORDER BY ").append(getSortKey()).append(" ASC"); - sql.append(" LIMIT ").append(pageSize); + return SqlPagingQueryUtils.generateLimitSqlQuery(this, true, buildLimitClause(pageSize)); + } - return sql.toString(); + private String buildLimitClause(int pageSize) { + return new StringBuilder().append("LIMIT ").append(pageSize).toString(); } @Override @@ -57,14 +42,8 @@ public class MySqlPagingQueryProvider extends AbstractSqlPagingQueryProvider { int page = itemIndex / pageSize; int offset = (page * pageSize) - 1; - StringBuilder sql = new StringBuilder(); - sql.append("SELECT ").append(getSortKey()).append(" AS SORT_KEY"); - sql.append(" FROM ").append(getFromClause()); - sql.append(getWhereClause() == null ? "" : " WHERE " + getWhereClause()); - sql.append(" ORDER BY ").append(getSortKey()).append(" ASC"); - sql.append(" LIMIT ").append(offset).append(", 1"); - - return sql.toString(); + String limitClause = new StringBuilder().append("LIMIT ").append(offset).append(", 1").toString(); + return SqlPagingQueryUtils.generateLimitJumpToQuery(this, limitClause); } } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/OraclePagingQueryProvider.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/OraclePagingQueryProvider.java index 97b54530b..04da47558 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/OraclePagingQueryProvider.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/OraclePagingQueryProvider.java @@ -1,7 +1,22 @@ +/* + * Copyright 2006-2008 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.springframework.batch.item.database.support; /** - * Oracle implementation of a {@link org.springframework.batch.item.database.support.PagingQueryProvider} using + * Oracle implementation of a {@link org.springframework.batch.item.database.support.PagingQueryProvider} using * database specific features. * * @author Thomas Risberg @@ -11,34 +26,17 @@ public class OraclePagingQueryProvider extends SqlWindowingPagingQueryProvider { @Override public String generateFirstPageQuery(int pageSize) { - StringBuilder sql = new StringBuilder(); - sql.append("SELECT ").append(getSelectClause()); - sql.append(" FROM ").append(getFromClause()); - sql.append(" WHERE "); - if (getWhereClause() != null) { - sql.append(getWhereClause()); - sql.append(" AND "); - } - sql.append("ROWNUM <= ").append(pageSize); - sql.append(" ORDER BY ").append(getSortKey()).append(" ASC"); + return SqlPagingQueryUtils.generateRowNumSqlQuery(this, false, buildRowNumClause(pageSize)); - return sql.toString(); } @Override public String generateRemainingPagesQuery(int pageSize) { - StringBuilder sql = new StringBuilder(); - sql.append("SELECT ").append(getSelectClause()); - sql.append(" FROM ").append(getFromClause()); - sql.append(" WHERE "); - if (getWhereClause() != null) { - sql.append(getWhereClause()); - sql.append(" AND "); - } - sql.append(getSortKey()).append(" > ").append(getSortKeyPlaceHolder()); - sql.append(" AND ROWNUM <= ").append(pageSize); - sql.append(" ORDER BY ").append(getSortKey()).append(" ASC"); - - return sql.toString(); + return SqlPagingQueryUtils.generateRowNumSqlQuery(this, true, buildRowNumClause(pageSize)); } + + private String buildRowNumClause(int pageSize) { + return new StringBuilder().append("ROWNUM <= ").append(pageSize).toString(); + } + } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/PostgresPagingQueryProvider.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/PostgresPagingQueryProvider.java index 804ca3a10..bb35cf607 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/PostgresPagingQueryProvider.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/PostgresPagingQueryProvider.java @@ -1,7 +1,22 @@ +/* + * Copyright 2006-2008 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.springframework.batch.item.database.support; /** - * MySQL implementation of a {@link org.springframework.batch.item.database.support.PagingQueryProvider} using database specific features. + * Postgres implementation of a {@link org.springframework.batch.item.database.support.PagingQueryProvider} using database specific features. * * @author Thomas Risberg * @since 2.0 @@ -10,46 +25,25 @@ public class PostgresPagingQueryProvider extends AbstractSqlPagingQueryProvider @Override public String generateFirstPageQuery(int pageSize) { - StringBuilder sql = new StringBuilder(); - sql.append("SELECT ").append(getSelectClause()); - sql.append(" FROM ").append(getFromClause()); - sql.append(getWhereClause() == null ? "" : " WHERE " + getWhereClause()); - sql.append(" ORDER BY ").append(getSortKey()).append(" ASC"); - sql.append(" LIMIT ").append(pageSize); - - return sql.toString(); + return SqlPagingQueryUtils.generateLimitSqlQuery(this, false, buildLimitClause(pageSize)); } @Override public String generateRemainingPagesQuery(int pageSize) { - StringBuilder sql = new StringBuilder(); - sql.append("SELECT ").append(getSelectClause()); - sql.append(" FROM ").append(getFromClause()); - sql.append(" WHERE "); - if (getWhereClause() != null) { - sql.append(getWhereClause()); - sql.append(" AND "); - } - sql.append(getSortKey()).append(" > ").append(getSortKeyPlaceHolder()); - sql.append(" ORDER BY ").append(getSortKey()).append(" ASC"); - sql.append(" LIMIT ").append(pageSize); - - return sql.toString(); + return SqlPagingQueryUtils.generateLimitSqlQuery(this, true, buildLimitClause(pageSize)); } + private String buildLimitClause(int pageSize) { + return new StringBuilder().append("LIMIT ").append(pageSize).toString(); + } + @Override public String generateJumpToItemQuery(int itemIndex, int pageSize) { int page = itemIndex / pageSize; int offset = (page * pageSize) - 1; - StringBuilder sql = new StringBuilder(); - sql.append("SELECT ").append(getSortKey()).append(" AS SORT_KEY"); - sql.append(" FROM ").append(getFromClause()); - sql.append(getWhereClause() == null ? "" : " WHERE " + getWhereClause()); - sql.append(" ORDER BY ").append(getSortKey()).append(" ASC"); - sql.append(" LIMIT ").append(offset).append(" 1"); - - return sql.toString(); + String limitClause = new StringBuilder().append("LIMIT ").append(offset).append(" 1").toString(); + return SqlPagingQueryUtils.generateLimitJumpToQuery(this, limitClause); } } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlPagingQueryUtils.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlPagingQueryUtils.java new file mode 100644 index 000000000..04087a3c8 --- /dev/null +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlPagingQueryUtils.java @@ -0,0 +1,94 @@ +/* + * Copyright 2006-2008 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.batch.item.database.support; + +/** + * Utility class that generates the actual SQL statements used by query providers. + * + * @author Thomas Risberg + * @since 2.0 + */ +public class SqlPagingQueryUtils { + + public static String generateLimitSqlQuery(AbstractSqlPagingQueryProvider provider, boolean remainingPageQuery, String limitClause) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ").append(provider.getSelectClause()); + sql.append(" FROM ").append(provider.getFromClause()); + buildWhereClause(provider, remainingPageQuery, sql); + sql.append(" ORDER BY ").append(provider.getSortKey()).append(" ASC "); + sql.append(limitClause); + + return sql.toString(); + } + + public static String generateTopSqlQuery(AbstractSqlPagingQueryProvider provider, boolean remainingPageQuery, String topClause) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ").append(topClause).append(" ").append(provider.getSelectClause()); + sql.append(" FROM ").append(provider.getFromClause()); + buildWhereClause(provider, remainingPageQuery, sql); + sql.append(" ORDER BY ").append(provider.getSortKey()).append(" ASC"); + + return sql.toString(); + } + + public static String generateRowNumSqlQuery(AbstractSqlPagingQueryProvider provider, boolean remainingPageQuery, String rowNumClause) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ").append(provider.getSelectClause()); + sql.append(" FROM ").append(provider.getFromClause()); + buildWhereClause(provider, remainingPageQuery, sql); + sql.append(provider.getWhereClause() != null ? " AND " : " WHERE ").append(rowNumClause); + sql.append(" ORDER BY ").append(provider.getSortKey()).append(" ASC"); + + return sql.toString(); + + } + + private static void buildWhereClause(AbstractSqlPagingQueryProvider provider, boolean remainingPageQuery, StringBuilder sql) { + if (remainingPageQuery) { + sql.append(" WHERE "); + if (provider.getWhereClause() != null) { + sql.append(provider.getWhereClause()); + sql.append(" AND "); + } + sql.append(provider.getSortKey()).append(" > ").append(provider.getSortKeyPlaceHolder()); + } + else { + sql.append(provider.getWhereClause() == null ? "" : " WHERE " + provider.getWhereClause()); + } + } + + public static String generateTopJumpToQuery(AbstractSqlPagingQueryProvider provider, String topClause) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ").append(topClause).append(" ").append(provider.getSortKey()).append(" AS SORT_KEY"); + sql.append(" FROM ").append(provider.getFromClause()); + sql.append(provider.getWhereClause() == null ? "" : " WHERE " + provider.getWhereClause()); + sql.append(" ORDER BY ").append(provider.getSortKey()).append(" ASC"); + + return sql.toString(); + } + + public static String generateLimitJumpToQuery(AbstractSqlPagingQueryProvider provider, String limitClause) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ").append(provider.getSortKey()).append(" AS SORT_KEY"); + sql.append(" FROM ").append(provider.getFromClause()); + sql.append(provider.getWhereClause() == null ? "" : " WHERE " + provider.getWhereClause()); + sql.append(" ORDER BY ").append(provider.getSortKey()).append(" ASC "); + sql.append( limitClause); + + return sql.toString(); + } + +} diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlServerPagingQueryProvider.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlServerPagingQueryProvider.java index 61089c2bd..7bc171851 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlServerPagingQueryProvider.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlServerPagingQueryProvider.java @@ -1,7 +1,22 @@ +/* + * Copyright 2006-2008 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.springframework.batch.item.database.support; /** - * Sql Server implementation of a {@link org.springframework.batch.item.database.support.PagingQueryProvider} using + * Sql Server implementation of a {@link org.springframework.batch.item.database.support.PagingQueryProvider} using * database specific features. * * @author Thomas Risberg @@ -11,28 +26,15 @@ public class SqlServerPagingQueryProvider extends SqlWindowingPagingQueryProvide @Override public String generateFirstPageQuery(int pageSize) { - StringBuilder sql = new StringBuilder(); - sql.append("SELECT ").append("TOP ").append(pageSize).append(" ").append(getSelectClause()); - sql.append(" FROM ").append(getFromClause()); - sql.append(getWhereClause() == null ? "" : " WHERE " + getWhereClause()); - sql.append(" ORDER BY ").append(getSortKey()).append(" ASC"); - - return sql.toString(); + return SqlPagingQueryUtils.generateTopSqlQuery(this, false, buildTopClause(pageSize)); } @Override public String generateRemainingPagesQuery(int pageSize) { - StringBuilder sql = new StringBuilder(); - sql.append("SELECT ").append("TOP ").append(pageSize).append(" ").append(getSelectClause()); - sql.append(" FROM ").append(getFromClause()); - sql.append(" WHERE "); - if (getWhereClause() != null) { - sql.append(getWhereClause()); - sql.append(" AND "); - } - sql.append(getSortKey()).append(" > ").append(getSortKeyPlaceHolder()); - sql.append(" ORDER BY ").append(getSortKey()).append(" ASC"); + return SqlPagingQueryUtils.generateTopSqlQuery(this, true, buildTopClause(pageSize)); + } - return sql.toString(); + private String buildTopClause(int pageSize) { + return new StringBuilder().append("TOP ").append(pageSize).toString(); } } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SybasePagingQueryProvider.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SybasePagingQueryProvider.java index 957de9eb1..b19334b1f 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SybasePagingQueryProvider.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SybasePagingQueryProvider.java @@ -1,7 +1,22 @@ +/* + * Copyright 2006-2008 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.springframework.batch.item.database.support; /** - * Sybase implementation of a {@link PagingQueryProvider} using + * Sybase implementation of a {@link PagingQueryProvider} using * database specific features. * * @author Thomas Risberg @@ -11,28 +26,16 @@ public class SybasePagingQueryProvider extends SqlWindowingPagingQueryProvider { @Override public String generateFirstPageQuery(int pageSize) { - StringBuilder sql = new StringBuilder(); - sql.append("SELECT ").append("TOP ").append(pageSize).append(" ").append(getSelectClause()); - sql.append(" FROM ").append(getFromClause()); - sql.append(getWhereClause() == null ? "" : " WHERE " + getWhereClause()); - sql.append(" ORDER BY ").append(getSortKey()).append(" ASC"); - - return sql.toString(); + return SqlPagingQueryUtils.generateTopSqlQuery(this, false, buildTopClause(pageSize)); } @Override public String generateRemainingPagesQuery(int pageSize) { - StringBuilder sql = new StringBuilder(); - sql.append("SELECT ").append("TOP ").append(pageSize).append(" ").append(getSelectClause()); - sql.append(" FROM ").append(getFromClause()); - sql.append(" WHERE "); - if (getWhereClause() != null) { - sql.append(getWhereClause()); - sql.append(" AND "); - } - sql.append(getSortKey()).append(" > ").append(getSortKeyPlaceHolder()); - sql.append(" ORDER BY ").append(getSortKey()).append(" ASC"); - - return sql.toString(); + return SqlPagingQueryUtils.generateTopSqlQuery(this, true, buildTopClause(pageSize)); } + + private String buildTopClause(int pageSize) { + return new StringBuilder().append("TOP ").append(pageSize).toString(); + } + } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/OraclePagingQueryProviderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/OraclePagingQueryProviderTests.java index 4637bc3d5..d67d60af4 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/OraclePagingQueryProviderTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/OraclePagingQueryProviderTests.java @@ -18,6 +18,10 @@ public class OraclePagingQueryProviderTests extends AbstractSqlPagingQueryProvid String sql = "SELECT id, name, age FROM foo WHERE bar = 1 AND ROWNUM <= 100 ORDER BY id ASC"; String s = pagingQueryProvider.generateFirstPageQuery(pageSize); Assert.assertEquals("", sql, s); + pagingQueryProvider.setWhereClause(""); + String sql2 = "SELECT id, name, age FROM foo WHERE ROWNUM <= 100 ORDER BY id ASC"; + String s2 = pagingQueryProvider.generateFirstPageQuery(pageSize); + Assert.assertEquals("", sql2, s2); } @Test @Override