Fix paging errors with descending keys

This commit is contained in:
dsyer
2009-01-02 16:03:11 +00:00
parent aee5ca3b85
commit d3e81b5b4d
18 changed files with 340 additions and 98 deletions

View File

@@ -15,6 +15,8 @@
*/
package org.springframework.batch.item.database.support;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Test;
@@ -40,6 +42,19 @@ public abstract class AbstractSqlPagingQueryProviderTests {
}
@Test
public void testQueryContainsSortKey(){
String s = pagingQueryProvider.generateFirstPageQuery(pageSize).toLowerCase();
assertTrue("Wrong query: "+s, s.contains("id asc"));
}
@Test
public void testQueryContainsSortKeyDesc(){
pagingQueryProvider.setAscending(false);
String s = pagingQueryProvider.generateFirstPageQuery(pageSize).toLowerCase();
assertTrue("Wrong query: "+s, s.contains("id desc"));
}
@Test
public abstract void testGenerateFirstPageQuery();
@@ -48,5 +63,8 @@ public abstract class AbstractSqlPagingQueryProviderTests {
@Test
public abstract void testGenerateJumpToItemQuery();
@Test
public abstract void testGenerateJumpToItemQueryForFirstPage();
}

View File

@@ -33,4 +33,12 @@ public class Db2PagingQueryProviderTests extends AbstractSqlPagingQueryProviderT
String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize);
Assert.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);
}
}

View File

@@ -98,4 +98,12 @@ public class DerbyPagingQueryProviderTests extends AbstractSqlPagingQueryProvide
String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize);
Assert.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);
}
}

View File

@@ -48,4 +48,11 @@ public class HsqlPagingQueryProviderTests extends AbstractSqlPagingQueryProvider
String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize);
Assert.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);
}
}

View File

@@ -48,4 +48,11 @@ public class MySqlPagingQueryProviderTests extends AbstractSqlPagingQueryProvide
String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize);
Assert.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);
}
}

View File

@@ -37,4 +37,11 @@ public class OraclePagingQueryProviderTests extends AbstractSqlPagingQueryProvid
String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize);
Assert.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);
}
}

View File

@@ -33,4 +33,12 @@ public class PostgresPagingQueryProviderTests extends AbstractSqlPagingQueryProv
String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize);
Assert.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);
}
}

View File

