Skip to content

Commit 5b2c1ed

Browse files
committed
新增支持 SurrealDB-关系、时序、图、键值、搜索、文档 等多模型数据库
https://github.com/APIJSON/apijson-surrealdb
1 parent 3461521 commit 5b2c1ed

File tree

5 files changed

+72
-40
lines changed

5 files changed

+72
-40
lines changed

APIJSONORM/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
<groupId>com.github.Tencent</groupId>
77
<artifactId>APIJSON</artifactId>
8-
<version>7.3.0</version>
8+
<version>7.4.0</version>
99
<packaging>jar</packaging>
1010

1111
<name>APIJSONORM</name>

APIJSONORM/src/main/java/apijson/JSONObject.java

+18-9
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,9 @@ public JSONObject setUserIdIn(List<Object> list) {
139139

140140
public static final String KEY_ROLE = "@role"; //角色,拥有对某些数据的某些操作的权限
141141
public static final String KEY_DATABASE = "@database"; //数据库类型,默认为MySQL
142-
public static final String KEY_SCHEMA = "@schema"; //数据库,Table在非默认schema内时需要声明
143142
public static final String KEY_DATASOURCE = "@datasource"; //数据源
143+
public static final String KEY_NAMESPACE = "@namespace"; //命名空间,Table在非默认namespace内时需要声明
144+
public static final String KEY_SCHEMA = "@schema"; //数据库,Table在非默认schema内时需要声明
144145
public static final String KEY_EXPLAIN = "@explain"; //分析 true/false
145146
public static final String KEY_CACHE = "@cache"; //缓存 RAM/ROM/ALL
146147
public static final String KEY_COLUMN = "@column"; //查询的Table字段或SQL函数
@@ -169,8 +170,9 @@ public JSONObject setUserIdIn(List<Object> list) {
169170
TABLE_KEY_LIST = new ArrayList<String>();
170171
TABLE_KEY_LIST.add(KEY_ROLE);
171172
TABLE_KEY_LIST.add(KEY_DATABASE);
172-
TABLE_KEY_LIST.add(KEY_SCHEMA);
173173
TABLE_KEY_LIST.add(KEY_DATASOURCE);
174+
TABLE_KEY_LIST.add(KEY_NAMESPACE);
175+
TABLE_KEY_LIST.add(KEY_SCHEMA);
174176
TABLE_KEY_LIST.add(KEY_EXPLAIN);
175177
TABLE_KEY_LIST.add(KEY_CACHE);
176178
TABLE_KEY_LIST.add(KEY_COLUMN);
@@ -253,20 +255,27 @@ public JSONObject setRole(String role) {
253255
public JSONObject setDatabase(String database) {
254256
return puts(KEY_DATABASE, database);
255257
}
256-
/**set schema where table was puts
257-
* @param schema
258-
* @return this
259-
*/
260-
public JSONObject setSchema(String schema) {
261-
return puts(KEY_SCHEMA, schema);
262-
}
263258
/**set datasource where table was puts
264259
* @param datasource
265260
* @return this
266261
*/
267262
public JSONObject setDatasource(String datasource) {
268263
return puts(KEY_DATASOURCE, datasource);
269264
}
265+
/**set namespace where table was puts
266+
* @param namespace
267+
* @return this
268+
*/
269+
public JSONObject setNamespace(String namespace) {
270+
return puts(KEY_NAMESPACE, namespace);
271+
}
272+
/**set schema where table was puts
273+
* @param schema
274+
* @return this
275+
*/
276+
public JSONObject setSchema(String schema) {
277+
return puts(KEY_SCHEMA, schema);
278+
}
270279
/**set if return explain informations
271280
* @param explain
272281
* @return

APIJSONORM/src/main/java/apijson/Log.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class Log {
1414

1515
public static boolean DEBUG = true;
1616

17-
public static final String VERSION = "7.3.0";
17+
public static final String VERSION = "7.4.0";
1818
public static final String KEY_SYSTEM_INFO_DIVIDER = "\n---|-----APIJSON SYSTEM INFO-----|---\n";
1919

2020
public static final String OS_NAME;

APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java

+46-29
Original file line numberDiff line numberDiff line change
@@ -47,31 +47,11 @@
4747
import apijson.orm.model.Table;
4848
import 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.*;
7051
import static apijson.RequestMethod.DELETE;
7152
import static apijson.RequestMethod.GET;
7253
import static apijson.RequestMethod.POST;
7354
import static apijson.RequestMethod.PUT;
74-
import static apijson.JSONObject.KEY_METHOD;
7555
import static apijson.SQL.AND;
7656
import static apijson.SQL.NOT;
7757
import 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);

APIJSONORM/src/main/java/apijson/orm/SQLConfig.java

+6
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public interface SQLConfig<T extends Object> {
4444
String DATABASE_KAFKA = "KAFKA"; // https://github.com/APIJSON/APIJSON-Demo/tree/master/APIJSON-Java-Server/APIJSONDemo-MultiDataSource-Kafka
4545
String DATABASE_SQLITE = "SQLITE"; // https://www.sqlite.org
4646
String DATABASE_DUCKDB = "DUCKDB"; // https://duckdb.org
47+
String DATABASE_SURREALDB = "SURREALDB"; // https://surrealdb.com
4748

4849
String DATABASE_MQ = "MQ"; //
4950

@@ -99,6 +100,7 @@ public interface SQLConfig<T extends Object> {
99100
boolean isMQ();
100101
boolean isSQLite();
101102
boolean isDuckDB();
103+
boolean isSurrealDB();
102104

103105

104106
// 暂时只兼容以上几种
@@ -229,6 +231,10 @@ default int[] getDBVersionNums() {
229231
String getDatabase();
230232
SQLConfig setDatabase(String database);
231233

234+
String getSQLNamespace();
235+
String getNamespace();
236+
SQLConfig<T> setNamespace(String namespace);
237+
232238
String getSQLSchema();
233239
String getSchema();
234240
SQLConfig setSchema(String schema);

0 commit comments

Comments
 (0)