From 68bbde171f48e000c6a31a1e086b7a8e577f779a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Wed, 9 May 2012 14:54:04 +0800 Subject: [PATCH] enhance mapping --- .../alibaba/druid/mapping/MappingEngine.java | 40 +++++++++++++++++-- .../spi/MSSQLServerMappingProvider.java | 12 ++++-- .../druid/mapping/spi/MappingProvider.java | 3 ++ .../mapping/spi/MappingVisitorUtils.java | 23 +++++++++++ .../mapping/spi/MySqlMappingProvider.java | 7 ++++ .../mapping/spi/OracleMappingProvider.java | 7 ++++ 6 files changed, 86 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/alibaba/druid/mapping/MappingEngine.java b/src/main/java/com/alibaba/druid/mapping/MappingEngine.java index 78f89d11bc..b5a79ee49e 100644 --- a/src/main/java/com/alibaba/druid/mapping/MappingEngine.java +++ b/src/main/java/com/alibaba/druid/mapping/MappingEngine.java @@ -14,6 +14,7 @@ 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.SQLObject; +import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; @@ -88,6 +89,27 @@ public class MappingEngine { public SQLASTOutputVisitor createOutputVisitor(Appendable out) { return provider.createOutputVisitor(this, out); } + + public String explain(String sql) { + return explain(sql); + } + + public String explain(String sql, MappingContext context) { + List stmtList = provider.explain(this, sql); + + if (stmtList.size() > 0) { + throw new IllegalArgumentException(sql); + } + + SQLStatement stmt = stmtList.get(0); + + MappingVisitor visitor = this.createMappingVisitor(context); + stmt.accept(visitor); + visitor.afterResolve(); + afterResole(visitor); + + return toSQL(stmt); + } public SQLSelectQueryBlock explainToSelectSQLObject(String sql) { return provider.explainToSelectSQLObject(this, sql); @@ -121,9 +143,13 @@ public class MappingEngine { } public String explainToDeleteSQL(String sql) { + return explainToDeleteSQL(sql, new MappingContext()); + } + + public String explainToDeleteSQL(String sql, MappingContext context) { SQLDeleteStatement stmt = explainToDeleteSQLObject(sql); - MappingVisitor visitor = this.createMappingVisitor(Collections.emptyList()); + MappingVisitor visitor = this.createMappingVisitor(context); stmt.accept(visitor); visitor.afterResolve(); afterResole(visitor); @@ -144,9 +170,13 @@ public class MappingEngine { } public String explainToUpdateSQL(String sql) { + return explainToUpdateSQL(sql, new MappingContext()); + } + + public String explainToUpdateSQL(String sql, MappingContext context) { SQLUpdateStatement stmt = explainToUpdateSQLObject(sql); - MappingVisitor visitor = this.createMappingVisitor(Collections.emptyList()); + MappingVisitor visitor = this.createMappingVisitor(context); stmt.accept(visitor); visitor.afterResolve(); afterResole(visitor); @@ -159,9 +189,13 @@ public class MappingEngine { } public String explainToInsertSQL(String sql) { + return explainToInsertSQL(sql, new MappingContext()); + } + + public String explainToInsertSQL(String sql, MappingContext context) { SQLInsertStatement stmt = explainToInsertSQLObject(sql); - MappingVisitor visitor = this.createMappingVisitor(Collections.emptyList()); + MappingVisitor visitor = this.createMappingVisitor(context); stmt.accept(visitor); visitor.afterResolve(); afterResole(visitor); diff --git a/src/main/java/com/alibaba/druid/mapping/spi/MSSQLServerMappingProvider.java b/src/main/java/com/alibaba/druid/mapping/spi/MSSQLServerMappingProvider.java index 25c197cc60..310cf3c9c7 100644 --- a/src/main/java/com/alibaba/druid/mapping/spi/MSSQLServerMappingProvider.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/MSSQLServerMappingProvider.java @@ -4,13 +4,13 @@ import java.util.List; import com.alibaba.druid.mapping.MappingContext; import com.alibaba.druid.mapping.MappingEngine; +import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.expr.SQLNumberExpr; import com.alibaba.druid.sql.ast.expr.SQLNumericLiteralExpr; import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; -import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.Top; import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerSelectParser; @@ -70,7 +70,7 @@ public class MSSQLServerMappingProvider implements MappingProvider { } public SQLUpdateStatement explainToUpdateSQLObject(MappingEngine engine, String sql) { - PGSQLStatementParser parser = new PGSQLStatementParser(sql); + SQLServerStatementParser parser = new SQLServerStatementParser(sql); SQLUpdateStatement stmt = parser.parseUpdateStatement(); MappingVisitorUtils.setDataSource(engine, stmt); @@ -79,7 +79,7 @@ public class MSSQLServerMappingProvider implements MappingProvider { } public SQLInsertStatement explainToInsertSQLObject(MappingEngine engine, String sql) { - PGSQLStatementParser parser = new PGSQLStatementParser(sql); + SQLServerStatementParser parser = new SQLServerStatementParser(sql); SQLInsertStatement stmt = (SQLInsertStatement) parser.parseInsert(); MappingVisitorUtils.setDataSource(engine, stmt); @@ -91,4 +91,10 @@ public class MSSQLServerMappingProvider implements MappingProvider { public ExportParameterVisitor createExportParameterVisitor(List parameters) { return new MSSQLServerExportParameterVisitor(parameters); } + + @Override + public List explain(MappingEngine engine, String sql) { + SQLServerStatementParser parser = new SQLServerStatementParser(sql); + return parser.parseStatementList(); + } } diff --git a/src/main/java/com/alibaba/druid/mapping/spi/MappingProvider.java b/src/main/java/com/alibaba/druid/mapping/spi/MappingProvider.java index d0c864aca4..8885133739 100644 --- a/src/main/java/com/alibaba/druid/mapping/spi/MappingProvider.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/MappingProvider.java @@ -4,6 +4,7 @@ import java.util.List; import com.alibaba.druid.mapping.MappingContext; import com.alibaba.druid.mapping.MappingEngine; +import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; @@ -20,6 +21,8 @@ public interface MappingProvider { ExportParameterVisitor createExportParameterVisitor(List parameters); SQLASTOutputVisitor createOutputVisitor(MappingEngine engine, Appendable out); + + List explain(MappingEngine engine, String sql); SQLSelectQueryBlock explainToSelectSQLObject(MappingEngine engine, String sql); diff --git a/src/main/java/com/alibaba/druid/mapping/spi/MappingVisitorUtils.java b/src/main/java/com/alibaba/druid/mapping/spi/MappingVisitorUtils.java index aab2f0e3e3..4142826c5a 100644 --- a/src/main/java/com/alibaba/druid/mapping/spi/MappingVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/MappingVisitorUtils.java @@ -13,6 +13,7 @@ import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; +import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; import com.alibaba.druid.sql.ast.expr.SQLNumericLiteralExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; @@ -23,6 +24,8 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectItem; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.ast.statement.SQLTableSource; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit; public class MappingVisitorUtils { @@ -376,6 +379,26 @@ public class MappingVisitorUtils { } return false; } + + public static boolean visit(MappingVisitor visitor, MySqlSelectQueryBlock x) { + Integer maxLimit = visitor.getEngine().getMaxLimit(); + + if (maxLimit != null) { + if (x.getLimit() == null) { + Limit limit = new Limit(); + limit.setRowCount(new SQLIntegerExpr(maxLimit)); + x.setLimit(limit); + } else { + SQLNumericLiteralExpr rowCountExpr = (SQLNumericLiteralExpr) x.getLimit().getRowCount(); + int rowCount = rowCountExpr.getNumber().intValue(); + if (rowCount > maxLimit.intValue()) { + rowCountExpr.setNumber(maxLimit); + } + } + } + + return visit(visitor, (SQLSelectQueryBlock) x); + } public static boolean visit(MappingVisitor visitor, SQLSelectQueryBlock x) { if (x.getSelectList().size() == 0) { 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 cd0a02201e..2ecbf6c5c0 100644 --- a/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingProvider.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingProvider.java @@ -4,6 +4,7 @@ import java.util.List; import com.alibaba.druid.mapping.MappingContext; import com.alibaba.druid.mapping.MappingEngine; +import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; import com.alibaba.druid.sql.ast.expr.SQLNumericLiteralExpr; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; @@ -90,4 +91,10 @@ public class MySqlMappingProvider implements MappingProvider { public ExportParameterVisitor createExportParameterVisitor(List parameters) { return new MySqlExportParameterVisitor(parameters); } + + @Override + public List explain(MappingEngine engine, String sql) { + MySqlStatementParser parser = new MySqlStatementParser(sql); + return parser.parseStatementList(); + } } diff --git a/src/main/java/com/alibaba/druid/mapping/spi/OracleMappingProvider.java b/src/main/java/com/alibaba/druid/mapping/spi/OracleMappingProvider.java index 6ce116f22b..2b0bd85f21 100644 --- a/src/main/java/com/alibaba/druid/mapping/spi/OracleMappingProvider.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/OracleMappingProvider.java @@ -4,6 +4,7 @@ import java.util.List; import com.alibaba.druid.mapping.MappingContext; import com.alibaba.druid.mapping.MappingEngine; +import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; @@ -70,4 +71,10 @@ public class OracleMappingProvider implements MappingProvider { public ExportParameterVisitor createExportParameterVisitor(List parameters) { return new OracleExportParameterVisitor(parameters); } + + @Override + public List explain(MappingEngine engine, String sql) { + OracleStatementParser parser = new OracleStatementParser(sql); + return parser.parseStatementList(); + } }