Author: shawkins
Date: 2009-09-01 00:26:32 -0400 (Tue, 01 Sep 2009)
New Revision: 1300
Modified:
trunk/common-core/src/main/java/com/metamatrix/common/types/DataTypeManager.java
trunk/common-core/src/main/java/com/metamatrix/common/types/Transform.java
trunk/common-core/src/main/java/com/metamatrix/common/types/basic/NumberToDoubleTransform.java
trunk/common-core/src/main/java/com/metamatrix/common/types/basic/NumberToFloatTransform.java
trunk/common-core/src/main/java/com/metamatrix/common/types/basic/NumberToIntegerTransform.java
trunk/common-core/src/main/java/com/metamatrix/common/types/basic/NumberToLongTransform.java
trunk/common-core/src/main/java/com/metamatrix/common/types/basic/NumberToShortTransform.java
trunk/engine/src/main/java/com/metamatrix/query/rewriter/QueryRewriter.java
trunk/engine/src/test/java/com/metamatrix/query/rewriter/TestQueryRewriter.java
Log:
TEIID-744 more accurately capturing non-invertable converts as lossy
Modified:
trunk/common-core/src/main/java/com/metamatrix/common/types/DataTypeManager.java
===================================================================
---
trunk/common-core/src/main/java/com/metamatrix/common/types/DataTypeManager.java 2009-08-31
22:18:33 UTC (rev 1299)
+++
trunk/common-core/src/main/java/com/metamatrix/common/types/DataTypeManager.java 2009-09-01
04:26:32 UTC (rev 1300)
@@ -490,13 +490,13 @@
DataTypeManager.addTransform(new NumberToByteTransform(
DefaultDataClasses.BIG_DECIMAL));
DataTypeManager.addTransform(new NumberToDoubleTransform(
- DefaultDataClasses.BIG_DECIMAL, true));
+ DefaultDataClasses.BIG_DECIMAL, true, false));
DataTypeManager.addTransform(new NumberToFloatTransform(
- DefaultDataClasses.BIG_DECIMAL, true));
+ DefaultDataClasses.BIG_DECIMAL, true, false));
DataTypeManager.addTransform(new NumberToIntegerTransform(
DefaultDataClasses.BIG_DECIMAL, true));
DataTypeManager.addTransform(new NumberToLongTransform(
- DefaultDataClasses.BIG_DECIMAL, true));
+ DefaultDataClasses.BIG_DECIMAL, true, false));
DataTypeManager.addTransform(new NumberToShortTransform(
DefaultDataClasses.BIG_DECIMAL, true));
DataTypeManager.addTransform(new
AnyToStringTransform(DefaultDataClasses.BIG_DECIMAL));
@@ -507,13 +507,13 @@
DataTypeManager.addTransform(new NumberToByteTransform(
DefaultDataClasses.BIG_INTEGER));
DataTypeManager.addTransform(new NumberToDoubleTransform(
- DefaultDataClasses.BIG_INTEGER, true));
+ DefaultDataClasses.BIG_INTEGER, true, false));
DataTypeManager.addTransform(new NumberToFloatTransform(
- DefaultDataClasses.BIG_INTEGER, true));
+ DefaultDataClasses.BIG_INTEGER, true, false));
DataTypeManager.addTransform(new NumberToIntegerTransform(
DefaultDataClasses.BIG_INTEGER, true));
DataTypeManager.addTransform(new NumberToLongTransform(
- DefaultDataClasses.BIG_INTEGER, true));
+ DefaultDataClasses.BIG_INTEGER, true, false));
DataTypeManager.addTransform(new NumberToShortTransform(
DefaultDataClasses.BIG_INTEGER, true));
DataTypeManager.addTransform(new
AnyToStringTransform(DefaultDataClasses.BIG_INTEGER));
@@ -540,13 +540,13 @@
DataTypeManager.addTransform(new
FixedNumberToBigIntegerTransform(DefaultDataClasses.BYTE));
DataTypeManager.addTransform(new NumberToBooleanTransform(Byte.valueOf((byte)0)));
DataTypeManager.addTransform(new NumberToDoubleTransform(
- DefaultDataClasses.BYTE, false));
+ DefaultDataClasses.BYTE, false, false));
DataTypeManager.addTransform(new NumberToFloatTransform(
- DefaultDataClasses.BYTE, false));
+ DefaultDataClasses.BYTE, false, false));
DataTypeManager.addTransform(new NumberToIntegerTransform(
DefaultDataClasses.BYTE, false));
DataTypeManager.addTransform(new NumberToLongTransform(
- DefaultDataClasses.BYTE, false));
+ DefaultDataClasses.BYTE, false, false));
DataTypeManager.addTransform(new NumberToShortTransform(
DefaultDataClasses.BYTE, false));
DataTypeManager.addTransform(new AnyToStringTransform(DefaultDataClasses.BYTE));
@@ -566,11 +566,11 @@
DataTypeManager.addTransform(new NumberToByteTransform(
DefaultDataClasses.DOUBLE));
DataTypeManager.addTransform(new NumberToFloatTransform(
- DefaultDataClasses.DOUBLE, true));
+ DefaultDataClasses.DOUBLE, true, false));
DataTypeManager.addTransform(new NumberToIntegerTransform(
DefaultDataClasses.DOUBLE, true));
DataTypeManager.addTransform(new NumberToLongTransform(
- DefaultDataClasses.DOUBLE, false)); //lossy, but not narrowing
+ DefaultDataClasses.DOUBLE, false, true)); //lossy, but not narrowing
DataTypeManager.addTransform(new NumberToShortTransform(
DefaultDataClasses.DOUBLE, true));
DataTypeManager.addTransform(new AnyToStringTransform(DefaultDataClasses.DOUBLE));
@@ -581,11 +581,11 @@
DataTypeManager.addTransform(new NumberToByteTransform(
DefaultDataClasses.FLOAT));
DataTypeManager.addTransform(new NumberToDoubleTransform(
- DefaultDataClasses.FLOAT, false));
+ DefaultDataClasses.FLOAT, false, false));
DataTypeManager.addTransform(new NumberToIntegerTransform(
DefaultDataClasses.FLOAT, true));
DataTypeManager.addTransform(new NumberToLongTransform(
- DefaultDataClasses.FLOAT, false)); //lossy, but not narrowing
+ DefaultDataClasses.FLOAT, false, true)); //lossy, but not narrowing
DataTypeManager.addTransform(new NumberToShortTransform(
DefaultDataClasses.FLOAT, true));
DataTypeManager.addTransform(new AnyToStringTransform(DefaultDataClasses.FLOAT));
@@ -596,11 +596,11 @@
DataTypeManager.addTransform(new NumberToByteTransform(
DefaultDataClasses.INTEGER));
DataTypeManager.addTransform(new NumberToDoubleTransform(
- DefaultDataClasses.INTEGER, false));
+ DefaultDataClasses.INTEGER, false, false));
DataTypeManager.addTransform(new NumberToFloatTransform(
- DefaultDataClasses.INTEGER, false)); //lossy, but not narrowing
+ DefaultDataClasses.INTEGER, false, true)); //lossy, but not narrowing
DataTypeManager.addTransform(new NumberToLongTransform(
- DefaultDataClasses.INTEGER, false));
+ DefaultDataClasses.INTEGER, false, false));
DataTypeManager.addTransform(new NumberToShortTransform(
DefaultDataClasses.INTEGER, true));
DataTypeManager.addTransform(new AnyToStringTransform(DefaultDataClasses.INTEGER));
@@ -611,9 +611,9 @@
DataTypeManager.addTransform(new NumberToByteTransform(
DefaultDataClasses.LONG));
DataTypeManager.addTransform(new NumberToDoubleTransform(
- DefaultDataClasses.LONG, false)); //lossy, but not narrowing
+ DefaultDataClasses.LONG, false, true)); //lossy, but not narrowing
DataTypeManager.addTransform(new NumberToFloatTransform(
- DefaultDataClasses.LONG, false)); //lossy, but not narrowing
+ DefaultDataClasses.LONG, false, true)); //lossy, but not narrowing
DataTypeManager.addTransform(new NumberToIntegerTransform(
DefaultDataClasses.LONG, true));
DataTypeManager.addTransform(new NumberToShortTransform(
@@ -626,13 +626,13 @@
DataTypeManager.addTransform(new NumberToByteTransform(
DefaultDataClasses.SHORT));
DataTypeManager.addTransform(new NumberToDoubleTransform(
- DefaultDataClasses.SHORT, false));
+ DefaultDataClasses.SHORT, false, false));
DataTypeManager.addTransform(new NumberToFloatTransform(
- DefaultDataClasses.SHORT, false));
+ DefaultDataClasses.SHORT, false, false));
DataTypeManager.addTransform(new NumberToIntegerTransform(
DefaultDataClasses.SHORT, false));
DataTypeManager.addTransform(new NumberToLongTransform(
- DefaultDataClasses.SHORT, false));
+ DefaultDataClasses.SHORT, false, false));
DataTypeManager.addTransform(new AnyToStringTransform(DefaultDataClasses.SHORT));
DataTypeManager
Modified: trunk/common-core/src/main/java/com/metamatrix/common/types/Transform.java
===================================================================
--- trunk/common-core/src/main/java/com/metamatrix/common/types/Transform.java 2009-08-31
22:18:33 UTC (rev 1299)
+++ trunk/common-core/src/main/java/com/metamatrix/common/types/Transform.java 2009-09-01
04:26:32 UTC (rev 1300)
@@ -105,6 +105,10 @@
public boolean isNarrowing() {
return false;
}
+
+ public boolean isLossy() {
+ return isNarrowing();
+ }
/**
* Override Object.toString() to do getDisplayName() version.
Modified:
trunk/common-core/src/main/java/com/metamatrix/common/types/basic/NumberToDoubleTransform.java
===================================================================
---
trunk/common-core/src/main/java/com/metamatrix/common/types/basic/NumberToDoubleTransform.java 2009-08-31
22:18:33 UTC (rev 1299)
+++
trunk/common-core/src/main/java/com/metamatrix/common/types/basic/NumberToDoubleTransform.java 2009-09-01
04:26:32 UTC (rev 1300)
@@ -30,10 +30,12 @@
private Class<?> sourceType;
private boolean isNarrowing;
+ private boolean isLossy;
- public NumberToDoubleTransform(Class<?> sourceType, boolean isNarrowing) {
+ public NumberToDoubleTransform(Class<?> sourceType, boolean isNarrowing, boolean
isLossy) {
this.sourceType = sourceType;
this.isNarrowing = isNarrowing;
+ this.isLossy = isLossy;
}
@Override
@@ -64,4 +66,14 @@
return DataTypeManager.DefaultDataClasses.DOUBLE;
}
+ @Override
+ public boolean isNarrowing() {
+ return isNarrowing;
+ }
+
+ @Override
+ public boolean isLossy() {
+ return isLossy;
+ }
+
}
Modified:
trunk/common-core/src/main/java/com/metamatrix/common/types/basic/NumberToFloatTransform.java
===================================================================
---
trunk/common-core/src/main/java/com/metamatrix/common/types/basic/NumberToFloatTransform.java 2009-08-31
22:18:33 UTC (rev 1299)
+++
trunk/common-core/src/main/java/com/metamatrix/common/types/basic/NumberToFloatTransform.java 2009-09-01
04:26:32 UTC (rev 1300)
@@ -30,10 +30,12 @@
private Class<?> sourceType;
private boolean isNarrowing;
+ private boolean isLossy;
- public NumberToFloatTransform(Class<?> sourceType, boolean isNarrowing) {
+ public NumberToFloatTransform(Class<?> sourceType, boolean isNarrowing, boolean
isLossy) {
this.sourceType = sourceType;
this.isNarrowing = isNarrowing;
+ this.isLossy = isLossy;
}
@Override
@@ -64,4 +66,14 @@
return DataTypeManager.DefaultDataClasses.FLOAT;
}
+ @Override
+ public boolean isNarrowing() {
+ return isNarrowing;
+ }
+
+ @Override
+ public boolean isLossy() {
+ return isLossy;
+ }
+
}
Modified:
trunk/common-core/src/main/java/com/metamatrix/common/types/basic/NumberToIntegerTransform.java
===================================================================
---
trunk/common-core/src/main/java/com/metamatrix/common/types/basic/NumberToIntegerTransform.java 2009-08-31
22:18:33 UTC (rev 1299)
+++
trunk/common-core/src/main/java/com/metamatrix/common/types/basic/NumberToIntegerTransform.java 2009-09-01
04:26:32 UTC (rev 1300)
@@ -64,4 +64,9 @@
return DataTypeManager.DefaultDataClasses.INTEGER;
}
+ @Override
+ public boolean isNarrowing() {
+ return isNarrowing;
+ }
+
}
Modified:
trunk/common-core/src/main/java/com/metamatrix/common/types/basic/NumberToLongTransform.java
===================================================================
---
trunk/common-core/src/main/java/com/metamatrix/common/types/basic/NumberToLongTransform.java 2009-08-31
22:18:33 UTC (rev 1299)
+++
trunk/common-core/src/main/java/com/metamatrix/common/types/basic/NumberToLongTransform.java 2009-09-01
04:26:32 UTC (rev 1300)
@@ -30,10 +30,12 @@
private Class<?> sourceType;
private boolean isNarrowing;
+ private boolean isLossy;
- public NumberToLongTransform(Class<?> sourceType, boolean isNarrowing) {
+ public NumberToLongTransform(Class<?> sourceType, boolean isNarrowing, boolean
isLossy) {
this.sourceType = sourceType;
this.isNarrowing = isNarrowing;
+ this.isLossy = isLossy;
}
@Override
@@ -64,4 +66,14 @@
return DataTypeManager.DefaultDataClasses.LONG;
}
+ @Override
+ public boolean isNarrowing() {
+ return isNarrowing;
+ }
+
+ @Override
+ public boolean isLossy() {
+ return isLossy;
+ }
+
}
Modified:
trunk/common-core/src/main/java/com/metamatrix/common/types/basic/NumberToShortTransform.java
===================================================================
---
trunk/common-core/src/main/java/com/metamatrix/common/types/basic/NumberToShortTransform.java 2009-08-31
22:18:33 UTC (rev 1299)
+++
trunk/common-core/src/main/java/com/metamatrix/common/types/basic/NumberToShortTransform.java 2009-09-01
04:26:32 UTC (rev 1300)
@@ -64,4 +64,9 @@
return DataTypeManager.DefaultDataClasses.SHORT;
}
+ @Override
+ public boolean isNarrowing() {
+ return isNarrowing;
+ }
+
}
Modified: trunk/engine/src/main/java/com/metamatrix/query/rewriter/QueryRewriter.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/rewriter/QueryRewriter.java 2009-08-31
22:18:33 UTC (rev 1299)
+++ trunk/engine/src/main/java/com/metamatrix/query/rewriter/QueryRewriter.java 2009-09-01
04:26:32 UTC (rev 1300)
@@ -1509,7 +1509,7 @@
Transform transform = DataTypeManager.getTransform(leftExpr.getType(),
crit.getRightExpression().getType());
- if (transform.isNarrowing()) {
+ if (transform.isLossy()) {
return crit;
}
@@ -1567,6 +1567,10 @@
Constant result = null;
try {
result =
ResolverUtil.convertConstant(DataTypeManager.getDataTypeName(rightConstant.getType()),
leftExprTypeName, rightConstant);
+ Constant other = ResolverUtil.convertConstant(leftExprTypeName,
DataTypeManager.getDataTypeName(rightConstant.getType()), result);
+ if (((Comparable)rightConstant.getValue()).compareTo(other.getValue()) !=
0) {
+ result = null;
+ }
} catch(QueryResolverException e) {
}
Modified: trunk/engine/src/test/java/com/metamatrix/query/rewriter/TestQueryRewriter.java
===================================================================
---
trunk/engine/src/test/java/com/metamatrix/query/rewriter/TestQueryRewriter.java 2009-08-31
22:18:33 UTC (rev 1299)
+++
trunk/engine/src/test/java/com/metamatrix/query/rewriter/TestQueryRewriter.java 2009-09-01
04:26:32 UTC (rev 1300)
@@ -1008,7 +1008,7 @@
String rewritProc = "CREATE PROCEDURE\n"; //$NON-NLS-1$
rewritProc = rewritProc + "BEGIN\n"; //$NON-NLS-1$
- rewritProc = rewritProc + "SELECT e2 FROM pm1.g1 WHERE sqrt(pm1.g1.e2) =
10.0;\n"; //$NON-NLS-1$
+ rewritProc = rewritProc + "SELECT e2 FROM pm1.g1 WHERE convert(sqrt(pm1.g1.e2),
integer) = 10;\n"; //$NON-NLS-1$
rewritProc = rewritProc + "END"; //$NON-NLS-1$
String procReturned = this.getReWrittenProcedure(procedure, userQuery,
@@ -1613,7 +1613,7 @@
}
@Test public void testRewriteCase1954e() {
- helpTestRewriteCriteria("convert(pm1.g1.e4, integer) = 2",
"pm1.g1.e4 = 2.0"); //$NON-NLS-1$ //$NON-NLS-2$
+ helpTestRewriteCriteria("convert(pm1.g1.e4, integer) = 2",
"convert(pm1.g1.e4, integer) = 2"); //$NON-NLS-1$ //$NON-NLS-2$
}
/** Check that this fails, x is not convertable to an int */