refactor oracle sql parser, merge If/ElseIf/ElseStatement

This commit is contained in:
高铁
2016-01-09 19:48:35 +08:00
parent ba8f949015
commit 6c126ba2f2
8 changed files with 17 additions and 245 deletions
@@ -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<SQLStatement> statements = new ArrayList<SQLStatement>();
private List<ElseIf> elseIfList = new ArrayList<ElseIf>();
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<SQLStatement> getStatements() {
return statements;
}
public void setStatements(List<SQLStatement> statements) {
this.statements = statements;
}
public List<ElseIf> getElseIfList() {
return elseIfList;
}
public void setElseIfList(List<ElseIf> 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<SQLStatement> statements = new ArrayList<SQLStatement>();
@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<SQLStatement> getStatements() {
return statements;
}
public void setStatements(List<SQLStatement> statements) {
this.statements = statements;
}
}
public static class Else extends OracleSQLObjectImpl {
private List<SQLStatement> statements = new ArrayList<SQLStatement>();
@Override
public void accept0(OracleASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, statements);
}
visitor.endVisit(this);
}
public List<SQLStatement> getStatements() {
return statements;
}
public void setStatements(List<SQLStatement> statements) {
this.statements = statements;
}
}
}
@@ -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;
@@ -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);
@@ -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;
@@ -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);
@@ -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;
@@ -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();
@@ -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);