Integrate SAP Hana as supported Spring Batch database
This commit adds SAP HANA as a supported Spring Batch database, enabling developers to seamlessly move their existing Spring Batch projects to SAP HANA or easily starting new Spring Batch projects on SAP HANA. This commit contains the following changes: - Add SAP HANA to the DatabaseType enum - Add HanaPagingQueryProvider and tests - Add properties files for SAP HANA Issue #2515
This commit is contained in:
committed by
Mahmoud Ben Hassine
parent
44dd4f7f56
commit
9388abb589
@@ -25,6 +25,7 @@ import org.springframework.batch.item.database.support.AbstractSqlPagingQueryPro
|
||||
import org.springframework.batch.item.database.support.Db2PagingQueryProvider;
|
||||
import org.springframework.batch.item.database.support.DerbyPagingQueryProvider;
|
||||
import org.springframework.batch.item.database.support.H2PagingQueryProvider;
|
||||
import org.springframework.batch.item.database.support.HanaPagingQueryProvider;
|
||||
import org.springframework.batch.item.database.support.HsqlPagingQueryProvider;
|
||||
import org.springframework.batch.item.database.support.MySqlPagingQueryProvider;
|
||||
import org.springframework.batch.item.database.support.OraclePagingQueryProvider;
|
||||
@@ -359,6 +360,7 @@ public class JdbcPagingItemReaderBuilder<T> {
|
||||
case DB2ZOS:
|
||||
case DB2AS400: provider = new Db2PagingQueryProvider(); break;
|
||||
case H2: provider = new H2PagingQueryProvider(); break;
|
||||
case HANA: provider = new HanaPagingQueryProvider(); break;
|
||||
case HSQL: provider = new HsqlPagingQueryProvider(); break;
|
||||
case SQLSERVER: provider = new SqlServerPagingQueryProvider(); break;
|
||||
case MYSQL: provider = new MySqlPagingQueryProvider(); break;
|
||||
|
||||
@@ -25,6 +25,7 @@ import org.springframework.jdbc.support.incrementer.Db2MainframeMaxValueIncremen
|
||||
import org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer;
|
||||
import org.springframework.jdbc.support.incrementer.DerbyMaxValueIncrementer;
|
||||
import org.springframework.jdbc.support.incrementer.H2SequenceMaxValueIncrementer;
|
||||
import org.springframework.jdbc.support.incrementer.HanaSequenceMaxValueIncrementer;
|
||||
import org.springframework.jdbc.support.incrementer.HsqlMaxValueIncrementer;
|
||||
import org.springframework.jdbc.support.incrementer.MySQLMaxValueIncrementer;
|
||||
import org.springframework.jdbc.support.incrementer.OracleSequenceMaxValueIncrementer;
|
||||
@@ -37,6 +38,7 @@ import static org.springframework.batch.support.DatabaseType.DB2AS400;
|
||||
import static org.springframework.batch.support.DatabaseType.DB2ZOS;
|
||||
import static org.springframework.batch.support.DatabaseType.DERBY;
|
||||
import static org.springframework.batch.support.DatabaseType.H2;
|
||||
import static org.springframework.batch.support.DatabaseType.HANA;
|
||||
import static org.springframework.batch.support.DatabaseType.HSQL;
|
||||
import static org.springframework.batch.support.DatabaseType.MYSQL;
|
||||
import static org.springframework.batch.support.DatabaseType.ORACLE;
|
||||
@@ -99,6 +101,9 @@ public class DefaultDataFieldMaxValueIncrementerFactory implements DataFieldMaxV
|
||||
else if (databaseType == H2) {
|
||||
return new H2SequenceMaxValueIncrementer(dataSource, incrementerName);
|
||||
}
|
||||
else if (databaseType == HANA) {
|
||||
return new HanaSequenceMaxValueIncrementer(dataSource, incrementerName);
|
||||
}
|
||||
else if (databaseType == MYSQL) {
|
||||
MySQLMaxValueIncrementer mySQLMaxValueIncrementer = new MySQLMaxValueIncrementer(dataSource, incrementerName, incrementerColumnName);
|
||||
mySQLMaxValueIncrementer.setUseNewConnection(true);
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Copyright 2006-2018 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.springframework.batch.item.database.PagingQueryProvider;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* SAP HANA implementation of a {@link PagingQueryProvider} using database specific features.
|
||||
*
|
||||
* @author Jonathan Bregler
|
||||
* @since 4.0
|
||||
*/
|
||||
public class HanaPagingQueryProvider extends AbstractSqlPagingQueryProvider {
|
||||
|
||||
@Override
|
||||
public String generateFirstPageQuery(int pageSize) {
|
||||
return SqlPagingQueryUtils.generateLimitSqlQuery(this, false, buildLimitClause(pageSize));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String generateRemainingPagesQuery(int pageSize) {
|
||||
if(StringUtils.hasText(getGroupClause())) {
|
||||
return SqlPagingQueryUtils.generateLimitGroupedSqlQuery(this, true, buildLimitClause(pageSize));
|
||||
}
|
||||
else {
|
||||
return SqlPagingQueryUtils.generateLimitSqlQuery(this, true, buildLimitClause(pageSize));
|
||||
}
|
||||
}
|
||||
|
||||
private String buildLimitClause(int pageSize) {
|
||||
return new StringBuilder().append("LIMIT ").append(pageSize).toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String generateJumpToItemQuery(int itemIndex, int pageSize) {
|
||||
int page = itemIndex / pageSize;
|
||||
int offset = (page * pageSize) - 1;
|
||||
offset = offset<0 ? 0 : offset;
|
||||
String limitClause = new StringBuilder().append("LIMIT 1 OFFSET ").append(offset).toString();
|
||||
return SqlPagingQueryUtils.generateLimitJumpToQuery(this, limitClause);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2006-2012 the original author or authors.
|
||||
* Copyright 2006-2018 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.
|
||||
@@ -21,6 +21,7 @@ import static org.springframework.batch.support.DatabaseType.DB2ZOS;
|
||||
import static org.springframework.batch.support.DatabaseType.DB2AS400;
|
||||
import static org.springframework.batch.support.DatabaseType.DERBY;
|
||||
import static org.springframework.batch.support.DatabaseType.H2;
|
||||
import static org.springframework.batch.support.DatabaseType.HANA;
|
||||
import static org.springframework.batch.support.DatabaseType.HSQL;
|
||||
import static org.springframework.batch.support.DatabaseType.MYSQL;
|
||||
import static org.springframework.batch.support.DatabaseType.ORACLE;
|
||||
@@ -78,6 +79,7 @@ public class SqlPagingQueryProviderFactoryBean implements FactoryBean<PagingQuer
|
||||
providers.put(DERBY,new DerbyPagingQueryProvider());
|
||||
providers.put(HSQL,new HsqlPagingQueryProvider());
|
||||
providers.put(H2,new H2PagingQueryProvider());
|
||||
providers.put(HANA,new HanaPagingQueryProvider());
|
||||
providers.put(MYSQL,new MySqlPagingQueryProvider());
|
||||
providers.put(ORACLE,new OraclePagingQueryProvider());
|
||||
providers.put(POSTGRES,new PostgresPagingQueryProvider());
|
||||
|
||||
@@ -48,7 +48,8 @@ public enum DatabaseType {
|
||||
POSTGRES("PostgreSQL"),
|
||||
SYBASE("Sybase"),
|
||||
H2("H2"),
|
||||
SQLITE("SQLite");
|
||||
SQLITE("SQLite"),
|
||||
HANA("HDB");
|
||||
|
||||
private static final Map<String, DatabaseType> nameMap;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user