mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
add mapping support
This commit is contained in:
@@ -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,27 @@ 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 SQLSelectQueryBlock explainToSQLObject(String sql) {
|
||||
return provider.explainToSQLObject(this, sql);
|
||||
}
|
||||
|
||||
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 = explainToSQLObject(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;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user