From 591feee11a7e1f785b4b3461520b47ef02da848c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Mon, 12 Mar 2012 21:03:45 +0800 Subject: [PATCH] refactor --- .../alibaba/druid/mapping/MappingEngine.java | 15 ++- .../druid/mapping/OracleMappingVisitor.java | 93 ------------------- .../spi/MSSQLServerMappingVisitor.java | 84 +++++++++++++++++ .../mapping/{ => spi}/MappingProvider.java | 3 +- .../mapping/{ => spi}/MappingVisitor.java | 3 +- .../{ => spi}/MappingVisitorUtils.java | 27 +++++- .../{ => spi}/MySqlMappingProvider.java | 3 +- .../{ => spi}/MySqlMappingVisitor.java | 27 ++---- .../{ => spi}/OracleMappingProvider.java | 3 +- .../mapping/spi/OracleMappingVisitor.java | 88 ++++++++++++++++++ .../visitor/SQLServerASTVisitorAdapter.java | 29 ++++++ 11 files changed, 256 insertions(+), 119 deletions(-) delete mode 100644 src/main/java/com/alibaba/druid/mapping/OracleMappingVisitor.java create mode 100644 src/main/java/com/alibaba/druid/mapping/spi/MSSQLServerMappingVisitor.java rename src/main/java/com/alibaba/druid/mapping/{ => spi}/MappingProvider.java (81%) rename src/main/java/com/alibaba/druid/mapping/{ => spi}/MappingVisitor.java (81%) rename src/main/java/com/alibaba/druid/mapping/{ => spi}/MappingVisitorUtils.java (83%) rename src/main/java/com/alibaba/druid/mapping/{ => spi}/MySqlMappingProvider.java (95%) rename src/main/java/com/alibaba/druid/mapping/{ => spi}/MySqlMappingVisitor.java (81%) rename src/main/java/com/alibaba/druid/mapping/{ => spi}/OracleMappingProvider.java (91%) create mode 100644 src/main/java/com/alibaba/druid/mapping/spi/OracleMappingVisitor.java create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java diff --git a/src/main/java/com/alibaba/druid/mapping/MappingEngine.java b/src/main/java/com/alibaba/druid/mapping/MappingEngine.java index 0ae2680710..debea1322e 100644 --- a/src/main/java/com/alibaba/druid/mapping/MappingEngine.java +++ b/src/main/java/com/alibaba/druid/mapping/MappingEngine.java @@ -2,6 +2,9 @@ package com.alibaba.druid.mapping; import java.util.LinkedHashMap; +import com.alibaba.druid.mapping.spi.MappingProvider; +import com.alibaba.druid.mapping.spi.MappingVisitor; +import com.alibaba.druid.mapping.spi.MySqlMappingProvider; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; @@ -9,7 +12,15 @@ public class MappingEngine { private LinkedHashMap entities = new LinkedHashMap(); private Integer maxLimit; - private MappingProvider provider; + private final MappingProvider provider; + + public MappingEngine(){ + this(new MySqlMappingProvider()); + } + + public MappingEngine(MappingProvider provider){ + this.provider = provider; + } public Integer getMaxLimit() { return maxLimit; @@ -34,7 +45,7 @@ public class MappingEngine { public SQLASTOutputVisitor createOutputVisitor(Appendable out) { return provider.createOutputVisitor(this, out); } - + public SQLSelectQueryBlock explainToSQLObject(String sql) { return provider.explainToSQLObject(this, sql); } diff --git a/src/main/java/com/alibaba/druid/mapping/OracleMappingVisitor.java b/src/main/java/com/alibaba/druid/mapping/OracleMappingVisitor.java deleted file mode 100644 index dd09b3482e..0000000000 --- a/src/main/java/com/alibaba/druid/mapping/OracleMappingVisitor.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.alibaba.druid.mapping; - -import java.util.LinkedHashMap; -import java.util.Map; - -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; -import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource; -import com.alibaba.druid.sql.ast.statement.SQLSelectItem; -import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; -import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource; -import com.alibaba.druid.sql.ast.statement.SQLTableSource; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference; -import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVIsitorAdapter; - -public class OracleMappingVisitor extends OracleASTVIsitorAdapter implements MappingVisitor { - private final LinkedHashMap entities; - private final Map tableSources = new LinkedHashMap(); - - public OracleMappingVisitor(LinkedHashMap entities) { - super(); - this.entities = entities; - } - - public LinkedHashMap getEntities() { - return entities; - } - - public Map getTableSources() { - return tableSources; - } - - public Entity getFirstEntity() { - for (Map.Entry entry : entities.entrySet()) { - return entry.getValue(); - } - - return null; - } - - public Entity getEntity(String name) { - Entity entity = this.entities.get(name); - - if (entity == null) { - for (Map.Entry entry : entities.entrySet()) { - if (entry.getKey().equalsIgnoreCase(name)) { - entity = entry.getValue(); - break; - } - } - } - - return entity; - } - - public boolean visit(SQLSelectItem x) { - x.getExpr().setParent(x); - return true; - } - - public boolean visit(OracleSelectQueryBlock x) { - return MappingVisitorUtils.visit(this, x); - } - - public boolean visit(SQLSelectQueryBlock x) { - return MappingVisitorUtils.visit(this, x); - } - - protected void fillSelectList(SQLSelectQueryBlock x) { - MappingVisitorUtils.fillSelectList(this, x); - } - - public boolean visit(SQLIdentifierExpr x) { - return MappingVisitorUtils.visit(this, x); - } - - public boolean visit(SQLSubqueryTableSource x) { - return MappingVisitorUtils.visit(this, x); - } - - public boolean visit(SQLJoinTableSource x) { - return MappingVisitorUtils.visit(this, x); - } - - public boolean visit(SQLExprTableSource x) { - return MappingVisitorUtils.visit(this, x); - } - - public boolean visit(OracleSelectTableReference x) { - return MappingVisitorUtils.visit(this, x); - } -} diff --git a/src/main/java/com/alibaba/druid/mapping/spi/MSSQLServerMappingVisitor.java b/src/main/java/com/alibaba/druid/mapping/spi/MSSQLServerMappingVisitor.java new file mode 100644 index 0000000000..0e676e9e81 --- /dev/null +++ b/src/main/java/com/alibaba/druid/mapping/spi/MSSQLServerMappingVisitor.java @@ -0,0 +1,84 @@ +package com.alibaba.druid.mapping.spi; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.alibaba.druid.mapping.Entity; +import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; +import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; +import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource; +import com.alibaba.druid.sql.ast.statement.SQLSelectItem; +import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; +import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource; +import com.alibaba.druid.sql.ast.statement.SQLTableSource; +import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; +import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitorAdapter; + +public class MSSQLServerMappingVisitor extends SQLServerASTVisitorAdapter implements MappingVisitor { + + private final LinkedHashMap entities; + private final Map tableSources = new LinkedHashMap(); + + public MSSQLServerMappingVisitor(LinkedHashMap entities){ + super(); + this.entities = entities; + } + + public LinkedHashMap getEntities() { + return entities; + } + + public Map getTableSources() { + return tableSources; + } + + @Override + public Entity getFirstEntity() { + for (Map.Entry entry : entities.entrySet()) { + return entry.getValue(); + } + + return null; + } + + public Entity getEntity(String name) { + return MappingVisitorUtils.getEntity(this, name); + } + + @Override + public boolean visit(SQLSelectItem x) { + x.getExpr().setParent(x); + return true; + } + + @Override + public boolean visit(SQLServerSelectQueryBlock x) { + return MappingVisitorUtils.visit(this, x); + } + + @Override + public boolean visit(SQLSelectQueryBlock x) { + return MappingVisitorUtils.visit(this, x); + } + + @Override + public boolean visit(SQLIdentifierExpr x) { + return MappingVisitorUtils.visit(this, x); + } + + @Override + public boolean visit(SQLSubqueryTableSource x) { + return MappingVisitorUtils.visit(this, x); + } + + @Override + public boolean visit(SQLJoinTableSource x) { + return MappingVisitorUtils.visit(this, x); + } + + @Override + public boolean visit(SQLExprTableSource x) { + return MappingVisitorUtils.visit(this, x); + } + +} diff --git a/src/main/java/com/alibaba/druid/mapping/MappingProvider.java b/src/main/java/com/alibaba/druid/mapping/spi/MappingProvider.java similarity index 81% rename from src/main/java/com/alibaba/druid/mapping/MappingProvider.java rename to src/main/java/com/alibaba/druid/mapping/spi/MappingProvider.java index 160fb2164a..8af0a54ca4 100644 --- a/src/main/java/com/alibaba/druid/mapping/MappingProvider.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/MappingProvider.java @@ -1,5 +1,6 @@ -package com.alibaba.druid.mapping; +package com.alibaba.druid.mapping.spi; +import com.alibaba.druid.mapping.MappingEngine; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; diff --git a/src/main/java/com/alibaba/druid/mapping/MappingVisitor.java b/src/main/java/com/alibaba/druid/mapping/spi/MappingVisitor.java similarity index 81% rename from src/main/java/com/alibaba/druid/mapping/MappingVisitor.java rename to src/main/java/com/alibaba/druid/mapping/spi/MappingVisitor.java index 534b946477..c6621711ac 100644 --- a/src/main/java/com/alibaba/druid/mapping/MappingVisitor.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/MappingVisitor.java @@ -1,7 +1,8 @@ -package com.alibaba.druid.mapping; +package com.alibaba.druid.mapping.spi; import java.util.Map; +import com.alibaba.druid.mapping.Entity; import com.alibaba.druid.sql.ast.statement.SQLTableSource; import com.alibaba.druid.sql.visitor.SQLASTVisitor; diff --git a/src/main/java/com/alibaba/druid/mapping/MappingVisitorUtils.java b/src/main/java/com/alibaba/druid/mapping/spi/MappingVisitorUtils.java similarity index 83% rename from src/main/java/com/alibaba/druid/mapping/MappingVisitorUtils.java rename to src/main/java/com/alibaba/druid/mapping/spi/MappingVisitorUtils.java index 28acc3d4be..b5d8829e7f 100644 --- a/src/main/java/com/alibaba/druid/mapping/MappingVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/MappingVisitorUtils.java @@ -1,5 +1,10 @@ -package com.alibaba.druid.mapping; +package com.alibaba.druid.mapping.spi; +import java.util.Map; + +import com.alibaba.druid.mapping.DruidMappingException; +import com.alibaba.druid.mapping.Entity; +import com.alibaba.druid.mapping.Property; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; @@ -9,6 +14,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.ast.statement.SQLTableSource; public class MappingVisitorUtils { + public static boolean visit(MappingVisitor visitor, SQLExprTableSource x) { SQLExpr expr = x.getExpr(); @@ -31,12 +37,12 @@ public class MappingVisitorUtils { return false; } - + public static boolean visit(MappingVisitor visitor, SQLTableSource x) { if (x.getAlias() != null) { visitor.getTableSources().put(x.getAlias(), x); } - + return true; } @@ -100,4 +106,19 @@ public class MappingVisitorUtils { return true; } + + public static Entity getEntity(MappingVisitor visitor, String name) { + Entity entity = visitor.getEntities().get(name); + + if (entity == null) { + for (Map.Entry entry : visitor.getEntities().entrySet()) { + if (entry.getKey().equalsIgnoreCase(name)) { + entity = entry.getValue(); + break; + } + } + } + + return entity; + } } diff --git a/src/main/java/com/alibaba/druid/mapping/MySqlMappingProvider.java b/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingProvider.java similarity index 95% rename from src/main/java/com/alibaba/druid/mapping/MySqlMappingProvider.java rename to src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingProvider.java index 4048e4d550..e1dddc1e9f 100644 --- a/src/main/java/com/alibaba/druid/mapping/MySqlMappingProvider.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingProvider.java @@ -1,5 +1,6 @@ -package com.alibaba.druid.mapping; +package com.alibaba.druid.mapping.spi; +import com.alibaba.druid.mapping.MappingEngine; import com.alibaba.druid.sql.ast.expr.SQLNumberExpr; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; diff --git a/src/main/java/com/alibaba/druid/mapping/MySqlMappingVisitor.java b/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingVisitor.java similarity index 81% rename from src/main/java/com/alibaba/druid/mapping/MySqlMappingVisitor.java rename to src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingVisitor.java index 25eacdc031..765f61f2b1 100644 --- a/src/main/java/com/alibaba/druid/mapping/MySqlMappingVisitor.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingVisitor.java @@ -1,8 +1,9 @@ -package com.alibaba.druid.mapping; +package com.alibaba.druid.mapping.spi; import java.util.LinkedHashMap; import java.util.Map; +import com.alibaba.druid.mapping.Entity; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource; @@ -39,49 +40,41 @@ public class MySqlMappingVisitor extends MySqlASTVisitorAdapter implements Mappi } public Entity getEntity(String name) { - Entity entity = this.entities.get(name); - - if (entity == null) { - for (Map.Entry entry : entities.entrySet()) { - if (entry.getKey().equalsIgnoreCase(name)) { - entity = entry.getValue(); - break; - } - } - } - - return entity; + return MappingVisitorUtils.getEntity(this, name); } + @Override public boolean visit(SQLSelectItem x) { x.getExpr().setParent(x); return true; } + @Override public boolean visit(MySqlSelectQueryBlock x) { return MappingVisitorUtils.visit(this, x); } + @Override public boolean visit(SQLSelectQueryBlock x) { return MappingVisitorUtils.visit(this, x); } - protected void fillSelectList(SQLSelectQueryBlock x) { - MappingVisitorUtils.fillSelectList(this, x); - } - + @Override public boolean visit(SQLIdentifierExpr x) { return MappingVisitorUtils.visit(this, x); } + @Override public boolean visit(SQLSubqueryTableSource x) { return MappingVisitorUtils.visit(this, x); } + @Override public boolean visit(SQLJoinTableSource x) { return MappingVisitorUtils.visit(this, x); } + @Override public boolean visit(SQLExprTableSource x) { return MappingVisitorUtils.visit(this, x); } diff --git a/src/main/java/com/alibaba/druid/mapping/OracleMappingProvider.java b/src/main/java/com/alibaba/druid/mapping/spi/OracleMappingProvider.java similarity index 91% rename from src/main/java/com/alibaba/druid/mapping/OracleMappingProvider.java rename to src/main/java/com/alibaba/druid/mapping/spi/OracleMappingProvider.java index d4225a84ad..503bdd3f3f 100644 --- a/src/main/java/com/alibaba/druid/mapping/OracleMappingProvider.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/OracleMappingProvider.java @@ -1,5 +1,6 @@ -package com.alibaba.druid.mapping; +package com.alibaba.druid.mapping.spi; +import com.alibaba.druid.mapping.MappingEngine; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; import com.alibaba.druid.sql.dialect.oracle.parser.OracleSelectParser; diff --git a/src/main/java/com/alibaba/druid/mapping/spi/OracleMappingVisitor.java b/src/main/java/com/alibaba/druid/mapping/spi/OracleMappingVisitor.java new file mode 100644 index 0000000000..74ef2ab442 --- /dev/null +++ b/src/main/java/com/alibaba/druid/mapping/spi/OracleMappingVisitor.java @@ -0,0 +1,88 @@ +package com.alibaba.druid.mapping.spi; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.alibaba.druid.mapping.Entity; +import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; +import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; +import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource; +import com.alibaba.druid.sql.ast.statement.SQLSelectItem; +import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; +import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource; +import com.alibaba.druid.sql.ast.statement.SQLTableSource; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVIsitorAdapter; + +public class OracleMappingVisitor extends OracleASTVIsitorAdapter implements MappingVisitor { + + private final LinkedHashMap entities; + private final Map tableSources = new LinkedHashMap(); + + public OracleMappingVisitor(LinkedHashMap entities){ + super(); + this.entities = entities; + } + + public LinkedHashMap getEntities() { + return entities; + } + + public Map getTableSources() { + return tableSources; + } + + public Entity getFirstEntity() { + for (Map.Entry entry : entities.entrySet()) { + return entry.getValue(); + } + + return null; + } + + public Entity getEntity(String name) { + return MappingVisitorUtils.getEntity(this, name); + } + + @Override + public boolean visit(SQLSelectItem x) { + x.getExpr().setParent(x); + return true; + } + + @Override + public boolean visit(OracleSelectQueryBlock x) { + return MappingVisitorUtils.visit(this, x); + } + + @Override + public boolean visit(SQLSelectQueryBlock x) { + return MappingVisitorUtils.visit(this, x); + } + + @Override + public boolean visit(SQLIdentifierExpr x) { + return MappingVisitorUtils.visit(this, x); + } + + @Override + public boolean visit(SQLSubqueryTableSource x) { + return MappingVisitorUtils.visit(this, x); + } + + @Override + public boolean visit(SQLJoinTableSource x) { + return MappingVisitorUtils.visit(this, x); + } + + @Override + public boolean visit(SQLExprTableSource x) { + return MappingVisitorUtils.visit(this, x); + } + + @Override + public boolean visit(OracleSelectTableReference x) { + return MappingVisitorUtils.visit(this, x); + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java new file mode 100644 index 0000000000..9eff67f70d --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java @@ -0,0 +1,29 @@ +package com.alibaba.druid.sql.dialect.sqlserver.visitor; + +import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; +import com.alibaba.druid.sql.dialect.sqlserver.ast.Top; +import com.alibaba.druid.sql.visitor.SQLASTVisitorAdapter; + +public class SQLServerASTVisitorAdapter extends SQLASTVisitorAdapter implements SQLServerASTVisitor { + + @Override + public boolean visit(SQLServerSelectQueryBlock x) { + return true; + } + + @Override + public void endVisit(SQLServerSelectQueryBlock x) { + + } + + @Override + public boolean visit(Top x) { + return true; + } + + @Override + public void endVisit(Top x) { + + } + +}