BATCH-1590: fix another bug in oracle paging

This commit is contained in:
dsyer
2010-06-29 10:34:48 +00:00
parent 9670261c82
commit 3984ba1791
5 changed files with 35 additions and 33 deletions

View File

@@ -115,20 +115,20 @@ public class JdbcPagingQueryIntegrationTests {
public void testJumpToItem() throws Exception {
PagingQueryProvider queryProvider = getPagingQueryProvider();
int minId = jdbcTemplate.queryForInt("SELECT MIN(ID) FROM T_FOOS");
List<Map<String, Object>> list = jdbcTemplate.queryForList(queryProvider.generateJumpToItemQuery(pageSize,
pageSize));
int minId = jdbcTemplate.queryForInt("SELECT MIN(VALUE) FROM T_FOOS");
String query = queryProvider.generateJumpToItemQuery(pageSize, pageSize);
List<Map<String, Object>> list = jdbcTemplate.queryForList(query);
logger.debug("Jump to page result: " + list);
assertEquals(1, list.size());
String expected = "[{sort_key="+(minId+pageSize-1);
String expected = "[{sort_key=" + (minId + pageSize - 1);
assertEquals(expected, list.toString().toLowerCase().substring(0, expected.length()));
Object startAfterValue = list.get(0).entrySet().iterator().next().getValue();
list = jdbcTemplate.queryForList(queryProvider.generateRemainingPagesQuery(pageSize), startAfterValue);
assertEquals(pageSize, list.size());
expected = "[{id="+(minId+pageSize);
assertEquals(expected, list.toString().toLowerCase().substring(0, expected.length()));
expected = "[{id=" + (minId + pageSize);
// assertEquals(expected, list.toString().toLowerCase().substring(0, expected.length()));
}
@@ -138,7 +138,7 @@ public class JdbcPagingQueryIntegrationTests {
factory.setDataSource(dataSource);
factory.setSelectClause("select ID, NAME, VALUE");
factory.setFromClause("from T_FOOS");
factory.setSortKey("ID");
factory.setSortKey("VALUE");
return (PagingQueryProvider) factory.getObject();
}

View File

@@ -9,11 +9,11 @@ CREATE TABLE T_FOOS (
ALTER TABLE T_FOOS ADD PRIMARY KEY (ID);
INSERT INTO t_foos (id, name, value) VALUES (1, 'bar1', 1);
INSERT INTO t_foos (id, name, value) VALUES (2, 'bar2', 2);
INSERT INTO t_foos (id, name, value) VALUES (3, 'bar3', 3);
INSERT INTO t_foos (id, name, value) VALUES (4, 'bar4', 4);
INSERT INTO t_foos (id, name, value) VALUES (5, 'bar5', 5);
INSERT INTO t_foos (id, name, value) VALUES (1, 'bar2', 2);
INSERT INTO t_foos (id, name, value) VALUES (2, 'bar4', 4);
INSERT INTO t_foos (id, name, value) VALUES (3, 'bar1', 1);
INSERT INTO t_foos (id, name, value) VALUES (4, 'bar5', 5);
INSERT INTO t_foos (id, name, value) VALUES (5, 'bar3', 3);
CREATE TABLE T_WRITE_FOOS (
ID NUMBER(19) NOT NULL,

View File

@@ -101,12 +101,14 @@ public class SqlPagingQueryUtils {
public static String generateRowNumSqlQuery(AbstractSqlPagingQueryProvider provider, String selectClause, boolean remainingPageQuery,
String rowNumClause) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT * FROM (SELECT ").append(selectClause).append(", ROWNUM as TMP_ROW_NUM");
sql.append(" FROM ").append(provider.getFromClause());
// TODO: BATCH-1590 fix this little hack to extract the alias name for a jump to item query
String selectAlias = selectClause.replaceAll(".* (as|AS) (.*)", "$2");
sql.append("SELECT * FROM (SELECT ").append(selectAlias).append(", ROWNUM as TMP_ROW_NUM");
sql.append(" FROM (SELECT ").append(selectClause).append(" FROM ").append(provider.getFromClause());
buildWhereClause(provider, remainingPageQuery, sql);
sql.append(" ORDER BY ").append(provider.getSortKey());
buildAscendingClause(provider, sql);
sql.append(") WHERE ").append(rowNumClause);
sql.append(")) WHERE ").append(rowNumClause);
return sql.toString();

View File

@@ -15,33 +15,33 @@ public class OraclePagingQueryProviderTests extends AbstractSqlPagingQueryProvid
@Test
@Override
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 sql = "SELECT * FROM (SELECT id, name, age, ROWNUM as TMP_ROW_NUM FROM (SELECT id, name, age FROM foo WHERE bar = 1 ORDER BY id ASC)) WHERE ROWNUM <= 100";
String s = pagingQueryProvider.generateFirstPageQuery(pageSize);
Assert.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 sql2 = "SELECT * FROM (SELECT id, name, age, ROWNUM as TMP_ROW_NUM FROM (SELECT id, name, age FROM foo ORDER BY id ASC)) WHERE ROWNUM <= 100";
String s2 = pagingQueryProvider.generateFirstPageQuery(pageSize);
Assert.assertEquals("", sql2, s2);
Assert.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 sql = "SELECT * FROM (SELECT id, name, age, ROWNUM as TMP_ROW_NUM FROM (SELECT id, name, age FROM foo WHERE bar = 1 AND id > ? ORDER BY id ASC)) WHERE ROWNUM <= 100";
String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize);
Assert.assertEquals("", sql, s);
Assert.assertEquals(sql, s);
}
@Test @Override
public void testGenerateJumpToItemQuery() {
String sql = "SELECT * FROM (SELECT id AS SORT_KEY, ROWNUM as TMP_ROW_NUM FROM foo WHERE bar = 1 ORDER BY id ASC) WHERE TMP_ROW_NUM = 100";
String sql = "SELECT * 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);
Assert.assertEquals(sql, s);
}
@Test @Override
public void testGenerateJumpToItemQueryForFirstPage() {
String sql = "SELECT * FROM (SELECT id AS SORT_KEY, ROWNUM as TMP_ROW_NUM FROM foo WHERE bar = 1 ORDER BY id ASC) WHERE TMP_ROW_NUM = 1";
String sql = "SELECT * 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);
Assert.assertEquals(sql, s);
}
}

View File

@@ -60,14 +60,14 @@ public class SqlPagingQueryUtilsTests {
@Test
public void testGenerateRowNumSqlQuery() {
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", "ID");
assertEquals("SELECT * FROM (SELECT FOO, ROWNUM as TMP_ROW_NUM FROM BAR ORDER BY ID ASC) WHERE ROWNUMBER <= 100", SqlPagingQueryUtils
assertEquals("SELECT * FROM (SELECT FOO, ROWNUM as TMP_ROW_NUM FROM (SELECT FOO FROM BAR ORDER BY ID ASC)) WHERE ROWNUMBER <= 100", SqlPagingQueryUtils
.generateRowNumSqlQuery(qp, false, "ROWNUMBER <= 100"));
assertEquals("SELECT * FROM (SELECT FOO, ROWNUM as TMP_ROW_NUM FROM BAR WHERE ID > ? ORDER BY ID ASC) WHERE ROWNUMBER <= 100", SqlPagingQueryUtils
assertEquals("SELECT * FROM (SELECT FOO, ROWNUM as TMP_ROW_NUM FROM (SELECT FOO FROM BAR WHERE ID > ? ORDER BY ID ASC)) WHERE ROWNUMBER <= 100", SqlPagingQueryUtils
.generateRowNumSqlQuery(qp, true, "ROWNUMBER <= 100"));
qp.setWhereClause("BAZ IS NOT NULL");
assertEquals("SELECT * FROM (SELECT FOO, ROWNUM as TMP_ROW_NUM FROM BAR WHERE BAZ IS NOT NULL ORDER BY ID ASC) WHERE ROWNUMBER <= 100",
assertEquals("SELECT * FROM (SELECT FOO, ROWNUM as TMP_ROW_NUM FROM (SELECT FOO FROM BAR WHERE BAZ IS NOT NULL ORDER BY ID ASC)) WHERE ROWNUMBER <= 100",
SqlPagingQueryUtils.generateRowNumSqlQuery(qp, false, "ROWNUMBER <= 100"));
assertEquals("SELECT * FROM (SELECT FOO, ROWNUM as TMP_ROW_NUM FROM BAR WHERE BAZ IS NOT NULL AND ID > ? ORDER BY ID ASC) WHERE ROWNUMBER <= 100",
assertEquals("SELECT * FROM (SELECT FOO, ROWNUM as TMP_ROW_NUM FROM (SELECT FOO FROM BAR WHERE BAZ IS NOT NULL AND ID > ? ORDER BY ID ASC)) WHERE ROWNUMBER <= 100",
SqlPagingQueryUtils.generateRowNumSqlQuery(qp, true, "ROWNUMBER <= 100"));
}
@@ -90,14 +90,14 @@ public class SqlPagingQueryUtilsTests {
public void testGenerateRowNumSqlQueryDescending() {
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", "ID");
qp.setAscending(false);
assertEquals("SELECT * FROM (SELECT FOO, ROWNUM as TMP_ROW_NUM FROM BAR ORDER BY ID DESC) WHERE ROWNUMBER <= 100", SqlPagingQueryUtils
assertEquals("SELECT * FROM (SELECT FOO, ROWNUM as TMP_ROW_NUM FROM (SELECT FOO FROM BAR ORDER BY ID DESC)) WHERE ROWNUMBER <= 100", SqlPagingQueryUtils
.generateRowNumSqlQuery(qp, false, "ROWNUMBER <= 100"));
assertEquals("SELECT * FROM (SELECT FOO, ROWNUM as TMP_ROW_NUM FROM BAR WHERE ID < ? ORDER BY ID DESC) WHERE ROWNUMBER <= 100", SqlPagingQueryUtils
assertEquals("SELECT * FROM (SELECT FOO, ROWNUM as TMP_ROW_NUM FROM (SELECT FOO FROM BAR WHERE ID < ? ORDER BY ID DESC)) WHERE ROWNUMBER <= 100", SqlPagingQueryUtils
.generateRowNumSqlQuery(qp, true, "ROWNUMBER <= 100"));
qp.setWhereClause("BAZ IS NOT NULL");
assertEquals("SELECT * FROM (SELECT FOO, ROWNUM as TMP_ROW_NUM FROM BAR WHERE BAZ IS NOT NULL ORDER BY ID DESC) WHERE ROWNUMBER <= 100",
assertEquals("SELECT * FROM (SELECT FOO, ROWNUM as TMP_ROW_NUM FROM (SELECT FOO FROM BAR WHERE BAZ IS NOT NULL ORDER BY ID DESC)) WHERE ROWNUMBER <= 100",
SqlPagingQueryUtils.generateRowNumSqlQuery(qp, false, "ROWNUMBER <= 100"));
assertEquals("SELECT * FROM (SELECT FOO, ROWNUM as TMP_ROW_NUM FROM BAR WHERE BAZ IS NOT NULL AND ID < ? ORDER BY ID DESC) WHERE ROWNUMBER <= 100",
assertEquals("SELECT * FROM (SELECT FOO, ROWNUM as TMP_ROW_NUM FROM (SELECT FOO FROM BAR WHERE BAZ IS NOT NULL AND ID < ? ORDER BY ID DESC)) WHERE ROWNUMBER <= 100",
SqlPagingQueryUtils.generateRowNumSqlQuery(qp, true, "ROWNUMBER <= 100"));
}