diff --git a/src/main/java/org/redkale/source/AbstractDataSqlSource.java b/src/main/java/org/redkale/source/AbstractDataSqlSource.java index 4ad6e2a5d..aabb0d754 100644 --- a/src/main/java/org/redkale/source/AbstractDataSqlSource.java +++ b/src/main/java/org/redkale/source/AbstractDataSqlSource.java @@ -159,7 +159,7 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource readConfProps.getProperty(DATA_SOURCE_SLOWMS_ERROR, "3000").trim()); } - protected PageCountSql createPageCountSql( + protected PageCountSql filterPageCountSql( EntityInfo info, final boolean readCache, boolean needTotal, @@ -199,12 +199,18 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource listSubSql = "SELECT " + (distinct ? "DISTINCT " : "") + info.getQueryColumns("a", selects) + " FROM (" + (union) + ") a"; } + // pageSql pageSql = listSubSql + createOrderbySql(info, flipper); - if (mysqlOrPgsql) { - pageSql = createLimitSql(pageSql, flipper); - containsLimit = true; + if (Flipper.validLimit(flipper)) { + if (mysqlOrPgsql) { + pageSql += " LIMIT " + flipper.getLimit() + " OFFSET " + flipper.getOffset(); + containsLimit = true; + } else if ("oracle".equals(dbtype())) { + // to do + } } - if (mysqlOrPgsql && needTotal) { + // countSql + if (needTotal) { String countSubSql; if (tables.length == 1) { countSubSql = "SELECT " @@ -233,24 +239,6 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource return rs; } - /** - * 生成page sql - * - * @param listSql listSql - * @param flipper 翻页对象 - * @return String - */ - protected String createLimitSql(String listSql, Flipper flipper) { - if (flipper == null || flipper.getLimit() < 1) { - return listSql; - } - final boolean mysqlOrPgsql = "mysql".equals(dbtype()) || "postgresql".equals(dbtype()); - if (mysqlOrPgsql) { - return listSql + " LIMIT " + flipper.getLimit() + " OFFSET " + flipper.getOffset(); - } - throw new SourceException("Not support page sql: " + listSql); - } - /** * 根据Flipper获取ORDER BY的SQL语句,不存在Flipper或sort字段返回空字符串 * @@ -922,12 +910,13 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource return getSQLAttrValue(info, attr, val); } - protected DataNativeSqlStatement nativeParse(String nativeSql, boolean countable, Map params) { + protected DataNativeSqlStatement nativeParse( + String nativeSql, boolean countable, Flipper flipper, Map params) { if (nativeSqlParser == null) { throw new SourceException("not found " + DataNativeSqlParser.class.getSimpleName() + " instance"); } return nativeSqlParser.parse( - signFunc, dbtype(), nativeSql, countable, params == null ? Collections.emptyMap() : params); + signFunc, dbtype(), nativeSql, countable, flipper, params == null ? Collections.emptyMap() : params); } @ConvertDisabled diff --git a/src/main/java/org/redkale/source/DataJdbcSource.java b/src/main/java/org/redkale/source/DataJdbcSource.java index ade528568..ef0b2de6a 100644 --- a/src/main/java/org/redkale/source/DataJdbcSource.java +++ b/src/main/java/org/redkale/source/DataJdbcSource.java @@ -2390,7 +2390,7 @@ public class DataJdbcSource extends AbstractDataSqlSource { try { conn = readPool.pollConnection(); conn.setAutoCommit(true); - PageCountSql sqls = createPageCountSql(info, readCache, needTotal, distinct, sels, tables, flipper, node); + PageCountSql sqls = filterPageCountSql(info, readCache, needTotal, distinct, sels, tables, flipper, node); try { return executeQuerySheet(info, needTotal, flipper, sels, s, conn, sqls); } catch (SQLException se) { @@ -2429,7 +2429,7 @@ public class DataJdbcSource extends AbstractDataSqlSource { } // 重新查询一次 - sqls = createPageCountSql(info, readCache, needTotal, distinct, sels, tables, flipper, node); + sqls = filterPageCountSql(info, readCache, needTotal, distinct, sels, tables, flipper, node); return executeQuerySheet(info, needTotal, flipper, sels, s, conn, sqls); } else { throw new SourceException(se); @@ -2494,7 +2494,7 @@ public class DataJdbcSource extends AbstractDataSqlSource { if (flipper != null && flipper.getOffset() > 0) { set.absolute(flipper.getOffset()); } - final int limit = flipper == null || flipper.getLimit() < 1 ? Integer.MAX_VALUE : flipper.getLimit(); + final int limit = Flipper.validLimit(flipper) ? flipper.getLimit() : Integer.MAX_VALUE; int i = 0; final DataResultSet rr = createDataResultSet(info, set); EntityBuilder builder = info.getBuilder(); @@ -2626,7 +2626,7 @@ public class DataJdbcSource extends AbstractDataSqlSource { @Local @Override public int nativeUpdate(String sql, Map params) { - DataNativeSqlStatement sinfo = super.nativeParse(sql, false, params); + DataNativeSqlStatement sinfo = super.nativeParse(sql, false, null, params); final long s = System.currentTimeMillis(); JdbcConnection conn = writePool.pollConnection(); Statement stmt = null; @@ -2703,7 +2703,7 @@ public class DataJdbcSource extends AbstractDataSqlSource { BiConsumer consumer, Function handler, Map params) { - DataNativeSqlStatement sinfo = super.nativeParse(sql, false, params); + DataNativeSqlStatement sinfo = super.nativeParse(sql, false, null, params); final long s = System.currentTimeMillis(); final JdbcConnection conn = readPool.pollConnection(); try { @@ -2746,7 +2746,7 @@ public class DataJdbcSource extends AbstractDataSqlSource { } public Sheet nativeQuerySheet(Class type, String sql, Flipper flipper, Map params) { - DataNativeSqlStatement sinfo = super.nativeParse(sql, true, params); + DataNativeSqlStatement sinfo = super.nativeParse(sql, true, flipper, params); final long s = System.currentTimeMillis(); final JdbcConnection conn = readPool.pollConnection(); try { @@ -2781,7 +2781,7 @@ public class DataJdbcSource extends AbstractDataSqlSource { } slowLog(s, countSql); if (total > 0) { - String pageSql = createLimitSql(sinfo.getNativePageSql(), flipper); + String pageSql = sinfo.getNativePageSql(); if (sinfo.isEmptyNamed()) { Statement stmt = conn.createQueryStatement(); ResultSet set = stmt.executeQuery(pageSql); diff --git a/src/main/java/org/redkale/source/DataNativeSqlParser.java b/src/main/java/org/redkale/source/DataNativeSqlParser.java index 98e7acdaf..e7e4f2c48 100644 --- a/src/main/java/org/redkale/source/DataNativeSqlParser.java +++ b/src/main/java/org/redkale/source/DataNativeSqlParser.java @@ -24,7 +24,12 @@ public interface DataNativeSqlParser { public DataNativeSqlInfo parse(IntFunction signFunc, String dbType, String rawSql); public DataNativeSqlStatement parse( - IntFunction signFunc, String dbType, String rawSql, boolean countable, Map params); + IntFunction signFunc, + String dbType, + String rawSql, + boolean countable, + Flipper flipper, + Map params); public static DataNativeSqlParser loadFirst() { if (DataNativeSqlStatement._first_parser != DataNativeSqlStatement.PARSER_NIL) { diff --git a/src/main/java/org/redkale/source/DataNativeSqlStatement.java b/src/main/java/org/redkale/source/DataNativeSqlStatement.java index c61d7c684..25a833a26 100644 --- a/src/main/java/org/redkale/source/DataNativeSqlStatement.java +++ b/src/main/java/org/redkale/source/DataNativeSqlStatement.java @@ -32,6 +32,7 @@ public class DataNativeSqlStatement { String dbType, String rawSql, boolean countable, + Flipper flipper, Map params) { throw new UnsupportedOperationException("No available instances found"); } diff --git a/src/main/java/org/redkale/source/Flipper.java b/src/main/java/org/redkale/source/Flipper.java index c5859cfec..f8e1b9eb9 100644 --- a/src/main/java/org/redkale/source/Flipper.java +++ b/src/main/java/org/redkale/source/Flipper.java @@ -191,6 +191,13 @@ public final class Flipper implements Serializable, Cloneable { return this; } + public Flipper sortIfAbsent(String sort) { + if (this.sort == null || this.sort.isEmpty()) { + this.sort = sort; + } + return this; + } + public static Flipper sortIfAbsent(Flipper flipper, String sort) { if (flipper != null) { return flipper.sortIfAbsent(sort); @@ -198,10 +205,7 @@ public final class Flipper implements Serializable, Cloneable { return flipper; } - public Flipper sortIfAbsent(String sort) { - if (this.sort == null || this.sort.isEmpty()) { - this.sort = sort; - } - return this; + public static boolean validLimit(Flipper flipper) { + return flipper != null && flipper.getLimit() > 0; } }