nativePageSql

This commit is contained in:
redkale
2024-06-06 14:55:12 +08:00
parent 071f1f35b7
commit a358e5bf01
5 changed files with 37 additions and 38 deletions

View File

@@ -159,7 +159,7 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource
readConfProps.getProperty(DATA_SOURCE_SLOWMS_ERROR, "3000").trim());
}
protected <T> PageCountSql createPageCountSql(
protected <T> PageCountSql filterPageCountSql(
EntityInfo<T> 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<String, Object> params) {
protected DataNativeSqlStatement nativeParse(
String nativeSql, boolean countable, Flipper flipper, Map<String, Object> 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

View File

@@ -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<T> builder = info.getBuilder();
@@ -2626,7 +2626,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
@Local
@Override
public int nativeUpdate(String sql, Map<String, Object> 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<Object, Object> consumer,
Function<DataResultSet, V> handler,
Map<String, Object> 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 <V> Sheet<V> nativeQuerySheet(Class<V> type, String sql, Flipper flipper, Map<String, Object> 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);

View File

@@ -24,7 +24,12 @@ public interface DataNativeSqlParser {
public DataNativeSqlInfo parse(IntFunction<String> signFunc, String dbType, String rawSql);
public DataNativeSqlStatement parse(
IntFunction<String> signFunc, String dbType, String rawSql, boolean countable, Map<String, Object> params);
IntFunction<String> signFunc,
String dbType,
String rawSql,
boolean countable,
Flipper flipper,
Map<String, Object> params);
public static DataNativeSqlParser loadFirst() {
if (DataNativeSqlStatement._first_parser != DataNativeSqlStatement.PARSER_NIL) {

View File

@@ -32,6 +32,7 @@ public class DataNativeSqlStatement {
String dbType,
String rawSql,
boolean countable,
Flipper flipper,
Map<String, Object> params) {
throw new UnsupportedOperationException("No available instances found");
}

View File

@@ -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;
}
}