All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sharksharding.sql.visitor.SchemaStatVisitor Maven / Gradle / Ivy

The newest version!
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 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;
//    }
//
//}