Skip to content

Commit

Permalink
新增支持 SurrealDB-关系、时序、图、键值、搜索、文档 等多模型数据库
Browse files Browse the repository at this point in the history
  • Loading branch information
TommyLemon committed Jan 30, 2025
1 parent 3461521 commit 5b2c1ed
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 40 deletions.
2 changes: 1 addition & 1 deletion APIJSONORM/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

<groupId>com.github.Tencent</groupId>
<artifactId>APIJSON</artifactId>
<version>7.3.0</version>
<version>7.4.0</version>
<packaging>jar</packaging>

<name>APIJSONORM</name>
Expand Down
27 changes: 18 additions & 9 deletions APIJSONORM/src/main/java/apijson/JSONObject.java
Original file line number Diff line number Diff line change
Expand Up @@ -139,8 +139,9 @@ public JSONObject setUserIdIn(List<Object> list) {

public static final String KEY_ROLE = "@role"; //角色,拥有对某些数据的某些操作的权限
public static final String KEY_DATABASE = "@database"; //数据库类型,默认为MySQL
public static final String KEY_SCHEMA = "@schema"; //数据库,Table在非默认schema内时需要声明
public static final String KEY_DATASOURCE = "@datasource"; //数据源
public static final String KEY_NAMESPACE = "@namespace"; //命名空间,Table在非默认namespace内时需要声明
public static final String KEY_SCHEMA = "@schema"; //数据库,Table在非默认schema内时需要声明
public static final String KEY_EXPLAIN = "@explain"; //分析 true/false
public static final String KEY_CACHE = "@cache"; //缓存 RAM/ROM/ALL
public static final String KEY_COLUMN = "@column"; //查询的Table字段或SQL函数
Expand Down Expand Up @@ -169,8 +170,9 @@ public JSONObject setUserIdIn(List<Object> list) {
TABLE_KEY_LIST = new ArrayList<String>();
TABLE_KEY_LIST.add(KEY_ROLE);
TABLE_KEY_LIST.add(KEY_DATABASE);
TABLE_KEY_LIST.add(KEY_SCHEMA);
TABLE_KEY_LIST.add(KEY_DATASOURCE);
TABLE_KEY_LIST.add(KEY_NAMESPACE);
TABLE_KEY_LIST.add(KEY_SCHEMA);
TABLE_KEY_LIST.add(KEY_EXPLAIN);
TABLE_KEY_LIST.add(KEY_CACHE);
TABLE_KEY_LIST.add(KEY_COLUMN);
Expand Down Expand Up @@ -253,20 +255,27 @@ public JSONObject setRole(String role) {
public JSONObject setDatabase(String database) {
return puts(KEY_DATABASE, database);
}
/**set schema where table was puts
* @param schema
* @return this
*/
public JSONObject setSchema(String schema) {
return puts(KEY_SCHEMA, schema);
}
/**set datasource where table was puts
* @param datasource
* @return this
*/
public JSONObject setDatasource(String datasource) {
return puts(KEY_DATASOURCE, datasource);
}
/**set namespace where table was puts
* @param namespace
* @return this
*/
public JSONObject setNamespace(String namespace) {
return puts(KEY_NAMESPACE, namespace);
}
/**set schema where table was puts
* @param schema
* @return this
*/
public JSONObject setSchema(String schema) {
return puts(KEY_SCHEMA, schema);
}
/**set if return explain informations
* @param explain
* @return
Expand Down
2 changes: 1 addition & 1 deletion APIJSONORM/src/main/java/apijson/Log.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public class Log {

public static boolean DEBUG = true;

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

public static final String OS_NAME;
Expand Down
75 changes: 46 additions & 29 deletions APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,31 +47,11 @@
import apijson.orm.model.Table;
import apijson.orm.model.TestRecord;

import static apijson.JSONObject.KEY_CACHE;
import static apijson.JSONObject.KEY_CAST;
import static apijson.JSONObject.KEY_COLUMN;
import static apijson.JSONObject.KEY_COMBINE;
import static apijson.JSONObject.KEY_DATABASE;
import static apijson.JSONObject.KEY_DATASOURCE;
import static apijson.JSONObject.KEY_EXPLAIN;
import static apijson.JSONObject.KEY_FROM;
import static apijson.JSONObject.KEY_GROUP;
import static apijson.JSONObject.KEY_HAVING;
import static apijson.JSONObject.KEY_HAVING_AND;
import static apijson.JSONObject.KEY_ID;
import static apijson.JSONObject.KEY_JSON;
import static apijson.JSONObject.KEY_NULL;
import static apijson.JSONObject.KEY_ORDER;
import static apijson.JSONObject.KEY_KEY;
import static apijson.JSONObject.KEY_RAW;
import static apijson.JSONObject.KEY_ROLE;
import static apijson.JSONObject.KEY_SCHEMA;
import static apijson.JSONObject.KEY_USER_ID;
import static apijson.JSONObject.*;
import static apijson.RequestMethod.DELETE;
import static apijson.RequestMethod.GET;
import static apijson.RequestMethod.POST;
import static apijson.RequestMethod.PUT;
import static apijson.JSONObject.KEY_METHOD;
import static apijson.SQL.AND;
import static apijson.SQL.NOT;
import static apijson.SQL.ON;
Expand Down Expand Up @@ -122,6 +102,7 @@ public abstract class AbstractSQLConfig<T extends Object> implements SQLConfig<T
public static boolean ALLOW_MISSING_KEY_4_COMBINE = true;

public static String DEFAULT_DATABASE = DATABASE_MYSQL;
public static String DEFAULT_NAMESPACE = "root";
public static String DEFAULT_SCHEMA = "sys";
public static String PREFIX_DISTINCT = "DISTINCT ";

Expand Down Expand Up @@ -225,6 +206,7 @@ public abstract class AbstractSQLConfig<T extends Object> implements SQLConfig<T
DATABASE_LIST.add(DATABASE_KAFKA);
DATABASE_LIST.add(DATABASE_MQ);
DATABASE_LIST.add(DATABASE_DUCKDB);
DATABASE_LIST.add(DATABASE_SURREALDB);


RAW_MAP = new LinkedHashMap<>(); // 保证顺序,避免配置冲突等意外情况
Expand Down Expand Up @@ -300,7 +282,6 @@ public abstract class AbstractSQLConfig<T extends Object> implements SQLConfig<T
RAW_MAP.put("POINT", "");
RAW_MAP.put("BLOB", "");
RAW_MAP.put("LONGBLOB", "");
RAW_MAP.put("BINARY", "");
RAW_MAP.put("UNSIGNED", "");
RAW_MAP.put("BIT", "");
RAW_MAP.put("TINYINT", "");
Expand All @@ -327,14 +308,12 @@ public abstract class AbstractSQLConfig<T extends Object> implements SQLConfig<T
RAW_MAP.put("ASC", "");
RAW_MAP.put("FOLLOWING", ""); // 往后
RAW_MAP.put("BETWEEN", "");
RAW_MAP.put("AND", "");
RAW_MAP.put("ROWS", "");

RAW_MAP.put("AGAINST", "");
RAW_MAP.put("IN NATURAL LANGUAGE MODE", "");
RAW_MAP.put("IN BOOLEAN MODE", "");
RAW_MAP.put("IN", "");
RAW_MAP.put("BOOLEAN", "");
RAW_MAP.put("NATURAL", "");
RAW_MAP.put("LANGUAGE", "");
RAW_MAP.put("MODE", "");
Expand Down Expand Up @@ -953,6 +932,7 @@ public String getUserIdKey() {
private String role; //发送请求的用户的角色
private boolean distinct = false;
private String database; //表所在的数据库类型
private String namespace; //表所在的命名空间
private String schema; //表所在的数据库名
private String datasource; //数据源
private String table; //表名
Expand Down Expand Up @@ -1341,9 +1321,17 @@ public static boolean isDuckDB(String db) {
return DATABASE_DUCKDB.equals(db);
}

@Override
public boolean isSurrealDB() {
return isSurrealDB(getSQLDatabase());
}
public static boolean isSurrealDB(String db) {
return DATABASE_SURREALDB.equals(db);
}

@Override
public String getQuote() { // MongoDB 同时支持 `tbl` 反引号 和 "col" 双引号
if(isElasticsearch() || isIoTDB()) {
if(isElasticsearch() || isIoTDB() || isSurrealDB()) {
return "";
}
return isMySQL() || isMariaDB() || isTiDB() || isClickHouse() || isTDengine() || isMilvus() ? "`" : "\"";
Expand All @@ -1354,6 +1342,23 @@ public String quote(String s) {
return q + s + q;
}

@Override
public String getNamespace() {
return namespace;
}

@Override
public String getSQLNamespace() {
String sch = getNamespace(); // 前端传参 @namespace 优先
return sch == null ? DEFAULT_NAMESPACE : sch; // 最后代码默认兜底配置
}

@Override
public AbstractSQLConfig<T> setNamespace(String namespace) {
this.namespace = namespace;
return this;
}

@Override
public String getSchema() {
return schema;
Expand All @@ -1374,7 +1379,7 @@ public String getSQLSchema() {
return SCHEMA_SYS; //SQL Server 在 sys 中的属性比 information_schema 中的要全,能拿到注释
}
if (AllTable.TAG.equals(table) || AllColumn.TAG.equals(table)
|| AllTableComment.TAG.equals(table) || AllTableComment.TAG.equals(table)) {
|| AllTableComment.TAG.equals(table) || AllColumnComment.TAG.equals(table)) {
return ""; //Oracle, Dameng 的 all_tables, dba_tables 和 all_tab_columns, dba_columns 表好像不属于任何 Schema
}

Expand All @@ -1384,6 +1389,7 @@ public String getSQLSchema() {
}
return sch == null ? DEFAULT_SCHEMA : sch; // 最后代码默认兜底配置
}

@Override
public AbstractSQLConfig setSchema(String schema) {
if (schema != null) {
Expand Down Expand Up @@ -2696,6 +2702,14 @@ public String getLimitString() {

int offset = getOffset(getPage(), count);
return " LIMIT " + offset + ", " + count; // 目前 moql-transx 的限制
} else if (isSurrealDB()) {
if (count == 0) {
Parser<T> parser = getParser();
count = parser == null ? AbstractParser.MAX_QUERY_COUNT : parser.getMaxQueryCount();
}

int offset = getOffset(getPage(), count);
return " START " + offset + " LIMIT " + count;
}

if (count <= 0 || RequestMethod.isHeadMethod(getMethod(), true)) { // TODO HEAD 真的不需要 LIMIT ?
Expand Down Expand Up @@ -5116,15 +5130,17 @@ public static <T extends Object> SQLConfig<T> newSQLConfig(RequestMethod method,
+ StringUtil.getString(DATABASE_LIST.toArray()) + "] 中的一种!");
}

String schema = request.getString(KEY_SCHEMA);
String datasource = request.getString(KEY_DATASOURCE);
String namespace = request.getString(KEY_NAMESPACE);
String schema = request.getString(KEY_SCHEMA);

SQLConfig<T> config = callback.getSQLConfig(method, database, schema, datasource, table);
config.setAlias(alias);

config.setDatabase(database); // 不删,后面表对象还要用的,必须放在 parseJoin 前
config.setSchema(schema); // 不删,后面表对象还要用的
config.setDatasource(datasource); // 不删,后面表对象还要用的
config.setNamespace(namespace); // 不删,后面表对象还要用的
config.setSchema(schema); // 不删,后面表对象还要用的

if (isProcedure) {
return config;
Expand Down Expand Up @@ -5282,8 +5298,9 @@ else if (userId instanceof Subquery) {}
request.remove(KEY_ROLE);
request.remove(KEY_EXPLAIN);
request.remove(KEY_CACHE);
request.remove(KEY_DATASOURCE);
request.remove(KEY_DATABASE);
request.remove(KEY_DATASOURCE);
request.remove(KEY_NAMESPACE);
request.remove(KEY_SCHEMA);
request.remove(KEY_FROM);
request.remove(KEY_COLUMN);
Expand Down
6 changes: 6 additions & 0 deletions APIJSONORM/src/main/java/apijson/orm/SQLConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ public interface SQLConfig<T extends Object> {
String DATABASE_KAFKA = "KAFKA"; // https://github.com/APIJSON/APIJSON-Demo/tree/master/APIJSON-Java-Server/APIJSONDemo-MultiDataSource-Kafka
String DATABASE_SQLITE = "SQLITE"; // https://www.sqlite.org
String DATABASE_DUCKDB = "DUCKDB"; // https://duckdb.org
String DATABASE_SURREALDB = "SURREALDB"; // https://surrealdb.com

String DATABASE_MQ = "MQ"; //

Expand Down Expand Up @@ -99,6 +100,7 @@ public interface SQLConfig<T extends Object> {
boolean isMQ();
boolean isSQLite();
boolean isDuckDB();
boolean isSurrealDB();


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

String getSQLNamespace();
String getNamespace();
SQLConfig<T> setNamespace(String namespace);

String getSQLSchema();
String getSchema();
SQLConfig setSchema(String schema);
Expand Down

0 comments on commit 5b2c1ed

Please sign in to comment.