package org.opencloudb.parser.druid; import java.util.Map; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; import com.alibaba.druid.stat.TableStat.Column; import com.alibaba.druid.stat.TableStat.Condition; /** * Druid解析器中用来从ast语法中提取表名、条件、字段等的vistor * @author wang.dw * */ public class MycatSchemaStatVisitor extends MySqlSchemaStatVisitor { public boolean visit(SQLBetweenExpr x) { String begin = x.beginExpr.toString(); String end = x.endExpr.toString(); Column column = getColumn(x); if (column == null) { return true; } Condition condition = null; for (Condition item : this.getConditions()) { if (item.getColumn().equals(column) && item.getOperator().equals("between")) { condition = item; break; } } if (condition == null) { condition = new Condition(); condition.setColumn(column); condition.setOperator("between"); this.conditions.add(condition); } condition.getValues().add(begin); condition.getValues().add(end); return true; } protected Column getColumn(SQLExpr expr) { Map<String, String> aliasMap = getAliasMap(); if (aliasMap == null) { return null; } if (expr instanceof SQLPropertyExpr) { SQLExpr owner = ((SQLPropertyExpr) expr).getOwner(); String column = ((SQLPropertyExpr) expr).getName(); if (owner instanceof SQLIdentifierExpr) { String tableName = ((SQLIdentifierExpr) owner).getName(); String table = tableName; if (aliasMap.containsKey(table)) { table = aliasMap.get(table); } if (variants.containsKey(table)) { return null; } if (table != null) { return new Column(table, column); } return handleSubQueryColumn(tableName, column); } return null; } if (expr instanceof SQLIdentifierExpr) { Column attrColumn = (Column) expr.getAttribute(ATTR_COLUMN); if (attrColumn != null) { return attrColumn; } String column = ((SQLIdentifierExpr) expr).getName(); String table = getCurrentTable(); if (table != null && aliasMap.containsKey(table)) { table = aliasMap.get(table); if (table == null) { return null; } } if (table != null) { return new Column(table, column); } if (variants.containsKey(column)) { return null; } return new Column("UNKNOWN", column); } if(expr instanceof SQLBetweenExpr) { SQLBetweenExpr betweenExpr = (SQLBetweenExpr)expr; String tableName = ((SQLIdentifierExpr)((SQLPropertyExpr) betweenExpr.getTestExpr()).getOwner()).getName(); String column = ((SQLPropertyExpr) betweenExpr.getTestExpr()).getName(); String table = tableName; if (aliasMap.containsKey(table)) { table = aliasMap.get(table); } if (variants.containsKey(table)) { return null; } if (table != null) { return new Column(table, column); } return handleSubQueryColumn(tableName, column); } return null; } }