4747import apijson .orm .model .Table ;
4848import apijson .orm .model .TestRecord ;
4949
50- import static apijson .JSONObject .KEY_CACHE ;
51- import static apijson .JSONObject .KEY_CAST ;
52- import static apijson .JSONObject .KEY_COLUMN ;
53- import static apijson .JSONObject .KEY_COMBINE ;
54- import static apijson .JSONObject .KEY_DATABASE ;
55- import static apijson .JSONObject .KEY_DATASOURCE ;
56- import static apijson .JSONObject .KEY_EXPLAIN ;
57- import static apijson .JSONObject .KEY_FROM ;
58- import static apijson .JSONObject .KEY_GROUP ;
59- import static apijson .JSONObject .KEY_HAVING ;
60- import static apijson .JSONObject .KEY_HAVING_AND ;
61- import static apijson .JSONObject .KEY_ID ;
62- import static apijson .JSONObject .KEY_JSON ;
63- import static apijson .JSONObject .KEY_NULL ;
64- import static apijson .JSONObject .KEY_ORDER ;
65- import static apijson .JSONObject .KEY_KEY ;
66- import static apijson .JSONObject .KEY_RAW ;
67- import static apijson .JSONObject .KEY_ROLE ;
68- import static apijson .JSONObject .KEY_SCHEMA ;
69- import static apijson .JSONObject .KEY_USER_ID ;
50+ import static apijson .JSONObject .*;
7051import static apijson .RequestMethod .DELETE ;
7152import static apijson .RequestMethod .GET ;
7253import static apijson .RequestMethod .POST ;
7354import static apijson .RequestMethod .PUT ;
74- import static apijson .JSONObject .KEY_METHOD ;
7555import static apijson .SQL .AND ;
7656import static apijson .SQL .NOT ;
7757import static apijson .SQL .ON ;
@@ -122,6 +102,7 @@ public abstract class AbstractSQLConfig<T extends Object> implements SQLConfig<T
122102 public static boolean ALLOW_MISSING_KEY_4_COMBINE = true ;
123103
124104 public static String DEFAULT_DATABASE = DATABASE_MYSQL ;
105+ public static String DEFAULT_NAMESPACE = "root" ;
125106 public static String DEFAULT_SCHEMA = "sys" ;
126107 public static String PREFIX_DISTINCT = "DISTINCT " ;
127108
@@ -225,6 +206,7 @@ public abstract class AbstractSQLConfig<T extends Object> implements SQLConfig<T
225206 DATABASE_LIST .add (DATABASE_KAFKA );
226207 DATABASE_LIST .add (DATABASE_MQ );
227208 DATABASE_LIST .add (DATABASE_DUCKDB );
209+ DATABASE_LIST .add (DATABASE_SURREALDB );
228210
229211
230212 RAW_MAP = new LinkedHashMap <>(); // 保证顺序,避免配置冲突等意外情况
@@ -300,7 +282,6 @@ public abstract class AbstractSQLConfig<T extends Object> implements SQLConfig<T
300282 RAW_MAP .put ("POINT" , "" );
301283 RAW_MAP .put ("BLOB" , "" );
302284 RAW_MAP .put ("LONGBLOB" , "" );
303- RAW_MAP .put ("BINARY" , "" );
304285 RAW_MAP .put ("UNSIGNED" , "" );
305286 RAW_MAP .put ("BIT" , "" );
306287 RAW_MAP .put ("TINYINT" , "" );
@@ -327,14 +308,12 @@ public abstract class AbstractSQLConfig<T extends Object> implements SQLConfig<T
327308 RAW_MAP .put ("ASC" , "" );
328309 RAW_MAP .put ("FOLLOWING" , "" ); // 往后
329310 RAW_MAP .put ("BETWEEN" , "" );
330- RAW_MAP .put ("AND" , "" );
331311 RAW_MAP .put ("ROWS" , "" );
332312
333313 RAW_MAP .put ("AGAINST" , "" );
334314 RAW_MAP .put ("IN NATURAL LANGUAGE MODE" , "" );
335315 RAW_MAP .put ("IN BOOLEAN MODE" , "" );
336316 RAW_MAP .put ("IN" , "" );
337- RAW_MAP .put ("BOOLEAN" , "" );
338317 RAW_MAP .put ("NATURAL" , "" );
339318 RAW_MAP .put ("LANGUAGE" , "" );
340319 RAW_MAP .put ("MODE" , "" );
@@ -953,6 +932,7 @@ public String getUserIdKey() {
953932 private String role ; //发送请求的用户的角色
954933 private boolean distinct = false ;
955934 private String database ; //表所在的数据库类型
935+ private String namespace ; //表所在的命名空间
956936 private String schema ; //表所在的数据库名
957937 private String datasource ; //数据源
958938 private String table ; //表名
@@ -1341,9 +1321,17 @@ public static boolean isDuckDB(String db) {
13411321 return DATABASE_DUCKDB .equals (db );
13421322 }
13431323
1324+ @ Override
1325+ public boolean isSurrealDB () {
1326+ return isSurrealDB (getSQLDatabase ());
1327+ }
1328+ public static boolean isSurrealDB (String db ) {
1329+ return DATABASE_SURREALDB .equals (db );
1330+ }
1331+
13441332 @ Override
13451333 public String getQuote () { // MongoDB 同时支持 `tbl` 反引号 和 "col" 双引号
1346- if (isElasticsearch () || isIoTDB ()) {
1334+ if (isElasticsearch () || isIoTDB () || isSurrealDB () ) {
13471335 return "" ;
13481336 }
13491337 return isMySQL () || isMariaDB () || isTiDB () || isClickHouse () || isTDengine () || isMilvus () ? "`" : "\" " ;
@@ -1354,6 +1342,23 @@ public String quote(String s) {
13541342 return q + s + q ;
13551343 }
13561344
1345+ @ Override
1346+ public String getNamespace () {
1347+ return namespace ;
1348+ }
1349+
1350+ @ Override
1351+ public String getSQLNamespace () {
1352+ String sch = getNamespace (); // 前端传参 @namespace 优先
1353+ return sch == null ? DEFAULT_NAMESPACE : sch ; // 最后代码默认兜底配置
1354+ }
1355+
1356+ @ Override
1357+ public AbstractSQLConfig <T > setNamespace (String namespace ) {
1358+ this .namespace = namespace ;
1359+ return this ;
1360+ }
1361+
13571362 @ Override
13581363 public String getSchema () {
13591364 return schema ;
@@ -1374,7 +1379,7 @@ public String getSQLSchema() {
13741379 return SCHEMA_SYS ; //SQL Server 在 sys 中的属性比 information_schema 中的要全,能拿到注释
13751380 }
13761381 if (AllTable .TAG .equals (table ) || AllColumn .TAG .equals (table )
1377- || AllTableComment .TAG .equals (table ) || AllTableComment .TAG .equals (table )) {
1382+ || AllTableComment .TAG .equals (table ) || AllColumnComment .TAG .equals (table )) {
13781383 return "" ; //Oracle, Dameng 的 all_tables, dba_tables 和 all_tab_columns, dba_columns 表好像不属于任何 Schema
13791384 }
13801385
@@ -1384,6 +1389,7 @@ public String getSQLSchema() {
13841389 }
13851390 return sch == null ? DEFAULT_SCHEMA : sch ; // 最后代码默认兜底配置
13861391 }
1392+
13871393 @ Override
13881394 public AbstractSQLConfig setSchema (String schema ) {
13891395 if (schema != null ) {
@@ -2696,6 +2702,14 @@ public String getLimitString() {
26962702
26972703 int offset = getOffset (getPage (), count );
26982704 return " LIMIT " + offset + ", " + count ; // 目前 moql-transx 的限制
2705+ } else if (isSurrealDB ()) {
2706+ if (count == 0 ) {
2707+ Parser <T > parser = getParser ();
2708+ count = parser == null ? AbstractParser .MAX_QUERY_COUNT : parser .getMaxQueryCount ();
2709+ }
2710+
2711+ int offset = getOffset (getPage (), count );
2712+ return " START " + offset + " LIMIT " + count ;
26992713 }
27002714
27012715 if (count <= 0 || RequestMethod .isHeadMethod (getMethod (), true )) { // TODO HEAD 真的不需要 LIMIT ?
@@ -5116,15 +5130,17 @@ public static <T extends Object> SQLConfig<T> newSQLConfig(RequestMethod method,
51165130 + StringUtil .getString (DATABASE_LIST .toArray ()) + "] 中的一种!" );
51175131 }
51185132
5119- String schema = request .getString (KEY_SCHEMA );
51205133 String datasource = request .getString (KEY_DATASOURCE );
5134+ String namespace = request .getString (KEY_NAMESPACE );
5135+ String schema = request .getString (KEY_SCHEMA );
51215136
51225137 SQLConfig <T > config = callback .getSQLConfig (method , database , schema , datasource , table );
51235138 config .setAlias (alias );
51245139
51255140 config .setDatabase (database ); // 不删,后面表对象还要用的,必须放在 parseJoin 前
5126- config .setSchema (schema ); // 不删,后面表对象还要用的
51275141 config .setDatasource (datasource ); // 不删,后面表对象还要用的
5142+ config .setNamespace (namespace ); // 不删,后面表对象还要用的
5143+ config .setSchema (schema ); // 不删,后面表对象还要用的
51285144
51295145 if (isProcedure ) {
51305146 return config ;
@@ -5282,8 +5298,9 @@ else if (userId instanceof Subquery) {}
52825298 request .remove (KEY_ROLE );
52835299 request .remove (KEY_EXPLAIN );
52845300 request .remove (KEY_CACHE );
5285- request .remove (KEY_DATASOURCE );
52865301 request .remove (KEY_DATABASE );
5302+ request .remove (KEY_DATASOURCE );
5303+ request .remove (KEY_NAMESPACE );
52875304 request .remove (KEY_SCHEMA );
52885305 request .remove (KEY_FROM );
52895306 request .remove (KEY_COLUMN );
0 commit comments