From 6c126ba2f2ee40a5962a762d1da0a6d994d5c02a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Sat, 9 Jan 2016 19:48:35 +0800 Subject: [PATCH] refactor oracle sql parser, merge If/ElseIf/ElseStatement --- .../oracle/ast/stmt/OracleIfStatement.java | 129 ------------------ .../oracle/parser/OracleStatementParser.java | 8 +- .../oracle/visitor/OracleASTVisitor.java | 15 -- .../visitor/OracleASTVisitorAdapter.java | 33 ----- .../oracle/visitor/OracleOutputVisitor.java | 27 +--- .../visitor/OracleSchemaStatVisitor.java | 33 ----- .../sql/visitor/SQLASTOutputVisitor.java | 5 + .../visitor/OracleASTVisitorAdapterTest.java | 12 +- 8 files changed, 17 insertions(+), 245 deletions(-) delete mode 100644 src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleIfStatement.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleIfStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleIfStatement.java deleted file mode 100644 index 2a8ae416e0..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleIfStatement.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * 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.dialect.oracle.ast.stmt; - -import java.util.ArrayList; -import java.util.List; - -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; -import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; - -public class OracleIfStatement extends OracleStatementImpl { - - private SQLExpr condition; - private List statements = new ArrayList(); - private List elseIfList = new ArrayList(); - private Else elseItem; - - @Override - public void accept0(OracleASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, condition); - acceptChild(visitor, statements); - acceptChild(visitor, elseIfList); - acceptChild(visitor, elseItem); - } - visitor.endVisit(this); - } - - public SQLExpr getCondition() { - return condition; - } - - public void setCondition(SQLExpr condition) { - this.condition = condition; - } - - public List getStatements() { - return statements; - } - - public void setStatements(List statements) { - this.statements = statements; - } - - public List getElseIfList() { - return elseIfList; - } - - public void setElseIfList(List elseIfList) { - this.elseIfList = elseIfList; - } - - public Else getElseItem() { - return elseItem; - } - - public void setElseItem(Else elseItem) { - this.elseItem = elseItem; - } - - public static class ElseIf extends OracleSQLObjectImpl { - - private SQLExpr condition; - private List statements = new ArrayList(); - - @Override - public void accept0(OracleASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, condition); - acceptChild(visitor, statements); - } - visitor.endVisit(this); - } - - public SQLExpr getCondition() { - return condition; - } - - public void setCondition(SQLExpr condition) { - this.condition = condition; - } - - public List getStatements() { - return statements; - } - - public void setStatements(List statements) { - this.statements = statements; - } - - } - - public static class Else extends OracleSQLObjectImpl { - - private List statements = new ArrayList(); - - @Override - public void accept0(OracleASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, statements); - } - visitor.endVisit(this); - } - - public List getStatements() { - return statements; - } - - public void setStatements(List statements) { - this.statements = statements; - } - - } -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java index d2a9e32c5e..eec7f3be88 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java @@ -39,6 +39,7 @@ import com.alibaba.druid.sql.ast.statement.SQLDropSequenceStatement; 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.SQLIfStatement; import com.alibaba.druid.sql.ast.statement.SQLInsertInto; import com.alibaba.druid.sql.ast.statement.SQLRollbackStatement; import com.alibaba.druid.sql.ast.statement.SQLSelect; @@ -85,7 +86,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; @@ -492,7 +492,7 @@ public class OracleStatementParser extends SQLStatementParser { public SQLStatement parseIf() { accept(Token.IF); - OracleIfStatement stmt = new OracleIfStatement(); + SQLIfStatement stmt = new SQLIfStatement(); stmt.setCondition(this.exprParser.expr()); @@ -506,7 +506,7 @@ public class OracleStatementParser extends SQLStatementParser { if (lexer.token() == Token.IF) { lexer.nextToken(); - OracleIfStatement.ElseIf elseIf = new OracleIfStatement.ElseIf(); + SQLIfStatement.ElseIf elseIf = new SQLIfStatement.ElseIf(); elseIf.setCondition(this.exprParser.expr()); @@ -515,7 +515,7 @@ public class OracleStatementParser extends SQLStatementParser { stmt.getElseIfList().add(elseIf); } else { - OracleIfStatement.Else elseItem = new OracleIfStatement.Else(); + SQLIfStatement.Else elseItem = new SQLIfStatement.Else(); this.parseStatementList(elseItem.getStatements()); stmt.setElseItem(elseItem); break; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java index 4759f3a15f..fdb6efc0d3 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java @@ -84,9 +84,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForeignKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.Else; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.ElseIf; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; @@ -422,18 +419,6 @@ public interface OracleASTVisitor extends SQLASTVisitor { void endVisit(OracleForStatement x); - boolean visit(Else x); - - void endVisit(Else x); - - boolean visit(ElseIf x); - - void endVisit(ElseIf x); - - boolean visit(OracleIfStatement x); - - void endVisit(OracleIfStatement x); - boolean visit(OracleRangeExpr x); void endVisit(OracleRangeExpr x); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java index 35337fd4c2..663bfedcf3 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java @@ -92,9 +92,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForeignKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.Else; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.ElseIf; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; @@ -937,36 +934,6 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora } - @Override - public boolean visit(Else x) { - return true; - } - - @Override - public void endVisit(Else x) { - - } - - @Override - public boolean visit(ElseIf x) { - return true; - } - - @Override - public void endVisit(ElseIf x) { - - } - - @Override - public boolean visit(OracleIfStatement x) { - return true; - } - - @Override - public void endVisit(OracleIfStatement x) { - - } - @Override public boolean visit(OracleRangeExpr x) { return true; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java index 157dc02f8c..af0ceda307 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java @@ -34,6 +34,7 @@ import com.alibaba.druid.sql.ast.statement.SQLCheck; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl; +import com.alibaba.druid.sql.ast.statement.SQLIfStatement; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType; import com.alibaba.druid.sql.ast.statement.SQLRollbackStatement; @@ -126,9 +127,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForeignKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.Else; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.ElseIf; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; @@ -2185,7 +2183,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } @Override - public boolean visit(Else x) { + public boolean visit(SQLIfStatement.Else x) { print0(ucase ? "ELSE" : "else"); incrementIndent(); println(); @@ -2205,7 +2203,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } @Override - public boolean visit(ElseIf x) { + public boolean visit(SQLIfStatement.ElseIf x) { print0(ucase ? "ELSE IF " : "else if "); x.getCondition().accept(this); print0(ucase ? " THEN" : " then"); @@ -2227,17 +2225,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } @Override - public void endVisit(ElseIf x) { - - } - - @Override - public void endVisit(Else x) { - - } - - @Override - public boolean visit(OracleIfStatement x) { + public boolean visit(SQLIfStatement x) { print0(ucase ? "IF " : "if "); x.getCondition().accept(this); print0(ucase ? " THEN" : " then"); @@ -2254,7 +2242,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS print(';'); decrementIndent(); - for (ElseIf elseIf : x.getElseIfList()) { + for (SQLIfStatement.ElseIf elseIf : x.getElseIfList()) { println(); elseIf.accept(this); } @@ -2268,11 +2256,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS return false; } - @Override - public void endVisit(OracleIfStatement x) { - - } - @Override public boolean visit(OracleRangeExpr x) { x.getLowBound().accept(this); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java index 3af42132b3..e67e5346f8 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java @@ -115,9 +115,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForeignKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.Else; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.ElseIf; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; @@ -1328,36 +1325,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle } - @Override - public boolean visit(Else x) { - return true; - } - - @Override - public void endVisit(Else x) { - - } - - @Override - public boolean visit(ElseIf x) { - return true; - } - - @Override - public void endVisit(ElseIf x) { - - } - - @Override - public boolean visit(OracleIfStatement x) { - return true; - } - - @Override - public void endVisit(OracleIfStatement x) { - - } - @Override public boolean visit(OracleRangeExpr x) { return true; diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index c493c7c602..cd673e12a3 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -2475,6 +2475,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab } } decrementIndent(); + + for (SQLIfStatement.ElseIf elseIf : x.getElseIfList()) { + println(); + elseIf.accept(this); + } if (x.getElseItem() != null) { println(); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java index 42471add0b..04ec24025a 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java @@ -1,12 +1,10 @@ package com.alibaba.druid.bvt.sql.oracle.visitor; -import junit.framework.TestCase; - import com.alibaba.druid.sql.ast.expr.SQLGroupingSetExpr; import com.alibaba.druid.sql.ast.expr.SQLTimestampExpr; -import com.alibaba.druid.sql.ast.statement.SQLFetchStatement; import com.alibaba.druid.sql.ast.statement.SQLAlterTableRename; import com.alibaba.druid.sql.ast.statement.SQLDropSequenceStatement; +import com.alibaba.druid.sql.ast.statement.SQLFetchStatement; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp; @@ -78,9 +76,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.Else; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.ElseIf; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; @@ -107,6 +102,8 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSetTransactionStateme import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitorAdapter; +import junit.framework.TestCase; + public class OracleASTVisitorAdapterTest extends TestCase { public void test_adapter() throws Exception { @@ -203,9 +200,6 @@ public class OracleASTVisitorAdapterTest extends TestCase { new OracleAlterIndexStatement().accept(adapter); new OracleForStatement().accept(adapter); new OracleAlterIndexStatement().accept(adapter); - new Else().accept(adapter); - new ElseIf().accept(adapter); - new OracleIfStatement().accept(adapter); new OracleRangeExpr().accept(adapter); new OracleAlterTableAddConstaint().accept(adapter); new OraclePrimaryKey().accept(adapter);