Merge pull request #66 from mminella/BATCH-1749
Batch-1749: JdbcPagingItemReader now supports multi-column keys
This commit is contained in:
@@ -1,3 +1,18 @@
|
||||
/*
|
||||
* Copyright 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.
|
||||
* 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;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
@@ -7,7 +22,9 @@ import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.CompletionService;
|
||||
@@ -24,6 +41,7 @@ import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.batch.item.ItemReader;
|
||||
import org.springframework.batch.item.database.support.Order;
|
||||
import org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean;
|
||||
import org.springframework.batch.item.sample.Foo;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@@ -33,6 +51,11 @@ import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
import org.springframework.test.jdbc.SimpleJdbcTestUtils;
|
||||
|
||||
/**
|
||||
* @author Dave Syer
|
||||
* @author David Thexton
|
||||
* @author Michael Minella
|
||||
*/
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@ContextConfiguration(locations = "JdbcPagingItemReaderCommonTests-context.xml")
|
||||
public class JdbcPagingItemReaderAsyncTests {
|
||||
@@ -141,7 +164,9 @@ public class JdbcPagingItemReaderAsyncTests {
|
||||
factory.setDataSource(dataSource);
|
||||
factory.setSelectClause("select ID, NAME, VALUE");
|
||||
factory.setFromClause("from T_FOOS");
|
||||
factory.setSortKey("VALUE");
|
||||
Map<String, Order> sortKeys = new LinkedHashMap<String, Order>();
|
||||
sortKeys.put("VALUE", Order.ASCENDING);
|
||||
factory.setSortKeys(sortKeys);
|
||||
reader.setQueryProvider((PagingQueryProvider) factory.getObject());
|
||||
reader.setRowMapper(new ParameterizedRowMapper<Foo>() {
|
||||
public Foo mapRow(ResultSet rs, int i) throws SQLException {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2006-2007 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.
|
||||
@@ -20,8 +20,12 @@ import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotSame;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.SortedMap;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
@@ -29,8 +33,10 @@ import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.batch.item.database.support.Order;
|
||||
import org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
|
||||
@@ -40,6 +46,7 @@ import org.springframework.test.jdbc.SimpleJdbcTestUtils;
|
||||
|
||||
/**
|
||||
* @author Dave Syer
|
||||
* @author Michael Minella
|
||||
* @since 2.1
|
||||
*/
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@@ -89,29 +96,40 @@ public class JdbcPagingQueryIntegrationTests {
|
||||
logger.debug("First page result: " + list);
|
||||
assertEquals(pageSize, list.size());
|
||||
count += pageSize;
|
||||
Object oldValue = -1L;
|
||||
Map<String, Object> oldValues = null;
|
||||
|
||||
while (count < pages * pageSize) {
|
||||
Object startAfterValue = list.get(pageSize - 1).get(queryProvider.getSortKey());
|
||||
assertNotSame(oldValue, startAfterValue);
|
||||
list = jdbcTemplate.queryForList(queryProvider.generateRemainingPagesQuery(pageSize), startAfterValue);
|
||||
Map<String, Object> startAfterValues = getStartAfterValues(
|
||||
queryProvider, list);
|
||||
assertNotSame(oldValues, startAfterValues);
|
||||
list = jdbcTemplate.queryForList(queryProvider.generateRemainingPagesQuery(pageSize), getParameterList(null, startAfterValues).toArray());
|
||||
assertEquals(pageSize, list.size());
|
||||
count += pageSize;
|
||||
oldValue = startAfterValue;
|
||||
oldValues = startAfterValues;
|
||||
}
|
||||
|
||||
if (count < total) {
|
||||
Object startAfterValue = list.get(pageSize - 1).get(queryProvider.getSortKey());
|
||||
list = jdbcTemplate.queryForList(queryProvider.generateRemainingPagesQuery(pageSize), startAfterValue);
|
||||
Map<String, Object> startAfterValues = getStartAfterValues(
|
||||
queryProvider, list);
|
||||
list = jdbcTemplate.queryForList(queryProvider.generateRemainingPagesQuery(pageSize), getParameterList(null, startAfterValues).toArray());
|
||||
assertEquals(total - pages * pageSize, list.size());
|
||||
count += list.size();
|
||||
}
|
||||
|
||||
assertEquals(total, count);
|
||||
}
|
||||
|
||||
private Map<String, Object> getStartAfterValues(
|
||||
PagingQueryProvider queryProvider, List<Map<String, Object>> list) {
|
||||
Map<String, Object> startAfterValues = new LinkedHashMap<String, Object>();
|
||||
for (Map.Entry<String, Order> sortKey : queryProvider.getSortKeys().entrySet()) {
|
||||
startAfterValues.put(sortKey.getKey(), list.get(pageSize - 1).get(sortKey.getKey()));
|
||||
}
|
||||
return startAfterValues;
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore
|
||||
public void testJumpToItem() throws Exception {
|
||||
|
||||
PagingQueryProvider queryProvider = getPagingQueryProvider();
|
||||
@@ -123,14 +141,12 @@ public class JdbcPagingQueryIntegrationTests {
|
||||
logger.debug("Jump to page result: " + list);
|
||||
assertEquals(1, list.size());
|
||||
System.err.println(list);
|
||||
String expected = "[{sort_key=" + (minId + pageSize - 1);
|
||||
String expected = "[{value=" + (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()));
|
||||
|
||||
}
|
||||
|
||||
protected PagingQueryProvider getPagingQueryProvider() throws Exception {
|
||||
@@ -139,9 +155,35 @@ public class JdbcPagingQueryIntegrationTests {
|
||||
factory.setDataSource(dataSource);
|
||||
factory.setSelectClause("select ID, NAME, VALUE");
|
||||
factory.setFromClause("from T_FOOS");
|
||||
factory.setSortKey("VALUE");
|
||||
Map<String, Order> sortKeys = new LinkedHashMap<String, Order>();
|
||||
sortKeys.put("VALUE", Order.ASCENDING);
|
||||
factory.setSortKeys(sortKeys);
|
||||
return (PagingQueryProvider) factory.getObject();
|
||||
|
||||
}
|
||||
|
||||
private List<Object> getParameterList(Map<String, Object> values, Map<String, Object> sortKeyValue) {
|
||||
SortedMap<String, Object> sm = new TreeMap<String, Object>();
|
||||
if (values != null) {
|
||||
sm.putAll(values);
|
||||
}
|
||||
List<Object> parameterList = new ArrayList<Object>();
|
||||
parameterList.addAll(sm.values());
|
||||
if (sortKeyValue != null && sortKeyValue.size() > 0) {
|
||||
List<Map.Entry<String, Object>> keys = new ArrayList<Map.Entry<String,Object>>(sortKeyValue.entrySet());
|
||||
|
||||
for(int i = 0; i < keys.size(); i++) {
|
||||
for(int j = 0; j < i; j++) {
|
||||
parameterList.add(keys.get(j).getValue());
|
||||
}
|
||||
|
||||
parameterList.add(keys.get(i).getValue());
|
||||
}
|
||||
}
|
||||
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Using parameterList:" + parameterList);
|
||||
}
|
||||
return parameterList;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2006-2007 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 static org.junit.Assert.assertNull;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -36,6 +37,7 @@ import org.junit.runner.RunWith;
|
||||
import org.springframework.batch.item.ExecutionContext;
|
||||
import org.springframework.batch.item.ItemReader;
|
||||
import org.springframework.batch.item.ItemStream;
|
||||
import org.springframework.batch.item.database.support.Order;
|
||||
import org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean;
|
||||
import org.springframework.batch.item.sample.Foo;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@@ -47,6 +49,7 @@ import org.springframework.test.jdbc.SimpleJdbcTestUtils;
|
||||
|
||||
/**
|
||||
* @author Dave Syer
|
||||
* @author Michael Minella
|
||||
* @since 2.1
|
||||
*/
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@@ -124,7 +127,9 @@ public class JdbcPagingRestartIntegrationTests {
|
||||
logger.debug("Ids: "+ids);
|
||||
int startAfterValue = (new Long(ids.get(count - 1).get("ID").toString())).intValue();
|
||||
logger.debug("Start after: " + startAfterValue);
|
||||
executionContext.putInt("JdbcPagingItemReader.start.after", startAfterValue);
|
||||
Map<String, Object> startAfterValues = new LinkedHashMap<String, Object>();
|
||||
startAfterValues.put("ID", startAfterValue);
|
||||
executionContext.put("JdbcPagingItemReader.start.after", startAfterValues);
|
||||
((ItemStream) reader).open(executionContext);
|
||||
|
||||
for (int i = count; i < total; i++) {
|
||||
@@ -147,7 +152,9 @@ public class JdbcPagingRestartIntegrationTests {
|
||||
factory.setDataSource(dataSource);
|
||||
factory.setSelectClause("select ID, NAME, VALUE");
|
||||
factory.setFromClause("from T_FOOS");
|
||||
factory.setSortKey("VALUE");
|
||||
Map<String, Order> sortKeys = new LinkedHashMap<String, Order>();
|
||||
sortKeys.put("VALUE", Order.ASCENDING);
|
||||
factory.setSortKeys(sortKeys);
|
||||
reader.setQueryProvider((PagingQueryProvider) factory.getObject());
|
||||
reader.setRowMapper(new ParameterizedRowMapper<Foo>() {
|
||||
public Foo mapRow(ResultSet rs, int i) throws SQLException {
|
||||
|
||||
@@ -31,13 +31,13 @@ import javax.sql.DataSource;
|
||||
|
||||
import org.springframework.batch.item.ExecutionContext;
|
||||
import org.springframework.batch.item.ItemStreamException;
|
||||
import org.springframework.batch.item.database.support.Order;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
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;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
@@ -87,13 +87,14 @@ public class JdbcPagingItemReader<T> extends AbstractPagingItemReader<T> impleme
|
||||
|
||||
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
private RowMapper rowMapper;
|
||||
|
||||
private String firstPageSql;
|
||||
|
||||
private String remainingPagesSql;
|
||||
|
||||
private Object startAfterValue;
|
||||
private Map<String, Object> startAfterValues;
|
||||
|
||||
private int fetchSize = VALUE_NOT_SET;
|
||||
|
||||
@@ -137,6 +138,7 @@ public class JdbcPagingItemReader<T> extends AbstractPagingItemReader<T> impleme
|
||||
* {@link org.springframework.jdbc.core.simple.ParameterizedRowMapper}
|
||||
* implementation
|
||||
*/
|
||||
@SuppressWarnings("rawtypes")
|
||||
public void setRowMapper(RowMapper rowMapper) {
|
||||
this.rowMapper = rowMapper;
|
||||
}
|
||||
@@ -176,8 +178,8 @@ public class JdbcPagingItemReader<T> extends AbstractPagingItemReader<T> impleme
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
protected void doReadPage() {
|
||||
|
||||
if (results == null) {
|
||||
results = new CopyOnWriteArrayList<T>();
|
||||
}
|
||||
@@ -214,43 +216,48 @@ public class JdbcPagingItemReader<T> extends AbstractPagingItemReader<T> impleme
|
||||
}
|
||||
if (this.queryProvider.isUsingNamedParameters()) {
|
||||
query = namedParameterJdbcTemplate.query(remainingPagesSql,
|
||||
getParameterMap(parameterValues, startAfterValue), rowCallback);
|
||||
getParameterMap(parameterValues, startAfterValues), rowCallback);
|
||||
}
|
||||
else {
|
||||
query = getJdbcTemplate().query(remainingPagesSql,
|
||||
getParameterList(parameterValues, startAfterValue).toArray(), rowCallback);
|
||||
getParameterList(parameterValues, startAfterValues).toArray(), rowCallback);
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
Collection<T> result = (Collection<T>) query;
|
||||
results.addAll(result);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(ExecutionContext executionContext) throws ItemStreamException {
|
||||
super.update(executionContext);
|
||||
if (isSaveState() && startAfterValue != null) {
|
||||
executionContext.put(getExecutionContextUserSupport().getKey(START_AFTER_VALUE), startAfterValue);
|
||||
if (isSaveState() && startAfterValues != null) {
|
||||
executionContext.put(getExecutionContextUserSupport().getKey(START_AFTER_VALUE), startAfterValues);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public void open(ExecutionContext executionContext) {
|
||||
if (isSaveState()) {
|
||||
startAfterValue = executionContext.get(getExecutionContextUserSupport().getKey(START_AFTER_VALUE));
|
||||
startAfterValues = (Map<String, Object>) executionContext.get(getExecutionContextUserSupport().getKey(START_AFTER_VALUE));
|
||||
|
||||
if(startAfterValues == null) {
|
||||
startAfterValues = new LinkedHashMap<String, Object>();
|
||||
}
|
||||
}
|
||||
|
||||
super.open(executionContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
protected void doJumpToPage(int itemIndex) {
|
||||
/*
|
||||
* Normally this would be false (the startAfterValue is enough
|
||||
* information to restart from.
|
||||
*/
|
||||
if (startAfterValue == null && getPage() > 0) {
|
||||
if (startAfterValues == null && getPage() > 0) {
|
||||
|
||||
String jumpToItemSql;
|
||||
jumpToItemSql = queryProvider.generateJumpToItemQuery(itemIndex, getPageSize());
|
||||
@@ -265,24 +272,25 @@ public class JdbcPagingItemReader<T> extends AbstractPagingItemReader<T> impleme
|
||||
}
|
||||
};
|
||||
if (this.queryProvider.isUsingNamedParameters()) {
|
||||
startAfterValue = namedParameterJdbcTemplate.queryForObject(jumpToItemSql,
|
||||
getParameterMap(parameterValues, startAfterValue), startMapper);
|
||||
startAfterValues = (Map<String, Object>) namedParameterJdbcTemplate.queryForObject(jumpToItemSql,
|
||||
getParameterMap(parameterValues, startAfterValues), startMapper);
|
||||
}
|
||||
else {
|
||||
startAfterValue = getJdbcTemplate().queryForObject(jumpToItemSql,
|
||||
getParameterList(parameterValues, startAfterValue).toArray(), startMapper);
|
||||
startAfterValues = (Map<String, Object>) getJdbcTemplate().queryForObject(jumpToItemSql,
|
||||
getParameterList(parameterValues, startAfterValues).toArray(), startMapper);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private Map<String, Object> getParameterMap(Map<String, Object> values, Object sortKeyValue) {
|
||||
private Map<String, Object> getParameterMap(Map<String, Object> values, Map<String, Object> sortKeyValues) {
|
||||
Map<String, Object> parameterMap = new LinkedHashMap<String, Object>();
|
||||
if (values != null) {
|
||||
parameterMap.putAll(values);
|
||||
}
|
||||
if (sortKeyValue != null) {
|
||||
parameterMap.put("_sortKey", sortKeyValue);
|
||||
if (sortKeyValues != null && !sortKeyValues.isEmpty()) {
|
||||
for (Map.Entry<String, Object> sortKey : sortKeyValues.entrySet()) {
|
||||
parameterMap.put("_" + sortKey.getKey(), sortKey.getValue());
|
||||
}
|
||||
}
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Using parameterMap:" + parameterMap);
|
||||
@@ -290,29 +298,37 @@ public class JdbcPagingItemReader<T> extends AbstractPagingItemReader<T> impleme
|
||||
return parameterMap;
|
||||
}
|
||||
|
||||
private List<Object> getParameterList(Map<String, Object> values, Object sortKeyValue) {
|
||||
private List<Object> getParameterList(Map<String, Object> values, Map<String, Object> sortKeyValue) {
|
||||
SortedMap<String, Object> sm = new TreeMap<String, Object>();
|
||||
if (values != null) {
|
||||
sm.putAll(values);
|
||||
}
|
||||
List<Object> parameterList = new ArrayList<Object>();
|
||||
parameterList.addAll(sm.values());
|
||||
if (sortKeyValue != null) {
|
||||
parameterList.add(sortKeyValue);
|
||||
if (sortKeyValue != null && sortKeyValue.size() > 0) {
|
||||
List<Map.Entry<String, Object>> keys = new ArrayList<Map.Entry<String,Object>>(sortKeyValue.entrySet());
|
||||
|
||||
for(int i = 0; i < keys.size(); i++) {
|
||||
for(int j = 0; j < i; j++) {
|
||||
parameterList.add(keys.get(j).getValue());
|
||||
}
|
||||
|
||||
parameterList.add(keys.get(i).getValue());
|
||||
}
|
||||
}
|
||||
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Using parameterList:" + parameterList);
|
||||
}
|
||||
return parameterList;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
private class PagingRowMapper implements RowMapper {
|
||||
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
|
||||
if(StringUtils.hasText(queryProvider.getSortKey())) {
|
||||
startAfterValue = rs.getObject(queryProvider.getSortKey());
|
||||
}
|
||||
else {
|
||||
startAfterValue = rs.getObject(queryProvider.getSortKeyWithoutAlias());
|
||||
startAfterValues = new LinkedHashMap<String, Object>();
|
||||
for (Map.Entry<String, Order> sortKey : queryProvider.getSortKeys().entrySet()) {
|
||||
startAfterValues.put(sortKey.getKey(), rs.getObject(sortKey.getKey()));
|
||||
}
|
||||
|
||||
return rowMapper.mapRow(rs, rowNum);
|
||||
|
||||
@@ -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,13 +16,18 @@
|
||||
|
||||
package org.springframework.batch.item.database;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import org.springframework.batch.item.database.support.Order;
|
||||
|
||||
/**
|
||||
* Interface defining the functionality to be provided for generating paging queries for use with Paging
|
||||
* Item Readers.
|
||||
*
|
||||
* @author Thomas Risberg
|
||||
* @author Michael Minella
|
||||
* @since 2.0
|
||||
*/
|
||||
public interface PagingQueryProvider {
|
||||
@@ -76,17 +81,19 @@ public interface PagingQueryProvider {
|
||||
boolean isUsingNamedParameters();
|
||||
|
||||
/**
|
||||
* The sort key (unique single column name).
|
||||
* The sort keys. A Map of the columns that make up the key and a Boolean indicating ascending or descending
|
||||
* (ascending = true).
|
||||
*
|
||||
* @return the sort key used to order the query
|
||||
* @return the sort keys used to order the query
|
||||
*/
|
||||
String getSortKey();
|
||||
|
||||
Map<String, Order> getSortKeys();
|
||||
|
||||
/**
|
||||
* The sort key (unique single column name) without alias.
|
||||
*
|
||||
* @return the sort key used to order the query (without alias)
|
||||
* Returns either a String to be used as the named placeholder for a sort key value (based on the column name)
|
||||
* or a ? for unnamed parameters.
|
||||
*
|
||||
* @param The sort key name
|
||||
* @return The string to be used for a parameterized query.
|
||||
*/
|
||||
String getSortKeyWithoutAlias();
|
||||
|
||||
String getSortKeyPlaceHolder(String keyName);
|
||||
}
|
||||
|
||||
@@ -16,16 +16,18 @@
|
||||
|
||||
package org.springframework.batch.item.database.support;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.batch.item.database.JdbcParameterUtils;
|
||||
import org.springframework.batch.item.database.PagingQueryProvider;
|
||||
import org.springframework.dao.InvalidDataAccessApiUsageException;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* Abstract SQL Paging Query Provider to serve as a base class for all provided
|
||||
@@ -39,7 +41,8 @@ import java.util.ArrayList;
|
||||
*
|
||||
* Provides properties and preparation for the mandatory "selectClause" and
|
||||
* "fromClause" as well as for the optional "whereClause". Also provides
|
||||
* property for the mandatory "sortKey".
|
||||
* property for the mandatory "sortKeys". <b>Note:</b> The columns that make up
|
||||
* the sort key must be a true key and not just a column to order by.
|
||||
*
|
||||
* @author Thomas Risberg
|
||||
* @author Dave Syer
|
||||
@@ -53,12 +56,10 @@ public abstract class AbstractSqlPagingQueryProvider implements PagingQueryProvi
|
||||
private String fromClause;
|
||||
|
||||
private String whereClause;
|
||||
|
||||
private String sortKey;
|
||||
|
||||
private String groupClause;
|
||||
private Map<String, Order> sortKeys = new LinkedHashMap<String, Order>();
|
||||
|
||||
private boolean ascending = true;
|
||||
private String groupClause;
|
||||
|
||||
private int parameterCount;
|
||||
|
||||
@@ -133,53 +134,19 @@ public abstract class AbstractSqlPagingQueryProvider implements PagingQueryProvi
|
||||
}
|
||||
|
||||
/**
|
||||
* @param sortKey key to use to sort and limit page content
|
||||
* @param sortKeys key to use to sort and limit page content
|
||||
*/
|
||||
public void setSortKey(String sortKey) {
|
||||
this.sortKey = sortKey;
|
||||
public void setSortKeys(Map<String, Order> sortKeys) {
|
||||
this.sortKeys = sortKeys;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the flag that signals that the sort key is applied ascending (default
|
||||
* true).
|
||||
* A Map<String, Boolean> of sort columns as the key and boolean for ascending/descending (assending = true).
|
||||
*
|
||||
* @param ascending the ascending value to set
|
||||
*/
|
||||
public void setAscending(boolean ascending) {
|
||||
this.ascending = ascending;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the flag that signals that the sort key is applied ascending.
|
||||
*
|
||||
* @return the ascending flag
|
||||
*/
|
||||
public boolean isAscending() {
|
||||
return ascending;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return sortKey key to use to sort and limit page content
|
||||
*/
|
||||
public String getSortKey() {
|
||||
return sortKey;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return sortKey key to use to sort and limit page content (without alias)
|
||||
*/
|
||||
public String getSortKeyWithoutAlias() {
|
||||
String sortKey = getSortKey();
|
||||
int separator = sortKey.indexOf('.');
|
||||
if (separator > 0) {
|
||||
int columnIndex = separator + 1;
|
||||
if (columnIndex < sortKey.length()) {
|
||||
sortKey = sortKey.substring(columnIndex);
|
||||
}
|
||||
}
|
||||
return sortKey;
|
||||
public Map<String, Order> getSortKeys() {
|
||||
return sortKeys;
|
||||
}
|
||||
|
||||
public int getParameterCount() {
|
||||
@@ -196,8 +163,8 @@ public abstract class AbstractSqlPagingQueryProvider implements PagingQueryProvi
|
||||
*
|
||||
* @return place holder for sortKey.
|
||||
*/
|
||||
protected String getSortKeyPlaceHolder() {
|
||||
return usingNamedParameters ? ":_sortKey" : "?";
|
||||
public String getSortKeyPlaceHolder(String keyName) {
|
||||
return usingNamedParameters ? ":_" + keyName : "?";
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -208,7 +175,7 @@ public abstract class AbstractSqlPagingQueryProvider implements PagingQueryProvi
|
||||
Assert.notNull(dataSource);
|
||||
Assert.hasLength(selectClause, "selectClause must be specified");
|
||||
Assert.hasLength(fromClause, "fromClause must be specified");
|
||||
Assert.hasLength(sortKey, "sortKey must be specified");
|
||||
Assert.notEmpty(sortKeys, "sortKey must be specified");
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("SELECT ").append(selectClause);
|
||||
sql.append(" FROM ").append(fromClause);
|
||||
|
||||
@@ -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 java.util.Map;
|
||||
|
||||
/**
|
||||
* Oracle implementation of a
|
||||
* {@link org.springframework.batch.item.database.PagingQueryProvider} using
|
||||
* database specific features.
|
||||
*
|
||||
* @author Thomas Risberg
|
||||
* @author Michael Minella
|
||||
* @since 2.0
|
||||
*/
|
||||
public class OraclePagingQueryProvider extends AbstractSqlPagingQueryProvider {
|
||||
@@ -42,9 +45,23 @@ public class OraclePagingQueryProvider extends AbstractSqlPagingQueryProvider {
|
||||
int page = itemIndex / pageSize;
|
||||
int offset = (page * pageSize);
|
||||
offset = offset == 0 ? 1 : offset;
|
||||
return SqlPagingQueryUtils.generateRowNumSqlQueryWithNesting(this, this.getSortKey() + " AS SORT_KEY", "SORT_KEY", false, "TMP_ROW_NUM = "
|
||||
String sortKeySelect = this.getSortKeySelect();
|
||||
return SqlPagingQueryUtils.generateRowNumSqlQueryWithNesting(this, sortKeySelect, sortKeySelect, false, "TMP_ROW_NUM = "
|
||||
+ offset);
|
||||
}
|
||||
|
||||
private String getSortKeySelect() {
|
||||
StringBuilder sql = new StringBuilder();
|
||||
String prefix = "";
|
||||
|
||||
for (Map.Entry<String, Order> sortKey : this.getSortKeys().entrySet()) {
|
||||
sql.append(prefix);
|
||||
prefix = ", ";
|
||||
sql.append(sortKey.getKey());
|
||||
}
|
||||
|
||||
return sql.toString();
|
||||
}
|
||||
|
||||
private String buildRowNumClause(int pageSize) {
|
||||
return new StringBuilder().append("ROWNUM <= ").append(pageSize).toString();
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* Copyright 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.
|
||||
* 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;
|
||||
|
||||
/**
|
||||
* The direction of the sort in an ORDER BY clause.
|
||||
*
|
||||
* @author Michael Minella
|
||||
*/
|
||||
public enum Order {
|
||||
ASCENDING, DESCENDING
|
||||
}
|
||||
@@ -18,8 +18,8 @@ package org.springframework.batch.item.database.support;
|
||||
import static org.springframework.batch.support.DatabaseType.DB2;
|
||||
import static org.springframework.batch.support.DatabaseType.DB2ZOS;
|
||||
import static org.springframework.batch.support.DatabaseType.DERBY;
|
||||
import static org.springframework.batch.support.DatabaseType.HSQL;
|
||||
import static org.springframework.batch.support.DatabaseType.H2;
|
||||
import static org.springframework.batch.support.DatabaseType.HSQL;
|
||||
import static org.springframework.batch.support.DatabaseType.MYSQL;
|
||||
import static org.springframework.batch.support.DatabaseType.ORACLE;
|
||||
import static org.springframework.batch.support.DatabaseType.POSTGRES;
|
||||
@@ -27,6 +27,7 @@ import static org.springframework.batch.support.DatabaseType.SQLSERVER;
|
||||
import static org.springframework.batch.support.DatabaseType.SYBASE;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
@@ -46,6 +47,7 @@ import org.springframework.util.StringUtils;
|
||||
* @author Dave Syer
|
||||
* @author Michael Minella
|
||||
*/
|
||||
@SuppressWarnings("rawtypes")
|
||||
public class SqlPagingQueryProviderFactoryBean implements FactoryBean {
|
||||
|
||||
private DataSource dataSource;
|
||||
@@ -60,9 +62,7 @@ public class SqlPagingQueryProviderFactoryBean implements FactoryBean {
|
||||
|
||||
private String groupClause;
|
||||
|
||||
private String sortKey;
|
||||
|
||||
private boolean ascending = true;
|
||||
private Map<String, Order> sortKeys;
|
||||
|
||||
private Map<DatabaseType, AbstractSqlPagingQueryProvider> providers = new HashMap<DatabaseType, AbstractSqlPagingQueryProvider>();
|
||||
|
||||
@@ -125,15 +125,17 @@ public class SqlPagingQueryProviderFactoryBean implements FactoryBean {
|
||||
/**
|
||||
* @param sortKey the sortKey to set
|
||||
*/
|
||||
public void setSortKey(String sortKey) {
|
||||
this.sortKey = sortKey;
|
||||
public void setSortKeys(Map<String, Order> sortKeys) {
|
||||
this.sortKeys = sortKeys;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ascending
|
||||
*/
|
||||
public void setAscending(boolean ascending) {
|
||||
this.ascending = ascending;
|
||||
|
||||
public void setSortKey(String key) {
|
||||
Assert.doesNotContain(key, ",", "String setter is valid for a single ASC key only");
|
||||
|
||||
Map<String, Order> keys = new LinkedHashMap<String, Order>();
|
||||
keys.put(key, Order.ASCENDING);
|
||||
|
||||
this.sortKeys = keys;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -159,8 +161,7 @@ public class SqlPagingQueryProviderFactoryBean implements FactoryBean {
|
||||
|
||||
provider.setFromClause(fromClause);
|
||||
provider.setWhereClause(whereClause);
|
||||
provider.setSortKey(sortKey);
|
||||
provider.setAscending(ascending);
|
||||
provider.setSortKeys(sortKeys);
|
||||
if (StringUtils.hasText(selectClause)) {
|
||||
provider.setSelectClause(selectClause);
|
||||
}
|
||||
|
||||
@@ -16,6 +16,11 @@
|
||||
|
||||
package org.springframework.batch.item.database.support;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
@@ -46,8 +51,7 @@ public class SqlPagingQueryUtils {
|
||||
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(" ORDER BY ").append(buildSortClause(provider));
|
||||
sql.append(" " + limitClause);
|
||||
|
||||
return sql.toString();
|
||||
@@ -70,8 +74,7 @@ public class SqlPagingQueryUtils {
|
||||
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(" ORDER BY ").append(buildSortClause(provider));
|
||||
|
||||
return sql.toString();
|
||||
}
|
||||
@@ -110,8 +113,7 @@ public class SqlPagingQueryUtils {
|
||||
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(" ORDER BY ").append(buildSortClause(provider));
|
||||
sql.append(") WHERE ").append(rowNumClause);
|
||||
|
||||
return sql.toString();
|
||||
@@ -132,8 +134,7 @@ public class SqlPagingQueryUtils {
|
||||
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(" ORDER BY ").append(buildSortClause(provider));
|
||||
sql.append(")) WHERE ").append(rowNumClause);
|
||||
|
||||
return sql.toString();
|
||||
@@ -150,12 +151,11 @@ public class SqlPagingQueryUtils {
|
||||
*/
|
||||
public static String generateLimitJumpToQuery(AbstractSqlPagingQueryProvider provider, String limitClause) {
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("SELECT ").append(provider.getSortKey()).append(" AS SORT_KEY");
|
||||
sql.append("SELECT ").append(buildSortKeySelect(provider));
|
||||
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(" ORDER BY ").append(buildSortClause(provider));
|
||||
sql.append(" " + limitClause);
|
||||
|
||||
return sql.toString();
|
||||
@@ -171,23 +171,111 @@ public class SqlPagingQueryUtils {
|
||||
*/
|
||||
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("SELECT ").append(topClause).append(" ").append(buildSortKeySelect(provider));
|
||||
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(" ORDER BY ").append(buildSortClause(provider));
|
||||
|
||||
return sql.toString();
|
||||
}
|
||||
|
||||
private static void buildAscendingClause(AbstractSqlPagingQueryProvider provider, StringBuilder sql) {
|
||||
if (provider.isAscending()) {
|
||||
sql.append(" ASC");
|
||||
/**
|
||||
* Generates ORDER BY attributes based on the sort keys.
|
||||
*
|
||||
* @param provider
|
||||
* @return a String that can be appended to an ORDER BY clause.
|
||||
*/
|
||||
public static String buildSortClause(AbstractSqlPagingQueryProvider provider) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
String prefix = "";
|
||||
|
||||
for (Map.Entry<String, Order> sortKey : provider.getSortKeys().entrySet()) {
|
||||
builder.append(prefix);
|
||||
|
||||
prefix = ", ";
|
||||
|
||||
builder.append(sortKey.getKey());
|
||||
|
||||
if(sortKey.getValue() != null && sortKey.getValue() == Order.DESCENDING) {
|
||||
builder.append(" DESC");
|
||||
}
|
||||
else {
|
||||
builder.append(" ASC");
|
||||
}
|
||||
}
|
||||
else {
|
||||
sql.append(" DESC");
|
||||
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends the where conditions required to query for the subsequent pages.
|
||||
*
|
||||
* @param provider
|
||||
* @param sql
|
||||
*/
|
||||
public static void buildSortConditions(
|
||||
AbstractSqlPagingQueryProvider provider, StringBuilder sql) {
|
||||
List<Map.Entry<String, Order>> keys = new ArrayList<Map.Entry<String,Order>>(provider.getSortKeys().entrySet());
|
||||
List<String> clauses = new ArrayList<String>();
|
||||
|
||||
for(int i = 0; i < keys.size(); i++) {
|
||||
StringBuilder clause = new StringBuilder();
|
||||
|
||||
String prefix = "";
|
||||
for(int j = 0; j < i; j++) {
|
||||
clause.append(prefix);
|
||||
prefix = " AND ";
|
||||
Entry<String, Order> entry = keys.get(j);
|
||||
clause.append(entry.getKey());
|
||||
clause.append(" = ");
|
||||
clause.append(provider.getSortKeyPlaceHolder(entry.getKey()));
|
||||
}
|
||||
|
||||
if(clause.length() > 0) {
|
||||
clause.append(" AND ");
|
||||
}
|
||||
clause.append(keys.get(i).getKey());
|
||||
|
||||
if(keys.get(i).getValue() != null && keys.get(i).getValue() == Order.DESCENDING) {
|
||||
clause.append(" < ");
|
||||
}
|
||||
else {
|
||||
clause.append(" > ");
|
||||
}
|
||||
|
||||
clause.append(provider.getSortKeyPlaceHolder(keys.get(i).getKey()));
|
||||
|
||||
clauses.add(clause.toString());
|
||||
}
|
||||
|
||||
sql.append("(");
|
||||
String prefix = "";
|
||||
|
||||
for (String curClause : clauses) {
|
||||
sql.append(prefix);
|
||||
prefix = " OR ";
|
||||
sql.append("(");
|
||||
sql.append(curClause);
|
||||
sql.append(")");
|
||||
}
|
||||
sql.append(")");
|
||||
}
|
||||
|
||||
private static String buildSortKeySelect(AbstractSqlPagingQueryProvider provider) {
|
||||
StringBuilder select = new StringBuilder();
|
||||
|
||||
String prefix = "";
|
||||
|
||||
for (Map.Entry<String, Order> sortKey : provider.getSortKeys().entrySet()) {
|
||||
select.append(prefix);
|
||||
|
||||
prefix = ", ";
|
||||
|
||||
select.append(sortKey.getKey());
|
||||
}
|
||||
|
||||
return select.toString();
|
||||
}
|
||||
|
||||
private static void buildWhereClause(AbstractSqlPagingQueryProvider provider, boolean remainingPageQuery,
|
||||
@@ -198,14 +286,8 @@ public class SqlPagingQueryUtils {
|
||||
sql.append(provider.getWhereClause());
|
||||
sql.append(" AND ");
|
||||
}
|
||||
sql.append(provider.getSortKey());
|
||||
if (provider.isAscending()) {
|
||||
sql.append(" > ");
|
||||
}
|
||||
else {
|
||||
sql.append(" < ");
|
||||
}
|
||||
sql.append(provider.getSortKeyPlaceHolder());
|
||||
|
||||
buildSortConditions(provider, sql);
|
||||
}
|
||||
else {
|
||||
sql.append(provider.getWhereClause() == null ? "" : " WHERE " + provider.getWhereClause());
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package org.springframework.batch.item.database.support;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
@@ -73,14 +75,9 @@ public class SqlWindowingPagingQueryProvider extends AbstractSqlPagingQueryProvi
|
||||
sql.append(getWhereClause());
|
||||
sql.append(" AND ");
|
||||
}
|
||||
sql.append(getSortKey());
|
||||
if (isAscending()) {
|
||||
sql.append(" > ");
|
||||
}
|
||||
else {
|
||||
sql.append(" < ");
|
||||
}
|
||||
sql.append(getSortKeyPlaceHolder());
|
||||
|
||||
SqlPagingQueryUtils.buildSortConditions(this, sql);
|
||||
|
||||
sql.append(getGroupClause() == null ? "" : " GROUP BY " + getGroupClause());
|
||||
sql.append(getOverSubstituteClauseEnd());
|
||||
sql.append(") ").append(getSubQueryAlias()).append("WHERE ").append(extractTableAlias()).append(
|
||||
@@ -98,9 +95,12 @@ public class SqlWindowingPagingQueryProvider extends AbstractSqlPagingQueryProvi
|
||||
}
|
||||
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("SELECT SORT_KEY FROM ( ");
|
||||
sql.append("SELECT ").append(getSortKey()).append(" AS SORT_KEY, ");
|
||||
sql.append("ROW_NUMBER() OVER (").append(getOverClause());
|
||||
sql.append("SELECT ");
|
||||
buildSortKeySelect(sql);
|
||||
sql.append(" FROM ( ");
|
||||
sql.append("SELECT ");
|
||||
buildSortKeySelect(sql);
|
||||
sql.append(", ROW_NUMBER() OVER (").append(getOverClause());
|
||||
sql.append(") AS ROW_NUMBER");
|
||||
sql.append(getOverSubstituteClauseStart());
|
||||
sql.append(" FROM ").append(getFromClause());
|
||||
@@ -113,8 +113,21 @@ public class SqlWindowingPagingQueryProvider extends AbstractSqlPagingQueryProvi
|
||||
return sql.toString();
|
||||
}
|
||||
|
||||
private void buildSortKeySelect(StringBuilder sql) {
|
||||
String prefix = "";
|
||||
for (Map.Entry<String, Order> sortKey : getSortKeys().entrySet()) {
|
||||
sql.append(prefix);
|
||||
prefix = ", ";
|
||||
sql.append(sortKey.getKey());
|
||||
}
|
||||
}
|
||||
|
||||
protected String getOverClause() {
|
||||
return "ORDER BY " + getSortKeyWithoutAlias() + " " + getAscendingClause();
|
||||
StringBuilder sql = new StringBuilder();
|
||||
|
||||
sql.append(" ORDER BY ").append(SqlPagingQueryUtils.buildSortClause(this));
|
||||
|
||||
return sql.toString();
|
||||
}
|
||||
|
||||
protected String getOverSubstituteClauseStart() {
|
||||
@@ -124,14 +137,4 @@ public class SqlWindowingPagingQueryProvider extends AbstractSqlPagingQueryProvi
|
||||
protected String getOverSubstituteClauseEnd() {
|
||||
return "";
|
||||
}
|
||||
|
||||
private String getAscendingClause() {
|
||||
if (isAscending()) {
|
||||
return "ASC";
|
||||
}
|
||||
else {
|
||||
return "DESC";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -7,7 +7,9 @@ import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.CompletionService;
|
||||
@@ -25,13 +27,14 @@ import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.batch.item.ItemReader;
|
||||
import org.springframework.batch.item.database.support.HsqlPagingQueryProvider;
|
||||
import org.springframework.batch.item.database.support.Order;
|
||||
import org.springframework.batch.item.sample.Foo;
|
||||
import org.springframework.batch.support.JdbcTestUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
import org.springframework.batch.support.JdbcTestUtils;
|
||||
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@ContextConfiguration(locations = "JdbcPagingItemReaderCommonTests-context.xml")
|
||||
@@ -140,7 +143,9 @@ public class JdbcPagingItemReaderAsyncTests {
|
||||
HsqlPagingQueryProvider queryProvider = new HsqlPagingQueryProvider();
|
||||
queryProvider.setSelectClause("select ID, NAME, VALUE");
|
||||
queryProvider.setFromClause("from T_FOOS");
|
||||
queryProvider.setSortKey("ID");
|
||||
Map<String, Order> sortKeys = new LinkedHashMap<String, Order>();
|
||||
sortKeys.put("ID", Order.ASCENDING);
|
||||
queryProvider.setSortKeys(sortKeys);
|
||||
reader.setQueryProvider(queryProvider);
|
||||
reader.setRowMapper(new ParameterizedRowMapper<Foo>() {
|
||||
public Foo mapRow(ResultSet rs, int i) throws SQLException {
|
||||
|
||||
@@ -1,17 +1,40 @@
|
||||
/*
|
||||
* Copyright 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.
|
||||
* 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;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.batch.item.database.support.HsqlPagingQueryProvider;
|
||||
import org.springframework.batch.item.database.support.Order;
|
||||
import org.springframework.batch.item.sample.Foo;
|
||||
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
|
||||
|
||||
/**
|
||||
* @author Dave Syer
|
||||
* @author Thomas Risberg
|
||||
* @author Michael Minella
|
||||
*
|
||||
*/
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@ContextConfiguration(locations = "/org/springframework/batch/item/database/JdbcPagingItemReaderParameterTests-context.xml")
|
||||
public class JdbcPagingItemReaderClassicParameterTests extends AbstractPagingItemReaderParameterTests {
|
||||
@@ -24,7 +47,9 @@ public class JdbcPagingItemReaderClassicParameterTests extends AbstractPagingIte
|
||||
queryProvider.setSelectClause("select ID, NAME, VALUE");
|
||||
queryProvider.setFromClause("from T_FOOS");
|
||||
queryProvider.setWhereClause("where VALUE >= ?");
|
||||
queryProvider.setSortKey("ID");
|
||||
Map<String, Order> sortKeys = new LinkedHashMap<String, Order>();
|
||||
sortKeys.put("ID", Order.ASCENDING);
|
||||
queryProvider.setSortKeys(sortKeys);
|
||||
reader.setParameterValues(Collections.<String, Object>singletonMap("limit", 3));
|
||||
reader.setQueryProvider(queryProvider);
|
||||
reader.setRowMapper(
|
||||
|
||||
@@ -1,20 +1,44 @@
|
||||
/*
|
||||
* Copyright 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.
|
||||
* 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;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.batch.item.AbstractItemStreamItemReaderTests;
|
||||
import org.springframework.batch.item.ItemReader;
|
||||
import org.springframework.batch.item.ExecutionContext;
|
||||
import org.springframework.batch.item.ItemReader;
|
||||
import org.springframework.batch.item.database.support.HsqlPagingQueryProvider;
|
||||
import org.springframework.batch.item.database.support.Order;
|
||||
import org.springframework.batch.item.sample.Foo;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
|
||||
/**
|
||||
* @author Dave Syer
|
||||
* @author Thomas Risberg
|
||||
* @author Michael Minella
|
||||
*/
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@ContextConfiguration
|
||||
public class JdbcPagingItemReaderCommonTests extends AbstractItemStreamItemReaderTests {
|
||||
@@ -29,7 +53,9 @@ public class JdbcPagingItemReaderCommonTests extends AbstractItemStreamItemReade
|
||||
HsqlPagingQueryProvider queryProvider = new HsqlPagingQueryProvider();
|
||||
queryProvider.setSelectClause("select ID, NAME, VALUE");
|
||||
queryProvider.setFromClause("from T_FOOS");
|
||||
queryProvider.setSortKey("ID");
|
||||
Map<String, Order> sortKeys = new LinkedHashMap<String, Order>();
|
||||
sortKeys.put("ID", Order.ASCENDING);
|
||||
queryProvider.setSortKeys(sortKeys);
|
||||
reader.setQueryProvider(queryProvider);
|
||||
reader.setRowMapper(
|
||||
new ParameterizedRowMapper<Foo>() {
|
||||
@@ -57,7 +83,9 @@ public class JdbcPagingItemReaderCommonTests extends AbstractItemStreamItemReade
|
||||
queryProvider.setSelectClause("select ID, NAME, VALUE");
|
||||
queryProvider.setFromClause("from T_FOOS");
|
||||
queryProvider.setWhereClause("where ID = -1");
|
||||
queryProvider.setSortKey("ID");
|
||||
Map<String, Order> sortKeys = new LinkedHashMap<String, Order>();
|
||||
sortKeys.put("ID", Order.ASCENDING);
|
||||
queryProvider.setSortKeys(sortKeys);
|
||||
reader.setQueryProvider(queryProvider);
|
||||
reader.setPageSize(3);
|
||||
reader.afterPropertiesSet();
|
||||
|
||||
@@ -1,10 +1,28 @@
|
||||
/*
|
||||
* Copyright 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.
|
||||
* 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;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.batch.item.ItemReader;
|
||||
import org.springframework.batch.item.database.support.HsqlPagingQueryProvider;
|
||||
import org.springframework.batch.item.database.support.Order;
|
||||
import org.springframework.batch.item.sample.Foo;
|
||||
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
|
||||
|
||||
@@ -12,6 +30,7 @@ import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
|
||||
* Tests for {@link JpaPagingItemReader}.
|
||||
*
|
||||
* @author Thomas Risberg
|
||||
* @author Michael Minella
|
||||
*/
|
||||
public class JdbcPagingItemReaderIntegrationTests extends AbstractGenericDataSourceItemReaderIntegrationTests {
|
||||
|
||||
@@ -22,7 +41,9 @@ public class JdbcPagingItemReaderIntegrationTests extends AbstractGenericDataSou
|
||||
HsqlPagingQueryProvider queryProvider = new HsqlPagingQueryProvider();
|
||||
queryProvider.setSelectClause("select ID, NAME, VALUE");
|
||||
queryProvider.setFromClause("from T_FOOS");
|
||||
queryProvider.setSortKey("ID");
|
||||
Map<String, Order> sortKeys = new LinkedHashMap<String, Order>();
|
||||
sortKeys.put("ID", Order.ASCENDING);
|
||||
queryProvider.setSortKeys(sortKeys);
|
||||
inputSource.setQueryProvider(queryProvider);
|
||||
inputSource.setRowMapper(
|
||||
new ParameterizedRowMapper<Foo>() {
|
||||
|
||||
@@ -1,16 +1,39 @@
|
||||
/*
|
||||
* Copyright 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.
|
||||
* 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;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.batch.item.database.support.HsqlPagingQueryProvider;
|
||||
import org.springframework.batch.item.database.support.Order;
|
||||
import org.springframework.batch.item.sample.Foo;
|
||||
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
|
||||
/**
|
||||
* @author Dave Syer
|
||||
* @author Thomas Risberg
|
||||
* @author Michael Minella
|
||||
*/
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@ContextConfiguration(locations = "/org/springframework/batch/item/database/JdbcPagingItemReaderParameterTests-context.xml")
|
||||
public class JdbcPagingItemReaderNamedParameterTests extends AbstractPagingItemReaderParameterTests {
|
||||
@@ -23,7 +46,9 @@ public class JdbcPagingItemReaderNamedParameterTests extends AbstractPagingItemR
|
||||
queryProvider.setSelectClause("select ID, NAME, VALUE");
|
||||
queryProvider.setFromClause("from T_FOOS");
|
||||
queryProvider.setWhereClause("where VALUE >= :limit");
|
||||
queryProvider.setSortKey("ID");
|
||||
Map<String, Order> sortKeys = new LinkedHashMap<String, Order>();
|
||||
sortKeys.put("ID", Order.ASCENDING);
|
||||
queryProvider.setSortKeys(sortKeys);
|
||||
reader.setParameterValues(Collections.<String, Object>singletonMap("limit", 3));
|
||||
reader.setQueryProvider(queryProvider);
|
||||
reader.setRowMapper(
|
||||
@@ -37,7 +62,7 @@ public class JdbcPagingItemReaderNamedParameterTests extends AbstractPagingItemR
|
||||
}
|
||||
}
|
||||
);
|
||||
reader.setPageSize(2);
|
||||
reader.setPageSize(3);
|
||||
reader.afterPropertiesSet();
|
||||
reader.setSaveState(true);
|
||||
|
||||
|
||||
@@ -1,10 +1,28 @@
|
||||
/*
|
||||
* Copyright 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.
|
||||
* 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;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.batch.item.ItemReader;
|
||||
import org.springframework.batch.item.database.support.HsqlPagingQueryProvider;
|
||||
import org.springframework.batch.item.database.support.Order;
|
||||
import org.springframework.batch.item.sample.Foo;
|
||||
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
|
||||
|
||||
@@ -12,6 +30,7 @@ import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
|
||||
* Tests for {@link JpaPagingItemReader} with sort key not equal to ID.
|
||||
*
|
||||
* @author Thomas Risberg
|
||||
* @author Michael Minella
|
||||
*/
|
||||
public class JdbcPagingItemReaderOrderIntegrationTests extends AbstractGenericDataSourceItemReaderIntegrationTests {
|
||||
|
||||
@@ -22,7 +41,10 @@ public class JdbcPagingItemReaderOrderIntegrationTests extends AbstractGenericDa
|
||||
HsqlPagingQueryProvider queryProvider = new HsqlPagingQueryProvider();
|
||||
queryProvider.setSelectClause("select ID, NAME, VALUE");
|
||||
queryProvider.setFromClause("from T_FOOS");
|
||||
queryProvider.setSortKey("VALUE");
|
||||
Map<String, Order> sortKeys = new LinkedHashMap<String, Order>();
|
||||
sortKeys.put("VALUE", Order.ASCENDING);
|
||||
sortKeys.put("NAME", Order.DESCENDING);
|
||||
queryProvider.setSortKeys(sortKeys);
|
||||
inputSource.setQueryProvider(queryProvider);
|
||||
inputSource.setRowMapper(
|
||||
new ParameterizedRowMapper<Foo>() {
|
||||
|
||||
@@ -15,8 +15,12 @@
|
||||
*/
|
||||
package org.springframework.batch.item.database.support;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
@@ -38,7 +42,10 @@ public abstract class AbstractSqlPagingQueryProviderTests {
|
||||
pagingQueryProvider.setSelectClause("id, name, age");
|
||||
pagingQueryProvider.setFromClause("foo");
|
||||
pagingQueryProvider.setWhereClause("bar = 1");
|
||||
pagingQueryProvider.setSortKey("id");
|
||||
|
||||
Map<String, Order> sortKeys = new LinkedHashMap<String, Order>();
|
||||
sortKeys.put("id", Order.ASCENDING);
|
||||
pagingQueryProvider.setSortKeys(sortKeys);
|
||||
pageSize = 100;
|
||||
|
||||
}
|
||||
@@ -51,11 +58,51 @@ public abstract class AbstractSqlPagingQueryProviderTests {
|
||||
|
||||
@Test
|
||||
public void testQueryContainsSortKeyDesc(){
|
||||
pagingQueryProvider.setAscending(false);
|
||||
pagingQueryProvider.getSortKeys().put("id", Order.DESCENDING);
|
||||
String s = pagingQueryProvider.generateFirstPageQuery(pageSize).toLowerCase();
|
||||
assertTrue("Wrong query: "+s, s.contains("id desc"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGenerateFirstPageQueryWithMultipleSortKeys() {
|
||||
Map<String, Order> sortKeys = new LinkedHashMap<String, Order>();
|
||||
sortKeys.put("name", Order.ASCENDING);
|
||||
sortKeys.put("id", Order.DESCENDING);
|
||||
pagingQueryProvider.setSortKeys(sortKeys);
|
||||
String s = pagingQueryProvider.generateFirstPageQuery(pageSize);
|
||||
assertEquals(getFirstPageSqlWithMultipleSortKeys(), s);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGenerateRemainingPagesQueryWithMultipleSortKeys() {
|
||||
Map<String, Order> sortKeys = new LinkedHashMap<String, Order>();
|
||||
sortKeys.put("name", Order.ASCENDING);
|
||||
sortKeys.put("id", Order.DESCENDING);
|
||||
pagingQueryProvider.setSortKeys(sortKeys);
|
||||
String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize);
|
||||
assertEquals(getRemainingSqlWithMultipleSortKeys(), s);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGenerateJumpToItemQueryWithMultipleSortKeys() {
|
||||
Map<String, Order> sortKeys = new LinkedHashMap<String, Order>();
|
||||
sortKeys.put("name", Order.ASCENDING);
|
||||
sortKeys.put("id", Order.DESCENDING);
|
||||
pagingQueryProvider.setSortKeys(sortKeys);
|
||||
String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize);
|
||||
assertEquals(getJumpToItemQueryWithMultipleSortKeys(), s);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGenerateJumpToItemQueryForFirstPageWithMultipleSortKeys() {
|
||||
Map<String, Order> sortKeys = new LinkedHashMap<String, Order>();
|
||||
sortKeys.put("name", Order.ASCENDING);
|
||||
sortKeys.put("id", Order.DESCENDING);
|
||||
pagingQueryProvider.setSortKeys(sortKeys);
|
||||
String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize);
|
||||
assertEquals(getJumpToItemQueryForFirstPageWithMultipleSortKeys(), s);
|
||||
}
|
||||
|
||||
@Test
|
||||
public abstract void testGenerateFirstPageQuery();
|
||||
|
||||
@@ -80,4 +127,11 @@ public abstract class AbstractSqlPagingQueryProviderTests {
|
||||
@Test
|
||||
public abstract void testGenerateJumpToItemQueryForFirstPageWithGroupBy();
|
||||
|
||||
public abstract String getFirstPageSqlWithMultipleSortKeys();
|
||||
|
||||
public abstract String getRemainingSqlWithMultipleSortKeys();
|
||||
|
||||
public abstract String getJumpToItemQueryWithMultipleSortKeys();
|
||||
|
||||
public abstract String getJumpToItemQueryForFirstPageWithMultipleSortKeys();
|
||||
}
|
||||
|
||||
@@ -1,8 +1,24 @@
|
||||
/*
|
||||
* Copyright 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.
|
||||
* 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;
|
||||
|
||||
import org.junit.Test;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* @author Thomas Risberg
|
||||
* @author Michael Minella
|
||||
@@ -23,21 +39,21 @@ public class Db2PagingQueryProviderTests extends AbstractSqlPagingQueryProviderT
|
||||
|
||||
@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 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);
|
||||
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 sql = "SELECT id FROM ( SELECT id, 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);
|
||||
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 sql = "SELECT id FROM ( SELECT id, 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);
|
||||
assertEquals(sql, s);
|
||||
}
|
||||
@@ -55,7 +71,7 @@ public class Db2PagingQueryProviderTests extends AbstractSqlPagingQueryProviderT
|
||||
@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 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);
|
||||
}
|
||||
@@ -64,7 +80,7 @@ public class Db2PagingQueryProviderTests extends AbstractSqlPagingQueryProviderT
|
||||
@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 sql = "SELECT id FROM ( SELECT id, 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);
|
||||
}
|
||||
@@ -73,8 +89,28 @@ public class Db2PagingQueryProviderTests extends AbstractSqlPagingQueryProviderT
|
||||
@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 sql = "SELECT id FROM ( SELECT id, 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);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFirstPageSqlWithMultipleSortKeys() {
|
||||
return "SELECT id, name, age FROM foo WHERE bar = 1 ORDER BY name ASC, id DESC FETCH FIRST 100 ROWS ONLY";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRemainingSqlWithMultipleSortKeys() {
|
||||
return "SELECT id, name, age FROM foo WHERE bar = 1 AND ((name > ?) OR (name = ? AND id < ?)) ORDER BY name ASC, id DESC FETCH FIRST 100 ROWS ONLY";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getJumpToItemQueryWithMultipleSortKeys() {
|
||||
return "SELECT name, id FROM ( SELECT name, id, ROW_NUMBER() OVER ( ORDER BY name ASC, id DESC) AS ROW_NUMBER FROM foo WHERE bar = 1) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 100";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getJumpToItemQueryForFirstPageWithMultipleSortKeys() {
|
||||
return "SELECT name, id FROM ( SELECT name, id, ROW_NUMBER() OVER ( ORDER BY name ASC, id DESC) AS ROW_NUMBER FROM foo WHERE bar = 1) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 1";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,33 +85,33 @@ public class DerbyPagingQueryProviderTests extends AbstractSqlPagingQueryProvide
|
||||
@Test
|
||||
@Override
|
||||
public void testGenerateFirstPageQuery() {
|
||||
String sql = "SELECT * FROM ( SELECT id, name, age, ROW_NUMBER() OVER () AS ROW_NUMBER FROM (SELECT id, name, age FROM foo WHERE bar = 1 ORDER BY id ASC) AS TMP_ORDERED) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER <= 100";
|
||||
String sql = "SELECT * FROM ( SELECT id, name, age, ROW_NUMBER() OVER () AS ROW_NUMBER FROM (SELECT id, name, age FROM foo WHERE bar = 1 ORDER BY id ASC) AS TMP_ORDERED) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER <= 100";
|
||||
String s = pagingQueryProvider.generateFirstPageQuery(pageSize);
|
||||
Assert.assertEquals("", sql, s);
|
||||
Assert.assertEquals(sql, s);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Override
|
||||
public void testGenerateRemainingPagesQuery() {
|
||||
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 > ? ORDER BY id ASC) AS TMP_ORDERED) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER <= 100";
|
||||
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 > ?)) ORDER BY id ASC) AS TMP_ORDERED) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER <= 100";
|
||||
String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize);
|
||||
Assert.assertEquals("", sql, s);
|
||||
Assert.assertEquals(sql, s);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Override
|
||||
public void testGenerateJumpToItemQuery() {
|
||||
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 ORDER BY id ASC) AS TMP_ORDERED) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 100";
|
||||
String sql = "SELECT id FROM ( SELECT id, ROW_NUMBER() OVER () AS ROW_NUMBER FROM (SELECT id, name, age FROM foo WHERE bar = 1 ORDER BY id ASC) AS TMP_ORDERED) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 100";
|
||||
String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize);
|
||||
Assert.assertEquals("", sql, s);
|
||||
Assert.assertEquals(sql, s);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Override
|
||||
public void testGenerateJumpToItemQueryForFirstPage() {
|
||||
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 ORDER BY id ASC) AS TMP_ORDERED) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 1";
|
||||
String sql = "SELECT id FROM ( SELECT id, ROW_NUMBER() OVER () AS ROW_NUMBER FROM (SELECT id, name, age FROM foo WHERE bar = 1 ORDER BY id ASC) AS TMP_ORDERED) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 1";
|
||||
String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize);
|
||||
Assert.assertEquals("", sql, s);
|
||||
Assert.assertEquals(sql, s);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -130,7 +130,7 @@ public class DerbyPagingQueryProviderTests extends AbstractSqlPagingQueryProvide
|
||||
@Test
|
||||
@Override
|
||||
public void testQueryContainsSortKeyDesc() {
|
||||
pagingQueryProvider.setAscending(false);
|
||||
pagingQueryProvider.getSortKeys().put("id", Order.DESCENDING);
|
||||
String s = pagingQueryProvider.generateFirstPageQuery(pageSize).toLowerCase();
|
||||
assertTrue("Wrong query: " + s, s.contains("id desc"));
|
||||
}
|
||||
@@ -139,7 +139,7 @@ public class DerbyPagingQueryProviderTests extends AbstractSqlPagingQueryProvide
|
||||
@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 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);
|
||||
}
|
||||
@@ -148,7 +148,7 @@ public class DerbyPagingQueryProviderTests extends AbstractSqlPagingQueryProvide
|
||||
@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 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);
|
||||
}
|
||||
@@ -157,7 +157,7 @@ public class DerbyPagingQueryProviderTests extends AbstractSqlPagingQueryProvide
|
||||
@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 sql = "SELECT id FROM ( SELECT id, 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);
|
||||
}
|
||||
@@ -166,8 +166,28 @@ public class DerbyPagingQueryProviderTests extends AbstractSqlPagingQueryProvide
|
||||
@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 sql = "SELECT id FROM ( SELECT id, 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);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFirstPageSqlWithMultipleSortKeys() {
|
||||
return "SELECT * FROM ( SELECT id, name, age, ROW_NUMBER() OVER () AS ROW_NUMBER FROM (SELECT id, name, age FROM foo WHERE bar = 1 ORDER BY name ASC, id DESC) AS TMP_ORDERED) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER <= 100";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRemainingSqlWithMultipleSortKeys() {
|
||||
return "SELECT * FROM ( SELECT id, name, age, ROW_NUMBER() OVER () AS ROW_NUMBER FROM (SELECT id, name, age FROM foo WHERE bar = 1 AND ((name > ?) OR (name = ? AND id < ?)) ORDER BY name ASC, id DESC) AS TMP_ORDERED) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER <= 100";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getJumpToItemQueryWithMultipleSortKeys() {
|
||||
return "SELECT name, id FROM ( SELECT name, id, ROW_NUMBER() OVER () AS ROW_NUMBER FROM (SELECT id, name, age FROM foo WHERE bar = 1 ORDER BY name ASC, id DESC) AS TMP_ORDERED) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 100";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getJumpToItemQueryForFirstPageWithMultipleSortKeys() {
|
||||
return "SELECT name, id FROM ( SELECT name, id, ROW_NUMBER() OVER () AS ROW_NUMBER FROM (SELECT id, name, age FROM foo WHERE bar = 1 ORDER BY name ASC, id DESC) AS TMP_ORDERED) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 1";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,9 +15,10 @@
|
||||
*/
|
||||
package org.springframework.batch.item.database.support;
|
||||
|
||||
import org.junit.Test;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* @author Thomas Risberg
|
||||
* @author Dave Syer
|
||||
@@ -39,21 +40,21 @@ public class H2PagingQueryProviderTests extends AbstractSqlPagingQueryProviderTe
|
||||
|
||||
@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 sql = "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 AND ((id > ?)) ORDER BY id ASC";
|
||||
String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize);
|
||||
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 sql = "SELECT LIMIT 99 1 id FROM foo WHERE bar = 1 ORDER BY id ASC";
|
||||
String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize);
|
||||
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 sql = "SELECT LIMIT 0 1 id FROM foo WHERE bar = 1 ORDER BY id ASC";
|
||||
String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize);
|
||||
assertEquals(sql, s);
|
||||
}
|
||||
@@ -71,7 +72,7 @@ public class H2PagingQueryProviderTests extends AbstractSqlPagingQueryProviderTe
|
||||
@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 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);
|
||||
}
|
||||
@@ -80,7 +81,7 @@ public class H2PagingQueryProviderTests extends AbstractSqlPagingQueryProviderTe
|
||||
@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 sql = "SELECT LIMIT 99 1 id FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC";
|
||||
String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize);
|
||||
assertEquals(sql, s);
|
||||
}
|
||||
@@ -89,8 +90,28 @@ public class H2PagingQueryProviderTests extends AbstractSqlPagingQueryProviderTe
|
||||
@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 sql = "SELECT LIMIT 0 1 id FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC";
|
||||
String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize);
|
||||
assertEquals(sql, s);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFirstPageSqlWithMultipleSortKeys() {
|
||||
return "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 ORDER BY name ASC, id DESC";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRemainingSqlWithMultipleSortKeys() {
|
||||
return "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 AND ((name > ?) OR (name = ? AND id < ?)) ORDER BY name ASC, id DESC";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getJumpToItemQueryWithMultipleSortKeys() {
|
||||
return "SELECT LIMIT 99 1 name, id FROM foo WHERE bar = 1 ORDER BY name ASC, id DESC";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getJumpToItemQueryForFirstPageWithMultipleSortKeys() {
|
||||
return "SELECT LIMIT 0 1 name, id FROM foo WHERE bar = 1 ORDER BY name ASC, id DESC";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
*/
|
||||
package org.springframework.batch.item.database.support;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* @author Thomas Risberg
|
||||
* @author Michael Minella
|
||||
@@ -39,21 +39,21 @@ public class HsqlPagingQueryProviderTests extends AbstractSqlPagingQueryProvider
|
||||
|
||||
@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 sql = "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 AND ((id > ?)) ORDER BY id ASC";
|
||||
String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize);
|
||||
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 sql = "SELECT LIMIT 99 1 id FROM foo WHERE bar = 1 ORDER BY id ASC";
|
||||
String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize);
|
||||
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 sql = "SELECT LIMIT 0 1 id FROM foo WHERE bar = 1 ORDER BY id ASC";
|
||||
String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize);
|
||||
assertEquals(sql, s);
|
||||
}
|
||||
@@ -71,7 +71,7 @@ public class HsqlPagingQueryProviderTests extends AbstractSqlPagingQueryProvider
|
||||
@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 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);
|
||||
}
|
||||
@@ -80,7 +80,7 @@ public class HsqlPagingQueryProviderTests extends AbstractSqlPagingQueryProvider
|
||||
@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 sql = "SELECT LIMIT 99 1 id FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC";
|
||||
String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize);
|
||||
assertEquals(sql, s);
|
||||
}
|
||||
@@ -89,8 +89,28 @@ public class HsqlPagingQueryProviderTests extends AbstractSqlPagingQueryProvider
|
||||
@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 sql = "SELECT LIMIT 0 1 id FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC";
|
||||
String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize);
|
||||
assertEquals(sql, s);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFirstPageSqlWithMultipleSortKeys() {
|
||||
return "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 ORDER BY name ASC, id DESC";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRemainingSqlWithMultipleSortKeys() {
|
||||
return "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 AND ((name > ?) OR (name = ? AND id < ?)) ORDER BY name ASC, id DESC";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getJumpToItemQueryWithMultipleSortKeys() {
|
||||
return "SELECT LIMIT 99 1 name, id FROM foo WHERE bar = 1 ORDER BY name ASC, id DESC";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getJumpToItemQueryForFirstPageWithMultipleSortKeys() {
|
||||
return "SELECT LIMIT 0 1 name, id FROM foo WHERE bar = 1 ORDER BY name ASC, id DESC";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,9 +15,10 @@
|
||||
*/
|
||||
package org.springframework.batch.item.database.support;
|
||||
|
||||
import org.junit.Test;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* @author Thomas Risberg
|
||||
* @author Michael Minella
|
||||
@@ -38,21 +39,21 @@ public class MySqlPagingQueryProviderTests extends AbstractSqlPagingQueryProvide
|
||||
|
||||
@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 sql = "SELECT id, name, age FROM foo WHERE bar = 1 AND ((id > ?)) ORDER BY id ASC LIMIT 100";
|
||||
String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize);
|
||||
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 sql = "SELECT id FROM foo WHERE bar = 1 ORDER BY id ASC LIMIT 99, 1";
|
||||
String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize);
|
||||
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 sql = "SELECT id FROM foo WHERE bar = 1 ORDER BY id ASC LIMIT 0, 1";
|
||||
String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize);
|
||||
assertEquals(sql, s);
|
||||
}
|
||||
@@ -70,7 +71,7 @@ public class MySqlPagingQueryProviderTests extends AbstractSqlPagingQueryProvide
|
||||
@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 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);
|
||||
}
|
||||
@@ -79,7 +80,7 @@ public class MySqlPagingQueryProviderTests extends AbstractSqlPagingQueryProvide
|
||||
@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 sql = "SELECT id FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC LIMIT 99, 1";
|
||||
String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize);
|
||||
assertEquals(sql, s);
|
||||
}
|
||||
@@ -88,8 +89,28 @@ public class MySqlPagingQueryProviderTests extends AbstractSqlPagingQueryProvide
|
||||
@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 sql = "SELECT id FROM foo WHERE bar = 1 GROUP BY dep ORDER BY id ASC LIMIT 0, 1";
|
||||
String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize);
|
||||
assertEquals(sql, s);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFirstPageSqlWithMultipleSortKeys() {
|
||||
return "SELECT id, name, age FROM foo WHERE bar = 1 ORDER BY name ASC, id DESC LIMIT 100";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRemainingSqlWithMultipleSortKeys() {
|
||||
return "SELECT id, name, age FROM foo WHERE bar = 1 AND ((name > ?) OR (name = ? AND id < ?)) ORDER BY name ASC, id DESC LIMIT 100";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getJumpToItemQueryWithMultipleSortKeys() {
|
||||
return "SELECT name, id FROM foo WHERE bar = 1 ORDER BY name ASC, id DESC LIMIT 99, 1";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getJumpToItemQueryForFirstPageWithMultipleSortKeys() {
|
||||
return "SELECT name, id FROM foo WHERE bar = 1 ORDER BY name ASC, id DESC LIMIT 0, 1";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,22 @@
|
||||
/*
|
||||
* Copyright 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.
|
||||
* 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;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
@@ -27,21 +43,21 @@ public class OraclePagingQueryProviderTests extends AbstractSqlPagingQueryProvid
|
||||
|
||||
@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 foo WHERE bar = 1 AND ((id > ?)) ORDER BY id ASC) WHERE ROWNUM <= 100";
|
||||
String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize);
|
||||
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 sql = "SELECT id FROM (SELECT id, ROWNUM as TMP_ROW_NUM FROM (SELECT id FROM foo WHERE bar = 1 ORDER BY id ASC)) WHERE TMP_ROW_NUM = 100";
|
||||
String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize);
|
||||
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 sql = "SELECT id FROM (SELECT id, ROWNUM as TMP_ROW_NUM FROM (SELECT id FROM foo WHERE bar = 1 ORDER BY id ASC)) WHERE TMP_ROW_NUM = 1";
|
||||
String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize);
|
||||
assertEquals(sql, s);
|
||||
}
|
||||
@@ -59,7 +75,7 @@ public class OraclePagingQueryProviderTests extends AbstractSqlPagingQueryProvid
|
||||
@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 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);
|
||||
}
|
||||
@@ -68,7 +84,7 @@ public class OraclePagingQueryProviderTests extends AbstractSqlPagingQueryProvid
|
||||
@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 sql = "SELECT id FROM (SELECT id, ROWNUM as TMP_ROW_NUM FROM (SELECT id 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);
|
||||
}
|
||||
@@ -77,8 +93,28 @@ public class OraclePagingQueryProviderTests extends AbstractSqlPagingQueryProvid
|
||||
@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 sql = "SELECT id FROM (SELECT id, ROWNUM as TMP_ROW_NUM FROM (SELECT id 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);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFirstPageSqlWithMultipleSortKeys() {
|
||||
return "SELECT * FROM (SELECT id, name, age, ROWNUM as TMP_ROW_NUM FROM foo WHERE bar = 1 ORDER BY name ASC, id DESC) WHERE ROWNUM <= 100";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRemainingSqlWithMultipleSortKeys() {
|
||||
return "SELECT * FROM (SELECT id, name, age, ROWNUM as TMP_ROW_NUM FROM foo WHERE bar = 1 AND ((name > ?) OR (name = ? AND id < ?)) ORDER BY name ASC, id DESC) WHERE ROWNUM <= 100";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getJumpToItemQueryWithMultipleSortKeys() {
|
||||
return "SELECT name, id FROM (SELECT name, id, ROWNUM as TMP_ROW_NUM FROM (SELECT name, id FROM foo WHERE bar = 1 ORDER BY name ASC, id DESC)) WHERE TMP_ROW_NUM = 100";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getJumpToItemQueryForFirstPageWithMultipleSortKeys() {
|
||||
return "SELECT name, id FROM (SELECT name, id, ROWNUM as TMP_ROW_NUM FROM (SELECT name, id FROM foo WHERE bar = 1 ORDER BY name ASC, id DESC)) WHERE TMP_ROW_NUM = 1";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,24 @@
|
||||
/*
|
||||
* Copyright 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.
|
||||
* 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;
|
||||
|
||||
import org.junit.Test;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* @author Thomas Risberg
|
||||
* @author Michael Minella
|
||||
@@ -23,21 +39,21 @@ public class PostgresPagingQueryProviderTests extends AbstractSqlPagingQueryProv
|
||||
|
||||
@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 sql = "SELECT id, name, age FROM foo WHERE bar = 1 AND ((id > ?)) ORDER BY id ASC LIMIT 100";
|
||||
String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize);
|
||||
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 sql = "SELECT id FROM foo WHERE bar = 1 ORDER BY id ASC LIMIT 1 OFFSET 99";
|
||||
String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize);
|
||||
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 sql = "SELECT id FROM foo WHERE bar = 1 ORDER BY id ASC LIMIT 1 OFFSET 0";
|
||||
String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize);
|
||||
assertEquals("Wrong SQL for first page", sql, s);
|
||||
}
|
||||
@@ -55,7 +71,7 @@ public class PostgresPagingQueryProviderTests extends AbstractSqlPagingQueryProv
|
||||
@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 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);
|
||||
}
|
||||
@@ -64,7 +80,7 @@ public class PostgresPagingQueryProviderTests extends AbstractSqlPagingQueryProv
|
||||
@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 sql = "SELECT id 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);
|
||||
}
|
||||
@@ -73,8 +89,28 @@ public class PostgresPagingQueryProviderTests extends AbstractSqlPagingQueryProv
|
||||
@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 sql = "SELECT id 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);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFirstPageSqlWithMultipleSortKeys() {
|
||||
return "SELECT id, name, age FROM foo WHERE bar = 1 ORDER BY name ASC, id DESC LIMIT 100";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRemainingSqlWithMultipleSortKeys() {
|
||||
return "SELECT id, name, age FROM foo WHERE bar = 1 AND ((name > ?) OR (name = ? AND id < ?)) ORDER BY name ASC, id DESC LIMIT 100";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getJumpToItemQueryWithMultipleSortKeys() {
|
||||
return "SELECT name, id FROM foo WHERE bar = 1 ORDER BY name ASC, id DESC LIMIT 1 OFFSET 99";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getJumpToItemQueryForFirstPageWithMultipleSortKeys() {
|
||||
return "SELECT name, id FROM foo WHERE bar = 1 ORDER BY name ASC, id DESC LIMIT 1 OFFSET 0";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,9 @@ import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import org.easymock.EasyMock;
|
||||
@@ -30,6 +33,7 @@ import org.springframework.jdbc.support.MetaDataAccessException;
|
||||
|
||||
/**
|
||||
* @author Dave Syer
|
||||
* @author Michael Minella
|
||||
*/
|
||||
public class SqlPagingQueryProviderFactoryBeanTests {
|
||||
|
||||
@@ -39,7 +43,9 @@ public class SqlPagingQueryProviderFactoryBeanTests {
|
||||
factory.setSelectClause("id, name, age");
|
||||
factory.setFromClause("foo");
|
||||
factory.setWhereClause("bar = 1");
|
||||
factory.setSortKey("id");
|
||||
Map<String, Order> sortKeys = new LinkedHashMap<String, Order>();
|
||||
sortKeys.put("id", Order.ASCENDING);
|
||||
factory.setSortKeys(sortKeys);
|
||||
DataSource dataSource = DatabaseTypeTestUtils.getMockDataSource(DatabaseType.HSQL.getProductName(), "100.0.0");
|
||||
factory.setDataSource(dataSource);
|
||||
EasyMock.replay(dataSource);
|
||||
@@ -70,7 +76,7 @@ public class SqlPagingQueryProviderFactoryBeanTests {
|
||||
|
||||
@Test(expected=IllegalArgumentException.class)
|
||||
public void testNoSortKey() throws Exception {
|
||||
factory.setSortKey(null);
|
||||
factory.setSortKeys(null);
|
||||
PagingQueryProvider provider = (PagingQueryProvider) factory.getObject();
|
||||
assertNotNull(provider);
|
||||
}
|
||||
|
||||
@@ -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,65 +19,78 @@ package org.springframework.batch.item.database.support;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* @author Thomas Risberg
|
||||
* @author Dave Syer
|
||||
* @author Michael Minella
|
||||
* @since 2.0
|
||||
*/
|
||||
public class SqlPagingQueryUtilsTests {
|
||||
|
||||
private Map<String, Order> sortKeys;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
sortKeys = new LinkedHashMap<String, Order>();
|
||||
sortKeys.put("ID", Order.ASCENDING);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGenerateLimitSqlQuery() {
|
||||
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", "ID");
|
||||
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", sortKeys);
|
||||
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
|
||||
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");
|
||||
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",
|
||||
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");
|
||||
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", sortKeys);
|
||||
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
|
||||
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");
|
||||
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",
|
||||
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");
|
||||
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", sortKeys);
|
||||
assertEquals(
|
||||
"SELECT * FROM (SELECT FOO, ROWNUM as TMP_ROW_NUM 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",
|
||||
"SELECT * FROM (SELECT FOO, ROWNUM as TMP_ROW_NUM 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",
|
||||
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",
|
||||
"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",
|
||||
SqlPagingQueryUtils.generateRowNumSqlQuery(qp, true, "ROWNUMBER <= 100"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGenerateRowNumSqlQueryWithNesting() {
|
||||
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", "ID");
|
||||
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", sortKeys);
|
||||
assertEquals(
|
||||
"SELECT FOO FROM (SELECT FOO, ROWNUM as TMP_ROW_NUM FROM (SELECT FOO FROM BAR ORDER BY ID ASC)) WHERE ROWNUMBER <= 100",
|
||||
SqlPagingQueryUtils.generateRowNumSqlQueryWithNesting(qp, "FOO", false, "ROWNUMBER <= 100"));
|
||||
@@ -85,62 +98,62 @@ public class SqlPagingQueryUtilsTests {
|
||||
|
||||
@Test
|
||||
public void testGenerateTopSqlQueryDescending() {
|
||||
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", "ID");
|
||||
qp.setAscending(false);
|
||||
sortKeys.put("ID", Order.DESCENDING);
|
||||
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", sortKeys);
|
||||
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
|
||||
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",
|
||||
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);
|
||||
sortKeys.put("ID", Order.DESCENDING);
|
||||
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", sortKeys);
|
||||
assertEquals(
|
||||
"SELECT * FROM (SELECT FOO, ROWNUM as TMP_ROW_NUM 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",
|
||||
"SELECT * FROM (SELECT FOO, ROWNUM as TMP_ROW_NUM 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",
|
||||
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",
|
||||
"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",
|
||||
SqlPagingQueryUtils.generateRowNumSqlQuery(qp, true, "ROWNUMBER <= 100"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGenerateLimitJumpToQuery() {
|
||||
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", "ID");
|
||||
assertEquals("SELECT ID AS SORT_KEY FROM BAR ORDER BY ID ASC LIMIT 100, 1", SqlPagingQueryUtils
|
||||
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", sortKeys);
|
||||
assertEquals("SELECT ID FROM BAR ORDER BY ID ASC LIMIT 100, 1", SqlPagingQueryUtils
|
||||
.generateLimitJumpToQuery(qp, "LIMIT 100, 1"));
|
||||
qp.setWhereClause("BAZ IS NOT NULL");
|
||||
assertEquals("SELECT ID AS SORT_KEY FROM BAR WHERE BAZ IS NOT NULL ORDER BY ID ASC LIMIT 100, 1",
|
||||
assertEquals("SELECT ID 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");
|
||||
assertEquals("SELECT TOP 100, 1 ID AS SORT_KEY FROM BAR ORDER BY ID ASC", SqlPagingQueryUtils
|
||||
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", sortKeys);
|
||||
assertEquals("SELECT TOP 100, 1 ID FROM BAR ORDER BY ID ASC", SqlPagingQueryUtils
|
||||
.generateTopJumpToQuery(qp, "TOP 100, 1"));
|
||||
qp.setWhereClause("BAZ IS NOT NULL");
|
||||
assertEquals("SELECT TOP 100, 1 ID AS SORT_KEY FROM BAR WHERE BAZ IS NOT NULL ORDER BY ID ASC",
|
||||
assertEquals("SELECT TOP 100, 1 ID 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);
|
||||
sortKeys.put("ID", Order.DESCENDING);
|
||||
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", sortKeys);
|
||||
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"));
|
||||
@@ -151,8 +164,8 @@ public class SqlPagingQueryUtilsTests {
|
||||
|
||||
@Test
|
||||
public void testGenerateLimitJumpQueryDescending() {
|
||||
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", "ID");
|
||||
qp.setAscending(false);
|
||||
sortKeys.put("ID", Order.DESCENDING);
|
||||
AbstractSqlPagingQueryProvider qp = new TestSqlPagingQueryProvider("FOO", "BAR", sortKeys);
|
||||
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"));
|
||||
@@ -163,10 +176,10 @@ public class SqlPagingQueryUtilsTests {
|
||||
|
||||
private static class TestSqlPagingQueryProvider extends AbstractSqlPagingQueryProvider {
|
||||
|
||||
public TestSqlPagingQueryProvider(String select, String from, String sortKey) {
|
||||
public TestSqlPagingQueryProvider(String select, String from, Map<String, Order> sortKeys) {
|
||||
setSelectClause(select);
|
||||
setFromClause(from);
|
||||
setSortKey(sortKey);
|
||||
setSortKeys(sortKeys);
|
||||
}
|
||||
|
||||
public String generateFirstPageQuery(int pageSize) {
|
||||
|
||||
@@ -1,8 +1,24 @@
|
||||
/*
|
||||
* Copyright 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.
|
||||
* 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;
|
||||
|
||||
import org.junit.Test;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* @author Thomas Risberg
|
||||
* @author Michael Minella
|
||||
@@ -23,21 +39,21 @@ public class SqlServerPagingQueryProviderTests extends AbstractSqlPagingQueryPro
|
||||
|
||||
@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 sql = "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 AND ((id > ?)) ORDER BY id ASC";
|
||||
String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize);
|
||||
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 sql = "SELECT id FROM ( SELECT id, 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);
|
||||
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 sql = "SELECT id FROM ( SELECT id, 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);
|
||||
assertEquals(sql, s);
|
||||
}
|
||||
@@ -55,7 +71,7 @@ public class SqlServerPagingQueryProviderTests extends AbstractSqlPagingQueryPro
|
||||
@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 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);
|
||||
}
|
||||
@@ -64,7 +80,7 @@ public class SqlServerPagingQueryProviderTests extends AbstractSqlPagingQueryPro
|
||||
@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 sql = "SELECT id FROM ( SELECT id, 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);
|
||||
}
|
||||
@@ -73,8 +89,28 @@ public class SqlServerPagingQueryProviderTests extends AbstractSqlPagingQueryPro
|
||||
@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 sql = "SELECT id FROM ( SELECT id, 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);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFirstPageSqlWithMultipleSortKeys() {
|
||||
return "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 ORDER BY name ASC, id DESC";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRemainingSqlWithMultipleSortKeys() {
|
||||
return "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 AND ((name > ?) OR (name = ? AND id < ?)) ORDER BY name ASC, id DESC";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getJumpToItemQueryWithMultipleSortKeys() {
|
||||
return "SELECT name, id FROM ( SELECT name, id, ROW_NUMBER() OVER ( ORDER BY name ASC, id DESC) AS ROW_NUMBER FROM foo WHERE bar = 1) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 100";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getJumpToItemQueryForFirstPageWithMultipleSortKeys() {
|
||||
return "SELECT name, id FROM ( SELECT name, id, ROW_NUMBER() OVER ( ORDER BY name ASC, id DESC) AS ROW_NUMBER FROM foo WHERE bar = 1) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 1";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,28 +32,28 @@ public class SqlWindowingPagingQueryProviderTests extends AbstractSqlPagingQuery
|
||||
|
||||
@Test @Override
|
||||
public void testGenerateFirstPageQuery() {
|
||||
String sql = "SELECT * FROM ( SELECT id, name, age, 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 sql = "SELECT * FROM ( SELECT id, name, age, 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.generateFirstPageQuery(pageSize);
|
||||
assertEquals("", sql, s);
|
||||
}
|
||||
|
||||
@Test @Override
|
||||
public void testGenerateRemainingPagesQuery() {
|
||||
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 > ?) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER <= 100";
|
||||
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 > ?))) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER <= 100";
|
||||
String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize);
|
||||
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 sql = "SELECT id FROM ( SELECT id, 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);
|
||||
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 sql = "SELECT id FROM ( SELECT id, 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);
|
||||
}
|
||||
@@ -62,7 +62,7 @@ public class SqlWindowingPagingQueryProviderTests extends AbstractSqlPagingQuery
|
||||
@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 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);
|
||||
}
|
||||
@@ -71,7 +71,7 @@ public class SqlWindowingPagingQueryProviderTests extends AbstractSqlPagingQuery
|
||||
@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 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);
|
||||
}
|
||||
@@ -80,7 +80,7 @@ public class SqlWindowingPagingQueryProviderTests extends AbstractSqlPagingQuery
|
||||
@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 sql = "SELECT id FROM ( SELECT id, 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);
|
||||
}
|
||||
@@ -89,8 +89,28 @@ public class SqlWindowingPagingQueryProviderTests extends AbstractSqlPagingQuery
|
||||
@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 sql = "SELECT id FROM ( SELECT id, 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);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFirstPageSqlWithMultipleSortKeys() {
|
||||
return "SELECT * FROM ( SELECT id, name, age, ROW_NUMBER() OVER ( ORDER BY name ASC, id DESC) AS ROW_NUMBER FROM foo WHERE bar = 1) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER <= 100";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRemainingSqlWithMultipleSortKeys() {
|
||||
return "SELECT * FROM ( SELECT id, name, age, ROW_NUMBER() OVER ( ORDER BY name ASC, id DESC) AS ROW_NUMBER FROM foo WHERE bar = 1 AND ((name > ?) OR (name = ? AND id < ?))) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER <= 100";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getJumpToItemQueryWithMultipleSortKeys() {
|
||||
return "SELECT name, id FROM ( SELECT name, id, ROW_NUMBER() OVER ( ORDER BY name ASC, id DESC) AS ROW_NUMBER FROM foo WHERE bar = 1) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 100";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getJumpToItemQueryForFirstPageWithMultipleSortKeys() {
|
||||
return "SELECT name, id FROM ( SELECT name, id, ROW_NUMBER() OVER ( ORDER BY name ASC, id DESC) AS ROW_NUMBER FROM foo WHERE bar = 1) AS TMP_SUB WHERE TMP_SUB.ROW_NUMBER = 1";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,24 @@
|
||||
/*
|
||||
* Copyright 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.
|
||||
* 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;
|
||||
|
||||
import org.junit.Test;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* @author Thomas Risberg
|
||||
* @author Michael Minella
|
||||
@@ -23,21 +39,21 @@ public class SybasePagingQueryProviderTests extends AbstractSqlPagingQueryProvid
|
||||
|
||||
@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 sql = "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 AND ((id > ?)) ORDER BY id ASC";
|
||||
String s = pagingQueryProvider.generateRemainingPagesQuery(pageSize);
|
||||
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 sql = "SELECT id FROM ( SELECT id, 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);
|
||||
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 sql = "SELECT id FROM ( SELECT id, 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);
|
||||
assertEquals("", sql, s);
|
||||
}
|
||||
@@ -55,7 +71,7 @@ public class SybasePagingQueryProviderTests extends AbstractSqlPagingQueryProvid
|
||||
@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 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);
|
||||
}
|
||||
@@ -64,7 +80,7 @@ public class SybasePagingQueryProviderTests extends AbstractSqlPagingQueryProvid
|
||||
@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 sql = "SELECT id FROM ( SELECT id, 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);
|
||||
}
|
||||
@@ -73,8 +89,28 @@ public class SybasePagingQueryProviderTests extends AbstractSqlPagingQueryProvid
|
||||
@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 sql = "SELECT id FROM ( SELECT id, 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);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFirstPageSqlWithMultipleSortKeys() {
|
||||
return "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 ORDER BY name ASC, id DESC";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRemainingSqlWithMultipleSortKeys() {
|
||||
return "SELECT TOP 100 id, name, age FROM foo WHERE bar = 1 AND ((name > ?) OR (name = ? AND id < ?)) ORDER BY name ASC, id DESC";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getJumpToItemQueryWithMultipleSortKeys() {
|
||||
return "SELECT name, id FROM ( SELECT name, id, ROW_NUMBER() OVER ( ORDER BY name ASC, id DESC) AS ROW_NUMBER FROM foo WHERE bar = 1) WHERE ROW_NUMBER = 100";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getJumpToItemQueryForFirstPageWithMultipleSortKeys() {
|
||||
return "SELECT name, id FROM ( SELECT name, id, ROW_NUMBER() OVER ( ORDER BY name ASC, id DESC) AS ROW_NUMBER FROM foo WHERE bar = 1) WHERE ROW_NUMBER = 1";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,12 @@
|
||||
<bean class="org.springframework.batch.item.database.support.HsqlPagingQueryProvider">
|
||||
<property name="selectClause" value="select id, bar"/>
|
||||
<property name="fromClause" value="foo"/>
|
||||
<property name="sortKey" value="id"/>
|
||||
<property name="sortKeys">
|
||||
<map>
|
||||
<entry key="id" value="ASCENDING"/>
|
||||
<entry key="name" value="DESCENDING"/>
|
||||
</map>
|
||||
</property>
|
||||
</bean>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
@@ -16,7 +16,11 @@
|
||||
<property name="queryProvider">
|
||||
<bean class="org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean">
|
||||
<property name="dataSource" ref="dataSource" />
|
||||
<property name="sortKey" value="ID" />
|
||||
<property name="sortKeys">
|
||||
<map>
|
||||
<entry key="id" value="ASCENDING"/>
|
||||
</map>
|
||||
</property>
|
||||
<!-- Intentionally put sort key second in the query list as a test -->
|
||||
<property name="selectClause" value="select NAME, ID, CREDIT" />
|
||||
<property name="fromClause" value="FROM CUSTOMER" />
|
||||
|
||||
@@ -44,7 +44,11 @@
|
||||
<property name="dataSource" ref="dataSource"/>
|
||||
<property name="fromClause" value="CUSTOMER"/>
|
||||
<property name="selectClause" value="ID,NAME,CREDIT"/>
|
||||
<property name="sortKey" value="ID"/>
|
||||
<property name="sortKeys">
|
||||
<map>
|
||||
<entry key="ID" value="ASCENDING"/>
|
||||
</map>
|
||||
</property>
|
||||
<property name="whereClause" value="ID >= :minId and ID <= :maxId"/>
|
||||
</bean>
|
||||
</property>
|
||||
|
||||
Reference in New Issue
Block a user