diff --git a/platforms/db2/src/main/java/io/ebean/platform/db2/DB2Luw9Platform.java b/platforms/db2/src/main/java/io/ebean/platform/db2/DB2Luw9Platform.java new file mode 100644 index 000000000..a7d06d15a --- /dev/null +++ b/platforms/db2/src/main/java/io/ebean/platform/db2/DB2Luw9Platform.java @@ -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(); + } +} diff --git a/platforms/db2/src/main/java/io/ebean/platform/db2/DB2RowNumberBasicLimiter.java b/platforms/db2/src/main/java/io/ebean/platform/db2/DB2RowNumberBasicLimiter.java new file mode 100644 index 000000000..5834b0a54 --- /dev/null +++ b/platforms/db2/src/main/java/io/ebean/platform/db2/DB2RowNumberBasicLimiter.java @@ -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(); + } +} diff --git a/platforms/db2/src/main/java/io/ebean/platform/db2/DB2RowNumberSqlLimiter.java b/platforms/db2/src/main/java/io/ebean/platform/db2/DB2RowNumberSqlLimiter.java new file mode 100644 index 000000000..e5d249df9 --- /dev/null +++ b/platforms/db2/src/main/java/io/ebean/platform/db2/DB2RowNumberSqlLimiter.java @@ -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); + } + +} diff --git a/platforms/db2/src/main/java/io/ebean/platform/db2/Db2PlatformProvider.java b/platforms/db2/src/main/java/io/ebean/platform/db2/Db2PlatformProvider.java index aade711c5..988104dfa 100644 --- a/platforms/db2/src/main/java/io/ebean/platform/db2/Db2PlatformProvider.java +++ b/platforms/db2/src/main/java/io/ebean/platform/db2/Db2PlatformProvider.java @@ -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); }