optimize tenant condition;close #I7IVCR

This commit is contained in:
开源海哥 2023-07-08 09:14:12 +08:00
parent fec7422f1f
commit c52c3654f8
5 changed files with 79 additions and 50 deletions

View File

@ -28,6 +28,7 @@ import com.mybatisflex.core.table.TableInfoFactory;
import com.mybatisflex.core.update.RawValue;
import com.mybatisflex.core.util.ArrayUtil;
import com.mybatisflex.core.util.CollectionUtil;
import com.mybatisflex.core.util.SqlUtil;
import com.mybatisflex.core.util.StringUtil;
import java.math.BigDecimal;
@ -113,7 +114,7 @@ public class CommonsDialectImpl implements IDialect {
}
for (int i = 0; i < rows.size(); i++) {
questions.append(buildQuestion(attrs.size()));
questions.append(SqlUtil.buildSqlParamPlaceholder(attrs.size()));
if (i != rows.size() - 1) {
questions.append(DELIMITER);
}
@ -585,14 +586,11 @@ public class CommonsDialectImpl implements IDialect {
public String forDeleteEntityById(TableInfo tableInfo) {
String logicDeleteColumn = tableInfo.getLogicDeleteColumnOrSkip();
Object[] tenantIdArgs = tableInfo.buildTenantIdArgs();
//正常删除
if (StringUtil.isBlank(logicDeleteColumn)) {
String deleteByIdSql = forDeleteById(tableInfo.getSchema(), tableInfo.getTableName(), tableInfo.getPrimaryColumns());
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
deleteByIdSql += AND + wrap(tableInfo.getTenantIdColumn()) + IN + buildQuestion(tenantIdArgs.length);
}
return deleteByIdSql;
return tableInfo.buildTenantCondition(deleteByIdSql, tenantIdArgs, this);
}
//逻辑删除
@ -612,10 +610,7 @@ public class CommonsDialectImpl implements IDialect {
sql.append(AND).append(buildLogicNormalCondition(logicDeleteColumn));
//租户ID
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(IN).append(buildQuestion(tenantIdArgs.length));
}
tableInfo.buildTenantCondition(sql, tenantIdArgs, this);
return sql.toString();
}
@ -632,7 +627,7 @@ public class CommonsDialectImpl implements IDialect {
//多租户
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
deleteSQL = deleteSQL.replace(WHERE, WHERE + BRACKET_LEFT) + BRACKET_RIGHT;
deleteSQL += AND + wrap(tableInfo.getTenantIdColumn()) + IN + buildQuestion(tenantIdArgs.length);
deleteSQL = tableInfo.buildTenantCondition(deleteSQL, tenantIdArgs, this);
}
return deleteSQL;
}
@ -674,9 +669,7 @@ public class CommonsDialectImpl implements IDialect {
sql.append(BRACKET_RIGHT).append(AND).append(buildLogicNormalCondition(logicDeleteColumn));
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(IN).append(buildQuestion(tenantIdArgs.length));
}
tableInfo.buildTenantCondition(sql, tenantIdArgs, this);
return sql.toString();
}
@ -766,13 +759,7 @@ public class CommonsDialectImpl implements IDialect {
//租户ID字段
Object[] tenantIdArgs = tableInfo.buildTenantIdArgs();
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
if (tenantIdArgs.length == 1) {
sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(EQUALS_PLACEHOLDER);
} else {
sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(IN).append(buildQuestion(tenantIdArgs.length));
}
}
tableInfo.buildTenantCondition(sql, tenantIdArgs, this);
//乐观锁条件
if (StringUtil.isNotBlank(versionColumn)) {
@ -923,9 +910,7 @@ public class CommonsDialectImpl implements IDialect {
//多租户
Object[] tenantIdArgs = tableInfo.buildTenantIdArgs();
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(IN).append(buildQuestion(tenantIdArgs.length));
}
tableInfo.buildTenantCondition(sql, tenantIdArgs, this);
return sql.toString();
}
@ -980,9 +965,8 @@ public class CommonsDialectImpl implements IDialect {
sql.append(AND).append(buildLogicNormalCondition(logicDeleteColumn));
}
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(IN).append(buildQuestion(tenantIdArgs.length));
}
//多租户
tableInfo.buildTenantCondition(sql, tenantIdArgs, this);
return sql.toString();
}
@ -1071,18 +1055,6 @@ public class CommonsDialectImpl implements IDialect {
}
protected String buildQuestion(int count) {
StringBuilder sb = new StringBuilder(BRACKET_LEFT);
for (int i = 0; i < count; i++) {
sb.append(PLACEHOLDER);
if (i != count - 1) {
sb.append(DELIMITER);
}
}
sb.append(BRACKET_RIGHT);
return sb.toString();
}
protected String buildLogicNormalCondition(String logicColumn) {
return LogicDeleteManager.getProcessor().buildLogicNormalCondition(logicColumn, this);
}

View File

