/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package net.sf.jsqlparser; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import net.sf.jsqlparser.expression.AllComparisonExpression; import net.sf.jsqlparser.expression.AnyComparisonExpression; import net.sf.jsqlparser.expression.BinaryExpression; import net.sf.jsqlparser.expression.CaseExpression; import net.sf.jsqlparser.expression.DateValue; import net.sf.jsqlparser.expression.DoubleValue; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.ExpressionVisitor; import net.sf.jsqlparser.expression.Function; import net.sf.jsqlparser.expression.InverseExpression; import net.sf.jsqlparser.expression.JdbcParameter; import net.sf.jsqlparser.expression.LongValue; import net.sf.jsqlparser.expression.NamedParameter; import net.sf.jsqlparser.expression.NullValue; import net.sf.jsqlparser.expression.Parenthesis; import net.sf.jsqlparser.expression.StringValue; import net.sf.jsqlparser.expression.TimeValue; import net.sf.jsqlparser.expression.TimestampValue; import net.sf.jsqlparser.expression.WhenClause; import net.sf.jsqlparser.expression.operators.arithmetic.Addition; import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseAnd; import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseOr; import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseXor; import net.sf.jsqlparser.expression.operators.arithmetic.Concat; import net.sf.jsqlparser.expression.operators.arithmetic.Division; import net.sf.jsqlparser.expression.operators.arithmetic.Multiplication; import net.sf.jsqlparser.expression.operators.arithmetic.Subtraction; import net.sf.jsqlparser.expression.operators.conditional.AndExpression; import net.sf.jsqlparser.expression.operators.conditional.OrExpression; import net.sf.jsqlparser.expression.operators.relational.Between; import net.sf.jsqlparser.expression.operators.relational.EqualsTo; import net.sf.jsqlparser.expression.operators.relational.ExpressionList; import net.sf.jsqlparser.expression.operators.relational.GreaterThan; import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals; import net.sf.jsqlparser.expression.operators.relational.InExpression; import net.sf.jsqlparser.expression.operators.relational.IsNullExpression; import net.sf.jsqlparser.expression.operators.relational.ItemsListVisitor; import net.sf.jsqlparser.expression.operators.relational.LikeExpression; import net.sf.jsqlparser.expression.operators.relational.ExistsExpression; import net.sf.jsqlparser.expression.operators.relational.Matches; import net.sf.jsqlparser.expression.operators.relational.MinorThan; import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals; import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Table; import net.sf.jsqlparser.statement.Statement; import net.sf.jsqlparser.statement.delete.Delete; import net.sf.jsqlparser.statement.insert.Insert; import net.sf.jsqlparser.statement.select.Connect; import net.sf.jsqlparser.statement.select.FromItemVisitor; import net.sf.jsqlparser.statement.select.Join; import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.statement.select.SelectVisitor; import net.sf.jsqlparser.statement.select.SubJoin; import net.sf.jsqlparser.statement.select.SubSelect; import net.sf.jsqlparser.statement.select.Union; import net.sf.jsqlparser.statement.update.Update; /** * * @author mg */ public class TablesFinder implements SelectVisitor, FromItemVisitor, ExpressionVisitor, ItemsListVisitor { public enum TO_CASE { LOWER, UPPER } private TO_CASE toCase = null; private Map<String, Table> tables = new HashMap<>(); private boolean forTables; private TablesFinder() { super(); } private TablesFinder(TO_CASE aToCase, boolean aForTables) { super(); toCase = aToCase; forTables = aForTables; } public static Map<String, Table> getTablesMap(TO_CASE toCase, Statement aStatement, boolean aForTables) { TablesFinder instance = new TablesFinder(toCase, aForTables); if (aStatement instanceof Select) { ((Select) aStatement).getSelectBody().accept(instance); } else if (aStatement instanceof Delete) { Table tbl = ((Delete) aStatement).getTable(); instance.visit(tbl); } else if (aStatement instanceof Update) { Table tbl = ((Update) aStatement).getTable(); instance.visit(tbl); } else if (aStatement instanceof Insert) { Table tbl = ((Insert) aStatement).getTable(); instance.visit(tbl); } return instance.tables; } @Override public void visit(PlainSelect plainSelect) { if (plainSelect.getFromItem() != null) { plainSelect.getFromItem().accept(this); } if (plainSelect.getJoins() != null) { for (Iterator joinsIt = plainSelect.getJoins().iterator(); joinsIt.hasNext();) { Join join = (Join) joinsIt.next(); join.getRightItem().accept(this); } } if (plainSelect.getWhere() != null) { plainSelect.getWhere().accept(this); } } @Override public void visit(Union union) { if (!forTables) { Iterator iter = union.getPlainSelects().iterator(); if (iter.hasNext()) { PlainSelect plainSelect = (PlainSelect) iter.next(); visit(plainSelect); } } else { for (Iterator iter = union.getPlainSelects().iterator(); iter.hasNext();) { PlainSelect plainSelect = (PlainSelect) iter.next(); visit(plainSelect); } } } @Override public void visit(Table table) { String tableWholeName = table.getWholeTableName(); if (table.getAlias() != null && !"".equals(table.getAlias().getName())) { tableWholeName = table.getAlias().getName(); } else {// Если нет алиаса, то надо ориентироваться по имени таблицы (в имени м.б. и схема). // Однако, в списке from может быть указана таблица со схемой, а в списке select без неё. // Для того, чтобы соответствующая таблица из from могла быть найдена, если в её // имени присутствует имя схемы, то надо её добавить ещё раз и по имени без схемы. if (table.getSchemaName() != null && !table.getSchemaName().isEmpty()) { String nameWithoutSchema = table.getName(); if (toCase == TO_CASE.LOWER) { nameWithoutSchema = nameWithoutSchema.toLowerCase(); } else if (toCase == TO_CASE.UPPER) { nameWithoutSchema = nameWithoutSchema.toUpperCase(); } tables.put(nameWithoutSchema, table); } } if (toCase == TO_CASE.LOWER) { tableWholeName = tableWholeName.toLowerCase(); } else if (toCase == TO_CASE.UPPER) { tableWholeName = tableWholeName.toUpperCase(); } tables.put(tableWholeName, table); } @Override public void visit(SubSelect subSelect) { subSelect.getSelectBody().accept(this); } @Override public void visit(Addition addition) { visitBinaryExpression(addition); } @Override public void visit(AndExpression andExpression) { visitBinaryExpression(andExpression); } @Override public void visit(Between between) { between.getLeftExpression().accept(this); between.getBetweenExpressionStart().accept(this); between.getBetweenExpressionEnd().accept(this); } @Override public void visit(Column tableColumn) { } @Override public void visit(Division division) { visitBinaryExpression(division); } @Override public void visit(DoubleValue doubleValue) { } @Override public void visit(EqualsTo equalsTo) { visitBinaryExpression(equalsTo); } @Override public void visit(Function function) { } @Override public void visit(GreaterThan greaterThan) { visitBinaryExpression(greaterThan); } @Override public void visit(GreaterThanEquals greaterThanEquals) { visitBinaryExpression(greaterThanEquals); } @Override public void visit(InExpression inExpression) { inExpression.getLeftExpression().accept(this); inExpression.getItemsList().accept(this); } @Override public void visit(InverseExpression inverseExpression) { inverseExpression.getExpression().accept(this); } @Override public void visit(IsNullExpression isNullExpression) { } @Override public void visit(JdbcParameter jdbcParameter) { } @Override public void visit(NamedParameter namedParameter) { } @Override public void visit(LikeExpression likeExpression) { visitBinaryExpression(likeExpression); } @Override public void visit(ExistsExpression existsExpression) { existsExpression.getRightExpression().accept(this); } @Override public void visit(LongValue longValue) { } @Override public void visit(MinorThan minorThan) { visitBinaryExpression(minorThan); } @Override public void visit(MinorThanEquals minorThanEquals) { visitBinaryExpression(minorThanEquals); } @Override public void visit(Multiplication multiplication) { visitBinaryExpression(multiplication); } @Override public void visit(NotEqualsTo notEqualsTo) { visitBinaryExpression(notEqualsTo); } @Override public void visit(NullValue nullValue) { } @Override public void visit(OrExpression orExpression) { visitBinaryExpression(orExpression); } @Override public void visit(Parenthesis parenthesis) { parenthesis.getExpression().accept(this); } @Override public void visit(StringValue stringValue) { } @Override public void visit(Subtraction subtraction) { visitBinaryExpression(subtraction); } public void visitBinaryExpression(BinaryExpression binaryExpression) { binaryExpression.getLeftExpression().accept(this); binaryExpression.getRightExpression().accept(this); } @Override public void visit(ExpressionList expressionList) { for (Iterator iter = expressionList.getExpressions().iterator(); iter.hasNext();) { Expression expression = (Expression) iter.next(); expression.accept(this); } } @Override public void visit(DateValue dateValue) { } @Override public void visit(TimestampValue timestampValue) { } @Override public void visit(TimeValue timeValue) { } /* (non-Javadoc) * @see net.sf.jsqlparser.expression.ExpressionVisitor#visit(net.sf.jsqlparser.expression.CaseExpression) */ @Override public void visit(CaseExpression caseExpression) { // TODO Auto-generated method stub } /* (non-Javadoc) * @see net.sf.jsqlparser.expression.ExpressionVisitor#visit(net.sf.jsqlparser.expression.WhenClause) */ @Override public void visit(WhenClause whenClause) { // TODO Auto-generated method stub } @Override public void visit(AllComparisonExpression allComparisonExpression) { allComparisonExpression.GetSubSelect().getSelectBody().accept(this); } @Override public void visit(AnyComparisonExpression anyComparisonExpression) { anyComparisonExpression.GetSubSelect().getSelectBody().accept(this); } @Override public void visit(SubJoin subjoin) { subjoin.getLeft().accept(this); subjoin.getJoin().getRightItem().accept(this); } @Override public void visit(Concat concat) { visitBinaryExpression(concat); } @Override public void visit(Matches matches) { visitBinaryExpression(matches); } @Override public void visit(BitwiseAnd bitwiseAnd) { visitBinaryExpression(bitwiseAnd); } @Override public void visit(BitwiseOr bitwiseOr) { visitBinaryExpression(bitwiseOr); } @Override public void visit(BitwiseXor bitwiseXor) { visitBinaryExpression(bitwiseXor); } @Override public void visit(Connect aConnect) { } }