bug fixed for mapping

This commit is contained in:
温少
2012-03-13 09:26:36 +08:00
parent 4b07baec86
commit 28c99426fd
12 changed files with 126 additions and 11 deletions
@@ -5,6 +5,8 @@ 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.SQLObject;
import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
@@ -55,9 +57,25 @@ public class MappingEngine {
query.accept(this.createMappingVisitor());
return toSQL(query);
}
public SQLDeleteStatement explainToDeleteSQLObject(String sql) {
return provider.explainToDeleteSQLObject(this, sql);
}
public String explainToDeleteSQLObjectSQL(String sql) {
SQLDeleteStatement query = explainToDeleteSQLObject(sql);
query.accept(this.createMappingVisitor());
return toSQL(query);
}
public String toSQL(SQLObject sqlObject) {
StringBuilder out = new StringBuilder();
SQLASTOutputVisitor outputVisitor = createOutputVisitor(out);
query.accept(outputVisitor);
sqlObject.accept(outputVisitor);
return out.toString();
}
@@ -2,10 +2,13 @@ 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.expr.SQLNumericLiteralExpr;
import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
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;
import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser;
import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerOutputVisitor;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
@@ -13,7 +16,7 @@ public class MSSQLServerMappingProvider implements MappingProvider {
@Override
public MappingVisitor createMappingVisitor(MappingEngine engine) {
return new MySqlMappingVisitor(engine.getEntities());
return new MSSQLServerMappingVisitor(engine.getEntities());
}
@Override
@@ -33,7 +36,7 @@ public class MSSQLServerMappingProvider implements MappingProvider {
top.setExpr(new SQLNumberExpr(maxLimit));
query.setTop(top);
} else {
SQLNumberExpr rowCountExpr = (SQLNumberExpr) query.getTop().getExpr();
SQLNumericLiteralExpr rowCountExpr = (SQLNumericLiteralExpr) query.getTop().getExpr();
int rowCount = rowCountExpr.getNumber().intValue();
if (rowCount > maxLimit.intValue()) {
rowCountExpr.setNumber(maxLimit);
@@ -43,4 +46,9 @@ public class MSSQLServerMappingProvider implements MappingProvider {
return query;
}
public SQLDeleteStatement explainToDeleteSQLObject(MappingEngine engine, String sql) {
SQLServerStatementParser parser = new SQLServerStatementParser(sql);
return parser.parseDeleteStatement();
}
}
@@ -1,6 +1,7 @@
package com.alibaba.druid.mapping.spi;
import com.alibaba.druid.mapping.MappingEngine;
import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
@@ -11,4 +12,6 @@ public interface MappingProvider {
SQLASTOutputVisitor createOutputVisitor(MappingEngine engine, Appendable out);
SQLSelectQueryBlock explainToSelectSQLObject(MappingEngine engine, String sql);
SQLDeleteStatement explainToDeleteSQLObject(MappingEngine engine, String sql);
}
@@ -1,11 +1,14 @@
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.expr.SQLIntegerExpr;
import com.alibaba.druid.sql.ast.expr.SQLNumericLiteralExpr;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement;
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.parser.MySqlStatementParser;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
@@ -20,7 +23,7 @@ public class MySqlMappingProvider implements MappingProvider {
public SQLASTOutputVisitor createOutputVisitor(MappingEngine engine, Appendable out) {
return new MySqlOutputVisitor(out);
}
public SQLSelectQueryBlock explainToSelectSQLObject(MappingEngine engine, String sql) {
MySqlSelectParser selectParser = new MySqlSelectParser(sql);
MySqlSelectQueryBlock query = (MySqlSelectQueryBlock) selectParser.query();
@@ -30,10 +33,10 @@ public class MySqlMappingProvider implements MappingProvider {
if (maxLimit != null) {
if (query.getLimit() == null) {
Limit limit = new Limit();
limit.setRowCount(new SQLNumberExpr(maxLimit));
limit.setRowCount(new SQLIntegerExpr(maxLimit));
query.setLimit(limit);
} else {
SQLNumberExpr rowCountExpr = (SQLNumberExpr) query.getLimit().getRowCount();
SQLNumericLiteralExpr rowCountExpr = (SQLNumericLiteralExpr) query.getLimit().getRowCount();
int rowCount = rowCountExpr.getNumber().intValue();
if (rowCount > maxLimit.intValue()) {
rowCountExpr.setNumber(maxLimit);
@@ -43,4 +46,9 @@ public class MySqlMappingProvider implements MappingProvider {
return query;
}
public MySqlDeleteStatement explainToDeleteSQLObject(MappingEngine engine, String sql) {
MySqlStatementParser parser = new MySqlStatementParser(sql);
return parser.parseDeleteStatement();
}
}
@@ -2,8 +2,10 @@ 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.OracleDeleteStatement;
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.parser.OracleStatementParser;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleOutputVisitor;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
@@ -26,4 +28,8 @@ public class OracleMappingProvider implements MappingProvider {
return query;
}
public OracleDeleteStatement explainToDeleteSQLObject(MappingEngine engine, String sql) {
OracleStatementParser parser = new OracleStatementParser(sql);
return parser.parseDeleteStatement();
}
}
@@ -24,4 +24,6 @@ public abstract class SQLNumericLiteralExpr extends SQLLiteralExpr {
}
public abstract Number getNumber();
public abstract void setNumber(Number number);
}
@@ -26,7 +26,6 @@ import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr;
import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
@@ -87,7 +86,7 @@ public class MySqlStatementParser extends SQLStatementParser {
return new SQLSelectStatement(new MySqlSelectParser(lexer).select());
}
public SQLDeleteStatement parseDeleteStatement() throws ParserException {
public MySqlDeleteStatement parseDeleteStatement() throws ParserException {
accept(Token.DELETE);
MySqlDeleteStatement deleteStatement = new MySqlDeleteStatement();
@@ -72,4 +72,14 @@ public class OracleBinaryDoubleExpr extends SQLNumericLiteralExpr implements Ora
return true;
}
@Override
public void setNumber(Number number) {
if (number == null) {
this.setValue(null);
return;
}
this.setValue(number.doubleValue());
}
}
@@ -72,4 +72,14 @@ public class OracleBinaryFloatExpr extends SQLNumericLiteralExpr implements Orac
return true;
}
@Override
public void setNumber(Number number) {
if (number == null) {
this.setValue(null);
return;
}
this.setValue(number.floatValue());
}
}
@@ -176,7 +176,7 @@ public class OracleStatementParser extends SQLStatementParser {
}
if (lexer.token() == (Token.DELETE)) {
statementList.add(parseDelete());
statementList.add(parseDeleteStatement());
continue;
}
@@ -1413,7 +1413,7 @@ public class OracleStatementParser extends SQLStatementParser {
return stmt;
}
public OracleDeleteStatement parseDelete() throws ParserException {
public OracleDeleteStatement parseDeleteStatement() throws ParserException {
accept(Token.DELETE);
OracleDeleteStatement deleteStatement = new OracleDeleteStatement();
@@ -0,0 +1,49 @@
package com.alibaba.druid.bvt.mapping;
import junit.framework.TestCase;
import org.junit.Assert;
import com.alibaba.druid.mapping.Entity;
import com.alibaba.druid.mapping.MappingEngine;
import com.alibaba.druid.mapping.Property;
import com.alibaba.druid.mapping.spi.MSSQLServerMappingProvider;
public class MappingVisitorSQLServerTest extends TestCase {
MappingEngine engine = new MappingEngine(new MSSQLServerMappingProvider());
protected void setUp() throws Exception {
Entity entity = new Entity();
entity.setName("设备");
entity.setDescription("Device");
entity.setTableName("device");
entity.addProperty(new Property("编号", "", "serviceTag"));
entity.addProperty(new Property("IP地址", "", "ip"));
engine.addEntity(entity);
}
public void test_0() throws Exception {
Assert.assertEquals("SELECT serviceTag AS \"编号\", ip AS \"IP地址\"\nFROM device", engine.explainToSelectSQL("select *"));
Assert.assertEquals("SELECT serviceTag AS \"编号\", ip AS \"IP地址\"\nFROM device\nWHERE ip = '127.0.0.1'",
engine.explainToSelectSQL("select 编号, IP地址 WHERE IP地址 = '127.0.0.1'"));
}
public void test_1() throws Exception {
engine.setMaxLimit(10);
Assert.assertEquals("SELECT TOP 10 serviceTag AS \"编号\", ip AS \"IP地址\"\nFROM device", engine.explainToSelectSQL("select *"));
Assert.assertEquals("SELECT TOP 10 serviceTag AS \"编号\", ip AS \"IP地址\"\nFROM device\nWHERE ip = '127.0.0.1'",
engine.explainToSelectSQL("select 编号, IP地址 WHERE IP地址 = '127.0.0.1'"));
Assert.assertEquals("SELECT TOP 3 serviceTag AS \"编号\", ip AS \"IP地址\"\nFROM device\nWHERE ip = '127.0.0.1'",
engine.explainToSelectSQL("select top 3 编号, IP地址 WHERE IP地址 = '127.0.0.1'"));
engine.setMaxLimit(null);
}
}
@@ -38,6 +38,8 @@ public class MappingVisitorTest extends TestCase {
Assert.assertEquals("SELECT serviceTag AS \"编号\", ip AS \"IP地址\"\nFROM device\nLIMIT 10", engine.explainToSelectSQL("select *"));
Assert.assertEquals("SELECT serviceTag AS \"编号\", ip AS \"IP地址\"\nFROM device\nWHERE ip = '127.0.0.1'\nLIMIT 10",
engine.explainToSelectSQL("select 编号, IP地址 WHERE IP地址 = '127.0.0.1'"));
Assert.assertEquals("SELECT serviceTag AS \"编号\", ip AS \"IP地址\"\nFROM device\nWHERE ip = '127.0.0.1'\nLIMIT 3",
engine.explainToSelectSQL("select 编号, IP地址 WHERE IP地址 = '127.0.0.1' limit 3"));
engine.setMaxLimit(null);