add mapping support

This commit is contained in:
温少
2012-03-12 20:42:56 +08:00
parent f893c1c5c9
commit 42caa77dee
5 changed files with 113 additions and 41 deletions
@@ -2,17 +2,14 @@ package com.alibaba.druid.mapping;
import java.util.LinkedHashMap;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.expr.SQLNumberExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlSelectParser;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
public class MappingEngine {
private LinkedHashMap<String, Entity> entities = new LinkedHashMap<String, Entity>();
private Integer maxLimit;
private MappingProvider provider;
public Integer getMaxLimit() {
return maxLimit;
@@ -30,36 +27,23 @@ public class MappingEngine {
this.entities.put(entity.getName(), entity);
}
public SQLASTVisitor createMySqlMappingVisitor() {
return new MySqlMappingVisitor(entities);
public MappingVisitor createMappingVisitor() {
return provider.createMappingVisitor(this);
}
public String explainToMySql(String sql) {
MySqlSelectQueryBlock query = explainToMySqlObject(sql);
query.accept(this.createMySqlMappingVisitor());
return SQLUtils.toMySqlString(query);
public SQLASTOutputVisitor createOutputVisitor(Appendable out) {
return provider.createOutputVisitor(this, out);
}
public MySqlSelectQueryBlock explainToMySqlObject(String sql) {
MySqlSelectParser selectParser = new MySqlSelectParser(sql);
MySqlSelectQueryBlock query = (MySqlSelectQueryBlock) selectParser.query();
if (this.maxLimit != null) {
if (query.getLimit() == null) {
Limit limit = new Limit();
limit.setRowCount(new SQLNumberExpr(maxLimit));
query.setLimit(limit);
} else {
SQLNumberExpr rowCountExpr = (SQLNumberExpr) query.getLimit().getRowCount();
int rowCount = rowCountExpr.getNumber().intValue();
if (rowCount > maxLimit.intValue()) {
rowCountExpr.setNumber(maxLimit);
}
}
}
return query;
public String explainToSQL(String sql) {
SQLSelectQueryBlock query = provider.explainToSQLObject(this, sql);
query.accept(this.createMappingVisitor());
StringBuilder out = new StringBuilder();
SQLASTOutputVisitor outputVisitor = createOutputVisitor(out);
query.accept(outputVisitor);
return out.toString();
}
}
@@ -0,0 +1,13 @@
package com.alibaba.druid.mapping;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
public interface MappingProvider {
MappingVisitor createMappingVisitor(MappingEngine engine);
SQLASTOutputVisitor createOutputVisitor(MappingEngine engine, Appendable out);
SQLSelectQueryBlock explainToSQLObject(MappingEngine engine, String sql);
}
@@ -3,13 +3,15 @@ package com.alibaba.druid.mapping;
import java.util.Map;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public interface MappingVisitor {
Entity getFirstEntity();
Entity getEntity(String name);
Map<String, Entity> getEntities();
Map<String, SQLTableSource> getTableSources();
public interface MappingVisitor extends SQLASTVisitor {
Entity getFirstEntity();
Entity getEntity(String name);
Map<String, Entity> getEntities();
Map<String, SQLTableSource> getTableSources();
}
@@ -0,0 +1,45 @@
package com.alibaba.druid.mapping;
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;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlSelectParser;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
public class MySqlMappingProvider implements MappingProvider {
@Override
public MappingVisitor createMappingVisitor(MappingEngine engine) {
return new MySqlMappingVisitor(engine.getEntities());
}
@Override
public SQLASTOutputVisitor createOutputVisitor(MappingEngine engine, Appendable out) {
return new MySqlOutputVisitor(out);
}
public SQLSelectQueryBlock explainToSQLObject(MappingEngine engine, String sql) {
MySqlSelectParser selectParser = new MySqlSelectParser(sql);
MySqlSelectQueryBlock query = (MySqlSelectQueryBlock) selectParser.query();
Integer maxLimit = engine.getMaxLimit();
if (maxLimit != null) {
if (query.getLimit() == null) {
Limit limit = new Limit();
limit.setRowCount(new SQLNumberExpr(maxLimit));
query.setLimit(limit);
} else {
SQLNumberExpr rowCountExpr = (SQLNumberExpr) query.getLimit().getRowCount();
int rowCount = rowCountExpr.getNumber().intValue();
if (rowCount > maxLimit.intValue()) {
rowCountExpr.setNumber(maxLimit);
}
}
}
return query;
}
}
@@ -0,0 +1,28 @@
package com.alibaba.druid.mapping;
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;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleOutputVisitor;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
public class OracleMappingProvider implements MappingProvider {
@Override
public MappingVisitor createMappingVisitor(MappingEngine engine) {
return new OracleMappingVisitor(engine.getEntities());
}
@Override
public SQLASTOutputVisitor createOutputVisitor(MappingEngine engine, Appendable out) {
return new OracleOutputVisitor(out);
}
public SQLSelectQueryBlock explainToSQLObject(MappingEngine engine, String sql) {
OracleSelectParser selectParser = new OracleSelectParser(sql);
OracleSelectQueryBlock query = (OracleSelectQueryBlock) selectParser.query();
return query;
}
}