@ -31,11 +31,11 @@ public class DefaultLogicDeleteProcessor extends AbstractLogicDeleteProcessor {
@Override
public void buildQueryCondition(QueryWrapper queryWrapper, TableInfo tableInfo) {
queryWrapper.and(QueryCondition.create(tableInfo.getSchema(), tableInfo.getTableName(), tableInfo.getLogicDeleteColumn()
, EQUALS
, FlexGlobalConfig.getDefaultConfig().getNormalValueOfLogicDelete()));
queryWrapper.where(QueryCondition.create(tableInfo.getSchema(), tableInfo.getTableName(), tableInfo.getLogicDeleteColumn()
, EQUALS, FlexGlobalConfig.getDefaultConfig().getNormalValueOfLogicDelete()));
}
@Override
protected Object getLogicNormalValue() {
Object normalValueOfLogicDelete = FlexGlobalConfig.getDefaultConfig().getNormalValueOfLogicDelete();
@ -46,6 +46,7 @@ public class DefaultLogicDeleteProcessor extends AbstractLogicDeleteProcessor {
return SINGLE_QUOTE + normalValueOfLogicDelete + SINGLE_QUOTE;
}
@Override
protected Object getLogicDeletedValue() {
Object deletedValueOfLogicDelete = FlexGlobalConfig.getDefaultConfig().getDeletedValueOfLogicDelete();

View File

@ -48,6 +48,8 @@ import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
import static com.mybatisflex.core.constant.SqlConsts.*;
public class TableInfo {
private String schema; //schema
@ -683,6 +685,42 @@ public class TableInfo {
return TenantManager.getTenantIds();
}
public String buildTenantCondition(String sql, Object[] tenantIdArgs, IDialect dialect) {
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
if (tenantIdArgs.length == 1) {
return sql + AND + dialect.wrap(tenantIdColumn) + EQUALS_PLACEHOLDER;
} else {
return sql + AND + dialect.wrap(tenantIdColumn) + IN + SqlUtil.buildSqlParamPlaceholder(tenantIdArgs.length);
}
} else {
return sql;
}
}
public void buildTenantCondition(StringBuilder sql, Object[] tenantIdArgs, IDialect dialect) {
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
if (tenantIdArgs.length == 1) {
sql.append(AND).append(dialect.wrap(tenantIdColumn)).append(EQUALS_PLACEHOLDER);
} else {
sql.append(AND).append(dialect.wrap(tenantIdColumn)).append(IN).append(SqlUtil.buildSqlParamPlaceholder(tenantIdArgs.length));
}
}
}
public void buildTenantCondition(QueryWrapper queryWrapper) {
Object[] tenantIdArgs = buildTenantIdArgs();
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
if (tenantIdArgs.length == 1) {
queryWrapper.where(QueryCondition.create(schema, tableName, tenantIdColumn, SqlConsts.EQUALS, tenantIdArgs[0]));
} else {
queryWrapper.where(QueryCondition.create(schema, tableName, tenantIdColumn, SqlConsts.IN, tenantIdArgs));
}
}
}
private static final String APPEND_CONDITIONS_FLAG = "appendConditions";
public void appendConditions(Object entity, QueryWrapper queryWrapper) {
@ -731,14 +769,8 @@ public class TableInfo {
}
//多租户
Object[] tenantIdArgs = buildTenantIdArgs();
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
if (tenantIdArgs.length == 1) {
queryWrapper.and(QueryCondition.create(schema, tableName, tenantIdColumn, SqlConsts.EQUALS, tenantIdArgs[0]));
} else {
queryWrapper.and(QueryCondition.create(schema, tableName, tenantIdColumn, SqlConsts.IN, tenantIdArgs));
}
}
buildTenantCondition(queryWrapper);
//子查询
List<QueryWrapper> childSelects = CPI.getChildSelect(queryWrapper);

View File

@ -21,6 +21,9 @@ import java.util.Date;
import java.util.StringJoiner;
import java.util.regex.Matcher;
import static com.mybatisflex.core.constant.SqlConsts.*;
import static com.mybatisflex.core.constant.SqlConsts.BRACKET_RIGHT;
public class SqlUtil {
private SqlUtil() {
@ -127,4 +130,16 @@ public class SqlUtil {
}
public static String buildSqlParamPlaceholder(int count) {
StringBuilder sb = new StringBuilder(BRACKET_LEFT);
for (int i = 0; i < count; i++) {
sb.append(PLACEHOLDER);
if (i != count - 1) {
sb.append(DELIMITER);
}
}
sb.append(BRACKET_RIGHT);
return sb.toString();
}
}

View File

@ -68,6 +68,15 @@ public class AccountTester {
System.out.println(queryWrapper.toSQL());
}
@Test
public void testTenant() {
QueryWrapper queryWrapper = QueryWrapper.create();
queryWrapper.where(Account::getId).ge(1);
List<Account> accounts = accountMapper.selectListByQuery(queryWrapper);
System.out.println(accounts);
}
@Test
public void testSelectAsToDTO() {