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
122102public static boolean ALLOW_MISSING_KEY_4_COMBINE = true ;
123103
124104public static String DEFAULT_DATABASE = DATABASE_MYSQL ;
105+ public static String DEFAULT_NAMESPACE = "root" ;
125106public static String DEFAULT_SCHEMA = "sys" ;
126107public static String PREFIX_DISTINCT = "DISTINCT " ;
127108
@@ -225,6 +206,7 @@ public abstract class AbstractSQLConfig<T extends Object> implements SQLConfig<T
225206DATABASE_LIST .add (DATABASE_KAFKA );
226207DATABASE_LIST .add (DATABASE_MQ );
227208DATABASE_LIST .add (DATABASE_DUCKDB );
209+ DATABASE_LIST .add (DATABASE_SURREALDB );
228210
229211
230212RAW_MAP = new LinkedHashMap <>(); // 保证顺序,避免配置冲突等意外情况
@@ -300,7 +282,6 @@ public abstract class AbstractSQLConfig<T extends Object> implements SQLConfig<T
300282RAW_MAP .put ("POINT" , "" );
301283RAW_MAP .put ("BLOB" , "" );
302284RAW_MAP .put ("LONGBLOB" , "" );
303- RAW_MAP .put ("BINARY" , "" );
304285RAW_MAP .put ("UNSIGNED" , "" );
305286RAW_MAP .put ("BIT" , "" );
306287RAW_MAP .put ("TINYINT" , "" );
@@ -327,14 +308,12 @@ public abstract class AbstractSQLConfig<T extends Object> implements SQLConfig<T
327308RAW_MAP .put ("ASC" , "" );
328309RAW_MAP .put ("FOLLOWING" , "" ); // 往后
329310RAW_MAP .put ("BETWEEN" , "" );
330- RAW_MAP .put ("AND" , "" );
331311RAW_MAP .put ("ROWS" , "" );
332312
333313RAW_MAP .put ("AGAINST" , "" );
334314RAW_MAP .put ("IN NATURAL LANGUAGE MODE" , "" );
335315RAW_MAP .put ("IN BOOLEAN MODE" , "" );
336316RAW_MAP .put ("IN" , "" );
337- RAW_MAP .put ("BOOLEAN" , "" );
338317RAW_MAP .put ("NATURAL" , "" );
339318RAW_MAP .put ("LANGUAGE" , "" );
340319RAW_MAP .put ("MODE" , "" );
@@ -953,6 +932,7 @@ public String getUserIdKey() {
953932private String role ; //发送请求的用户的角色
954933private boolean distinct = false ;
955934private String database ; //表所在的数据库类型
935+ private String namespace ; //表所在的命名空间
956936private String schema ; //表所在的数据库名
957937private String datasource ; //数据源
958938private String table ; //表名
@@ -1341,9 +1321,17 @@ public static boolean isDuckDB(String db) {
13411321return 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
13451333public String getQuote () { // MongoDB 同时支持 `tbl` 反引号 和 "col" 双引号
1346- if (isElasticsearch () || isIoTDB ()) {
1334+ if (isElasticsearch () || isIoTDB () || isSurrealDB () ) {
13471335return "" ;
13481336}
13491337return isMySQL () || isMariaDB () || isTiDB () || isClickHouse () || isTDengine () || isMilvus () ? "`" : "\" " ;
@@ -1354,6 +1342,23 @@ public String quote(String s) {
13541342return 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
13581363public String getSchema () {
13591364return schema ;
@@ -1374,7 +1379,7 @@ public String getSQLSchema() {
13741379return SCHEMA_SYS ; //SQL Server 在 sys 中的属性比 information_schema 中的要全,能拿到注释
13751380}
13761381if (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 )) {
13781383return "" ; //Oracle, Dameng 的 all_tables, dba_tables 和 all_tab_columns, dba_columns 表好像不属于任何 Schema
13791384}
13801385
@@ -1384,6 +1389,7 @@ public String getSQLSchema() {
13841389}
13851390return sch == null ? DEFAULT_SCHEMA : sch ; // 最后代码默认兜底配置
13861391}
1392+
13871393@ Override
13881394public AbstractSQLConfig setSchema (String schema ) {
13891395if (schema != null ) {
@@ -2696,6 +2702,14 @@ public String getLimitString() {
26962702
26972703int offset = getOffset (getPage (), count );
26982704return " 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
27012715if (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 );
51205133String datasource = request .getString (KEY_DATASOURCE );
5134+ String namespace = request .getString (KEY_NAMESPACE );
5135+ String schema = request .getString (KEY_SCHEMA );
51215136
51225137SQLConfig <T > config = callback .getSQLConfig (method , database , schema , datasource , table );
51235138config .setAlias (alias );
51245139
51255140config .setDatabase (database ); // 不删,后面表对象还要用的,必须放在 parseJoin 前
5126- config .setSchema (schema ); // 不删,后面表对象还要用的
51275141config .setDatasource (datasource ); // 不删,后面表对象还要用的
5142+ config .setNamespace (namespace ); // 不删,后面表对象还要用的
5143+ config .setSchema (schema ); // 不删,后面表对象还要用的
51285144
51295145if (isProcedure ) {
51305146return config ;
@@ -5282,8 +5298,9 @@ else if (userId instanceof Subquery) {}
52825298request .remove (KEY_ROLE );
52835299request .remove (KEY_EXPLAIN );
52845300request .remove (KEY_CACHE );
5285- request .remove (KEY_DATASOURCE );
52865301request .remove (KEY_DATABASE );
5302+ request .remove (KEY_DATASOURCE );
5303+ request .remove (KEY_NAMESPACE );
52875304request .remove (KEY_SCHEMA );
52885305request .remove (KEY_FROM );
52895306request .remove (KEY_COLUMN );
0 commit comments