From 3b551287d7d60efdd39f38c84164a87d3ec1314f Mon Sep 17 00:00:00 2001 From: Michael Minella Date: Tue, 30 Oct 2012 15:46:10 -0500 Subject: [PATCH] BATCH-1691: Implemented group by clause in paging queries --- .../item/database/JdbcPagingItemReader.java | 13 ++++- .../AbstractSqlPagingQueryProvider.java | 26 +++++++++- .../support/PostgresPagingQueryProvider.java | 6 ++- .../SqlPagingQueryProviderFactoryBean.java | 15 +++++- .../database/support/SqlPagingQueryUtils.java | 18 ++++++- .../SqlWindowingPagingQueryProvider.java | 6 ++- .../AbstractSqlPagingQueryProviderTests.java | 15 +++++- .../support/Db2PagingQueryProviderTests.java | 46 +++++++++++++++-- .../DerbyPagingQueryProviderTests.java | 39 ++++++++++++++- .../support/H2PagingQueryProviderTests.java | 49 +++++++++++++++--- .../support/HsqlPagingQueryProviderTests.java | 50 ++++++++++++++++--- .../MySqlPagingQueryProviderTests.java | 49 +++++++++++++++--- .../OraclePagingQueryProviderTests.java | 49 +++++++++++++++--- .../PostgresPagingQueryProviderTests.java | 46 +++++++++++++++-- .../SqlServerPagingQueryProviderTests.java | 46 +++++++++++++++-- .../SqlWindowingPagingQueryProviderTests.java | 40 ++++++++++++++- .../SybasePagingQueryProviderTests.java | 47 +++++++++++++++-- 17 files changed, 505 insertions(+), 55 deletions(-) diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/JdbcPagingItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/JdbcPagingItemReader.java index d96518f9f..bd98a32d3 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/JdbcPagingItemReader.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/JdbcPagingItemReader.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2008 the original author or authors. + * Copyright 2006-2012 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. @@ -37,6 +37,7 @@ import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; +import org.springframework.util.StringUtils; /** *

@@ -70,6 +71,7 @@ import org.springframework.util.ClassUtils; * * @author Thomas Risberg * @author Dave Syer + * @author Michael Minella * @since 2.0 */ public class JdbcPagingItemReader extends AbstractPagingItemReader implements InitializingBean { @@ -157,6 +159,7 @@ public class JdbcPagingItemReader extends AbstractPagingItemReader impleme * Check mandatory properties. * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet() */ + @Override public void afterPropertiesSet() throws Exception { super.afterPropertiesSet(); Assert.notNull(dataSource); @@ -305,7 +308,13 @@ public class JdbcPagingItemReader extends AbstractPagingItemReader impleme private class PagingRowMapper implements RowMapper { public Object mapRow(ResultSet rs, int rowNum) throws SQLException { - startAfterValue = rs.getObject(queryProvider.getSortKeyWithoutAlias()); + if(StringUtils.hasText(queryProvider.getSortKey())) { + startAfterValue = rs.getObject(queryProvider.getSortKey()); + } + else { + startAfterValue = rs.getObject(queryProvider.getSortKeyWithoutAlias()); + } + return rowMapper.mapRow(rs, rowNum); } } 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 fc5e78025..2e6619dd6 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 @@ -1,5 +1,5 @@ /* - * Copyright 2006-2008 the original author or authors. + * Copyright 2006-2012 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. @@ -43,6 +43,7 @@ import java.util.ArrayList; * * @author Thomas Risberg * @author Dave Syer + * @author Michael Minella * @since 2.0 */ public abstract class AbstractSqlPagingQueryProvider implements PagingQueryProvider { @@ -54,12 +55,32 @@ public abstract class AbstractSqlPagingQueryProvider implements PagingQueryProvi private String whereClause; private String sortKey; + + private String groupClause; private boolean ascending = true; private int parameterCount; private boolean usingNamedParameters; + + /** + * The setter for the group by clause + * + * @param SQL GROUP BY clause part of the SQL query string + */ + public void setGroupClause(String groupClause) { + this.groupClause = groupClause; + } + + /** + * The getter for the group by clause + * + * @return SQL GROUP BY clause part of the SQL query string + */ + public String getGroupClause() { + return this.groupClause; + } /** * @param selectClause SELECT clause part of SQL query string @@ -194,6 +215,9 @@ public abstract class AbstractSqlPagingQueryProvider implements PagingQueryProvi if (whereClause != null) { sql.append(" WHERE ").append(whereClause); } + if(groupClause != null) { + sql.append(" GROUP BY ").append(groupClause); + } List namedParameters = new ArrayList(); parameterCount = JdbcParameterUtils.countParameterPlaceholders(sql.toString(), namedParameters); if (namedParameters.size() > 0) { 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 e1ce7c41f..b92603575 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,5 +1,5 @@ /* - * Copyright 2006-2008 the original author or authors. + * Copyright 2006-2012 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. @@ -18,8 +18,12 @@ package org.springframework.batch.item.database.support; /** * Postgres implementation of a {@link org.springframework.batch.item.database.PagingQueryProvider} using database specific features. + * + * When using the groupClause, this implementation expects all select fields not used in aggregate functions to be included in the + * groupClause (the provider does not add them for you). * * @author Thomas Risberg + * @author Michael Minella * @since 2.0 */ public class PostgresPagingQueryProvider extends AbstractSqlPagingQueryProvider { diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlPagingQueryProviderFactoryBean.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlPagingQueryProviderFactoryBean.java index 42ae64509..c0963aba7 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlPagingQueryProviderFactoryBean.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlPagingQueryProviderFactoryBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2008 the original author or authors. + * Copyright 2006-2012 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. @@ -44,6 +44,7 @@ import org.springframework.util.StringUtils; * types are given by the {@link DatabaseType} enum. * * @author Dave Syer + * @author Michael Minella */ public class SqlPagingQueryProviderFactoryBean implements FactoryBean { @@ -56,6 +57,8 @@ public class SqlPagingQueryProviderFactoryBean implements FactoryBean { private String whereClause; private String selectClause; + + private String groupClause; private String sortKey; @@ -76,6 +79,13 @@ public class SqlPagingQueryProviderFactoryBean implements FactoryBean { providers.put(SQLSERVER,new SqlServerPagingQueryProvider()); providers.put(SYBASE,new SybasePagingQueryProvider()); } + + /** + * @param SQL GROUP BY clause part of the SQL query string + */ + public void setGroupClause(String groupClause) { + this.groupClause = groupClause; + } /** * @param databaseType the databaseType to set @@ -154,6 +164,9 @@ public class SqlPagingQueryProviderFactoryBean implements FactoryBean { if (StringUtils.hasText(selectClause)) { provider.setSelectClause(selectClause); } + if(StringUtils.hasText(groupClause)) { + provider.setGroupClause(groupClause); + } provider.init(dataSource); 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 index adfea3654..093f834c8 100644 --- 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 @@ -1,5 +1,5 @@ /* - * Copyright 2006-2008 the original author or authors. + * Copyright 2006-2012 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. @@ -16,12 +16,15 @@ package org.springframework.batch.item.database.support; +import org.springframework.util.StringUtils; + /** * Utility class that generates the actual SQL statements used by query * providers. * * @author Thomas Risberg * @author Dave Syer + * @author Michael Minella * @since 2.0 */ public class SqlPagingQueryUtils { @@ -42,6 +45,7 @@ public class SqlPagingQueryUtils { sql.append("SELECT ").append(provider.getSelectClause()); sql.append(" FROM ").append(provider.getFromClause()); buildWhereClause(provider, remainingPageQuery, sql); + buildGroupByClause(provider, sql); sql.append(" ORDER BY ").append(provider.getSortKeyWithoutAlias()); buildAscendingClause(provider, sql); sql.append(" " + limitClause); @@ -65,6 +69,7 @@ public class SqlPagingQueryUtils { sql.append("SELECT ").append(topClause).append(" ").append(provider.getSelectClause()); sql.append(" FROM ").append(provider.getFromClause()); buildWhereClause(provider, remainingPageQuery, sql); + buildGroupByClause(provider, sql); sql.append(" ORDER BY ").append(provider.getSortKeyWithoutAlias()); buildAscendingClause(provider, sql); @@ -104,6 +109,7 @@ public class SqlPagingQueryUtils { sql.append("SELECT * FROM (SELECT ").append(selectClause).append(", ROWNUM as TMP_ROW_NUM"); sql.append(" FROM ").append(provider.getFromClause()); buildWhereClause(provider, remainingPageQuery, sql); + buildGroupByClause(provider, sql); sql.append(" ORDER BY ").append(provider.getSortKeyWithoutAlias()); buildAscendingClause(provider, sql); sql.append(") WHERE ").append(rowNumClause); @@ -125,6 +131,7 @@ public class SqlPagingQueryUtils { .append(", ROWNUM as TMP_ROW_NUM"); sql.append(" FROM (SELECT ").append(innerSelectClause).append(" FROM ").append(provider.getFromClause()); buildWhereClause(provider, remainingPageQuery, sql); + buildGroupByClause(provider, sql); sql.append(" ORDER BY ").append(provider.getSortKeyWithoutAlias()); buildAscendingClause(provider, sql); sql.append(")) WHERE ").append(rowNumClause); @@ -146,6 +153,7 @@ public class SqlPagingQueryUtils { sql.append("SELECT ").append(provider.getSortKey()).append(" AS SORT_KEY"); sql.append(" FROM ").append(provider.getFromClause()); sql.append(provider.getWhereClause() == null ? "" : " WHERE " + provider.getWhereClause()); + buildGroupByClause(provider, sql); sql.append(" ORDER BY ").append(provider.getSortKeyWithoutAlias()); buildAscendingClause(provider, sql); sql.append(" " + limitClause); @@ -166,6 +174,7 @@ public class SqlPagingQueryUtils { 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()); + buildGroupByClause(provider, sql); sql.append(" ORDER BY ").append(provider.getSortKeyWithoutAlias()); buildAscendingClause(provider, sql); @@ -202,5 +211,12 @@ public class SqlPagingQueryUtils { sql.append(provider.getWhereClause() == null ? "" : " WHERE " + provider.getWhereClause()); } } + + private static void buildGroupByClause(AbstractSqlPagingQueryProvider provider, StringBuilder sql) { + if(StringUtils.hasText(provider.getGroupClause())) { + sql.append(" GROUP BY "); + sql.append(provider.getGroupClause()); + } + } } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlWindowingPagingQueryProvider.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlWindowingPagingQueryProvider.java index e3f869619..3aaa72b41 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlWindowingPagingQueryProvider.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlWindowingPagingQueryProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2008 the original author or authors. + * Copyright 2006-2012 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. @@ -24,6 +24,7 @@ import org.springframework.util.StringUtils; * Apache Derby version 10.4.1.3 * * @author Thomas Risberg + * @author Michael Minella * @since 2.0 */ public class SqlWindowingPagingQueryProvider extends AbstractSqlPagingQueryProvider { @@ -38,6 +39,7 @@ public class SqlWindowingPagingQueryProvider extends AbstractSqlPagingQueryProvi sql.append(getOverSubstituteClauseStart()); sql.append(" FROM ").append(getFromClause()).append( getWhereClause() == null ? "" : " WHERE " + getWhereClause()); + sql.append(getGroupClause() == null ? "" : " GROUP BY " + getGroupClause()); sql.append(getOverSubstituteClauseEnd()); sql.append(") ").append(getSubQueryAlias()).append("WHERE ").append(extractTableAlias()).append( "ROW_NUMBER <= ").append(pageSize); @@ -79,6 +81,7 @@ public class SqlWindowingPagingQueryProvider extends AbstractSqlPagingQueryProvi sql.append(" < "); } sql.append(getSortKeyPlaceHolder()); + sql.append(getGroupClause() == null ? "" : " GROUP BY " + getGroupClause()); sql.append(getOverSubstituteClauseEnd()); sql.append(") ").append(getSubQueryAlias()).append("WHERE ").append(extractTableAlias()).append( "ROW_NUMBER <= ").append(pageSize); @@ -102,6 +105,7 @@ public class SqlWindowingPagingQueryProvider extends AbstractSqlPagingQueryProvi sql.append(getOverSubstituteClauseStart()); sql.append(" FROM ").append(getFromClause()); sql.append(getWhereClause() == null ? "" : " WHERE " + getWhereClause()); + sql.append(getGroupClause() == null ? "" : " GROUP BY " + getGroupClause()); sql.append(getOverSubstituteClauseEnd()); sql.append(") ").append(getSubQueryAlias()).append("WHERE ").append(extractTableAlias()).append( "ROW_NUMBER = ").append(lastRowNum); diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/AbstractSqlPagingQueryProviderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/AbstractSqlPagingQueryProviderTests.java index 0ffc0e4bb..27c0a62c0 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/AbstractSqlPagingQueryProviderTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/AbstractSqlPagingQueryProviderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2008 the original author or authors. + * Copyright 2006-2012 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. @@ -22,6 +22,7 @@ import org.junit.Test; /** * @author Thomas Risberg + * @author Michael Minella */ public abstract class AbstractSqlPagingQueryProviderTests { @@ -66,5 +67,17 @@ public abstract class AbstractSqlPagingQueryProviderTests { @Test public abstract void testGenerateJumpToItemQueryForFirstPage(); + + @Test + public abstract void testGenerateFirstPageQueryWithGroupBy(); + + @Test + public abstract void testGenerateRemainingPagesQueryWithGroupBy(); + + @Test + public abstract void testGenerateJumpToItemQueryWithGroupBy(); + + @Test + public abstract void testGenerateJumpToItemQueryForFirstPageWithGroupBy(); } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/Db2PagingQueryProviderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/Db2PagingQueryProviderTests.java index a406f1166..90fad6d75 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/Db2PagingQueryProviderTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/Db2PagingQueryProviderTests.java @@ -1,10 +1,11 @@ package org.springframework.batch.item.database.support; import org.junit.Test; -import org.junit.Assert; +import static org.junit.Assert.assertEquals; /** * @author Thomas Risberg + * @author Michael Minella */ public class Db2PagingQueryProviderTests extends AbstractSqlPagingQueryProviderTests { @@ -17,28 +18,63 @@ public class Db2PagingQueryProviderTests extends AbstractSqlPagingQueryProviderT public void testGenerateFirstPageQuery() { String sql = "SELECT id, name, age FROM foo WHERE bar = 1 ORDER BY id ASC FETCH FIRST 100 ROWS ONLY"; String s = pagingQueryProvider.generateFirstPageQuery(pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); } @Test @Override public void testGenerateRemainingPagesQuery() { String sql = "SELECT id, name, age FROM foo WHERE bar = 1 AND id > ? ORDER BY id ASC FETCH FIRST 100 ROWS ONLY"; String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); } @Test @Override public void testGenerateJumpToItemQuery() { String sql = "SELECT SORT_KEY FROM ( SELECT id AS SORT_KEY, ROW_NUMBER() OVER (ORDER BY id ASC) AS ROW_NUMBER FROM foo WHERE bar = 1) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 100"; String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); } @Test @Override public void testGenerateJumpToItemQueryForFirstPage() { String sql = "SELECT SORT_KEY FROM ( SELECT id AS SORT_KEY, ROW_NUMBER() OVER (ORDER BY id ASC) AS ROW_NUMBER FROM foo WHERE bar = 1) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 1"; String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); } + @Override + @Test + public void testGenerateFirstPageQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT id, name, age FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC FETCH FIRST 100 ROWS ONLY"; + String s = pagingQueryProvider.generateFirstPageQuery(pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateRemainingPagesQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT id, name, age FROM foo WHERE bar = 1 AND id > ? GROUP BY dep ORDER BY id ASC FETCH FIRST 100 ROWS ONLY"; + String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateJumpToItemQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT SORT_KEY FROM ( SELECT id AS SORT_KEY, ROW_NUMBER() OVER (ORDER BY id ASC) AS ROW_NUMBER FROM foo WHERE bar = 1 GROUP BY dep) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 100"; + String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateJumpToItemQueryForFirstPageWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT SORT_KEY FROM ( SELECT id AS SORT_KEY, ROW_NUMBER() OVER (ORDER BY id ASC) AS ROW_NUMBER FROM foo WHERE bar = 1 GROUP BY dep) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 1"; + String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize); + assertEquals(sql, s); + } } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/DerbyPagingQueryProviderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/DerbyPagingQueryProviderTests.java index f1da15da3..0654aa1fc 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/DerbyPagingQueryProviderTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/DerbyPagingQueryProviderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2008 the original author or authors. + * Copyright 2006-2012 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. @@ -19,6 +19,7 @@ import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -33,6 +34,7 @@ import org.springframework.dao.InvalidDataAccessResourceUsageException; /** * @author Thomas Risberg + * @author Michael Minella */ public class DerbyPagingQueryProviderTests extends AbstractSqlPagingQueryProviderTests { @@ -133,4 +135,39 @@ public class DerbyPagingQueryProviderTests extends AbstractSqlPagingQueryProvide assertTrue("Wrong query: " + s, s.contains("id desc")); } + @Override + @Test + public void testGenerateFirstPageQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT * FROM ( SELECT id, name, age, ROW_NUMBER() OVER () AS ROW_NUMBER FROM (SELECT id, name, age FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC) AS TMP_ORDERED) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER <= 100"; + String s = pagingQueryProvider.generateFirstPageQuery(pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateRemainingPagesQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT * FROM ( SELECT id, name, age, ROW_NUMBER() OVER () AS ROW_NUMBER FROM (SELECT id, name, age FROM foo WHERE bar = 1 AND id > ? GROUP BY dep ORDER BY id ASC) AS TMP_ORDERED) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER <= 100"; + String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateJumpToItemQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT SORT_KEY FROM ( SELECT id AS SORT_KEY, ROW_NUMBER() OVER () AS ROW_NUMBER FROM (SELECT id, name, age FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC) AS TMP_ORDERED) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 100"; + String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateJumpToItemQueryForFirstPageWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT SORT_KEY FROM ( SELECT id AS SORT_KEY, ROW_NUMBER() OVER () AS ROW_NUMBER FROM (SELECT id, name, age FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC) AS TMP_ORDERED) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 1"; + String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize); + assertEquals(sql, s); + } } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/H2PagingQueryProviderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/H2PagingQueryProviderTests.java index 6cd942ef3..e4df91051 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/H2PagingQueryProviderTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/H2PagingQueryProviderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2008 the original author or authors. + * Copyright 2006-2012 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. @@ -16,11 +16,12 @@ package org.springframework.batch.item.database.support; import org.junit.Test; -import org.junit.Assert; +import static org.junit.Assert.assertEquals; /** * @author Thomas Risberg * @author Dave Syer + * @author Michael Minella */ public class H2PagingQueryProviderTests extends AbstractSqlPagingQueryProviderTests { @@ -33,27 +34,63 @@ public class H2PagingQueryProviderTests extends AbstractSqlPagingQueryProviderTe public void testGenerateFirstPageQuery() { String sql = "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 ORDER BY id ASC"; String s = pagingQueryProvider.generateFirstPageQuery(pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); } @Test @Override public void testGenerateRemainingPagesQuery() { String sql = "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 AND id > ? ORDER BY id ASC"; String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); } @Test @Override public void testGenerateJumpToItemQuery() { String sql = "SELECT LIMIT 99 1 id AS SORT_KEY FROM foo WHERE bar = 1 ORDER BY id ASC"; String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); } @Test @Override public void testGenerateJumpToItemQueryForFirstPage() { String sql = "SELECT LIMIT 0 1 id AS SORT_KEY FROM foo WHERE bar = 1 ORDER BY id ASC"; String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateFirstPageQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC"; + String s = pagingQueryProvider.generateFirstPageQuery(pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateRemainingPagesQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 AND id > ? GROUP BY dep ORDER BY id ASC"; + String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateJumpToItemQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT LIMIT 99 1 id AS SORT_KEY FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC"; + String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateJumpToItemQueryForFirstPageWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT LIMIT 0 1 id AS SORT_KEY FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC"; + String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize); + assertEquals(sql, s); } } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/HsqlPagingQueryProviderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/HsqlPagingQueryProviderTests.java index 196cee342..43753acbb 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/HsqlPagingQueryProviderTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/HsqlPagingQueryProviderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2008 the original author or authors. + * Copyright 2006-2012 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. @@ -16,10 +16,12 @@ package org.springframework.batch.item.database.support; import org.junit.Test; -import org.junit.Assert; + +import static org.junit.Assert.assertEquals; /** * @author Thomas Risberg + * @author Michael Minella */ public class HsqlPagingQueryProviderTests extends AbstractSqlPagingQueryProviderTests { @@ -32,27 +34,63 @@ public class HsqlPagingQueryProviderTests extends AbstractSqlPagingQueryProvider public void testGenerateFirstPageQuery() { String sql = "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 ORDER BY id ASC"; String s = pagingQueryProvider.generateFirstPageQuery(pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); } @Test @Override public void testGenerateRemainingPagesQuery() { String sql = "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 AND id > ? ORDER BY id ASC"; String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); } @Test @Override public void testGenerateJumpToItemQuery() { String sql = "SELECT LIMIT 99 1 id AS SORT_KEY FROM foo WHERE bar = 1 ORDER BY id ASC"; String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); } @Test @Override public void testGenerateJumpToItemQueryForFirstPage() { String sql = "SELECT LIMIT 0 1 id AS SORT_KEY FROM foo WHERE bar = 1 ORDER BY id ASC"; String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateFirstPageQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC"; + String s = pagingQueryProvider.generateFirstPageQuery(pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateRemainingPagesQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 AND id > ? GROUP BY dep ORDER BY id ASC"; + String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateJumpToItemQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT LIMIT 99 1 id AS SORT_KEY FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC"; + String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateJumpToItemQueryForFirstPageWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT LIMIT 0 1 id AS SORT_KEY FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC"; + String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize); + assertEquals(sql, s); } } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/MySqlPagingQueryProviderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/MySqlPagingQueryProviderTests.java index af51b9552..8d5dd5fbc 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/MySqlPagingQueryProviderTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/MySqlPagingQueryProviderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2008 the original author or authors. + * Copyright 2006-2012 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. @@ -16,10 +16,11 @@ package org.springframework.batch.item.database.support; import org.junit.Test; -import org.junit.Assert; +import static org.junit.Assert.assertEquals; /** * @author Thomas Risberg + * @author Michael Minella */ public class MySqlPagingQueryProviderTests extends AbstractSqlPagingQueryProviderTests { @@ -32,27 +33,63 @@ public class MySqlPagingQueryProviderTests extends AbstractSqlPagingQueryProvide public void testGenerateFirstPageQuery() { String sql = "SELECT id, name, age FROM foo WHERE bar = 1 ORDER BY id ASC LIMIT 100"; String s = pagingQueryProvider.generateFirstPageQuery(pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); } @Test @Override public void testGenerateRemainingPagesQuery() { String sql = "SELECT id, name, age FROM foo WHERE bar = 1 AND id > ? ORDER BY id ASC LIMIT 100"; String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); } @Test @Override public void testGenerateJumpToItemQuery() { String sql = "SELECT id AS SORT_KEY FROM foo WHERE bar = 1 ORDER BY id ASC LIMIT 99, 1"; String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); } @Test @Override public void testGenerateJumpToItemQueryForFirstPage() { String sql = "SELECT id AS SORT_KEY FROM foo WHERE bar = 1 ORDER BY id ASC LIMIT 0, 1"; String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateFirstPageQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT id, name, age FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC LIMIT 100"; + String s = pagingQueryProvider.generateFirstPageQuery(pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateRemainingPagesQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT id, name, age FROM foo WHERE bar = 1 AND id > ? GROUP BY dep ORDER BY id ASC LIMIT 100"; + String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateJumpToItemQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT id AS SORT_KEY FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC LIMIT 99, 1"; + String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateJumpToItemQueryForFirstPageWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT id AS SORT_KEY FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC LIMIT 0, 1"; + String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize); + assertEquals(sql, s); } } 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 fe2fff029..d8a410079 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 @@ -1,10 +1,11 @@ package org.springframework.batch.item.database.support; -import org.junit.Assert; +import static org.junit.Assert.assertEquals; import org.junit.Test; /** * @author Thomas Risberg + * @author Michael Minella */ public class OraclePagingQueryProviderTests extends AbstractSqlPagingQueryProviderTests { @@ -17,31 +18,67 @@ public class OraclePagingQueryProviderTests extends AbstractSqlPagingQueryProvid public void testGenerateFirstPageQuery() { String sql = "SELECT * FROM (SELECT id, name, age, ROWNUM as TMP_ROW_NUM FROM foo WHERE bar = 1 ORDER BY id ASC) WHERE ROWNUM <= 100"; String s = pagingQueryProvider.generateFirstPageQuery(pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); pagingQueryProvider.setWhereClause(""); String sql2 = "SELECT * FROM (SELECT id, name, age, ROWNUM as TMP_ROW_NUM FROM foo ORDER BY id ASC) WHERE ROWNUM <= 100"; String s2 = pagingQueryProvider.generateFirstPageQuery(pageSize); - Assert.assertEquals("", sql2, s2); + assertEquals(sql2, s2); } @Test @Override public void testGenerateRemainingPagesQuery() { String sql = "SELECT * FROM (SELECT id, name, age, ROWNUM as TMP_ROW_NUM FROM foo WHERE bar = 1 AND id > ? ORDER BY id ASC) WHERE ROWNUM <= 100"; String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); } @Test @Override public void testGenerateJumpToItemQuery() { String sql = "SELECT SORT_KEY FROM (SELECT SORT_KEY, ROWNUM as TMP_ROW_NUM FROM (SELECT id AS SORT_KEY FROM foo WHERE bar = 1 ORDER BY id ASC)) WHERE TMP_ROW_NUM = 100"; String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize); - Assert.assertEquals(sql, s); + assertEquals(sql, s); } @Test @Override public void testGenerateJumpToItemQueryForFirstPage() { String sql = "SELECT SORT_KEY FROM (SELECT SORT_KEY, ROWNUM as TMP_ROW_NUM FROM (SELECT id AS SORT_KEY FROM foo WHERE bar = 1 ORDER BY id ASC)) WHERE TMP_ROW_NUM = 1"; String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize); - Assert.assertEquals(sql, s); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateFirstPageQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT * FROM (SELECT id, name, age, ROWNUM as TMP_ROW_NUM FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC) WHERE ROWNUM <= 100"; + String s = pagingQueryProvider.generateFirstPageQuery(pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateRemainingPagesQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT * FROM (SELECT id, name, age, ROWNUM as TMP_ROW_NUM FROM foo WHERE bar = 1 AND id > ? GROUP BY dep ORDER BY id ASC) WHERE ROWNUM <= 100"; + String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateJumpToItemQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT SORT_KEY FROM (SELECT SORT_KEY, ROWNUM as TMP_ROW_NUM FROM (SELECT id AS SORT_KEY FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC)) WHERE TMP_ROW_NUM = 100"; + String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateJumpToItemQueryForFirstPageWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT SORT_KEY FROM (SELECT SORT_KEY, ROWNUM as TMP_ROW_NUM FROM (SELECT id AS SORT_KEY FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC)) WHERE TMP_ROW_NUM = 1"; + String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize); + assertEquals(sql, s); } } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/PostgresPagingQueryProviderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/PostgresPagingQueryProviderTests.java index 9b4d266c7..53d841807 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/PostgresPagingQueryProviderTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/PostgresPagingQueryProviderTests.java @@ -1,10 +1,11 @@ package org.springframework.batch.item.database.support; import org.junit.Test; -import org.junit.Assert; +import static org.junit.Assert.assertEquals; /** * @author Thomas Risberg + * @author Michael Minella */ public class PostgresPagingQueryProviderTests extends AbstractSqlPagingQueryProviderTests { @@ -17,28 +18,63 @@ public class PostgresPagingQueryProviderTests extends AbstractSqlPagingQueryProv public void testGenerateFirstPageQuery() { String sql = "SELECT id, name, age FROM foo WHERE bar = 1 ORDER BY id ASC LIMIT 100"; String s = pagingQueryProvider.generateFirstPageQuery(pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); } @Test @Override public void testGenerateRemainingPagesQuery() { String sql = "SELECT id, name, age FROM foo WHERE bar = 1 AND id > ? ORDER BY id ASC LIMIT 100"; String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); } @Test @Override public void testGenerateJumpToItemQuery() { String sql = "SELECT id AS SORT_KEY FROM foo WHERE bar = 1 ORDER BY id ASC LIMIT 1 OFFSET 99"; String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize); - Assert.assertEquals("Wrong SQL for jump to", sql, s); + assertEquals("Wrong SQL for jump to", sql, s); } @Test @Override public void testGenerateJumpToItemQueryForFirstPage() { String sql = "SELECT id AS SORT_KEY FROM foo WHERE bar = 1 ORDER BY id ASC LIMIT 1 OFFSET 0"; String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize); - Assert.assertEquals("Wrong SQL for first page", sql, s); + assertEquals("Wrong SQL for first page", sql, s); } + @Override + @Test + public void testGenerateFirstPageQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("id, dep"); + String sql = "SELECT id, name, age FROM foo WHERE bar = 1 GROUP BY id, dep ORDER BY id ASC LIMIT 100"; + String s = pagingQueryProvider.generateFirstPageQuery(pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateRemainingPagesQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("id, dep"); + String sql = "SELECT id, name, age FROM foo WHERE bar = 1 AND id > ? GROUP BY id, dep ORDER BY id ASC LIMIT 100"; + String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateJumpToItemQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("id, dep"); + String sql = "SELECT id AS SORT_KEY FROM foo WHERE bar = 1 GROUP BY id, dep ORDER BY id ASC LIMIT 1 OFFSET 99"; + String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateJumpToItemQueryForFirstPageWithGroupBy() { + pagingQueryProvider.setGroupClause("id, dep"); + String sql = "SELECT id AS SORT_KEY FROM foo WHERE bar = 1 GROUP BY id, dep ORDER BY id ASC LIMIT 1 OFFSET 0"; + String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize); + assertEquals(sql, s); + } } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/SqlServerPagingQueryProviderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/SqlServerPagingQueryProviderTests.java index e71229b1d..b0b7f7007 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/SqlServerPagingQueryProviderTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/SqlServerPagingQueryProviderTests.java @@ -1,10 +1,11 @@ package org.springframework.batch.item.database.support; import org.junit.Test; -import org.junit.Assert; +import static org.junit.Assert.assertEquals; /** * @author Thomas Risberg + * @author Michael Minella */ public class SqlServerPagingQueryProviderTests extends AbstractSqlPagingQueryProviderTests { @@ -17,28 +18,63 @@ public class SqlServerPagingQueryProviderTests extends AbstractSqlPagingQueryPro public void testGenerateFirstPageQuery() { String sql = "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 ORDER BY id ASC"; String s = pagingQueryProvider.generateFirstPageQuery(pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); } @Test @Override public void testGenerateRemainingPagesQuery() { String sql = "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 AND id > ? ORDER BY id ASC"; String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); } @Test @Override public void testGenerateJumpToItemQuery() { String sql = "SELECT SORT_KEY FROM ( SELECT id AS SORT_KEY, ROW_NUMBER() OVER (ORDER BY id ASC) AS ROW_NUMBER FROM foo WHERE bar = 1) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 100"; String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); } @Test @Override public void testGenerateJumpToItemQueryForFirstPage() { String sql = "SELECT SORT_KEY FROM ( SELECT id AS SORT_KEY, ROW_NUMBER() OVER (ORDER BY id ASC) AS ROW_NUMBER FROM foo WHERE bar = 1) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 1"; String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize); - Assert.assertEquals("", sql, s); + assertEquals(sql, s); } + @Override + @Test + public void testGenerateFirstPageQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC"; + String s = pagingQueryProvider.generateFirstPageQuery(pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateRemainingPagesQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 AND id > ? GROUP BY dep ORDER BY id ASC"; + String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateJumpToItemQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT SORT_KEY FROM ( SELECT id AS SORT_KEY, ROW_NUMBER() OVER (ORDER BY id ASC) AS ROW_NUMBER FROM foo WHERE bar = 1 GROUP BY dep) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 100"; + String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateJumpToItemQueryForFirstPageWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT SORT_KEY FROM ( SELECT id AS SORT_KEY, ROW_NUMBER() OVER (ORDER BY id ASC) AS ROW_NUMBER FROM foo WHERE bar = 1 GROUP BY dep) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 1"; + String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize); + assertEquals(sql, s); + } } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/SqlWindowingPagingQueryProviderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/SqlWindowingPagingQueryProviderTests.java index 2245c4651..7f2605256 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/SqlWindowingPagingQueryProviderTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/SqlWindowingPagingQueryProviderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2008 the original author or authors. + * Copyright 2006-2012 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. @@ -15,13 +15,14 @@ */ package org.springframework.batch.item.database.support; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; import org.junit.Assert; import org.junit.Test; /** * @author Thomas Risberg + * @author Michael Minella */ public class SqlWindowingPagingQueryProviderTests extends AbstractSqlPagingQueryProviderTests { @@ -57,4 +58,39 @@ public class SqlWindowingPagingQueryProviderTests extends AbstractSqlPagingQuery Assert.assertEquals("", sql, s); } + @Override + @Test + public void testGenerateFirstPageQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT * FROM ( SELECT id, name, age, ROW_NUMBER() OVER (ORDER BY id ASC) AS ROW_NUMBER FROM foo WHERE bar = 1 GROUP BY dep) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER <= 100"; + String s = pagingQueryProvider.generateFirstPageQuery(pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateRemainingPagesQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT * FROM ( SELECT id, name, age, ROW_NUMBER() OVER (ORDER BY id ASC) AS ROW_NUMBER FROM foo WHERE bar = 1 AND id > ? GROUP BY dep) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER <= 100"; + String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateJumpToItemQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT SORT_KEY FROM ( SELECT id AS SORT_KEY, ROW_NUMBER() OVER (ORDER BY id ASC) AS ROW_NUMBER FROM foo WHERE bar = 1 GROUP BY dep) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 100"; + String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateJumpToItemQueryForFirstPageWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT SORT_KEY FROM ( SELECT id AS SORT_KEY, ROW_NUMBER() OVER (ORDER BY id ASC) AS ROW_NUMBER FROM foo WHERE bar = 1 GROUP BY dep) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 1"; + String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize); + assertEquals(sql, s); + } } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/SybasePagingQueryProviderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/SybasePagingQueryProviderTests.java index 1503798be..c31c764c3 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/SybasePagingQueryProviderTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/SybasePagingQueryProviderTests.java @@ -1,10 +1,11 @@ package org.springframework.batch.item.database.support; import org.junit.Test; -import org.junit.Assert; +import static org.junit.Assert.assertEquals; /** * @author Thomas Risberg + * @author Michael Minella */ public class SybasePagingQueryProviderTests extends AbstractSqlPagingQueryProviderTests { @@ -17,27 +18,63 @@ public class SybasePagingQueryProviderTests extends AbstractSqlPagingQueryProvid public void testGenerateFirstPageQuery() { String sql = "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 ORDER BY id ASC"; String s = pagingQueryProvider.generateFirstPageQuery(pageSize); - Assert.assertEquals("", sql, s); + assertEquals("", sql, s); } @Test @Override public void testGenerateRemainingPagesQuery() { String sql = "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 AND id > ? ORDER BY id ASC"; String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize); - Assert.assertEquals("", sql, s); + assertEquals("", sql, s); } @Test @Override public void testGenerateJumpToItemQuery() { String sql = "SELECT SORT_KEY FROM ( SELECT id AS SORT_KEY, ROW_NUMBER() OVER (ORDER BY id ASC) AS ROW_NUMBER FROM foo WHERE bar = 1) WHERE ROW_NUMBER = 100"; String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize); - Assert.assertEquals("", sql, s); + assertEquals("", sql, s); } @Test @Override public void testGenerateJumpToItemQueryForFirstPage() { String sql = "SELECT SORT_KEY FROM ( SELECT id AS SORT_KEY, ROW_NUMBER() OVER (ORDER BY id ASC) AS ROW_NUMBER FROM foo WHERE bar = 1) WHERE ROW_NUMBER = 1"; String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize); - Assert.assertEquals("", sql, s); + assertEquals("", sql, s); + } + + @Override + @Test + public void testGenerateFirstPageQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC"; + String s = pagingQueryProvider.generateFirstPageQuery(pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateRemainingPagesQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 AND id > ? GROUP BY dep ORDER BY id ASC"; + String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateJumpToItemQueryWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT SORT_KEY FROM ( SELECT id AS SORT_KEY, ROW_NUMBER() OVER (ORDER BY id ASC) AS ROW_NUMBER FROM foo WHERE bar = 1 GROUP BY dep) WHERE ROW_NUMBER = 100"; + String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize); + assertEquals(sql, s); + } + + @Override + @Test + public void testGenerateJumpToItemQueryForFirstPageWithGroupBy() { + pagingQueryProvider.setGroupClause("dep"); + String sql = "SELECT SORT_KEY FROM ( SELECT id AS SORT_KEY, ROW_NUMBER() OVER (ORDER BY id ASC) AS ROW_NUMBER FROM foo WHERE bar = 1 GROUP BY dep) WHERE ROW_NUMBER = 1"; + String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize); + assertEquals(sql, s); } }