enhance mapping

This commit is contained in:
温少
2012-05-09 14:54:04 +08:00
parent 38683996ba
commit 68bbde171f
6 changed files with 86 additions and 6 deletions
@@ -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<SQLStatement> 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);
@@ -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<Object> parameters) {
return new MSSQLServerExportParameterVisitor(parameters);
}
@Override
public List<SQLStatement> explain(MappingEngine engine, String sql) {
SQLServerStatementParser parser = new SQLServerStatementParser(sql);
return parser.parseStatementList();
}
}
@@ -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<Object> parameters);
SQLASTOutputVisitor createOutputVisitor(MappingEngine engine, Appendable out);
List<SQLStatement> explain(MappingEngine engine, String sql);
SQLSelectQueryBlock explainToSelectSQLObject(MappingEngine engine, String sql);
@@ -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) {
@@ -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<Object> parameters) {
return new MySqlExportParameterVisitor(parameters);
}
@Override
public List<SQLStatement> explain(MappingEngine engine, String sql) {
MySqlStatementParser parser = new MySqlStatementParser(sql);
return parser.parseStatementList();
}
}
@@ -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<Object> parameters) {
return new OracleExportParameterVisitor(parameters);
}
@Override
public List<SQLStatement> explain(MappingEngine engine, String sql) {
OracleStatementParser parser = new OracleStatementParser(sql);
return parser.parseStatementList();
}
}