package com.holyliao.visitor; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.Alias; import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.schema.Table; import net.sf.jsqlparser.statement.select.FromItemVisitor; import net.sf.jsqlparser.statement.select.LateralSubSelect; import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.statement.select.SubJoin; import net.sf.jsqlparser.statement.select.SubSelect; import net.sf.jsqlparser.statement.select.TableFunction; import net.sf.jsqlparser.statement.select.ValuesList; import java.util.List; import java.util.Map; import java.util.UUID; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.holyliao.DPHelper; import com.holyliao.IdsAndColumn; import com.holyliao.util.SqlSpliceUtils; /** * @author: liaoqixing * @date: 18-5-7 下午2:49 * @desciptions: */ public class FromItemVisitorImpl implements FromItemVisitor { private Logger logger = LoggerFactory.getLogger(FromItemVisitorImpl.class); private SubSelect subSelect; @Override public void visit(Table table) { String tableName = table.getName(); //关键点:解析到需要进行数据权限控制的表时进行拼装,可以从当前线程获取表数据 //需要进行的数据权限控制的表数据 Map<String, IdsAndColumn> tables = DPHelper.getLocalDataPermissions().getTables(); if (tables.containsKey(tableName)) { IdsAndColumn idsAndColumn = tables.get(tableName); List<String> ids = idsAndColumn.getIds(); List<String> columns = idsAndColumn.getColumns(); SubSelect subSelect = new SubSelect(); String subSql = SqlSpliceUtils.spliceIdAndColumn(tableName, ids, columns); try { subSelect.setSelectBody(((Select) (CCJSqlParserUtil.parse(subSql))).getSelectBody()); } catch (JSQLParserException e) { logger.error("数据权限sql解析异常"); } //TODO:采用随机别名不能避免重名 subSelect.setAlias(table.getAlias() != null ? table.getAlias() : new Alias("DP" + UUID.randomUUID() .toString().replace("-", ""))); this.subSelect = subSelect; } } public SubSelect getSubSelect() { return this.subSelect; } // FROM 子查询 @Override public void visit(SubSelect subSelect) { // 如果是子查询的话返回到select接口实现类 subSelect.getSelectBody().accept(new SelectVisitorImpl()); } // FROM subjoin @Override public void visit(SubJoin subjoin) { subjoin.getLeft().accept(new FromItemVisitorImpl()); subjoin.getJoin().getRightItem().accept(new FromItemVisitorImpl()); } // FROM 横向子查询 @Override public void visit(LateralSubSelect lateralSubSelect) { lateralSubSelect.getSubSelect().getSelectBody() .accept(new SelectVisitorImpl()); } // FROM value列表 @Override public void visit(ValuesList valuesList) { } // FROM tableFunction @Override public void visit(TableFunction tableFunction) { } }