From 855c64d197004be712e319e56c1dea6e5e2c8d51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Sun, 18 Mar 2012 14:54:41 +0800 Subject: [PATCH] refactor --- .../mysql/visitor/MySqlSchemaStatVisitor.java | 18 +++----- .../druid/sql/visitor/SchemaStatVisitor.java | 9 ++-- .../bvt/sql/mysql/MySqlDeleteTest_0.java | 44 +++++++++++++++++++ .../bvt/sql/mysql/MySqlDeleteTest_1.java | 44 +++++++++++++++++++ .../bvt/sql/mysql/MySqlDeleteTest_2.java | 44 +++++++++++++++++++ 5 files changed, 144 insertions(+), 15 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_0.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_1.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_2.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java index 6fbf20ca81..fa5359b631 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java @@ -63,8 +63,10 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS setMode(x, Mode.Delete); - setAliasMap(); - + accept(x.getFrom()); + accept(x.getUsing()); + x.getTableSource().accept(this); + if (x.getTableSource() instanceof SQLExprTableSource) { SQLName tableName = (SQLName) ((SQLExprTableSource) x.getTableSource()).getExpr(); String ident = tableName.toString(); @@ -72,18 +74,10 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS TableStat stat = this.getTableStat(ident); stat.incrementDeleteCount(); - } else { - MySqlSchemaStatVisitor tableSourceVisitor = new MySqlSchemaStatVisitor(); - tableSourceVisitor.accept(x.getTableSource()); - for (TableStat.Name name : tableSourceVisitor.getTables().keySet()) { - TableStat stat = this.getTableStat(name.getName()); - stat.incrementDeleteCount(); - } - } + } accept(x.getWhere()); - accept(x.getFrom()); - accept(x.getUsing()); + accept(x.getOrderBy()); accept(x.getLimit()); diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java index 8dff34dc8c..6af0022f01 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -723,10 +723,13 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } if (aliasMap != null) { - if (x.getAlias() != null) { - aliasMap.put(x.getAlias(), ident); + String alias = x.getAlias(); + if (alias != null && !aliasMap.containsKey(alias)) { + aliasMap.put(alias, ident); + } + if (!aliasMap.containsKey(ident)) { + aliasMap.put(ident, ident); } - aliasMap.put(ident, ident); } } else { accept(x.getExpr()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_0.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_0.java new file mode 100644 index 0000000000..0056453991 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_0.java @@ -0,0 +1,44 @@ +package com.alibaba.druid.bvt.sql.mysql; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.stat.TableStat.Column; + +public class MySqlDeleteTest_0 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "DELETE a1, a2 FROM t1 AS a1 INNER JOIN t2 AS a2 WHERE a1.id=a2.id;"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(2, visitor.getTables().size()); + Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(2, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t1"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t2"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("t1", "id"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("t2", "id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_1.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_1.java new file mode 100644 index 0000000000..5e28d2ad44 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_1.java @@ -0,0 +1,44 @@ +package com.alibaba.druid.bvt.sql.mysql; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.stat.TableStat.Column; + +public class MySqlDeleteTest_1 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "DELETE FROM a1, a2 USING t1 AS a1 INNER JOIN t2 AS a2 WHERE a1.id=a2.id;"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(2, visitor.getTables().size()); + Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(2, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t1"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t2"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("t1", "id"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("t2", "id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_2.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_2.java new file mode 100644 index 0000000000..4421e3401c --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_2.java @@ -0,0 +1,44 @@ +package com.alibaba.druid.bvt.sql.mysql; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.stat.TableStat.Column; + +public class MySqlDeleteTest_2 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "DELETE t1 FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(2, visitor.getTables().size()); + Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(3, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t1"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t2"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("t1", "id"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("t2", "id"))); + } +}