/*Copyright (C) 2026 the APIJSON group. All rights reserved. This source code is licensed under the Apache License Version 2.0.*/ package apijson.orm; import java.util.List; import java.util.Map; import apijson.NotNull; import apijson.RequestMethod; import apijson.StringUtil; /**SQL配置 * @author Lemon */ public interface SQLConfig, L extends List> { String DATABASE_MYSQL = "MYSQL"; // https://www.mysql.com String DATABASE_POSTGRESQL = "POSTGRESQL"; // https://www.postgresql.org String DATABASE_SQLSERVER = "SQLSERVER"; // https://www.microsoft.com/en-us/sql-server String DATABASE_ORACLE = "ORACLE"; // https://www.oracle.com/database String DATABASE_DB2 = "DB2"; // https://www.ibm.com/products/db2 String DATABASE_MARIADB = "MARIADB"; // https://mariadb.org String DATABASE_TIDB = "TIDB"; // https://www.pingcap.com/tidb String DATABASE_COCKROACHDB = "COCKROACHDB"; // https://www.cockroachlabs.com String DATABASE_DAMENG = "DAMENG"; // https://www.dameng.com String DATABASE_KINGBASE = "KINGBASE"; // https://www.kingbase.com.cn String DATABASE_KINGBASE_MYSQL = "KINGBASE_MYSQL"; // Kingbase in MySQL compatibility mode String DATABASE_KINGBASE_ORACLE = "KINGBASE_ORACLE"; // Kingbase in Oracle compatibility mode String DATABASE_KINGBASE_SQLSERVER = "KINGBASE_SQLSERVER"; // Kingbase in SQL Server compatibility mode String DATABASE_ELASTICSEARCH = "ELASTICSEARCH"; // https://www.elastic.co/guide/en/elasticsearch/reference/7.4/xpack-sql.html String DATABASE_MANTICORE = "MANTICORE"; // https://manticoresearch.com String DATABASE_CLICKHOUSE = "CLICKHOUSE"; // https://clickhouse.com String DATABASE_HIVE = "HIVE"; // https://hive.apache.org String DATABASE_PRESTO = "PRESTO"; // Facebook PrestoDB https://prestodb.io String DATABASE_TRINO = "TRINO"; // PrestoSQL https://trino.io String DATABASE_DORIS = "DORIS"; // https://doris.apache.org String DATABASE_SNOWFLAKE = "SNOWFLAKE"; // https://www.snowflake.com String DATABASE_DATABEND = "DATABEND"; // https://www.databend.com String DATABASE_DATABRICKS = "DATABRICKS"; // https://www.databricks.com String DATABASE_CASSANDRA = "CASSANDRA"; // https://cassandra.apache.org String DATABASE_MILVUS = "MILVUS"; // https://milvus.io String DATABASE_INFLUXDB = "INFLUXDB"; // https://www.influxdata.com/products/influxdb-overview String DATABASE_TDENGINE = "TDENGINE"; // https://tdengine.com String DATABASE_TIMESCALEDB = "TIMESCALEDB"; // https://www.timescale.com String DATABASE_QUESTDB = "QUESTDB"; // https://questdb.com String DATABASE_IOTDB = "IOTDB"; // https://iotdb.apache.org/zh/UserGuide/latest/API/Programming-JDBC.html String DATABASE_REDIS = "REDIS"; // https://redisql.com String DATABASE_MONGODB = "MONGODB"; // https://www.mongodb.com/docs/atlas/data-federation/query/query-with-sql 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_OPENGAUSS = "OPENGAUSS"; // https://opengauss.org String DATABASE_STARROCKS = "STARROCKS"; // https://docs.starrocks.io/zh/docs/quick_start/shared-nothing String DATABASE_MQ = "MQ"; // String SCHEMA_INFORMATION = "information_schema"; //MySQL, PostgreSQL, SQL Server 都有的系统模式 String SCHEMA_SYS = "sys"; //SQL Server 系统模式 String TABLE_SCHEMA = "table_schema"; String TABLE_NAME = "table_name"; int TYPE_CHILD = 0; int TYPE_ITEM = 1; int TYPE_ITEM_CHILD_0 = 2; Parser gainParser(); SQLConfig setParser(Parser parser); ObjectParser gainObjectParser(); SQLConfig setObjectParser(ObjectParser objectParser); int getVersion(); SQLConfig setVersion(int version); String getTag(); SQLConfig setTag(String tag); boolean isTSQL(); boolean isMSQL(); boolean isPSQL(); boolean isMySQL(); boolean isPostgreSQL(); boolean isSQLServer(); boolean isOracle(); boolean isDb2(); boolean isMariaDB(); boolean isTiDB(); boolean isCockroachDB(); boolean isDameng(); boolean isKingBase(); boolean isKingBaseMySQL(); boolean isKingBaseOracle(); boolean isKingBaseSQLServer(); boolean isElasticsearch(); boolean isManticore(); boolean isClickHouse(); boolean isHive(); boolean isPresto(); boolean isTrino(); boolean isSnowflake(); boolean isDatabend(); boolean isDatabricks(); boolean isCassandra(); boolean isMilvus(); boolean isInfluxDB(); boolean isTDengine(); boolean isTimescaleDB(); boolean isQuestDB(); boolean isIoTDB(); boolean isRedis(); boolean isMongoDB(); boolean isKafka(); boolean isMQ(); boolean isSQLite(); boolean isDuckDB(); boolean isSurrealDB(); boolean isOpenGauss(); boolean isDoris(); boolean isStarRocks(); // 暂时只兼容以上几种 // boolean isSQL(); // boolean isTSQL(); // boolean isPLSQL(); // boolean isAnsiSQL(); /**用来给 Table, Column 等系统属性表来绕过 MAX_SQL_COUNT 等限制 * @return */ boolean limitSQLCount(); /**是否开启 WITH AS 表达式来简化 SQL 和提升性能 * @return */ boolean isWithAsEnable(); /**允许增删改部分失败 * @return */ boolean allowPartialUpdateFailed(); @NotNull String getIdKey(); @NotNull String getUserIdKey(); /**获取数据库版本号,可通过判断版本号解决一些 JDBC 驱动连接数据库的兼容问题 * MYSQL: 8.0, 5.7, 5.6 等; PostgreSQL: 11, 10, 9.6 等 * @return */ String gainDBVersion(); @NotNull default int[] gainDBVersionNums() { String dbVersion = StringUtil.noBlank(gainDBVersion()); if (dbVersion.isEmpty()) { return new int[]{0}; } int index = dbVersion.indexOf("-"); if (index > 0) { dbVersion = dbVersion.substring(0, index); } String[] ss = dbVersion.split("[.]"); int[] nums = new int[Math.max(1, ss.length)]; for (int i = 0; i < ss.length; i++) { nums[i] = Integer.valueOf(ss[i]); } return nums; } /**获取数据库地址 * @return */ String gainDBUri(); /**获取数据库账号 * @return */ String gainDBAccount(); /**获取数据库密码 * @return */ String gainDBPassword(); /**获取SQL语句 * @return * @throws Exception */ String gainSQL(boolean prepared) throws Exception; boolean isTest(); SQLConfig setTest(boolean test); int getType(); SQLConfig setType(int type); int getCount(); SQLConfig setCount(int count); int getPage(); SQLConfig setPage(int page); int getQuery(); SQLConfig setQuery(int query); Boolean getCompat(); SQLConfig setCompat(Boolean compat); int getPosition(); SQLConfig setPosition(int position); int getCache(); SQLConfig setCache(int cache); boolean isExplain(); SQLConfig setExplain(boolean explain); RequestMethod getMethod(); SQLConfig setMethod(RequestMethod method); Object getId(); SQLConfig setId(Object id); /**Whether the current id was supplied by {@link AbstractSQLConfig.IdCallback}, rather than by the request.*/ default boolean isIdGeneratedByAPIJSON() { return false; } default SQLConfig setIdGeneratedByAPIJSON(boolean generated) { return this; } Object getIdIn(); SQLConfig setIdIn(Object idIn); Object getUserId(); SQLConfig setUserId(Object userId); Object getUserIdIn(); SQLConfig setUserIdIn(Object userIdIn); String getRole(); SQLConfig setRole(String role); public boolean isDistinct(); public SQLConfig setDistinct(boolean distinct); String getDatabase(); SQLConfig setDatabase(String database); String getSQLNamespace(); String getNamespace(); SQLConfig setNamespace(String namespace); String gainSQLCatalog(); String getCatalog(); SQLConfig setCatalog(String catalog); String gainSQLSchema(); String getSchema(); SQLConfig setSchema(String schema); String getDatasource(); SQLConfig setDatasource(String datasource); String getQuote(); List getJson(); SQLConfig setJson(List json); /**请求传进来的Table名 * @return * @see {@link #gainSQLTable()} */ String getTable(); SQLConfig setTable(String table); /**数据库里的真实Table名 * 通过 {@link AbstractSQLConfig.TABLE_KEY_MAP} 映射 * @return */ String gainSQLTable(); String gainTablePath(); Map getKeyMap(); SQLConfig setKeyMap(Map keyMap); List getRaw(); SQLConfig setRaw(List raw); Subquery getFrom(); SQLConfig setFrom(Subquery from); List getColumn(); SQLConfig setColumn(List column); List> getValues(); SQLConfig setValues(List> values); Map getContent(); SQLConfig setContent(Map content); Map> getCombineMap(); SQLConfig setCombineMap(Map> combineMap); String getCombine(); SQLConfig setCombine(String combine); Map getCast(); SQLConfig setCast(Map cast); List getNull(); SQLConfig setNull(List nulls); Map getWhere(); SQLConfig setWhere(Map where); String getGroup(); SQLConfig setGroup(String group); Map getHaving(); SQLConfig setHaving(Map having); String getHavingCombine(); SQLConfig setHavingCombine(String havingCombine); String getSample(); SQLConfig setSample(String order); String getLatest(); SQLConfig setLatest(String latest); String getPartition(); SQLConfig setPartition(String partition); String getFill(); SQLConfig setFill(String fill); String getOrder(); SQLConfig setOrder(String order); /** * exactMatch = false * @param key * @return */ Object getWhere(String key); /** * @param key * @param exactMatch * @return */ Object getWhere(String key, boolean exactMatch); /** * @param key * @param value * @return */ SQLConfig putWhere(String key, Object value, boolean prior); boolean isPrepared(); SQLConfig setPrepared(boolean prepared); boolean isMain(); SQLConfig setMain(boolean main); List getPreparedValueList(); SQLConfig setPreparedValueList(List preparedValueList); String getAlias(); SQLConfig setAlias(String alias); default String gainTableKey() { String alias = getAlias(); return getTable() + (StringUtil.isEmpty(alias) ? "" : ":" + alias); } default String gainSQLAlias() { return gainSQLAlias(getTable(), getAlias()); } static String gainSQLAlias(@NotNull String table, String alias) { // 这里不用 : $ 等符号,因为部分数据库/引擎似乎不支持 `key`, "key", [key] 等避免关键词冲突的方式,只能使用符合变量命名的表别名 return StringUtil.isEmpty(alias) ? table : table + "__" + alias; // 带上原表名,避免 alias 和其它表名/字段名冲突 } String gainWhereString(boolean hasPrefix) throws Exception; String gainRawSQL(String key, Object value) throws Exception; String gainRawSQL(String key, Object value, boolean throwWhenMissing) throws Exception; boolean isKeyPrefix(); SQLConfig setKeyPrefix(boolean keyPrefix); List> getJoinList(); SQLConfig setJoinList(List> joinList); boolean hasJoin(); String gainSubqueryString(Subquery subquery) throws Exception; SQLConfig setProcedure(String procedure); List getWithAsExprPreparedValueList(); SQLConfig setWithAsExprPreparedValueList(List withAsExprePreparedValueList); boolean isFakeDelete(); Map onFakeDelete(Map map); }