@@ -16,11 +16,15 @@
package org.springframework.batch.item.database.support;
import org.junit.Assert;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import org.springframework.util.StringUtils;
/**
* @author Thomas Risberg
* @author Dave Syer
* @since 2.0
*/
public class SqlPagingQueryUtilsTests {
@@ -28,65 +32,118 @@ public class SqlPagingQueryUtilsTests {
@Test
public void testGenerateLimitSqlQuery() {
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", "ID");
Assert.assertEquals("SELECT FOO FROM BAR ORDER BY ID ASC LIMIT 100", SqlPagingQueryUtils.generateLimitSqlQuery(
qp, false, "LIMIT 100"));
Assert.assertEquals("SELECT FOO FROM BAR WHERE ID > ? ORDER BY ID ASC LIMIT 100", SqlPagingQueryUtils.generateLimitSqlQuery(
qp, true, "LIMIT 100"));
assertEquals("SELECT FOO FROM BAR ORDER BY ID ASC LIMIT 100", SqlPagingQueryUtils.generateLimitSqlQuery(qp,
false, "LIMIT 100"));
assertEquals("SELECT FOO FROM BAR WHERE ID > ? ORDER BY ID ASC LIMIT 100", SqlPagingQueryUtils
.generateLimitSqlQuery(qp, true, "LIMIT 100"));
qp.setWhereClause("BAZ IS NOT NULL");
Assert.assertEquals("SELECT FOO FROM BAR WHERE BAZ IS NOT NULL ORDER BY ID ASC LIMIT 100", SqlPagingQueryUtils.generateLimitSqlQuery(
qp, false, "LIMIT 100"));
Assert.assertEquals("SELECT FOO FROM BAR WHERE BAZ IS NOT NULL AND ID > ? ORDER BY ID ASC LIMIT 100", SqlPagingQueryUtils.generateLimitSqlQuery(
qp, true, "LIMIT 100"));
assertEquals("SELECT FOO FROM BAR WHERE BAZ IS NOT NULL ORDER BY ID ASC LIMIT 100", SqlPagingQueryUtils
.generateLimitSqlQuery(qp, false, "LIMIT 100"));
assertEquals("SELECT FOO FROM BAR WHERE BAZ IS NOT NULL AND ID > ? ORDER BY ID ASC LIMIT 100",
SqlPagingQueryUtils.generateLimitSqlQuery(qp, true, "LIMIT 100"));
}
@Test
public void testGenerateTopSqlQuery() {
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", "ID");
Assert.assertEquals("SELECT TOP 100 FOO FROM BAR ORDER BY ID ASC", SqlPagingQueryUtils.generateTopSqlQuery(
qp, false, "TOP 100"));
Assert.assertEquals("SELECT TOP 100 FOO FROM BAR WHERE ID > ? ORDER BY ID ASC", SqlPagingQueryUtils.generateTopSqlQuery(
qp, true, "TOP 100"));
assertEquals("SELECT TOP 100 FOO FROM BAR ORDER BY ID ASC", SqlPagingQueryUtils.generateTopSqlQuery(qp, false,
"TOP 100"));
assertEquals("SELECT TOP 100 FOO FROM BAR WHERE ID > ? ORDER BY ID ASC", SqlPagingQueryUtils
.generateTopSqlQuery(qp, true, "TOP 100"));
qp.setWhereClause("BAZ IS NOT NULL");
Assert.assertEquals("SELECT TOP 100 FOO FROM BAR WHERE BAZ IS NOT NULL ORDER BY ID ASC", SqlPagingQueryUtils.generateTopSqlQuery(
qp, false, "TOP 100"));
Assert.assertEquals("SELECT TOP 100 FOO FROM BAR WHERE BAZ IS NOT NULL AND ID > ? ORDER BY ID ASC", SqlPagingQueryUtils.generateTopSqlQuery(
qp, true, "TOP 100"));
assertEquals("SELECT TOP 100 FOO FROM BAR WHERE BAZ IS NOT NULL ORDER BY ID ASC", SqlPagingQueryUtils
.generateTopSqlQuery(qp, false, "TOP 100"));
assertEquals("SELECT TOP 100 FOO FROM BAR WHERE BAZ IS NOT NULL AND ID > ? ORDER BY ID ASC",
SqlPagingQueryUtils.generateTopSqlQuery(qp, true, "TOP 100"));
}
@Test
public void testGenerateRowNumSqlQuery() {
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", "ID");
Assert.assertEquals("SELECT FOO FROM BAR WHERE ROWNUMBER <= 100 ORDER BY ID ASC", SqlPagingQueryUtils.generateRowNumSqlQuery(
qp, false, "ROWNUMBER <= 100"));
Assert.assertEquals("SELECT FOO FROM BAR WHERE ID > ? AND ROWNUMBER <= 100 ORDER BY ID ASC", SqlPagingQueryUtils.generateRowNumSqlQuery(
qp, true, "ROWNUMBER <= 100"));
assertEquals("SELECT FOO FROM BAR WHERE ROWNUMBER <= 100 ORDER BY ID ASC", SqlPagingQueryUtils
.generateRowNumSqlQuery(qp, false, "ROWNUMBER <= 100"));
assertEquals("SELECT FOO FROM BAR WHERE ID > ? AND ROWNUMBER <= 100 ORDER BY ID ASC", SqlPagingQueryUtils
.generateRowNumSqlQuery(qp, true, "ROWNUMBER <= 100"));
qp.setWhereClause("BAZ IS NOT NULL");
Assert.assertEquals("SELECT FOO FROM BAR WHERE BAZ IS NOT NULL AND ROWNUMBER <= 100 ORDER BY ID ASC", SqlPagingQueryUtils.generateRowNumSqlQuery(
qp, false, "ROWNUMBER <= 100"));
Assert.assertEquals("SELECT FOO FROM BAR WHERE BAZ IS NOT NULL AND ID > ? AND ROWNUMBER <= 100 ORDER BY ID ASC", SqlPagingQueryUtils.generateRowNumSqlQuery(
qp, true, "ROWNUMBER <= 100"));
assertEquals("SELECT FOO FROM BAR WHERE BAZ IS NOT NULL AND ROWNUMBER <= 100 ORDER BY ID ASC",
SqlPagingQueryUtils.generateRowNumSqlQuery(qp, false, "ROWNUMBER <= 100"));
assertEquals("SELECT FOO FROM BAR WHERE BAZ IS NOT NULL AND ID > ? AND ROWNUMBER <= 100 ORDER BY ID ASC",
SqlPagingQueryUtils.generateRowNumSqlQuery(qp, true, "ROWNUMBER <= 100"));
}
@Test
public void testGenerateTopSqlQueryDescending() {
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", "ID");
qp.setAscending(false);
assertEquals("SELECT TOP 100 FOO FROM BAR ORDER BY ID DESC", SqlPagingQueryUtils.generateTopSqlQuery(qp, false,
"TOP 100"));
assertEquals("SELECT TOP 100 FOO FROM BAR WHERE ID < ? ORDER BY ID DESC", SqlPagingQueryUtils
.generateTopSqlQuery(qp, true, "TOP 100"));
qp.setWhereClause("BAZ IS NOT NULL");
assertEquals("SELECT TOP 100 FOO FROM BAR WHERE BAZ IS NOT NULL ORDER BY ID DESC", SqlPagingQueryUtils
.generateTopSqlQuery(qp, false, "TOP 100"));
assertEquals("SELECT TOP 100 FOO FROM BAR WHERE BAZ IS NOT NULL AND ID < ? ORDER BY ID DESC",
SqlPagingQueryUtils.generateTopSqlQuery(qp, true, "TOP 100"));
}
@Test
public void testGenerateRowNumSqlQueryDescending() {
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", "ID");
qp.setAscending(false);
assertEquals("SELECT FOO FROM BAR WHERE ROWNUMBER <= 100 ORDER BY ID DESC", SqlPagingQueryUtils
.generateRowNumSqlQuery(qp, false, "ROWNUMBER <= 100"));
assertEquals("SELECT FOO FROM BAR WHERE ID < ? AND ROWNUMBER <= 100 ORDER BY ID DESC", SqlPagingQueryUtils
.generateRowNumSqlQuery(qp, true, "ROWNUMBER <= 100"));
qp.setWhereClause("BAZ IS NOT NULL");
assertEquals("SELECT FOO FROM BAR WHERE BAZ IS NOT NULL AND ROWNUMBER <= 100 ORDER BY ID DESC",
SqlPagingQueryUtils.generateRowNumSqlQuery(qp, false, "ROWNUMBER <= 100"));
assertEquals("SELECT FOO FROM BAR WHERE BAZ IS NOT NULL AND ID < ? AND ROWNUMBER <= 100 ORDER BY ID DESC",
SqlPagingQueryUtils.generateRowNumSqlQuery(qp, true, "ROWNUMBER <= 100"));
}
@Test
public void testGenerateLimitJumpToQuery() {
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", "ID");
Assert.assertEquals("SELECT ID AS SORT_KEY FROM BAR ORDER BY ID ASC LIMIT 100, 1", SqlPagingQueryUtils.generateLimitJumpToQuery(
qp, "LIMIT 100, 1"));
assertEquals("SELECT ID AS SORT_KEY FROM BAR ORDER BY ID ASC LIMIT 100, 1", SqlPagingQueryUtils
.generateLimitJumpToQuery(qp, "LIMIT 100, 1"));
qp.setWhereClause("BAZ IS NOT NULL");
Assert.assertEquals("SELECT ID AS SORT_KEY FROM BAR WHERE BAZ IS NOT NULL ORDER BY ID ASC LIMIT 100, 1", SqlPagingQueryUtils.generateLimitJumpToQuery(
qp, "LIMIT 100, 1"));
assertEquals("SELECT ID AS SORT_KEY FROM BAR WHERE BAZ IS NOT NULL ORDER BY ID ASC LIMIT 100, 1",
SqlPagingQueryUtils.generateLimitJumpToQuery(qp, "LIMIT 100, 1"));
}
@Test
public void testGenerateTopJumpToQuery() {
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", "ID");
Assert.assertEquals("SELECT TOP 100, 1 ID AS SORT_KEY FROM BAR ORDER BY ID ASC", SqlPagingQueryUtils.generateTopJumpToQuery(
qp, "TOP 100, 1"));
assertEquals("SELECT TOP 100, 1 ID AS SORT_KEY FROM BAR ORDER BY ID ASC", SqlPagingQueryUtils
.generateTopJumpToQuery(qp, "TOP 100, 1"));
qp.setWhereClause("BAZ IS NOT NULL");
Assert.assertEquals("SELECT TOP 100, 1 ID AS SORT_KEY FROM BAR WHERE BAZ IS NOT NULL ORDER BY ID ASC", SqlPagingQueryUtils.generateTopJumpToQuery(
qp, "TOP 100, 1"));
assertEquals("SELECT TOP 100, 1 ID AS SORT_KEY FROM BAR WHERE BAZ IS NOT NULL ORDER BY ID ASC",
SqlPagingQueryUtils.generateTopJumpToQuery(qp, "TOP 100, 1"));
}
@Test
public void testGenerateTopJumpQueryDescending() {
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", "ID");
qp.setAscending(false);
String query = SqlPagingQueryUtils.generateTopJumpToQuery(qp, "TOP 100, 1");
assertTrue("Wrong query: " + query, query.contains("ID DESC"));
assertEquals("Wrong query: " + query, 0, StringUtils.countOccurrencesOf(query, "ASC"));
assertEquals("Wrong query: " + query, 1, StringUtils.countOccurrencesOf(query, "DESC"));
qp.setWhereClause("BAZ IS NOT NULL");
assertTrue("Wrong query: " + query, query.contains("ID DESC"));
}
@Test
public void testGenerateLimtJumpQueryDescending() {
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", "ID");
qp.setAscending(false);
String query = SqlPagingQueryUtils.generateLimitJumpToQuery(qp, "LIMIT 100, 1");
assertTrue("Wrong query: " + query, query.contains("ID DESC"));
assertEquals("Wrong query: " + query, 0, StringUtils.countOccurrencesOf(query, "ASC"));
assertEquals("Wrong query: " + query, 1, StringUtils.countOccurrencesOf(query, "DESC"));
qp.setWhereClause("BAZ IS NOT NULL");
assertTrue("Wrong query: " + query, query.contains("ID DESC"));
}
private static class TestSqlPagingQueryProvider extends AbstractSqlPagingQueryProvider {

View File

@@ -33,4 +33,12 @@ public class SqlServerPagingQueryProviderTests extends AbstractSqlPagingQueryPro
String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize);
Assert.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);
}
}

View File

@@ -17,6 +17,7 @@ package org.springframework.batch.item.database.support;
import static org.junit.Assert.*;
import org.junit.Assert;
import org.junit.Test;
/**
@@ -48,4 +49,12 @@ public class SqlWindowingPagingQueryProviderTests extends AbstractSqlPagingQuery
String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize);
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);
}
}

View File

@@ -33,4 +33,11 @@ public class SybasePagingQueryProviderTests extends AbstractSqlPagingQueryProvid
String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize);
Assert.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);
}
}