Initial DB2Luw9Platform using row_number() for row limiting sql

This commit is contained in:
Rob Bygrave
2023-03-30 22:56:55 +13:00
parent 4a372a5dc8
commit 1807fc201e
4 changed files with 87 additions and 0 deletions
@@ -0,0 +1,15 @@
package io.ebean.platform.db2;
import io.ebean.annotation.Platform;
/**
* DB2 platform for Linux/Unix/Windows version 9.x.
*/
public class DB2Luw9Platform extends BaseDB2Platform {
public DB2Luw9Platform() {
super();
this.platform = Platform.DB2LUW; // TODO: Add a DB2LUW9
this.basicSqlLimiter = new DB2RowNumberBasicLimiter();
this.sqlLimiter = new DB2RowNumberSqlLimiter();
}
}
@@ -0,0 +1,31 @@
package io.ebean.platform.db2;
import io.ebean.config.dbplatform.BasicSqlLimiter;
/**
* Row limiter for Oracle 9,10,11 using rownum.
*/
final class DB2RowNumberBasicLimiter implements BasicSqlLimiter {
@Override
public String limit(String dbSql, int firstRow, int maxRows) {
if (firstRow < 1 && maxRows < 1) {
return dbSql;
}
StringBuilder sb = new StringBuilder(60 + dbSql.length());
int lastRow = maxRows;
if (lastRow > 0) {
lastRow += firstRow;
}
sb.append("select * from (select row_number() over() rn, a.* from (");
sb.append(dbSql).append(") a ");
if (lastRow > 0) {
sb.append(" where rn <= ").append(lastRow);
}
sb.append(") ");
if (firstRow > 0) {
sb.append(" where rn_ > ").append(firstRow);
}
return sb.toString();
}
}
@@ -0,0 +1,38 @@
package io.ebean.platform.db2;
import io.ebean.config.dbplatform.SqlLimitRequest;
import io.ebean.config.dbplatform.SqlLimitResponse;
import io.ebean.config.dbplatform.SqlLimiter;
final class DB2RowNumberSqlLimiter implements SqlLimiter {
@Override
public SqlLimitResponse limit(SqlLimitRequest request) {
String dbSql = request.getDbSql();
StringBuilder sb = new StringBuilder(60 + dbSql.length());
int firstRow = request.getFirstRow();
int lastRow = request.getMaxRows();
if (lastRow > 0) {
lastRow += firstRow;
}
sb.append("select * from (select row_number() over() rn, a.* from (select ");
if (request.isDistinct()) {
sb.append("distinct ");
}
sb.append(dbSql).append(") a ");
if (lastRow > 0) {
sb.append(" where rn <= ").append(lastRow);
}
sb.append(") ");
if (firstRow > 0) {
sb.append(" where rn > ").append(firstRow);
}
String sql = request.getDbPlatform().completeSql(sb.toString(), request.getOrmQuery());
return new SqlLimitResponse(sql);
}
}
@@ -39,6 +39,9 @@ public class Db2PlatformProvider implements DatabasePlatformProvider {
if (name.equals("db2luw")) {
return new DB2LuwPlatform();
}
if (name.equals("db2luw9")) {
return new DB2Luw9Platform();
}
throw new IllegalArgumentException("Unknown DB2 platform, expecting db2luw/db2zos/db2fori but got "+ name);
}