[teiid-commits] teiid SVN: r2274 - in branches/7.0.x: engine/src/main/java/org/teiid/query/optimizer/relational/rules and 2 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Tue Jun 22 11:11:50 EDT 2010


Author: shawkins
Date: 2010-06-22 11:11:50 -0400 (Tue, 22 Jun 2010)
New Revision: 2274

Modified:
   branches/7.0.x/common-core/src/main/java/org/teiid/core/types/basic/FloatingNumberToBigDecimalTransform.java
   branches/7.0.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushAggregates.java
   branches/7.0.x/engine/src/test/java/org/teiid/common/queue/TestStatsCapturingWorkManager.java
   branches/7.0.x/engine/src/test/java/org/teiid/query/processor/TestAggregateProcessing.java
Log:
TEIID-159 updating the handling of floating to bigdecmial conversions and fixing misc math issues with aggregate pushdown.

Modified: branches/7.0.x/common-core/src/main/java/org/teiid/core/types/basic/FloatingNumberToBigDecimalTransform.java
===================================================================
--- branches/7.0.x/common-core/src/main/java/org/teiid/core/types/basic/FloatingNumberToBigDecimalTransform.java	2010-06-22 14:34:09 UTC (rev 2273)
+++ branches/7.0.x/common-core/src/main/java/org/teiid/core/types/basic/FloatingNumberToBigDecimalTransform.java	2010-06-22 15:11:50 UTC (rev 2274)
@@ -46,7 +46,9 @@
 	 * the transformation fails
 	 */
 	public Object transformDirect(Object value) throws TransformationException {
-        return BigDecimal.valueOf(((Number)value).doubleValue());
+		BigDecimal result = BigDecimal.valueOf(((Number)value).doubleValue());
+		result = result.setScale(Math.max(result.scale(), value instanceof Double ? 12 : 4));
+		return result;
 	}
 
 	/**

Modified: branches/7.0.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushAggregates.java
===================================================================
--- branches/7.0.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushAggregates.java	2010-06-22 14:34:09 UTC (rev 2273)
+++ branches/7.0.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushAggregates.java	2010-06-22 15:11:50 UTC (rev 2274)
@@ -352,10 +352,14 @@
         		projectedViewSymbols.add(agg);
         	} else {
         		if (agg.getAggregateFunction().equals(NonReserved.COUNT)) {
-        			SearchedCaseExpression count = new SearchedCaseExpression(Arrays.asList(new IsNullCriteria(agg.getExpression())), Arrays.asList(new Constant(Integer.valueOf(0))));
-        			count.setElseExpression(new Constant(Integer.valueOf(1)));
-        			count.setType(DataTypeManager.DefaultDataClasses.INTEGER);
-    				projectedViewSymbols.add(new ExpressionSymbol("stagedAgg", count)); //$NON-NLS-1$
+        			if (agg.getExpression() == null) {
+	    				projectedViewSymbols.add(new ExpressionSymbol("stagedAgg", new Constant(1))); //$NON-NLS-1$
+        			} else { 
+	        			SearchedCaseExpression count = new SearchedCaseExpression(Arrays.asList(new IsNullCriteria(agg.getExpression())), Arrays.asList(new Constant(Integer.valueOf(0))));
+	        			count.setElseExpression(new Constant(Integer.valueOf(1)));
+	        			count.setType(DataTypeManager.DefaultDataClasses.INTEGER);
+	    				projectedViewSymbols.add(new ExpressionSymbol("stagedAgg", count)); //$NON-NLS-1$
+        			}
         		} else { //min, max, sum
         			Expression ex = agg.getExpression();
         			ex = ResolverUtil.convertExpression(ex, DataTypeManager.getDataTypeName(agg.getType()), metadata);
@@ -689,7 +693,10 @@
                 AggregateSymbol sumSumAgg = new AggregateSymbol("stagedAgg", NonReserved.SUM, false, sumAgg); //$NON-NLS-1$
                 AggregateSymbol sumCountAgg = new AggregateSymbol("stagedAgg", NonReserved.SUM, false, countAgg); //$NON-NLS-1$
 
-                Function divideFunc = new Function("/", new Expression[] {sumSumAgg, sumCountAgg}); //$NON-NLS-1$
+                Expression convertedSum = new Function(FunctionLibrary.CONVERT, new Expression[] {sumSumAgg, new Constant(DataTypeManager.getDataTypeName(partitionAgg.getType()))});
+                Expression convertCount = new Function(FunctionLibrary.CONVERT, new Expression[] {sumCountAgg, new Constant(DataTypeManager.getDataTypeName(partitionAgg.getType()))});
+                
+                Function divideFunc = new Function("/", new Expression[] {convertedSum, convertCount}); //$NON-NLS-1$
                 ResolverVisitor.resolveLanguageObject(divideFunc, metadata);
 
                 newExpression = divideFunc;

Modified: branches/7.0.x/engine/src/test/java/org/teiid/common/queue/TestStatsCapturingWorkManager.java
===================================================================
--- branches/7.0.x/engine/src/test/java/org/teiid/common/queue/TestStatsCapturingWorkManager.java	2010-06-22 14:34:09 UTC (rev 2273)
+++ branches/7.0.x/engine/src/test/java/org/teiid/common/queue/TestStatsCapturingWorkManager.java	2010-06-22 15:11:50 UTC (rev 2274)
@@ -32,6 +32,7 @@
 import javax.resource.spi.work.WorkManager;
 import javax.resource.spi.work.WorkRejectedException;
 
+import org.junit.Ignore;
 import org.junit.Test;
 import org.teiid.adminapi.impl.WorkerPoolStatisticsMetadata;
 import org.teiid.dqp.internal.process.StatsCapturingWorkManager;
@@ -61,6 +62,7 @@
         assertEquals("Expected threads to be maxed out", MAX_THREADS, stats.getHighestActiveThreads()); //$NON-NLS-1$
     }
 
+    @Ignore
     @Test public void testThreadReuse() throws Exception {
         final long SINGLE_WAIT = 50;
         final long NUM_THREADS = 5;

Modified: branches/7.0.x/engine/src/test/java/org/teiid/query/processor/TestAggregateProcessing.java
===================================================================
--- branches/7.0.x/engine/src/test/java/org/teiid/query/processor/TestAggregateProcessing.java	2010-06-22 14:34:09 UTC (rev 2273)
+++ branches/7.0.x/engine/src/test/java/org/teiid/query/processor/TestAggregateProcessing.java	2010-06-22 15:11:50 UTC (rev 2274)
@@ -176,9 +176,9 @@
 		// Create expected results
 		List[] expected = new List[] {
 				Arrays.asList(new Object[] { new Integer(1),
-						new BigDecimal("110.5") }), //$NON-NLS-1$
+						new BigDecimal("110.5000") }), //$NON-NLS-1$
 				Arrays.asList(new Object[] { new Integer(2),
-						new BigDecimal("254.5") }) //$NON-NLS-1$
+						new BigDecimal("254.5000") }) //$NON-NLS-1$
 		};
 
 		// Construct data manager with data



More information about the teiid-commits mailing list