package org.jeecg.config.mybatis;
|
|
import com.baomidou.mybatisplus.extension.plugins.tenant.TenantSqlParser;
|
import net.sf.jsqlparser.expression.BinaryExpression;
|
import net.sf.jsqlparser.expression.Expression;
|
import net.sf.jsqlparser.expression.Parenthesis;
|
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
|
import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
|
import net.sf.jsqlparser.expression.operators.relational.*;
|
import net.sf.jsqlparser.schema.Column;
|
import net.sf.jsqlparser.schema.Table;
|
import net.sf.jsqlparser.statement.select.*;
|
|
import java.util.List;
|
|
/**
|
* 复写租户条件
|
*/
|
public class JeecgTenantParser extends TenantSqlParser {
|
|
/**
|
* @param expression
|
* @param table
|
* @return
|
*/
|
protected Expression processTableAlias(Expression expression, Table table) {
|
String tableAliasName;
|
if (table.getAlias() == null) {
|
tableAliasName = table.getName();
|
} else {
|
tableAliasName = table.getAlias().getName();
|
}
|
|
// in
|
if (expression instanceof InExpression) {
|
InExpression in = (InExpression) expression;
|
if (in.getLeftExpression() instanceof Column) {
|
setTableAliasNameForColumn((Column) in.getLeftExpression(), tableAliasName);
|
}
|
|
// 比较操作
|
} else if (expression instanceof BinaryExpression) {
|
BinaryExpression compare = (BinaryExpression) expression;
|
if (compare.getLeftExpression() instanceof Column) {
|
setTableAliasNameForColumn((Column) compare.getLeftExpression(), tableAliasName);
|
} else if (compare.getRightExpression() instanceof Column) {
|
setTableAliasNameForColumn((Column) compare.getRightExpression(), tableAliasName);
|
}
|
|
// between
|
} else if (expression instanceof Between) {
|
Between between = (Between) expression;
|
if (between.getLeftExpression() instanceof Column) {
|
setTableAliasNameForColumn((Column) between.getLeftExpression(), tableAliasName);
|
}
|
}
|
return expression;
|
}
|
|
private void setTableAliasNameForColumn(Column column, String tableAliasName) {
|
column.setColumnName(tableAliasName + "." + column.getColumnName());
|
}
|
|
/**
|
* 默认是按 tenant_id=1 按等于条件追加
|
*
|
* @param currentExpression 现有的条件:比如你原来的sql查询条件
|
* @param table
|
* @return
|
*/
|
@Override
|
protected Expression builderExpression(Expression currentExpression, Table table) {
|
final Expression tenantExpression = this.getTenantHandler().getTenantId(true);
|
Expression appendExpression;
|
if (!(tenantExpression instanceof SupportsOldOracleJoinSyntax)) {
|
appendExpression = new EqualsTo();
|
((EqualsTo) appendExpression).setLeftExpression(this.getAliasColumn(table));
|
((EqualsTo) appendExpression).setRightExpression(tenantExpression);
|
} else {
|
appendExpression = processTableAlias(tenantExpression, table);
|
}
|
if (currentExpression == null) {
|
return appendExpression;
|
}
|
if (currentExpression instanceof BinaryExpression) {
|
BinaryExpression binaryExpression = (BinaryExpression) currentExpression;
|
if (binaryExpression.getLeftExpression() instanceof FromItem) {
|
processFromItem((FromItem) binaryExpression.getLeftExpression());
|
}
|
if (binaryExpression.getRightExpression() instanceof FromItem) {
|
processFromItem((FromItem) binaryExpression.getRightExpression());
|
}
|
} else if (currentExpression instanceof InExpression) {
|
InExpression inExp = (InExpression) currentExpression;
|
ItemsList rightItems = inExp.getRightItemsList();
|
if (rightItems instanceof SubSelect) {
|
processSelectBody(((SubSelect) rightItems).getSelectBody());
|
}
|
}
|
if (currentExpression instanceof OrExpression) {
|
return new AndExpression(new Parenthesis(currentExpression), appendExpression);
|
} else {
|
return new AndExpression(currentExpression, appendExpression);
|
}
|
}
|
|
@Override
|
protected void processPlainSelect(PlainSelect plainSelect, boolean addColumn) {
|
FromItem fromItem = plainSelect.getFromItem();
|
if (fromItem instanceof Table) {
|
Table fromTable = (Table) fromItem;
|
if (!this.getTenantHandler().doTableFilter(fromTable.getName())) {
|
plainSelect.setWhere(builderExpression(plainSelect.getWhere(), fromTable));
|
if (addColumn) {
|
plainSelect.getSelectItems().add(new SelectExpressionItem(new Column(this.getTenantHandler().getTenantIdColumn())));
|
}
|
}
|
} else {
|
processFromItem(fromItem);
|
}
|
List<Join> joins = plainSelect.getJoins();
|
if (joins != null && joins.size() > 0) {
|
joins.forEach(j -> {
|
processJoin(j);
|
processFromItem(j.getRightItem());
|
});
|
}
|
}
|
|
}
|