From 6b7958dbfdeb8f28ee5cbe548939c8d928ab4649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Wed, 14 Mar 2012 14:25:29 +0800 Subject: [PATCH] refactor --- .../mapping/spi/MySqlMappingProvider.java | 31 ++++++---- .../sql/ast/statement/SQLInsertInto.java | 18 +++++- .../sql/ast/statement/SQLInsertStatement.java | 2 +- .../ast/statement/MySqlInsertStatement.java | 2 +- .../mysql/parser/MySqlStatementParser.java | 57 ++++++++++--------- .../mysql/visitor/MySqlOutputVisitor.java | 2 - .../ast/stmt/OracleInsertStatement.java | 2 +- .../ast/stmt/OracleMultiInsertStatement.java | 2 +- .../ast/stmt/PGInsertStatement.java | 2 +- .../druid/bvt/mapping/MappingVisitorTest.java | 5 ++ 10 files changed, 74 insertions(+), 49 deletions(-) diff --git a/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingProvider.java b/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingProvider.java index bb92f13379..3a0f4116d9 100644 --- a/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingProvider.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingProvider.java @@ -29,7 +29,7 @@ public class MySqlMappingProvider implements MappingProvider { public SQLASTOutputVisitor createOutputVisitor(MappingEngine engine, Appendable out) { return new MySqlOutputVisitor(out); } - + public SQLSelectQueryBlock explainToSelectSQLObject(MappingEngine engine, String sql) { MySqlSelectParser selectParser = new MySqlSelectParser(sql); MySqlSelectQueryBlock query = (MySqlSelectQueryBlock) selectParser.query(); @@ -52,36 +52,43 @@ public class MySqlMappingProvider implements MappingProvider { return query; } - + public MySqlDeleteStatement explainToDeleteSQLObject(MappingEngine engine, String sql) { MySqlStatementParser parser = new MySqlStatementParser(sql); - + MySqlDeleteStatement stmt = parser.parseDeleteStatement(); if (stmt.getTableSource() == null) { Entity entity = engine.getFirstEntity(); stmt.setTableSource(new SQLIdentifierExpr(entity.getName())); } - + return stmt; } - + public SQLUpdateStatement explainToUpdateSQLObject(MappingEngine engine, String sql) { MySqlStatementParser parser = new MySqlStatementParser(sql); SQLUpdateStatement stmt = parser.parseUpdateStatement(); + + if (stmt.getTableSource() == null) { + Entity entity = engine.getFirstEntity(); + stmt.setTableSource(new SQLIdentifierExpr(entity.getName())); + } + + return stmt; + } + + public SQLInsertStatement explainToInsertSQLObject(MappingEngine engine, String sql) { + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLInsertStatement stmt = (SQLInsertStatement) parser.parseInsert(); if (stmt.getTableSource() == null) { Entity entity = engine.getFirstEntity(); stmt.setTableSource(new SQLIdentifierExpr(entity.getName())); } - + return stmt; } - - public SQLInsertStatement explainToInsertSQLObject(MappingEngine engine, String sql) { - MySqlStatementParser parser = new MySqlStatementParser(sql); - return (SQLInsertStatement) parser.parseInsert(); - } - + @Override public ExportParameterVisitor createExportParameterVisitor(List parameters) { return new MySqlExportParameterVisitor(parameters); diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertInto.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertInto.java index 43c4ce6fe6..4f9eec907f 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertInto.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertInto.java @@ -11,7 +11,7 @@ import com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause; public abstract class SQLInsertInto extends SQLObjectImpl { private static final long serialVersionUID = 1L; - protected SQLName tableName; + protected SQLExprTableSource tableSource; protected String alias; protected final List columns = new ArrayList(); @@ -30,12 +30,24 @@ public abstract class SQLInsertInto extends SQLObjectImpl { this.alias = alias; } + public SQLExprTableSource getTableSource() { + return tableSource; + } + + public void setTableSource(SQLExprTableSource tableSource) { + this.tableSource = tableSource; + } + public SQLName getTableName() { - return tableName; + return (SQLName) tableSource.getExpr(); } public void setTableName(SQLName tableName) { - this.tableName = tableName; + this.setTableSource(new SQLExprTableSource(tableName)); + } + + public void setTableSource(SQLName tableName) { + this.setTableSource(new SQLExprTableSource(tableName)); } public SQLSelect getQuery() { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java index 64bbac3037..bb96212315 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java @@ -34,7 +34,7 @@ public class SQLInsertStatement extends SQLInsertInto implements SQLStatement { @Override protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { - this.acceptChild(visitor, tableName); + this.acceptChild(visitor, tableSource); this.acceptChild(visitor, columns); this.acceptChild(visitor, values); this.acceptChild(visitor, query); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlInsertStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlInsertStatement.java index 74dbbbb31f..611901456e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlInsertStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlInsertStatement.java @@ -107,7 +107,7 @@ public class MySqlInsertStatement extends SQLInsertStatement { protected void accept0(MySqlASTVisitor visitor) { if (visitor.visit(this)) { - this.acceptChild(visitor, getTableName()); + this.acceptChild(visitor, getTableSource()); this.acceptChild(visitor, getColumns()); this.acceptChild(visitor, getValuesList()); this.acceptChild(visitor, getQuery()); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java index b7247225ce..289c016822 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java @@ -117,7 +117,7 @@ public class MySqlStatementParser extends SQLStatementParser { lexer.nextToken(); continue; } - + break; } @@ -138,7 +138,7 @@ public class MySqlStatementParser extends SQLStatementParser { lexer.nextToken(); continue; } - + break; } } @@ -910,40 +910,43 @@ public class MySqlStatementParser extends SQLStatementParser { } public SQLInsertStatement parseInsert() { - accept(Token.INSERT); - MySqlInsertStatement insertStatement = new MySqlInsertStatement(); - if (identifierEquals("LOW_PRIORITY")) { - insertStatement.setLowPriority(true); + if (lexer.token() == Token.INSERT) { lexer.nextToken(); - } - if (identifierEquals("DELAYED")) { - insertStatement.setDelayed(true); - lexer.nextToken(); - } + if (identifierEquals("LOW_PRIORITY")) { + insertStatement.setLowPriority(true); + lexer.nextToken(); + } - if (identifierEquals("HIGH_PRIORITY")) { - insertStatement.setHighPriority(true); - lexer.nextToken(); - } + if (identifierEquals("DELAYED")) { + insertStatement.setDelayed(true); + lexer.nextToken(); + } - if (identifierEquals("IGNORE")) { - insertStatement.setIgnore(true); - lexer.nextToken(); - } + if (identifierEquals("HIGH_PRIORITY")) { + insertStatement.setHighPriority(true); + lexer.nextToken(); + } - if (lexer.token() == Token.INTO) { - lexer.nextToken(); - } + if (identifierEquals("IGNORE")) { + insertStatement.setIgnore(true); + lexer.nextToken(); + } - SQLName tableName = this.exprParser.name(); - insertStatement.setTableName(tableName); + if (lexer.token() == Token.INTO) { + lexer.nextToken(); + } + + SQLName tableName = this.exprParser.name(); + insertStatement.setTableName(tableName); + + if (lexer.token() == Token.IDENTIFIER) { + insertStatement.setAlias(lexer.stringVal()); + lexer.nextToken(); + } - if (lexer.token() == Token.IDENTIFIER) { - insertStatement.setAlias(lexer.stringVal()); - lexer.nextToken(); } if (lexer.token() == (Token.LPAREN)) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index b84a936387..06d13f53f3 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -725,7 +725,6 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV x.getTableName().accept(this); if (x.getColumns().size() > 0) { - incrementIndent(); println(); print("("); for (int i = 0, size = x.getColumns().size(); i < size; ++i) { @@ -739,7 +738,6 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV x.getColumns().get(i).accept(this); } print(")"); - decrementIndent(); } if (x.getValuesList().size() != 0) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleInsertStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleInsertStatement.java index 6b5fb5e9fc..b516850c3b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleInsertStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleInsertStatement.java @@ -49,7 +49,7 @@ public class OracleInsertStatement extends SQLInsertStatement implements OracleS public void accept0(OracleASTVisitor visitor) { if (visitor.visit(this)) { - this.acceptChild(visitor, tableName); + this.acceptChild(visitor, tableSource); this.acceptChild(visitor, columns); this.acceptChild(visitor, values); this.acceptChild(visitor, query); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleMultiInsertStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleMultiInsertStatement.java index 8e91c3144c..3c38056512 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleMultiInsertStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleMultiInsertStatement.java @@ -173,7 +173,7 @@ public class OracleMultiInsertStatement extends OracleStatementImpl { @Override public void accept0(OracleASTVisitor visitor) { if (visitor.visit(this)) { - this.acceptChild(visitor, tableName); + this.acceptChild(visitor, tableSource); this.acceptChild(visitor, columns); this.acceptChild(visitor, values); this.acceptChild(visitor, query); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGInsertStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGInsertStatement.java index 92c84b0fcb..82baf9034e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGInsertStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGInsertStatement.java @@ -60,7 +60,7 @@ public class PGInsertStatement extends SQLInsertStatement implements PGSQLStatem public void accept0(PGASTVisitor visitor) { if (visitor.visit(this)) { this.acceptChild(visitor, with); - this.acceptChild(visitor, tableName); + this.acceptChild(visitor, tableSource); this.acceptChild(visitor, columns); this.acceptChild(visitor, valuesList); this.acceptChild(visitor, query); diff --git a/src/test/java/com/alibaba/druid/bvt/mapping/MappingVisitorTest.java b/src/test/java/com/alibaba/druid/bvt/mapping/MappingVisitorTest.java index 817a985dda..ebd8b58a6f 100644 --- a/src/test/java/com/alibaba/druid/bvt/mapping/MappingVisitorTest.java +++ b/src/test/java/com/alibaba/druid/bvt/mapping/MappingVisitorTest.java @@ -44,6 +44,11 @@ public class MappingVisitorTest extends TestCase { Assert.assertEquals("UPDATE device\nSET serviceTag = ?\nWHERE ip = '127.0.0.1'", engine.explainToUpdateSQL("SET 编号 = ? WHERE IP地址 = '127.0.0.1'")); } + + public void test_insert() throws Exception { + Assert.assertEquals("INSERT INTO device\n(serviceTag, ip)\nVALUES\n(?, ?)", + engine.explainToInsertSQL("(编号, IP地址) VALUES (?, ?)")); + } public void test_1() throws Exception { engine.setMaxLimit(10);