feat: add operateType param for DynamicSchemaProcessor

This commit is contained in:
Michael Yang 2024-03-16 10:14:03 +08:00
parent ee559c0f02
commit 19ae7ecdb6
9 changed files with 62 additions and 59 deletions

View File

@ -32,11 +32,11 @@ public interface IDialect {
String wrapColumnAlias(String keyword);
default String getRealTable(String table, OperateType operateType) {
return TableManager.getRealTable(table,operateType);
return TableManager.getRealTable(table, operateType);
}
default String getRealSchema(String schema, String table) {
return TableManager.getRealSchema(schema, table);
default String getRealSchema(String schema, String table, OperateType operateType) {
return TableManager.getRealSchema(schema, table, operateType);
}
String forHint(String hintString);
@ -113,6 +113,7 @@ public interface IDialect {
/**
* 权限处理
*
* @param tableInfo tableInfo
* @param sql sql
* @param operateType 操作类型

View File

@ -140,11 +140,11 @@ public class CommonsDialectImpl implements IDialect {
index++;
}
String table = getRealTable(tableName,OperateType.INSERT);
String table = getRealTable(tableName, OperateType.INSERT);
StringBuilder sql = new StringBuilder();
sql.append(INSERT_INTO);
if (StringUtil.isNotBlank(schema)) {
sql.append(wrap(getRealSchema(schema, table))).append(REFERENCE);
sql.append(wrap(getRealSchema(schema, table, OperateType.INSERT))).append(REFERENCE);
}
sql.append(wrap(table));
sql.append(BRACKET_LEFT).append(fields).append(BRACKET_RIGHT);
@ -176,11 +176,11 @@ public class CommonsDialectImpl implements IDialect {
}
}
String table = getRealTable(tableName,OperateType.INSERT);
String table = getRealTable(tableName, OperateType.INSERT);
StringBuilder sql = new StringBuilder();
sql.append(INSERT_INTO);
if (StringUtil.isNotBlank(schema)) {
sql.append(wrap(getRealSchema(schema, table))).append(REFERENCE);
sql.append(wrap(getRealSchema(schema, table, OperateType.INSERT))).append(REFERENCE);
}
sql.append(wrap(table));
sql.append(BLANK).append(BRACKET_LEFT)
@ -193,11 +193,11 @@ public class CommonsDialectImpl implements IDialect {
@Override
public String forDeleteById(String schema, String tableName, String[] primaryKeys) {
String table = getRealTable(tableName,OperateType.DELETE);
String table = getRealTable(tableName, OperateType.DELETE);
StringBuilder sql = new StringBuilder();
sql.append(DELETE_FROM);
if (StringUtil.isNotBlank(schema)) {
sql.append(wrap(getRealSchema(schema, table))).append(REFERENCE);
sql.append(wrap(getRealSchema(schema, table, OperateType.DELETE))).append(REFERENCE);
}
sql.append(wrap(table));
sql.append(WHERE);
@ -214,11 +214,11 @@ public class CommonsDialectImpl implements IDialect {
@Override
public String forDeleteBatchByIds(String schema, String tableName, String[] primaryKeys, Object[] ids) {
String table = getRealTable(tableName,OperateType.DELETE);
String table = getRealTable(tableName, OperateType.DELETE);
StringBuilder sql = new StringBuilder();
sql.append(DELETE_FROM);
if (StringUtil.isNotBlank(schema)) {
sql.append(wrap(getRealSchema(schema, table))).append(REFERENCE);
sql.append(wrap(getRealSchema(schema, table, OperateType.DELETE))).append(REFERENCE);
}
sql.append(wrap(table));
@ -261,7 +261,7 @@ public class CommonsDialectImpl implements IDialect {
@Override
public String forUpdateById(String schema, String tableName, Row row) {
String table = getRealTable(tableName,OperateType.UPDATE);
String table = getRealTable(tableName, OperateType.UPDATE);
StringBuilder sql = new StringBuilder();
Set<String> modifyAttrs = RowCPI.getModifyAttrs(row);
Map<String, RawValue> rawValueMap = RowCPI.getRawValueMap(row);
@ -269,7 +269,7 @@ public class CommonsDialectImpl implements IDialect {
sql.append(UPDATE);
if (StringUtil.isNotBlank(schema)) {
sql.append(wrap(getRealSchema(schema, table))).append(REFERENCE);
sql.append(wrap(getRealSchema(schema, table, OperateType.UPDATE))).append(REFERENCE);
}
sql.append(wrap(table)).append(SET);
@ -317,7 +317,7 @@ public class CommonsDialectImpl implements IDialect {
//fix: support schema
QueryTable queryTable = queryTables.get(0);
sqlBuilder.append(UPDATE).append(queryTable.toSql(this,OperateType.UPDATE)).append(SET);
sqlBuilder.append(UPDATE).append(queryTable.toSql(this, OperateType.UPDATE)).append(SET);
int index = 0;
for (String modifyAttr : modifyAttrs) {
if (index > 0) {
@ -335,7 +335,7 @@ public class CommonsDialectImpl implements IDialect {
index++;
}
buildJoinSql(sqlBuilder, queryWrapper, queryTables,OperateType.UPDATE);
buildJoinSql(sqlBuilder, queryWrapper, queryTables, OperateType.UPDATE);
buildWhereSql(sqlBuilder, queryWrapper, queryTables, false);
buildGroupBySql(sqlBuilder, queryWrapper, queryTables);
buildHavingSql(sqlBuilder, queryWrapper, queryTables);
@ -367,10 +367,10 @@ public class CommonsDialectImpl implements IDialect {
@Override
public String forSelectOneById(String schema, String tableName, String[] primaryKeys, Object[] primaryValues) {
String table = getRealTable(tableName,OperateType.SELECT);
String table = getRealTable(tableName, OperateType.SELECT);
StringBuilder sql = new StringBuilder(SELECT_ALL_FROM);
if (StringUtil.isNotBlank(schema)) {
sql.append(wrap(getRealSchema(schema, table))).append(REFERENCE);
sql.append(wrap(getRealSchema(schema, table, OperateType.SELECT))).append(REFERENCE);
}
sql.append(wrap(table)).append(WHERE);
for (int i = 0; i < primaryKeys.length; i++) {
@ -438,9 +438,9 @@ public class CommonsDialectImpl implements IDialect {
buildSelectColumnSql(sqlBuilder, allTables, selectColumns, CPI.getHint(queryWrapper));
sqlBuilder.append(FROM).append(StringUtil.join(DELIMITER, queryTables, queryTable -> queryTable.toSql(this,OperateType.SELECT)));
sqlBuilder.append(FROM).append(StringUtil.join(DELIMITER, queryTables, queryTable -> queryTable.toSql(this, OperateType.SELECT)));
buildJoinSql(sqlBuilder, queryWrapper, allTables,OperateType.SELECT);
buildJoinSql(sqlBuilder, queryWrapper, allTables, OperateType.SELECT);
buildWhereSql(sqlBuilder, queryWrapper, allTables, true);
buildGroupBySql(sqlBuilder, queryWrapper, allTables);
buildHavingSql(sqlBuilder, queryWrapper, allTables);
@ -474,7 +474,7 @@ public class CommonsDialectImpl implements IDialect {
public String buildNoSelectSql(QueryWrapper queryWrapper) {
StringBuilder sqlBuilder = new StringBuilder();
buildJoinSql(sqlBuilder, queryWrapper, Collections.EMPTY_LIST,OperateType.SELECT);
buildJoinSql(sqlBuilder, queryWrapper, Collections.EMPTY_LIST, OperateType.SELECT);
buildWhereSql(sqlBuilder, queryWrapper, Collections.EMPTY_LIST, true);
buildGroupBySql(sqlBuilder, queryWrapper, Collections.EMPTY_LIST);
buildHavingSql(sqlBuilder, queryWrapper, Collections.EMPTY_LIST);
@ -546,17 +546,17 @@ public class CommonsDialectImpl implements IDialect {
throw new IllegalArgumentException("Delete with join sql must has 1 table only. but current has " + queryTables.size());
}
QueryTable queryTable = queryTables.get(0);
String table = getRealTable(queryTable.getName(),OperateType.DELETE);
String table = getRealTable(queryTable.getName(), OperateType.DELETE);
if (StringUtil.isNotBlank(queryTable.getSchema())) {
sqlBuilder.append(wrap(getRealSchema(queryTable.getSchema(), table))).append(REFERENCE);
sqlBuilder.append(wrap(getRealSchema(queryTable.getSchema(), table, OperateType.DELETE))).append(REFERENCE);
}
sqlBuilder.append(BLANK).append(wrap(getRealTable(table,OperateType.DELETE)));
sqlBuilder.append(BLANK).append(wrap(getRealTable(table, OperateType.DELETE)));
}
sqlBuilder.append(FROM).append(StringUtil.join(DELIMITER, queryTables, queryTable -> queryTable.toSql(this,OperateType.DELETE)));
sqlBuilder.append(FROM).append(StringUtil.join(DELIMITER, queryTables, queryTable -> queryTable.toSql(this, OperateType.DELETE)));
buildJoinSql(sqlBuilder, queryWrapper, allTables,OperateType.DELETE);
buildJoinSql(sqlBuilder, queryWrapper, allTables, OperateType.DELETE);
buildWhereSql(sqlBuilder, queryWrapper, allTables, false);
buildGroupBySql(sqlBuilder, queryWrapper, allTables);
buildHavingSql(sqlBuilder, queryWrapper, allTables);
@ -591,7 +591,7 @@ public class CommonsDialectImpl implements IDialect {
@Override
public String forInsertEntity(TableInfo tableInfo, Object entity, boolean ignoreNulls) {
StringBuilder sql = new StringBuilder();
sql.append(INSERT_INTO).append(tableInfo.getWrapSchemaAndTableName(this,OperateType.INSERT));
sql.append(INSERT_INTO).append(tableInfo.getWrapSchemaAndTableName(this, OperateType.INSERT));
String[] insertColumns = tableInfo.obtainInsertColumns(entity, ignoreNulls);
Map<String, String> onInsertColumns = tableInfo.getOnInsertColumns();
@ -623,7 +623,7 @@ public class CommonsDialectImpl implements IDialect {
public String forInsertEntityWithPk(TableInfo tableInfo, Object entity, boolean ignoreNulls) {
StringBuilder sql = new StringBuilder();
sql.append(INSERT_INTO).append(tableInfo.getWrapSchemaAndTableName(this,OperateType.INSERT));
sql.append(INSERT_INTO).append(tableInfo.getWrapSchemaAndTableName(this, OperateType.INSERT));
String[] insertColumns = tableInfo.obtainInsertColumnsWithPk(entity, ignoreNulls);
Map<String, String> onInsertColumns = tableInfo.getOnInsertColumns();
@ -650,7 +650,7 @@ public class CommonsDialectImpl implements IDialect {
@Override
public String forInsertEntityBatch(TableInfo tableInfo, List<?> entities) {
StringBuilder sql = new StringBuilder();
sql.append(INSERT_INTO).append(tableInfo.getWrapSchemaAndTableName(this,OperateType.INSERT));
sql.append(INSERT_INTO).append(tableInfo.getWrapSchemaAndTableName(this, OperateType.INSERT));
String[] insertColumns = tableInfo.obtainInsertColumns(null, false);
String[] warpedInsertColumns = new String[insertColumns.length];
for (int i = 0; i < insertColumns.length; i++) {
@ -696,7 +696,7 @@ public class CommonsDialectImpl implements IDialect {
StringBuilder sql = new StringBuilder();
String[] primaryKeys = tableInfo.getPrimaryColumns();
sql.append(UPDATE).append(tableInfo.getWrapSchemaAndTableName(this,OperateType.UPDATE));
sql.append(UPDATE).append(tableInfo.getWrapSchemaAndTableName(this, OperateType.UPDATE));
sql.append(SET).append(buildLogicDeletedSet(logicDeleteColumn, tableInfo));
sql.append(WHERE);
for (int i = 0; i < primaryKeys.length; i++) {
@ -734,7 +734,7 @@ public class CommonsDialectImpl implements IDialect {
StringBuilder sql = new StringBuilder();
sql.append(UPDATE);
sql.append(tableInfo.getWrapSchemaAndTableName(this,OperateType.UPDATE));
sql.append(tableInfo.getWrapSchemaAndTableName(this, OperateType.UPDATE));
sql.append(SET).append(buildLogicDeletedSet(logicDeleteColumn, tableInfo));
sql.append(WHERE);
sql.append(BRACKET_LEFT);
@ -793,11 +793,11 @@ public class CommonsDialectImpl implements IDialect {
//ignore selectColumns
StringBuilder sqlBuilder = new StringBuilder(UPDATE).append(forHint(CPI.getHint(queryWrapper)));
sqlBuilder.append(tableInfo.getWrapSchemaAndTableName(this,OperateType.DELETE));
sqlBuilder.append(tableInfo.getWrapSchemaAndTableName(this, OperateType.DELETE));
sqlBuilder.append(SET).append(buildLogicDeletedSet(logicDeleteColumn, tableInfo));
buildJoinSql(sqlBuilder, queryWrapper, allTables,OperateType.DELETE);
buildJoinSql(sqlBuilder, queryWrapper, allTables, OperateType.DELETE);
buildWhereSql(sqlBuilder, queryWrapper, allTables, false);
buildGroupBySql(sqlBuilder, queryWrapper, allTables);
buildHavingSql(sqlBuilder, queryWrapper, allTables);
@ -818,7 +818,7 @@ public class CommonsDialectImpl implements IDialect {
Map<String, RawValue> rawValueMap = tableInfo.obtainUpdateRawValueMap(entity);
String[] primaryKeys = tableInfo.getPrimaryColumns();
sql.append(UPDATE).append(tableInfo.getWrapSchemaAndTableName(this,OperateType.UPDATE)).append(SET);
sql.append(UPDATE).append(tableInfo.getWrapSchemaAndTableName(this, OperateType.UPDATE)).append(SET);
StringJoiner stringJoiner = new StringJoiner(DELIMITER);
@ -884,10 +884,10 @@ public class CommonsDialectImpl implements IDialect {
Map<String, RawValue> rawValueMap = tableInfo.obtainUpdateRawValueMap(entity);
sqlBuilder.append(UPDATE).append(forHint(CPI.getHint(queryWrapper)));
sqlBuilder.append(tableInfo.getWrapSchemaAndTableName(this,OperateType.UPDATE));
sqlBuilder.append(tableInfo.getWrapSchemaAndTableName(this, OperateType.UPDATE));
List<QueryTable> queryTables = CPI.getQueryTables(queryWrapper);
buildJoinSql(sqlBuilder, queryWrapper, queryTables,OperateType.UPDATE);
buildJoinSql(sqlBuilder, queryWrapper, queryTables, OperateType.UPDATE);
sqlBuilder.append(SET);
@ -946,7 +946,7 @@ public class CommonsDialectImpl implements IDialect {
public String forSelectOneEntityById(TableInfo tableInfo) {
StringBuilder sql = new StringBuilder();
buildSelectColumnSql(sql, null, null, null);
sql.append(FROM).append(tableInfo.getWrapSchemaAndTableName(this,OperateType.SELECT));
sql.append(FROM).append(tableInfo.getWrapSchemaAndTableName(this, OperateType.SELECT));
sql.append(WHERE);
String[] pKeys = tableInfo.getPrimaryColumns();
for (int i = 0; i < pKeys.length; i++) {
@ -974,7 +974,7 @@ public class CommonsDialectImpl implements IDialect {
public String forSelectEntityListByIds(TableInfo tableInfo, Object[] primaryValues) {
StringBuilder sql = new StringBuilder();
buildSelectColumnSql(sql, null, tableInfo.getDefaultQueryColumn(), null);
sql.append(FROM).append(tableInfo.getWrapSchemaAndTableName(this,OperateType.SELECT));
sql.append(FROM).append(tableInfo.getWrapSchemaAndTableName(this, OperateType.SELECT));
sql.append(WHERE);
String[] primaryKeys = tableInfo.getPrimaryColumns();
@ -1034,7 +1034,7 @@ public class CommonsDialectImpl implements IDialect {
if (!join.checkEffective()) {
continue;
}
sqlBuilder.append(join.toSql(queryTables, this,operateType));
sqlBuilder.append(join.toSql(queryTables, this, operateType));
joinSuccess = true;
}
}

View File

@ -169,9 +169,9 @@ public class OracleDialect extends CommonsDialectImpl {
StringBuilder sql = new StringBuilder();
sql.append(INSERT_ALL);
String table = getRealTable(tableName,OperateType.INSERT);
String table = getRealTable(tableName, OperateType.INSERT);
String tableNameWrap = StringUtil.isNotBlank(schema)
? wrap(getRealSchema(schema,table)) + REFERENCE + wrap(table)
? wrap(getRealSchema(schema, table, OperateType.INSERT)) + REFERENCE + wrap(table)
: wrap(table);
String questionStrings = SqlUtil.buildSqlParamPlaceholder(attrs.size());

View File

@ -979,10 +979,10 @@ public class QueryColumn implements CloneSupport<QueryColumn>, Conditional<Query
return dialect.wrap(selectTable.alias) + SqlConsts.REFERENCE + dialect.wrap(name);
} else if (StringUtil.isNotBlank(selectTable.getSchema()) && StringUtil.isNotBlank(selectTable.getName())) {
String realTable = dialect.getRealTable(selectTable.getName(), OperateType.SELECT);
return dialect.wrap(dialect.getRealSchema(selectTable.schema, realTable)) + SqlConsts.REFERENCE + dialect.wrap(realTable)
return dialect.wrap(dialect.getRealSchema(selectTable.schema, realTable, OperateType.SELECT)) + SqlConsts.REFERENCE + dialect.wrap(realTable)
+ SqlConsts.REFERENCE + dialect.wrap(name);
} else if (StringUtil.isNotBlank(selectTable.getName())) {
return dialect.wrap(dialect.getRealTable(selectTable.getName(),OperateType.SELECT)) + SqlConsts.REFERENCE + dialect.wrap(name);
return dialect.wrap(dialect.getRealTable(selectTable.getName(), OperateType.SELECT)) + SqlConsts.REFERENCE + dialect.wrap(name);
} else {
return dialect.wrap(name);
}

View File

@ -109,10 +109,10 @@ public class QueryTable implements CloneSupport<QueryTable> {
public String toSql(IDialect dialect, OperateType operateType) {
String sql;
if (StringUtil.isNotBlank(schema)) {
String table = dialect.getRealTable(name,operateType);
sql = dialect.wrap(dialect.getRealSchema(schema, table)) + "." + dialect.wrap(table) + WrapperUtil.buildAlias(alias, dialect);
String table = dialect.getRealTable(name, operateType);
sql = dialect.wrap(dialect.getRealSchema(schema, table, operateType)) + "." + dialect.wrap(table) + WrapperUtil.buildAlias(alias, dialect);
} else {
sql = dialect.wrap(dialect.getRealTable(name,operateType)) + WrapperUtil.buildAlias(alias, dialect);
sql = dialect.wrap(dialect.getRealTable(name, operateType)) + WrapperUtil.buildAlias(alias, dialect);
}
return sql;
}

View File

@ -15,8 +15,10 @@
*/
package com.mybatisflex.core.table;
import com.mybatisflex.core.dialect.OperateType;
public interface DynamicSchemaProcessor {
String process(String schema, String table);
String process(String schema, String table, OperateType operateType);
}

View File

@ -182,10 +182,10 @@ public class TableInfo {
public String getWrapSchemaAndTableName(IDialect dialect, OperateType operateType) {
if (StringUtil.isNotBlank(schema)) {
String table = dialect.getRealTable(tableName,operateType);
return dialect.wrap(dialect.getRealSchema(schema, table)) + "." + dialect.wrap(table);
String table = dialect.getRealTable(tableName, operateType);
return dialect.wrap(dialect.getRealSchema(schema, table, operateType)) + "." + dialect.wrap(table);
} else {
return dialect.wrap(dialect.getRealTable(tableName,operateType));
return dialect.wrap(dialect.getRealTable(tableName, operateType));
}
}

View File

@ -93,12 +93,12 @@ public class TableManager {
return tableName;
}
String dynamicTableName = dynamicTableProcessor.process(tableName,operateType);
String dynamicTableName = dynamicTableProcessor.process(tableName, operateType);
return StringUtil.isNotBlank(dynamicTableName) ? dynamicTableName : tableName;
}
public static String getRealSchema(String schema, String table) {
public static String getRealSchema(String schema, String table, OperateType operateType) {
Map<String, String> mapping = schemaMappingTL.get();
if (mapping != null) {
String dynamicSchema = mapping.get(schema);
@ -111,7 +111,7 @@ public class TableManager {
return schema;
}
String dynamicSchema = dynamicSchemaProcessor.process(schema, table);
String dynamicSchema = dynamicSchemaProcessor.process(schema, table, operateType);
return StringUtil.isNotBlank(dynamicSchema) ? dynamicSchema : schema;
}

View File

@ -7,7 +7,7 @@ spring:
# driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/flex_test
username: root
password: 12345678
password: 123456
# driver-class-name:
# datasource:
# driver-class-name: org.h2.Driver