Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
com.sharksharding.sql.visitor.SchemaStatVisitor Maven / Gradle / Ivy
package com.sharksharding.sql.visitor;
///*
// * Copyright 1999-2101 Alibaba Group Holding Ltd.
// *
// * Licensed under the Apache License, Version 2.0 (the "License");
// * you may not use this file except in compliance with the License.
// * You may obtain a copy of the License at
// *
// * http://www.apache.org/licenses/LICENSE-2.0
// *
// * Unless required by applicable law or agreed to in writing, software
// * distributed under the License is distributed on an "AS IS" BASIS,
// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// * See the License for the specific language governing permissions and
// * limitations under the License.
// */
//package com.alibaba.druid.sql.visitor;
//
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.LinkedHashMap;
//import java.util.LinkedHashSet;
//import java.util.List;
//import java.util.Map;
//import java.util.Set;
//
//import com.alibaba.druid.sql.ast.SQLExpr;
//import com.alibaba.druid.sql.ast.SQLName;
//import com.alibaba.druid.sql.ast.SQLObject;
//import com.alibaba.druid.sql.ast.SQLOrderBy;
//import com.alibaba.druid.sql.ast.SQLOrderingSpecification;
//import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr;
//import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr;
//import com.alibaba.druid.sql.ast.expr.SQLArrayExpr;
//import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
//import com.alibaba.druid.sql.ast.expr.SQLCurrentOfCursorExpr;
//import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
//import com.alibaba.druid.sql.ast.expr.SQLInListExpr;
//import com.alibaba.druid.sql.ast.expr.SQLInSubQueryExpr;
//import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr;
//import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
//import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
//import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn;
//import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex;
//import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint;
//import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropConstraint;
//import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropForeignKey;
//import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableConstraint;
//import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem;
//import com.alibaba.druid.sql.ast.statement.SQLAlterTableRename;
//import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement;
//import com.alibaba.druid.sql.ast.statement.SQLCallStatement;
//import com.alibaba.druid.sql.ast.statement.SQLCheck;
//import com.alibaba.druid.sql.ast.statement.SQLCloseStatement;
//import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
//import com.alibaba.druid.sql.ast.statement.SQLCommentStatement;
//import com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement;
//import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
//import com.alibaba.druid.sql.ast.statement.SQLCreateTriggerStatement;
//import com.alibaba.druid.sql.ast.statement.SQLCreateViewStatement;
//import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
//import com.alibaba.druid.sql.ast.statement.SQLDropDatabaseStatement;
//import com.alibaba.druid.sql.ast.statement.SQLDropFunctionStatement;
//import com.alibaba.druid.sql.ast.statement.SQLDropIndexStatement;
//import com.alibaba.druid.sql.ast.statement.SQLDropProcedureStatement;
//import com.alibaba.druid.sql.ast.statement.SQLDropSequenceStatement;
//import com.alibaba.druid.sql.ast.statement.SQLDropTableSpaceStatement;
//import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement;
//import com.alibaba.druid.sql.ast.statement.SQLDropTriggerStatement;
//import com.alibaba.druid.sql.ast.statement.SQLDropUserStatement;
//import com.alibaba.druid.sql.ast.statement.SQLDropViewStatement;
//import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
//import com.alibaba.druid.sql.ast.statement.SQLFetchStatement;
//import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl;
//import com.alibaba.druid.sql.ast.statement.SQLGrantStatement;
//import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
//import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource;
//import com.alibaba.druid.sql.ast.statement.SQLObjectType;
//import com.alibaba.druid.sql.ast.statement.SQLOpenStatement;
//import com.alibaba.druid.sql.ast.statement.SQLRevokeStatement;
//import com.alibaba.druid.sql.ast.statement.SQLRollbackStatement;
//import com.alibaba.druid.sql.ast.statement.SQLSelect;
//import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause;
//import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
//import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem;
//import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
//import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
//import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
//import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource;
//import com.alibaba.druid.sql.ast.statement.SQLTableElement;
//import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement;
//import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
//import com.alibaba.druid.sql.ast.statement.SQLUseStatement;
//import com.alibaba.druid.sql.ast.statement.SQLWithSubqueryClause;
//import com.alibaba.druid.stat.TableStat;
//import com.alibaba.druid.stat.TableStat.Column;
//import com.alibaba.druid.stat.TableStat.Condition;
//import com.alibaba.druid.stat.TableStat.Mode;
//import com.alibaba.druid.stat.TableStat.Relationship;
//import com.alibaba.druid.util.StringUtils;
//
//public class SchemaStatVisitor extends SQLASTVisitorAdapter {
//
// protected final HashMap tableStats = new LinkedHashMap();
// protected final Set columns = new LinkedHashSet();
// protected final List conditions = new ArrayList();
// protected final Set relationships = new LinkedHashSet();
// protected final List orderByColumns = new ArrayList();
// protected final Set groupByColumns = new LinkedHashSet();
//
// protected final Map subQueryMap = new LinkedHashMap();
//
// protected final Map variants = new LinkedHashMap();
//
// protected Map aliasMap = new HashMap();
//
// protected String currentTable;
//
// public final static String ATTR_TABLE = "_table_";
// public final static String ATTR_COLUMN = "_column_";
//
// private List parameters;
//
// private Mode mode;
//
// public SchemaStatVisitor(){
// this(new ArrayList());
// }
//
// public SchemaStatVisitor(List parameters){
// this.parameters = parameters;
// }
//
// public List getParameters() {
// return parameters;
// }
//
// public void setParameters(List parameters) {
// this.parameters = parameters;
// }
//
// public TableStat getTableStat(String ident) {
// return getTableStat(ident, null);
// }
//
// public Column addColumn(String tableName, String columnName) {
// tableName = handleName(tableName);
// columnName = handleName(columnName);
//
// Column column = this.getColumn(tableName, columnName);
// if (column == null) {
// column = new Column(tableName, columnName);
// columns.add(column);
// }
// return column;
// }
//
// public TableStat getTableStat(String tableName, String alias) {
// if (variants.containsKey(tableName)) {
// return null;
// }
//
// tableName = handleName(tableName);
// TableStat stat = tableStats.get(tableName);
// if (stat == null) {
// stat = new TableStat();
// tableStats.put(new TableStat.Name(tableName), stat);
// if (alias != null) {
// aliasMap.put(alias, tableName);
// }
// }
// return stat;
// }
//
// private String handleName(String ident) {
// int len = ident.length();
// if (ident.charAt(0) == '[' && ident.charAt(len - 1) == ']') {
// ident = ident.substring(1, len - 1);
// } else {
// boolean flag0 = false;
// boolean flag1 = false;
// boolean flag2 = false;
// boolean flag3 = false;
// for (int i = 0; i < len; ++i) {
// final char ch = ident.charAt(i);
// if (ch == '\"') {
// flag0 = true;
// } else if (ch == '`') {
// flag1 = true;
// } else if (ch == ' ') {
// flag2 = true;
// } else if (ch == '\'') {
// flag3 = true;
// }
// }
// if (flag0) {
// ident = ident.replaceAll("\"", "");
// }
//
// if (flag1) {
// ident = ident.replaceAll("`", "");
// }
//
// if (flag2) {
// ident = ident.replaceAll(" ", "");
// }
//
// if (flag3) {
// ident = ident.replaceAll("'", "");
// }
// }
// ident = aliasWrap(ident);
//
// return ident;
// }
//
// public Map getVariants() {
// return variants;
// }
//
// public void setAliasMap() {
// this.setAliasMap(new HashMap());
// }
//
// public void clearAliasMap() {
// this.aliasMap = null;
// }
//
// public void setAliasMap(Map aliasMap) {
// this.aliasMap = aliasMap;
// }
//
// public Map getAliasMap() {
// return aliasMap;
// }
//
// public void setCurrentTable(String table) {
// this.currentTable = table;
// }
//
// public void setCurrentTable(SQLObject x) {
// x.putAttribute("_old_local_", this.currentTable);
// }
//
// public void restoreCurrentTable(SQLObject x) {
// String table = (String) x.getAttribute("_old_local_");
// this.currentTable = table;
// }
//
// public void setCurrentTable(SQLObject x, String table) {
// x.putAttribute("_old_local_", this.currentTable);
// this.currentTable = table;
// }
//
// public String getCurrentTable() {
// return currentTable;
// }
//
// protected Mode getMode() {
// return mode;
// }
//
// protected void setModeOrigin(SQLObject x) {
// Mode originalMode = (Mode) x.getAttribute("_original_use_mode");
// mode = originalMode;
// }
//
// protected Mode setMode(SQLObject x, Mode mode) {
// Mode oldMode = this.mode;
// x.putAttribute("_original_use_mode", oldMode);
// this.mode = mode;
// return oldMode;
// }
//
// public class OrderByStatVisitor extends SQLASTVisitorAdapter {
//
// private final SQLOrderBy orderBy;
//
// public OrderByStatVisitor(SQLOrderBy orderBy){
// this.orderBy = orderBy;
// for (SQLSelectOrderByItem item : orderBy.getItems()) {
// item.getExpr().setParent(item);
// }
// }
//
// public SQLOrderBy getOrderBy() {
// return orderBy;
// }
//
// public boolean visit(SQLIdentifierExpr x) {
// if (subQueryMap.containsKey(currentTable)) {
// return false;
// }
//
// if (currentTable != null) {
// addOrderByColumn(currentTable, x.getName(), x);
// } else {
// addOrderByColumn("UNKOWN", x.getName(), x);
// }
// return false;
// }
//
// public boolean visit(SQLPropertyExpr x) {
// if (x.getOwner() instanceof SQLIdentifierExpr) {
// String owner = ((SQLIdentifierExpr) x.getOwner()).getName();
//
// if (subQueryMap.containsKey(owner)) {
// return false;
// }
//
// owner = aliasWrap(owner);
//
// if (owner != null) {
// addOrderByColumn(owner, x.getName(), x);
// }
// }
//
// return false;
// }
//
// public void addOrderByColumn(String table, String columnName, SQLObject expr) {
// Column column = new Column(table, columnName);
//
// SQLObject parent = expr.getParent();
// if (parent instanceof SQLSelectOrderByItem) {
// SQLOrderingSpecification type = ((SQLSelectOrderByItem) parent).getType();
// column.getAttributes().put("orderBy.type", type);
// }
//
// orderByColumns.add(column);
// }
// }
//
// public boolean visit(SQLOrderBy x) {
// OrderByStatVisitor orderByVisitor = new OrderByStatVisitor(x);
// SQLSelectQueryBlock query = null;
// if (x.getParent() instanceof SQLSelectQueryBlock) {
// query = (SQLSelectQueryBlock) x.getParent();
// }
// if (query != null) {
// for (SQLSelectOrderByItem item : x.getItems()) {
// SQLExpr expr = item.getExpr();
// if (expr instanceof SQLIntegerExpr) {
// int intValue = ((SQLIntegerExpr) expr).getNumber().intValue() - 1;
// if (intValue < query.getSelectList().size()) {
// SQLSelectItem selectItem = query.getSelectList().get(intValue);
// selectItem.getExpr().accept(orderByVisitor);
// }
// }
// }
// }
// x.accept(orderByVisitor);
// return true;
// }
//
// public Set getRelationships() {
// return relationships;
// }
//
// public List getOrderByColumns() {
// return orderByColumns;
// }
//
// public Set getGroupByColumns() {
// return groupByColumns;
// }
//
// public List getConditions() {
// return conditions;
// }
//
// public boolean visit(SQLBinaryOpExpr x) {
// x.getLeft().setParent(x);
// x.getRight().setParent(x);
//
// switch (x.getOperator()) {
// case Equality:
// case NotEqual:
// case GreaterThan:
// case GreaterThanOrEqual:
// case LessThan:
// case LessThanOrEqual:
// case LessThanOrEqualOrGreaterThan:
// case Like:
// case NotLike:
// case Is:
// case IsNot:
// handleCondition(x.getLeft(), x.getOperator().name, x.getRight());
// handleCondition(x.getRight(), x.getOperator().name, x.getLeft());
//
// handleRelationship(x.getLeft(), x.getOperator().name, x.getRight());
// break;
// default:
// break;
// }
// return true;
// }
//
// protected void handleRelationship(SQLExpr left, String operator, SQLExpr right) {
// Column leftColumn = getColumn(left);
// if (leftColumn == null) {
// return;
// }
//
// Column rightColumn = getColumn(right);
// if (rightColumn == null) {
// return;
// }
//
// Relationship relationship = new Relationship();
// relationship.setLeft(leftColumn);
// relationship.setRight(rightColumn);
// relationship.setOperator(operator);
//
// this.relationships.add(relationship);
// }
//
// protected void handleCondition(SQLExpr expr, String operator, List values) {
// handleCondition(expr, operator, values.toArray(new SQLExpr[values.size()]));
// }
//
// protected void handleCondition(SQLExpr expr, String operator, SQLExpr... valueExprs) {
// Column column = getColumn(expr);
// if (column == null) {
// return;
// }
//
// Condition condition = null;
// for (Condition item : this.getConditions()) {
// if (item.getColumn().equals(column) && item.getOperator().equals(operator)) {
// condition = item;
// break;
// }
// }
//
// if (condition == null) {
// condition = new Condition();
// condition.setColumn(column);
// condition.setOperator(operator);
// this.conditions.add(condition);
// }
//
// for (SQLExpr item : valueExprs) {
// Object value = SQLEvalVisitorUtils.eval(getDbType(), item, parameters, false);
// condition.getValues().add(value);
// }
// }
//
// public String getDbType() {
// return null;
// }
//
// protected Column getColumn(SQLExpr expr) {
// Map 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);
// }
//
// return null;
// }
//
// @Override
// public boolean visit(SQLTruncateStatement x) {
// setMode(x, Mode.Delete);
//
// setAliasMap();
//
// String originalTable = getCurrentTable();
//
// for (SQLExprTableSource tableSource : x.getTableSources()) {
// SQLName name = (SQLName) tableSource.getExpr();
//
// String ident = name.toString();
// setCurrentTable(ident);
// x.putAttribute("_old_local_", originalTable);
//
// TableStat stat = getTableStat(ident);
// stat.incrementDeleteCount();
//
// Map aliasMap = getAliasMap();
// if (aliasMap != null) {
// aliasMap.put(ident, ident);
// }
// }
//
// return false;
// }
//
// @Override
// public boolean visit(SQLDropViewStatement x) {
// setMode(x, Mode.Drop);
// return true;
// }
//
// @Override
// public boolean visit(SQLDropTableStatement x) {
// setMode(x, Mode.Insert);
//
// setAliasMap();
//
// String originalTable = getCurrentTable();
//
// for (SQLExprTableSource tableSource : x.getTableSources()) {
// SQLName name = (SQLName) tableSource.getExpr();
// String ident = name.toString();
// setCurrentTable(ident);
// x.putAttribute("_old_local_", originalTable);
//
// TableStat stat = getTableStat(ident);
// stat.incrementDropCount();
//
// Map aliasMap = getAliasMap();
// if (aliasMap != null) {
// aliasMap.put(ident, ident);
// }
// }
//
// return false;
// }
//
// @Override
// public boolean visit(SQLInsertStatement x) {
// setMode(x, Mode.Insert);
//
// setAliasMap();
//
// String originalTable = getCurrentTable();
//
// if (x.getTableName() instanceof SQLName) {
// String ident = ((SQLName) x.getTableName()).toString();
// setCurrentTable(ident);
// x.putAttribute("_old_local_", originalTable);
//
// TableStat stat = getTableStat(ident);
// stat.incrementInsertCount();
//
// Map aliasMap = getAliasMap();
// if (aliasMap != null) {
// if (x.getAlias() != null) {
// aliasMap.put(x.getAlias(), ident);
// }
// aliasMap.put(ident, ident);
// }
// }
//
// accept(x.getColumns());
// accept(x.getQuery());
//
// return false;
// }
//
// protected void accept(SQLObject x) {
// if (x != null) {
// x.accept(this);
// }
// }
//
// protected void accept(List extends SQLObject> nodes) {
// for (int i = 0, size = nodes.size(); i < size; ++i) {
// accept(nodes.get(i));
// }
// }
//
// public boolean visit(SQLSelectQueryBlock x) {
// if (x.getFrom() == null) {
// return false;
// }
//
// setMode(x, Mode.Select);
//
// if (x.getFrom() instanceof SQLSubqueryTableSource) {
// x.getFrom().accept(this);
// return false;
// }
//
// if (x.getInto() != null && x.getInto().getExpr() instanceof SQLName) {
// SQLName into = (SQLName) x.getInto().getExpr();
// String ident = into.toString();
// TableStat stat = getTableStat(ident);
// if (stat != null) {
// stat.incrementInsertCount();
// }
// }
//
// String originalTable = getCurrentTable();
//
// if (x.getFrom() instanceof SQLExprTableSource) {
// SQLExprTableSource tableSource = (SQLExprTableSource) x.getFrom();
// if (tableSource.getExpr() instanceof SQLName) {
// String ident = tableSource.getExpr().toString();
//
// setCurrentTable(x, ident);
// x.putAttribute(ATTR_TABLE, ident);
// if (x.getParent() instanceof SQLSelect) {
// x.getParent().putAttribute(ATTR_TABLE, ident);
// }
// x.putAttribute("_old_local_", originalTable);
// }
// }
//
// if (x.getFrom() != null) {
// x.getFrom().accept(this); // 提前执行,获得aliasMap
// String table = (String) x.getFrom().getAttribute(ATTR_TABLE);
// if (table != null) {
// x.putAttribute(ATTR_TABLE, table);
// }
// }
//
// // String ident = x.getTable().toString();
// //
// // TableStat stat = getTableStat(ident);
// // stat.incrementInsertCount();
// // return false;
//
// if (x.getWhere() != null) {
// x.getWhere().setParent(x);
// }
//
// return true;
// }
//
// public void endVisit(SQLSelectQueryBlock x) {
// String originalTable = (String) x.getAttribute("_old_local_");
// x.putAttribute("table", getCurrentTable());
// setCurrentTable(originalTable);
//
// setModeOrigin(x);
// }
//
// public boolean visit(SQLJoinTableSource x) {
// x.getLeft().accept(this);
// x.getRight().accept(this);
// if (x.getCondition() != null) {
// x.getCondition().accept(this);
// }
// return false;
// }
//
// public boolean visit(SQLPropertyExpr x) {
// if (x.getOwner() instanceof SQLIdentifierExpr) {
// String owner = ((SQLIdentifierExpr) x.getOwner()).getName();
//
// if (subQueryMap.containsKey(owner)) {
// return false;
// }
//
// owner = aliasWrap(owner);
//
// if (owner != null) {
// Column column = addColumn(owner, x.getName());
// x.putAttribute(ATTR_COLUMN, column);
// if (column != null) {
// if (column != null) {
// setColumn(x, column);
// }
// }
// }
// }
// return false;
// }
//
// protected String aliasWrap(String name) {
// Map aliasMap = getAliasMap();
//
// if (aliasMap != null) {
// for (Map.Entry entry : aliasMap.entrySet()) {
// if (entry.getKey() == null) {
// continue;
// }
// if (entry.getKey().equalsIgnoreCase(name)) {
// return entry.getValue();
// }
// }
// }
//
// return name;
// }
//
// protected Column handleSubQueryColumn(String owner, String alias) {
// SQLObject query = subQueryMap.get(owner);
//
// if (query == null) {
// return null;
// }
//
// List selectList = null;
// if (query instanceof SQLSelectQueryBlock) {
// selectList = ((SQLSelectQueryBlock) query).getSelectList();
// }
//
// if (selectList != null) {
// for (SQLSelectItem item : selectList) {
// if (!item.getClass().equals(SQLSelectItem.class)) {
// continue;
// }
//
// String itemAlias = item.getAlias();
// SQLExpr itemExpr = item.getExpr();
// if (itemAlias == null) {
// if (itemExpr instanceof SQLIdentifierExpr) {
// itemAlias = itemExpr.toString();
// } else if (itemExpr instanceof SQLPropertyExpr) {
// itemAlias = ((SQLPropertyExpr) itemExpr).getName();
// }
// }
//
// if (alias.equalsIgnoreCase(itemAlias)) {
// Column column = (Column) itemExpr.getAttribute(ATTR_COLUMN);
// return column;
// }
//
// }
// }
//
// return null;
// }
//
// public boolean visit(SQLIdentifierExpr x) {
// String currentTable = getCurrentTable();
//
// if (subQueryMap.containsKey(currentTable)) {
// return false;
// }
//
// String ident = x.toString();
//
// if (variants.containsKey(ident)) {
// return false;
// }
//
// Column column;
// if (currentTable != null) {
// column = addColumn(currentTable, ident);
// x.putAttribute(ATTR_COLUMN, column);
// } else {
// column = handleUnkownColumn(ident);
// if (column != null) {
// x.putAttribute(ATTR_COLUMN, column);
// }
// }
// if (column != null) {
// setColumn(x, column);
// }
// return false;
// }
//
// private void setColumn(SQLExpr x, Column column) {
// SQLObject current = x;
// for (;;) {
// SQLObject parent = current.getParent();
//
// if (parent == null) {
// break;
// }
//
// if (parent instanceof SQLSelectQueryBlock) {
// SQLSelectQueryBlock query = (SQLSelectQueryBlock) parent;
// if (query.getWhere() == current) {
// column.setWhere(true);
// }
// break;
// }
//
// if (parent instanceof SQLSelectGroupByClause) {
// SQLSelectGroupByClause groupBy = (SQLSelectGroupByClause) parent;
// if (current == groupBy.getHaving()) {
// column.setHaving(true);
// } else if (groupBy.getItems().contains(current)) {
// column.setGroupBy(true);
// }
// break;
// }
//
// if (parent instanceof SQLSelectItem) {
// column.setSelec(true);
// break;
// }
//
// if (parent instanceof SQLJoinTableSource) {
// SQLJoinTableSource join = (SQLJoinTableSource) parent;
// if (join.getCondition() == current) {
// column.setJoin(true);
// }
// break;
// }
//
// current = parent;
// }
// }
//
// protected Column handleUnkownColumn(String columnName) {
// return addColumn("UNKNOWN", columnName);
// }
//
// public boolean visit(SQLAllColumnExpr x) {
// String currentTable = getCurrentTable();
//
// if (subQueryMap.containsKey(currentTable)) {
// return false;
// }
//
// if (currentTable != null) {
// addColumn(currentTable, "*");
// }
// return false;
// }
//
// public Map getTables() {
// return tableStats;
// }
//
// public boolean containsTable(String tableName) {
// return tableStats.containsKey(new TableStat.Name(tableName));
// }
//
// public Set getColumns() {
// return columns;
// }
//
// public Column getColumn(String tableName, String columnName) {
// for (Column column : this.columns) {
// if (StringUtils.equalsIgnoreCase(tableName, column.getTable())
// && StringUtils.equalsIgnoreCase(columnName, column.getName())) {
// return column;
// }
// }
// return null;
// }
//
// public boolean visit(SQLSelectStatement x) {
// setAliasMap();
// return true;
// }
//
// public void endVisit(SQLSelectStatement x) {
// }
//
// @Override
// public boolean visit(SQLWithSubqueryClause.Entry x) {
// String alias = x.getName().toString();
// Map aliasMap = getAliasMap();
// SQLWithSubqueryClause with = (SQLWithSubqueryClause) x.getParent();
//
// if (Boolean.TRUE == with.getRecursive()) {
//
// if (aliasMap != null && alias != null) {
// aliasMap.put(alias, null);
// subQueryMap.put(alias, x.getSubQuery().getQuery());
// }
//
// x.getSubQuery().accept(this);
// } else {
// x.getSubQuery().accept(this);
//
// if (aliasMap != null && alias != null) {
// aliasMap.put(alias, null);
// subQueryMap.put(alias, x.getSubQuery().getQuery());
// }
// }
//
// return false;
// }
//
// public boolean visit(SQLSubqueryTableSource x) {
// x.getSelect().accept(this);
//
// SQLSelectQuery query = x.getSelect().getQuery();
//
// Map aliasMap = getAliasMap();
// if (aliasMap != null && x.getAlias() != null) {
// aliasMap.put(x.getAlias(), null);
// subQueryMap.put(x.getAlias(), query);
// }
// return false;
// }
//
// protected boolean isSimpleExprTableSource(SQLExprTableSource x) {
// return x.getExpr() instanceof SQLName;
// }
//
// public boolean visit(SQLExprTableSource x) {
// if (isSimpleExprTableSource(x)) {
// String ident = x.getExpr().toString();
//
// if (variants.containsKey(ident)) {
// return false;
// }
//
// if (subQueryMap.containsKey(ident)) {
// return false;
// }
//
// Map aliasMap = getAliasMap();
//
// TableStat stat = getTableStat(ident);
//
// Mode mode = getMode();
// if (mode != null) {
// switch (mode) {
// case Delete:
// stat.incrementDeleteCount();
// break;
// case Insert:
// stat.incrementInsertCount();
// break;
// case Update:
// stat.incrementUpdateCount();
// break;
// case Select:
// stat.incrementSelectCount();
// break;
// case Merge:
// stat.incrementMergeCount();
// break;
// case Drop:
// stat.incrementDropCount();
// break;
// default:
// break;
// }
// }
//
// if (aliasMap != null) {
// String alias = x.getAlias();
// if (alias != null && !aliasMap.containsKey(alias)) {
// aliasMap.put(alias, ident);
// }
// if (!aliasMap.containsKey(ident)) {
// aliasMap.put(ident, ident);
// }
// }
// } else {
// accept(x.getExpr());
// }
//
// return false;
// }
//
// public boolean visit(SQLSelectItem x) {
// x.getExpr().setParent(x);
// return true;
// }
//
// public void endVisit(SQLSelect x) {
// restoreCurrentTable(x);
// }
//
// public boolean visit(SQLSelect x) {
// setCurrentTable(x);
//
// if (x.getOrderBy() != null) {
// x.getOrderBy().setParent(x);
// }
//
// accept(x.getWithSubQuery());
// accept(x.getQuery());
//
// String originalTable = getCurrentTable();
//
// setCurrentTable((String) x.getQuery().getAttribute("table"));
// x.putAttribute("_old_local_", originalTable);
//
// accept(x.getOrderBy());
//
// setCurrentTable(originalTable);
//
// return false;
// }
//
// public boolean visit(SQLAggregateExpr x) {
// accept(x.getArguments());
// accept(x.getWithinGroup());
// accept(x.getOver());
// return false;
// }
//
// public boolean visit(SQLMethodInvokeExpr x) {
// accept(x.getParameters());
// return false;
// }
//
// public boolean visit(SQLUpdateStatement x) {
// setAliasMap();
//
// setMode(x, Mode.Update);
//
// SQLName identName = x.getTableName();
// if (identName != null) {
// String ident = identName.toString();
// setCurrentTable(ident);
//
// TableStat stat = getTableStat(ident);
// stat.incrementUpdateCount();
//
// Map aliasMap = getAliasMap();
// aliasMap.put(ident, ident);
// } else {
// x.getTableSource().accept(this);
// }
//
// accept(x.getItems());
// accept(x.getWhere());
//
// return false;
// }
//
// public boolean visit(SQLDeleteStatement x) {
// setAliasMap();
//
// setMode(x, Mode.Delete);
//
// String tableName = x.getTableName().toString();
// setCurrentTable(tableName);
//
// if (x.getAlias() != null) {
// this.aliasMap.put(x.getAlias(), tableName);
// }
//
// TableStat stat = getTableStat(tableName);
// stat.incrementDeleteCount();
//
// accept(x.getWhere());
//
// return false;
// }
//
// public boolean visit(SQLInListExpr x) {
// if (x.isNot()) {
// handleCondition(x.getExpr(), "NOT IN", x.getTargetList());
// } else {
// handleCondition(x.getExpr(), "IN", x.getTargetList());
// }
//
// return true;
// }
//
// @Override
// public boolean visit(SQLInSubQueryExpr x) {
// if (x.isNot()) {
// handleCondition(x.getExpr(), "NOT IN");
// } else {
// handleCondition(x.getExpr(), "IN");
// }
// return true;
// }
//
// public void endVisit(SQLDeleteStatement x) {
//
// }
//
// public void endVisit(SQLUpdateStatement x) {
// }
//
// public boolean visit(SQLCreateTableStatement x) {
// for (SQLTableElement e : x.getTableElementList()) {
// e.setParent(x);
// }
//
// String tableName = x.getName().toString();
//
// TableStat stat = getTableStat(tableName);
// stat.incrementCreateCount();
// setCurrentTable(x, tableName);
//
// accept(x.getTableElementList());
//
// restoreCurrentTable(x);
//
// if (x.getInherits() != null) {
// x.getInherits().accept(this);
// }
//
// return false;
// }
//
// public boolean visit(SQLColumnDefinition x) {
// String tableName = null;
// {
// SQLObject parent = x.getParent();
// if (parent instanceof SQLCreateTableStatement) {
// tableName = ((SQLCreateTableStatement) parent).getName().toString();
// }
// }
//
// if (tableName == null) {
// return true;
// }
//
// String columnName = x.getName().toString();
// addColumn(tableName, columnName);
//
// return false;
// }
//
// @Override
// public boolean visit(SQLCallStatement x) {
// return false;
// }
//
// @Override
// public void endVisit(SQLCommentStatement x) {
//
// }
//
// @Override
// public boolean visit(SQLCommentStatement x) {
// return false;
// }
//
// public boolean visit(SQLCurrentOfCursorExpr x) {
// return false;
// }
//
// @Override
// public boolean visit(SQLAlterTableAddColumn x) {
// SQLAlterTableStatement stmt = (SQLAlterTableStatement) x.getParent();
// String table = stmt.getName().toString();
//
// for (SQLColumnDefinition column : x.getColumns()) {
// String columnName = column.getName().toString();
// addColumn(table, columnName);
// }
// return false;
// }
//
// @Override
// public void endVisit(SQLAlterTableAddColumn x) {
//
// }
//
// @Override
// public boolean visit(SQLRollbackStatement x) {
// return false;
// }
//
// public boolean visit(SQLCreateViewStatement x) {
// x.getSubQuery().accept(this);
// return false;
// }
//
// @Override
// public boolean visit(SQLAlterTableDropForeignKey x) {
// return false;
// }
//
// @Override
// public boolean visit(SQLUseStatement x) {
// return false;
// }
//
// @Override
// public boolean visit(SQLAlterTableDisableConstraint x) {
// return false;
// }
//
// @Override
// public boolean visit(SQLAlterTableEnableConstraint x) {
// return false;
// }
//
// @Override
// public boolean visit(SQLAlterTableStatement x) {
// String tableName = x.getName().toString();
// TableStat stat = getTableStat(tableName);
// stat.incrementAlterCount();
//
// setCurrentTable(x, tableName);
//
// for (SQLAlterTableItem item : x.getItems()) {
// item.setParent(x);
// item.accept(this);
// }
//
// return false;
// }
//
// @Override
// public boolean visit(SQLAlterTableDropConstraint x) {
// return false;
// }
//
// @Override
// public boolean visit(SQLDropIndexStatement x) {
// setMode(x, Mode.DropIndex);
// SQLExprTableSource table = x.getTableName();
// if (table != null) {
// SQLName name = (SQLName) table.getExpr();
//
// String ident = name.toString();
// setCurrentTable(ident);
//
// TableStat stat = getTableStat(ident);
// stat.incrementDropIndexCount();
//
// Map aliasMap = getAliasMap();
// if (aliasMap != null) {
// aliasMap.put(ident, ident);
// }
// }
// return false;
// }
//
// @Override
// public boolean visit(SQLCreateIndexStatement x) {
// setMode(x, Mode.CreateIndex);
//
// SQLName name = (SQLName) ((SQLExprTableSource) x.getTable()).getExpr();
//
// String table = name.toString();
// setCurrentTable(table);
//
// TableStat stat = getTableStat(table);
// stat.incrementDropIndexCount();
//
// Map aliasMap = getAliasMap();
// if (aliasMap != null) {
// aliasMap.put(table, table);
// }
//
// for (SQLSelectOrderByItem item : x.getItems()) {
// SQLExpr expr = item.getExpr();
// if (expr instanceof SQLIdentifierExpr) {
// SQLIdentifierExpr identExpr = (SQLIdentifierExpr) expr;
// String columnName = identExpr.getName();
// addColumn(table, columnName);
// }
// }
//
// return false;
// }
//
// @Override
// public boolean visit(SQLForeignKeyImpl x) {
//
// for (SQLName column : x.getReferencingColumns()) {
// column.accept(this);
// }
//
// String table = x.getReferencedTableName().getSimpleName();
// setCurrentTable(table);
//
// TableStat stat = getTableStat(table);
// stat.incrementReferencedCount();
// for (SQLName column : x.getReferencedColumns()) {
// String columnName = column.getSimpleName();
// addColumn(table, columnName);
// }
//
// return false;
// }
//
// @Override
// public boolean visit(SQLDropSequenceStatement x) {
// return false;
// }
//
// @Override
// public boolean visit(SQLDropTriggerStatement x) {
// return false;
// }
//
// @Override
// public boolean visit(SQLDropUserStatement x) {
// return false;
// }
//
// @Override
// public boolean visit(SQLGrantStatement x) {
// if (x.getOn() != null && (x.getObjectType() == null || x.getObjectType() == SQLObjectType.TABLE)) {
// x.getOn().accept(this);
// }
// return false;
// }
//
// @Override
// public boolean visit(SQLRevokeStatement x) {
// if (x.getOn() != null) {
// x.getOn().accept(this);
// }
// return false;
// }
//
// @Override
// public boolean visit(SQLDropDatabaseStatement x) {
// return false;
// }
//
// @Override
// public boolean visit(SQLAlterTableAddIndex x) {
// for (SQLSelectOrderByItem item : x.getItems()) {
// item.accept(this);
// }
// return false;
// }
//
// public boolean visit(SQLCheck x) {
// x.getExpr().accept(this);
// return false;
// }
//
// public boolean visit(SQLCreateTriggerStatement x) {
// return false;
// }
//
// public boolean visit(SQLDropFunctionStatement x) {
// return false;
// }
//
// public boolean visit(SQLDropTableSpaceStatement x) {
// return false;
// }
//
// public boolean visit(SQLDropProcedureStatement x) {
// return false;
// }
//
// @Override
// public boolean visit(SQLAlterTableRename x) {
// return false;
// }
//
// @Override
// public boolean visit(SQLArrayExpr x) {
// accept(x.getValues());
//
// SQLExpr exp = x.getExpr();
// if (exp instanceof SQLIdentifierExpr) {
// if (((SQLIdentifierExpr) exp).getName().equals("ARRAY")) {
// return false;
// }
// }
// exp.accept(this);
// return false;
// }
//
// @Override
// public boolean visit(SQLOpenStatement x) {
// return false;
// }
//
// @Override
// public boolean visit(SQLFetchStatement x) {
// return false;
// }
//
// @Override
// public boolean visit(SQLCloseStatement x) {
// return false;
// }
//
//}