47
47
import apijson .orm .model .Table ;
48
48
import apijson .orm .model .TestRecord ;
49
49
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 .*;
70
51
import static apijson .RequestMethod .DELETE ;
71
52
import static apijson .RequestMethod .GET ;
72
53
import static apijson .RequestMethod .POST ;
73
54
import static apijson .RequestMethod .PUT ;
74
- import static apijson .JSONObject .KEY_METHOD ;
75
55
import static apijson .SQL .AND ;
76
56
import static apijson .SQL .NOT ;
77
57
import static apijson .SQL .ON ;
@@ -122,6 +102,7 @@ public abstract class AbstractSQLConfig<T extends Object> implements SQLConfig<T
122
102
public static boolean ALLOW_MISSING_KEY_4_COMBINE = true ;
123
103
124
104
public static String DEFAULT_DATABASE = DATABASE_MYSQL ;
105
+ public static String DEFAULT_NAMESPACE = "root" ;
125
106
public static String DEFAULT_SCHEMA = "sys" ;
126
107
public static String PREFIX_DISTINCT = "DISTINCT " ;
127
108
@@ -225,6 +206,7 @@ public abstract class AbstractSQLConfig<T extends Object> implements SQLConfig<T
225
206
DATABASE_LIST .add (DATABASE_KAFKA );
226
207
DATABASE_LIST .add (DATABASE_MQ );
227
208
DATABASE_LIST .add (DATABASE_DUCKDB );
209
+ DATABASE_LIST .add (DATABASE_SURREALDB );
228
210
229
211
230
212
RAW_MAP = new LinkedHashMap <>(); // 保证顺序,避免配置冲突等意外情况
@@ -300,7 +282,6 @@ public abstract class AbstractSQLConfig<T extends Object> implements SQLConfig<T
300
282
RAW_MAP .put ("POINT" , "" );
301
283
RAW_MAP .put ("BLOB" , "" );
302
284
RAW_MAP .put ("LONGBLOB" , "" );
303
- RAW_MAP .put ("BINARY" , "" );
304
285
RAW_MAP .put ("UNSIGNED" , "" );
305
286
RAW_MAP .put ("BIT" , "" );
306
287
RAW_MAP .put ("TINYINT" , "" );
@@ -327,14 +308,12 @@ public abstract class AbstractSQLConfig<T extends Object> implements SQLConfig<T
327
308
RAW_MAP .put ("ASC" , "" );
328
309
RAW_MAP .put ("FOLLOWING" , "" ); // 往后
329
310
RAW_MAP .put ("BETWEEN" , "" );
330
- RAW_MAP .put ("AND" , "" );
331
311
RAW_MAP .put ("ROWS" , "" );
332
312
333
313
RAW_MAP .put ("AGAINST" , "" );
334
314
RAW_MAP .put ("IN NATURAL LANGUAGE MODE" , "" );
335
315
RAW_MAP .put ("IN BOOLEAN MODE" , "" );
336
316
RAW_MAP .put ("IN" , "" );
337
- RAW_MAP .put ("BOOLEAN" , "" );
338
317
RAW_MAP .put ("NATURAL" , "" );
339
318
RAW_MAP .put ("LANGUAGE" , "" );
340
319
RAW_MAP .put ("MODE" , "" );
@@ -953,6 +932,7 @@ public String getUserIdKey() {
953
932
private String role ; //发送请求的用户的角色
954
933
private boolean distinct = false ;
955
934
private String database ; //表所在的数据库类型
935
+ private String namespace ; //表所在的命名空间
956
936
private String schema ; //表所在的数据库名
957
937
private String datasource ; //数据源
958
938
private String table ; //表名
@@ -1341,9 +1321,17 @@ public static boolean isDuckDB(String db) {
1341
1321
return DATABASE_DUCKDB .equals (db );
1342
1322
}
1343
1323
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
+
1344
1332
@ Override
1345
1333
public String getQuote () { // MongoDB 同时支持 `tbl` 反引号 和 "col" 双引号
1346
- if (isElasticsearch () || isIoTDB ()) {
1334
+ if (isElasticsearch () || isIoTDB () || isSurrealDB () ) {
1347
1335
return "" ;
1348
1336
}
1349
1337
return isMySQL () || isMariaDB () || isTiDB () || isClickHouse () || isTDengine () || isMilvus () ? "`" : "\" " ;
@@ -1354,6 +1342,23 @@ public String quote(String s) {
1354
1342
return q + s + q ;
1355
1343
}
1356
1344
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
+
1357
1362
@ Override
1358
1363
public String getSchema () {
1359
1364
return schema ;
@@ -1374,7 +1379,7 @@ public String getSQLSchema() {
1374
1379
return SCHEMA_SYS ; //SQL Server 在 sys 中的属性比 information_schema 中的要全,能拿到注释
1375
1380
}
1376
1381
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 )) {
1378
1383
return "" ; //Oracle, Dameng 的 all_tables, dba_tables 和 all_tab_columns, dba_columns 表好像不属于任何 Schema
1379
1384
}
1380
1385
@@ -1384,6 +1389,7 @@ public String getSQLSchema() {
1384
1389
}
1385
1390
return sch == null ? DEFAULT_SCHEMA : sch ; // 最后代码默认兜底配置
1386
1391
}
1392
+
1387
1393
@ Override
1388
1394
public AbstractSQLConfig setSchema (String schema ) {
1389
1395
if (schema != null ) {
@@ -2696,6 +2702,14 @@ public String getLimitString() {
2696
2702
2697
2703
int offset = getOffset (getPage (), count );
2698
2704
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 ;
2699
2713
}
2700
2714
2701
2715
if (count <= 0 || RequestMethod .isHeadMethod (getMethod (), true )) { // TODO HEAD 真的不需要 LIMIT ?
@@ -5116,15 +5130,17 @@ public static <T extends Object> SQLConfig<T> newSQLConfig(RequestMethod method,
5116
5130
+ StringUtil .getString (DATABASE_LIST .toArray ()) + "] 中的一种!" );
5117
5131
}
5118
5132
5119
- String schema = request .getString (KEY_SCHEMA );
5120
5133
String datasource = request .getString (KEY_DATASOURCE );
5134
+ String namespace = request .getString (KEY_NAMESPACE );
5135
+ String schema = request .getString (KEY_SCHEMA );
5121
5136
5122
5137
SQLConfig <T > config = callback .getSQLConfig (method , database , schema , datasource , table );
5123
5138
config .setAlias (alias );
5124
5139
5125
5140
config .setDatabase (database ); // 不删,后面表对象还要用的,必须放在 parseJoin 前
5126
- config .setSchema (schema ); // 不删,后面表对象还要用的
5127
5141
config .setDatasource (datasource ); // 不删,后面表对象还要用的
5142
+ config .setNamespace (namespace ); // 不删,后面表对象还要用的
5143
+ config .setSchema (schema ); // 不删,后面表对象还要用的
5128
5144
5129
5145
if (isProcedure ) {
5130
5146
return config ;
@@ -5282,8 +5298,9 @@ else if (userId instanceof Subquery) {}
5282
5298
request .remove (KEY_ROLE );
5283
5299
request .remove (KEY_EXPLAIN );
5284
5300
request .remove (KEY_CACHE );
5285
- request .remove (KEY_DATASOURCE );
5286
5301
request .remove (KEY_DATABASE );
5302
+ request .remove (KEY_DATASOURCE );
5303
+ request .remove (KEY_NAMESPACE );
5287
5304
request .remove (KEY_SCHEMA );
5288
5305
request .remove (KEY_FROM );
5289
5306
request .remove (KEY_COLUMN );
0 commit comments