From e201b09d72a2b3e43628b8d94b2e5fe3741cc569 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Mon, 12 Mar 2012 21:52:22 +0800 Subject: [PATCH] bug fixed for mapping --- .../spi/MSSQLServerMappingProvider.java | 5 +- .../mapping/spi/MySqlMappingProvider.java | 7 +-- .../sql/ast/expr/SQLNumericLiteralExpr.java | 2 + .../ast/expr/OracleBinaryDoubleExpr.java | 10 ++++ .../ast/expr/OracleBinaryFloatExpr.java | 10 ++++ .../mapping/MappingVisitorSQLServerTest.java | 49 +++++++++++++++++++ .../druid/bvt/mapping/MappingVisitorTest.java | 2 + 7 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/mapping/MappingVisitorSQLServerTest.java 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 65361d06df..5259c47095 100644 --- a/src/main/java/com/alibaba/druid/mapping/spi/MSSQLServerMappingProvider.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/MSSQLServerMappingProvider.java @@ -2,6 +2,7 @@ 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.SQLSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.Top; @@ -13,7 +14,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 +34,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); 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 324779e2d0..a2d880ac29 100644 --- a/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingProvider.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingProvider.java @@ -1,7 +1,8 @@ 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.MySqlSelectQueryBlock; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit; @@ -30,10 +31,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); diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNumericLiteralExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNumericLiteralExpr.java index d688d499d0..420aebcd27 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNumericLiteralExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNumericLiteralExpr.java @@ -24,4 +24,6 @@ public abstract class SQLNumericLiteralExpr extends SQLLiteralExpr { } public abstract Number getNumber(); + + public abstract void setNumber(Number number); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleBinaryDoubleExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleBinaryDoubleExpr.java index 88e16a7b0a..376b9c004d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleBinaryDoubleExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleBinaryDoubleExpr.java @@ -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()); + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleBinaryFloatExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleBinaryFloatExpr.java index d548e6e3b4..c5a0a1782f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleBinaryFloatExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleBinaryFloatExpr.java @@ -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()); + } + } diff --git a/src/test/java/com/alibaba/druid/bvt/mapping/MappingVisitorSQLServerTest.java b/src/test/java/com/alibaba/druid/bvt/mapping/MappingVisitorSQLServerTest.java new file mode 100644 index 0000000000..80f4c8cfe6 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/mapping/MappingVisitorSQLServerTest.java @@ -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); + + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/mapping/MappingVisitorTest.java b/src/test/java/com/alibaba/druid/bvt/mapping/MappingVisitorTest.java index 0523b464c2..4c6a7bd368 100644 --- a/src/test/java/com/alibaba/druid/bvt/mapping/MappingVisitorTest.java +++ b/src/test/java/com/alibaba/druid/bvt/mapping/MappingVisitorTest.java @@ -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);