|
@@ -13,7 +13,7 @@
|
|
|
* License for the specific language governing permissions and limitations under
|
|
|
* the License.
|
|
|
*/
|
|
|
-package com.baomidou.mybatisplus.plugins.tenancy;
|
|
|
+package com.baomidou.mybatisplus.plugins.tenant;
|
|
|
|
|
|
import java.util.List;
|
|
|
|
|
@@ -53,7 +53,7 @@ import net.sf.jsqlparser.statement.update.Update;
|
|
|
* @author hubin
|
|
|
* @since 2017-09-01
|
|
|
*/
|
|
|
-public class TenancySqlParser extends AbstractJsqlParser {
|
|
|
+public class TenantSqlParser extends AbstractJsqlParser {
|
|
|
|
|
|
private TenantHandler tenantHandler;
|
|
|
|
|
@@ -68,13 +68,14 @@ public class TenancySqlParser extends AbstractJsqlParser {
|
|
|
} else if (statement instanceof Delete) {
|
|
|
this.processDelete((Delete) statement);
|
|
|
}
|
|
|
+ logger.debug("parser sql: " + statement.toString());
|
|
|
return SqlInfo.newInstance().setSql(statement.toString());
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* select 语句处理
|
|
|
*/
|
|
|
- public void processSelectBody(SelectBody selectBody) {
|
|
|
+ protected void processSelectBody(SelectBody selectBody) {
|
|
|
if (selectBody instanceof PlainSelect) {
|
|
|
processPlainSelect((PlainSelect) selectBody);
|
|
|
} else if (selectBody instanceof WithItem) {
|
|
@@ -98,7 +99,7 @@ public class TenancySqlParser extends AbstractJsqlParser {
|
|
|
* insert 语句处理
|
|
|
* </p>
|
|
|
*/
|
|
|
- public void processInsert(Insert insert) {
|
|
|
+ protected void processInsert(Insert insert) {
|
|
|
if (this.tenantHandler.doTableFilter(insert.getTable().getName())) {
|
|
|
// 过滤退出执行
|
|
|
return;
|
|
@@ -109,7 +110,7 @@ public class TenancySqlParser extends AbstractJsqlParser {
|
|
|
} else if (insert.getItemsList() != null) {
|
|
|
((ExpressionList) insert.getItemsList()).getExpressions().add(tenantHandler.getTenantId());
|
|
|
} else {
|
|
|
- throw new MybatisPlusException("无法处理的 sql");
|
|
|
+ throw new MybatisPlusException("Failed to process multiple-table update, please exclude the tableName or statementId");
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -118,20 +119,17 @@ public class TenancySqlParser extends AbstractJsqlParser {
|
|
|
* update 语句处理
|
|
|
* </p>
|
|
|
*/
|
|
|
- public void processUpdate(Update update) {
|
|
|
- //获得where条件表达式
|
|
|
- Expression where = update.getWhere();
|
|
|
- EqualsTo equalsTo = new EqualsTo();
|
|
|
- if (where instanceof BinaryExpression) {
|
|
|
- equalsTo.setLeftExpression(new Column(this.tenantHandler.getTenantIdColumn()));
|
|
|
- equalsTo.setRightExpression(tenantHandler.getTenantId());
|
|
|
- AndExpression andExpression = new AndExpression(equalsTo, where);
|
|
|
- update.setWhere(andExpression);
|
|
|
- } else {
|
|
|
- equalsTo.setLeftExpression(new Column(this.tenantHandler.getTenantIdColumn()));
|
|
|
- equalsTo.setRightExpression(tenantHandler.getTenantId());
|
|
|
- update.setWhere(equalsTo);
|
|
|
+ protected void processUpdate(Update update) {
|
|
|
+ List<Table> tableList = update.getTables();
|
|
|
+ if (null == tableList || tableList.size() >= 2) {
|
|
|
+ throw new MybatisPlusException("Failed to process multiple-table update, please exclude the statementId");
|
|
|
}
|
|
|
+ Table table = tableList.get(0);
|
|
|
+ if (this.tenantHandler.doTableFilter(table.getName())) {
|
|
|
+ // 过滤退出执行
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ update.setWhere(this.andExpression(table, update.getWhere()));
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -139,8 +137,30 @@ public class TenancySqlParser extends AbstractJsqlParser {
|
|
|
* delete 语句处理
|
|
|
* </p>
|
|
|
*/
|
|
|
- public void processDelete(Delete delete) {
|
|
|
+ protected void processDelete(Delete delete) {
|
|
|
+ if (this.tenantHandler.doTableFilter(delete.getTable().getName())) {
|
|
|
+ // 过滤退出执行
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ delete.setWhere(this.andExpression(delete.getTable(), delete.getWhere()));
|
|
|
+ }
|
|
|
|
|
|
+ /**
|
|
|
+ * <p>
|
|
|
+ * delete update 语句 where 处理
|
|
|
+ * </p>
|
|
|
+ */
|
|
|
+ protected BinaryExpression andExpression(Table table, Expression where) {
|
|
|
+ //获得where条件表达式
|
|
|
+ EqualsTo equalsTo = new EqualsTo();
|
|
|
+ if (where instanceof BinaryExpression) {
|
|
|
+ equalsTo.setLeftExpression(new Column(this.tenantHandler.getTenantIdColumn()));
|
|
|
+ equalsTo.setRightExpression(tenantHandler.getTenantId());
|
|
|
+ return new AndExpression(equalsTo, where);
|
|
|
+ }
|
|
|
+ equalsTo.setLeftExpression(this.getAliasColumn(table));
|
|
|
+ equalsTo.setRightExpression(tenantHandler.getTenantId());
|
|
|
+ return equalsTo;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -148,7 +168,7 @@ public class TenancySqlParser extends AbstractJsqlParser {
|
|
|
* 处理 PlainSelect
|
|
|
* </p>
|
|
|
*/
|
|
|
- public void processPlainSelect(PlainSelect plainSelect) {
|
|
|
+ protected void processPlainSelect(PlainSelect plainSelect) {
|
|
|
processPlainSelect(plainSelect, false);
|
|
|
}
|
|
|
|
|
@@ -160,7 +180,7 @@ public class TenancySqlParser extends AbstractJsqlParser {
|
|
|
* @param plainSelect
|
|
|
* @param addColumn 是否添加租户列,insert into select语句中需要
|
|
|
*/
|
|
|
- public void processPlainSelect(PlainSelect plainSelect, boolean addColumn) {
|
|
|
+ protected void processPlainSelect(PlainSelect plainSelect, boolean addColumn) {
|
|
|
FromItem fromItem = plainSelect.getFromItem();
|
|
|
if (fromItem instanceof Table) {
|
|
|
Table fromTable = (Table) fromItem;
|
|
@@ -184,11 +204,10 @@ public class TenancySqlParser extends AbstractJsqlParser {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/**
|
|
|
* 处理子查询等
|
|
|
*/
|
|
|
- public void processFromItem(FromItem fromItem) {
|
|
|
+ protected void processFromItem(FromItem fromItem) {
|
|
|
if (fromItem instanceof SubJoin) {
|
|
|
SubJoin subJoin = (SubJoin) fromItem;
|
|
|
if (subJoin.getJoin() != null) {
|
|
@@ -203,7 +222,7 @@ public class TenancySqlParser extends AbstractJsqlParser {
|
|
|
processSelectBody(subSelect.getSelectBody());
|
|
|
}
|
|
|
} else if (fromItem instanceof ValuesList) {
|
|
|
-
|
|
|
+ logger.debug("Perform a subquery, if you do not give us feedback");
|
|
|
} else if (fromItem instanceof LateralSubSelect) {
|
|
|
LateralSubSelect lateralSubSelect = (LateralSubSelect) fromItem;
|
|
|
if (lateralSubSelect.getSubSelect() != null) {
|
|
@@ -218,7 +237,7 @@ public class TenancySqlParser extends AbstractJsqlParser {
|
|
|
/**
|
|
|
* 处理联接语句
|
|
|
*/
|
|
|
- public void processJoin(Join join) {
|
|
|
+ protected void processJoin(Join join) {
|
|
|
if (join.getRightItem() instanceof Table) {
|
|
|
Table fromTable = (Table) join.getRightItem();
|
|
|
if (this.tenantHandler.doTableFilter(fromTable.getName())) {
|
|
@@ -232,25 +251,14 @@ public class TenancySqlParser extends AbstractJsqlParser {
|
|
|
/**
|
|
|
* 处理条件
|
|
|
*/
|
|
|
- public Expression builderExpression(Expression expression, Table table) {
|
|
|
- Expression tenantExpression = null;
|
|
|
- //当传入table时,字段前加上别名或者table名
|
|
|
- //别名优先使用
|
|
|
- StringBuilder tenantIdColumnName = new StringBuilder();
|
|
|
- if (table != null) {
|
|
|
- tenantIdColumnName.append(table.getAlias() != null ? table.getAlias().getName() : table.getName());
|
|
|
- tenantIdColumnName.append(".");
|
|
|
- }
|
|
|
- tenantIdColumnName.append(this.tenantHandler.getTenantIdColumn());
|
|
|
+ protected Expression builderExpression(Expression expression, Table table) {
|
|
|
//生成字段名
|
|
|
- Column tenantColumn = new Column(tenantIdColumnName.toString());
|
|
|
EqualsTo equalsTo = new EqualsTo();
|
|
|
- tenantExpression = equalsTo;
|
|
|
- equalsTo.setLeftExpression(tenantColumn);
|
|
|
+ equalsTo.setLeftExpression(this.getAliasColumn(table));
|
|
|
equalsTo.setRightExpression(tenantHandler.getTenantId());
|
|
|
//加入判断防止条件为空时生成 "and null" 导致查询结果为空
|
|
|
if (expression == null) {
|
|
|
- return tenantExpression;
|
|
|
+ return equalsTo;
|
|
|
} else {
|
|
|
if (expression instanceof BinaryExpression) {
|
|
|
BinaryExpression binaryExpression = (BinaryExpression) expression;
|
|
@@ -261,8 +269,27 @@ public class TenancySqlParser extends AbstractJsqlParser {
|
|
|
processFromItem((FromItem) binaryExpression.getRightExpression());
|
|
|
}
|
|
|
}
|
|
|
- return new AndExpression(tenantExpression, expression);
|
|
|
+ return new AndExpression(equalsTo, expression);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * <p>
|
|
|
+ * 字段是否添加别名设置
|
|
|
+ * </p>
|
|
|
+ *
|
|
|
+ * @param table 表对象
|
|
|
+ * @return 字段
|
|
|
+ */
|
|
|
+ protected Column getAliasColumn(Table table) {
|
|
|
+ if (null == table.getAlias()) {
|
|
|
+ return new Column(this.tenantHandler.getTenantIdColumn());
|
|
|
}
|
|
|
+ StringBuilder column = new StringBuilder();
|
|
|
+ column.append(table.getAlias().getName());
|
|
|
+ column.append(".");
|
|
|
+ column.append(this.tenantHandler.getTenantIdColumn());
|
|
|
+ return new Column(column.toString());
|
|
|
}
|
|
|
|
|
|
public TenantHandler getTenantHandler() {
|