From b266a9c820279b541780446bd19dad7433ea8332 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Wed, 14 Mar 2012 14:02:18 +0800 Subject: [PATCH] refactor --- .../mapping/spi/MySqlMappingProvider.java | 11 ++++++++-- .../sql/ast/statement/SQLDeleteStatement.java | 6 +++++- .../sql/ast/statement/SQLUpdateStatement.java | 4 ++++ .../ast/statement/MySqlDeleteStatement.java | 5 ++--- .../druid/sql/parser/SQLStatementParser.java | 20 ++++++++++--------- .../sql/visitor/SQLASTOutputVisitor.java | 6 ++++-- .../druid/bvt/mapping/MappingVisitorTest.java | 5 +++++ 7 files changed, 40 insertions(+), 17 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 518f95b662..bb92f13379 100644 --- a/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingProvider.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingProvider.java @@ -59,7 +59,7 @@ public class MySqlMappingProvider implements MappingProvider { MySqlDeleteStatement stmt = parser.parseDeleteStatement(); if (stmt.getTableSource() == null) { Entity entity = engine.getFirstEntity(); - stmt.setTableName(new SQLIdentifierExpr(entity.getName())); + stmt.setTableSource(new SQLIdentifierExpr(entity.getName())); } return stmt; @@ -67,7 +67,14 @@ public class MySqlMappingProvider implements MappingProvider { public SQLUpdateStatement explainToUpdateSQLObject(MappingEngine engine, String sql) { MySqlStatementParser parser = new MySqlStatementParser(sql); - return parser.parseUpdateStatement(); + 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) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDeleteStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDeleteStatement.java index 03065caeaa..bc081b12a3 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDeleteStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDeleteStatement.java @@ -35,6 +35,10 @@ public class SQLDeleteStatement extends SQLStatementImpl { public SQLExprTableSource getTableSource() { return tableSource; } + + public void setTableSource(SQLExpr expr) { + this.setTableSource(new SQLExprTableSource(expr)); + } public void setTableSource(SQLExprTableSource tableSource) { this.tableSource = tableSource; @@ -45,7 +49,7 @@ public class SQLDeleteStatement extends SQLStatementImpl { } public void setTableName(SQLName tableName) { - this.tableSource = new SQLExprTableSource(tableName); + this.setTableSource(new SQLExprTableSource(tableName)); } public void setTableName(String name) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUpdateStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUpdateStatement.java index 9a036e85ce..987f17d6f2 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUpdateStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUpdateStatement.java @@ -39,6 +39,10 @@ public class SQLUpdateStatement extends SQLStatementImpl { public SQLTableSource getTableSource() { return tableSource; } + + public void setTableSource(SQLExpr expr) { + this.setTableSource(new SQLExprTableSource(expr)); + } public void setTableSource(SQLTableSource tableSource) { this.tableSource = tableSource; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDeleteStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDeleteStatement.java index 8f2f6a73d6..8810b87d72 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDeleteStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDeleteStatement.java @@ -84,9 +84,8 @@ public class MySqlDeleteStatement extends SQLDeleteStatement { } return (SQLName) tableSources.get(0).getExpr(); } - - public void setTableName(SQLName tableName) { - SQLExprTableSource tableSource = new SQLExprTableSource(tableName); + + public void setTableSource(SQLExprTableSource tableSource) { if (tableSources.size() == 0) { tableSources.add(tableSource); } else { diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index e56f0e69b2..308bb729a4 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -294,7 +294,7 @@ public class SQLStatementParser extends SQLParser { public SQLStatement parseCreate() throws ParserException { char mark_ch = lexer.current(); int mark_bp = lexer.bp(); - + accept(Token.CREATE); Token token = lexer.token(); @@ -313,14 +313,14 @@ public class SQLStatementParser extends SQLParser { lexer.reset(mark_bp, mark_ch, Token.CREATE); return parseCreateProcedure(); } - - //lexer.reset(mark_bp, mark_ch, Token.CREATE); + + // lexer.reset(mark_bp, mark_ch, Token.CREATE); throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } throw new ParserException("TODO " + lexer.token()); } - + public SQLStatement parseCreateProcedure() { throw new ParserException("TODO " + lexer.token()); } @@ -346,13 +346,15 @@ public class SQLStatementParser extends SQLParser { } public SQLUpdateStatement parseUpdateStatement() throws ParserException { - accept(Token.UPDATE); - SQLUpdateStatement udpateStatement = new SQLUpdateStatement(); + + if (lexer.token() == Token.UPDATE) { + lexer.nextToken(); - SQLTableSource tableSource = this.exprParser.createSelectParser().parseTableSource(); - udpateStatement.setTableSource(tableSource); - + SQLTableSource tableSource = this.exprParser.createSelectParser().parseTableSource(); + udpateStatement.setTableSource(tableSource); + } + accept(Token.SET); for (;;) { 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 001f2e3775..49d7181a1a 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -706,7 +706,8 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { x.getTableSource().accept(this); - print(" SET "); + println(); + print("SET "); for (int i = 0, size = x.getItems().size(); i < size; ++i) { if (i != 0) { print(", "); @@ -715,7 +716,8 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { } if (x.getWhere() != null) { - print(" WHERE "); + println(); + print("WHERE "); x.getWhere().setParent(x); x.getWhere().accept(this); } 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 3494e5709f..817a985dda 100644 --- a/src/test/java/com/alibaba/druid/bvt/mapping/MappingVisitorTest.java +++ b/src/test/java/com/alibaba/druid/bvt/mapping/MappingVisitorTest.java @@ -39,6 +39,11 @@ public class MappingVisitorTest extends TestCase { Assert.assertEquals("DELETE FROM device\nWHERE ip = '127.0.0.1'", engine.explainToDeleteSQL("WHERE IP地址 = '127.0.0.1'")); } + + public void test_update() throws Exception { + Assert.assertEquals("UPDATE device\nSET serviceTag = ?\nWHERE ip = '127.0.0.1'", + engine.explainToUpdateSQL("SET 编号 = ? WHERE IP地址 = '127.0.0.1'")); + } public void test_1() throws Exception { engine.setMaxLimit(10);