[teiid-commits] teiid SVN: r2840 - in trunk/engine/src: main/java/org/teiid/query/tempdata and 1 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Wed Jan 12 20:40:52 EST 2011


Author: shawkins
Date: 2011-01-12 20:40:52 -0500 (Wed, 12 Jan 2011)
New Revision: 2840

Modified:
   trunk/engine/src/main/java/org/teiid/query/metadata/TempCapabilitiesFinder.java
   trunk/engine/src/main/java/org/teiid/query/tempdata/TempTable.java
   trunk/engine/src/test/java/org/teiid/query/processor/TestTempTables.java
Log:
TEIID-1433 adding direct count(*) support

Modified: trunk/engine/src/main/java/org/teiid/query/metadata/TempCapabilitiesFinder.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/TempCapabilitiesFinder.java	2011-01-12 23:13:09 UTC (rev 2839)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/TempCapabilitiesFinder.java	2011-01-13 01:40:52 UTC (rev 2840)
@@ -52,6 +52,7 @@
 	    		tempCaps.setCapabilitySupport(Capability.CRITERIA_ISNULL, true);
 	    		tempCaps.setCapabilitySupport(Capability.CRITERIA_LIKE, true);
 	    		tempCaps.setCapabilitySupport(Capability.CRITERIA_LIKE_ESCAPE, true);
+	    		tempCaps.setCapabilitySupport(Capability.QUERY_AGGREGATES_COUNT_STAR, true);
     		}
     		return tempCaps;
     	}

Modified: trunk/engine/src/main/java/org/teiid/query/tempdata/TempTable.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/tempdata/TempTable.java	2011-01-12 23:13:09 UTC (rev 2839)
+++ trunk/engine/src/main/java/org/teiid/query/tempdata/TempTable.java	2011-01-13 01:40:52 UTC (rev 2840)
@@ -23,6 +23,7 @@
 package org.teiid.query.tempdata;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
@@ -59,6 +60,7 @@
 import org.teiid.query.sql.lang.Criteria;
 import org.teiid.query.sql.lang.OrderBy;
 import org.teiid.query.sql.lang.SetClauseList;
+import org.teiid.query.sql.symbol.AggregateSymbol;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.sql.symbol.SingleElementSymbol;
@@ -312,6 +314,21 @@
 	}
 
 	public TupleSource createTupleSource(final List<? extends SingleElementSymbol> projectedCols, final Criteria condition, OrderBy orderBy) throws TeiidComponentException, TeiidProcessingException {
+		//special handling for count(*)
+		boolean agg = false;
+		for (SingleElementSymbol singleElementSymbol : projectedCols) {
+			if (singleElementSymbol instanceof AggregateSymbol) {
+				agg = true;
+				break;
+			}
+		}
+		if (agg) {
+			if (condition == null) {
+				int count = this.getRowCount();
+				return new CollectionTupleSource(Arrays.asList(Collections.nCopies(projectedCols.size(), count)).iterator());
+			}
+			orderBy = null;
+		}
 		IndexInfo primary = new IndexInfo(this, projectedCols, condition, orderBy, true);
 		IndexInfo ii = primary;
 		if (indexTables != null && (condition != null || orderBy != null) && ii.valueSet.size() != 1) {
@@ -328,15 +345,15 @@
 			}
 			LogManager.logDetail(LogConstants.CTX_DQP, "Choose index", ii.table, "covering:", ii.coveredCriteria,"ordering:", ii.ordering); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 			if (ii.covering) {
-				return ii.table.createTupleSource(projectedCols, condition, orderBy, ii);
+				return ii.table.createTupleSource(projectedCols, condition, orderBy, ii, agg);
 			}
 			List<ElementSymbol> pkColumns = this.columns.subList(0, this.tree.getKeyLength());
 			if (ii.ordering != null) {
 				//use order and join
 				primary.valueTs = ii.table.createTupleSource(pkColumns, 
-						Criteria.combineCriteria(ii.coveredCriteria), orderBy, ii);
+						Criteria.combineCriteria(ii.coveredCriteria), orderBy, ii, agg);
 				primary.ordering = null;
-				return createTupleSource(projectedCols, Criteria.combineCriteria(ii.nonCoveredCriteria), null, primary);
+				return createTupleSource(projectedCols, Criteria.combineCriteria(ii.nonCoveredCriteria), null, primary, agg);
 			} 
 			//order by pk to localize lookup costs, then join
 			OrderBy pkOrderBy = new OrderBy();
@@ -344,18 +361,18 @@
 				pkOrderBy.addVariable(elementSymbol);
 			}
 			primary.valueTs = ii.table.createTupleSource(pkColumns, 
-					Criteria.combineCriteria(ii.coveredCriteria), pkOrderBy, ii);
-			return createTupleSource(projectedCols, Criteria.combineCriteria(ii.nonCoveredCriteria), orderBy, primary);
+					Criteria.combineCriteria(ii.coveredCriteria), pkOrderBy, ii, agg);
+			return createTupleSource(projectedCols, Criteria.combineCriteria(ii.nonCoveredCriteria), orderBy, primary, agg);
 		}
-		return createTupleSource(projectedCols, condition, orderBy, ii);
+		return createTupleSource(projectedCols, condition, orderBy, ii, agg);
 	}
 
 	private TupleSource createTupleSource(
 			final List<? extends SingleElementSymbol> projectedCols,
-			final Criteria condition, OrderBy orderBy, IndexInfo ii)
+			final Criteria condition, OrderBy orderBy, IndexInfo ii, boolean agg)
 			throws TeiidComponentException, TeiidProcessingException {
 		TupleBrowser browser = ii.createTupleBrowser();
-		TupleSource ts = new QueryTupleSource(browser, columnMap, projectedCols, condition);
+		TupleSource ts = new QueryTupleSource(browser, columnMap, agg?getColumns():projectedCols, condition);
 		
 		boolean usingQueryTupleSource = false;
 		try {
@@ -363,6 +380,12 @@
 			if (ii.ordering == null && orderBy != null) {
 				SortUtility sort = new SortUtility(ts, orderBy.getOrderByItems(), Mode.SORT, bm, sessionID, projectedCols);
 				tb = sort.sort();
+			} else if (agg) {
+				int count = 0;
+				while (ts.nextTuple() != null) {
+					count++;
+				}
+				return new CollectionTupleSource(Arrays.asList(Collections.nCopies(projectedCols.size(), count)).iterator());
 			} else if (updatable) {
 				tb = bm.createTupleBuffer(projectedCols, sessionID, TupleSourceType.PROCESSOR);
 				List<?> next = null;

Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestTempTables.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestTempTables.java	2011-01-12 23:13:09 UTC (rev 2839)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestTempTables.java	2011-01-13 01:40:52 UTC (rev 2840)
@@ -262,6 +262,12 @@
 		execute("create local temporary table x (e1 string, e2 integer, primary key (e1, e2))", new List[] {Arrays.asList(0)}); //$NON-NLS-1$
 		execute("select * from x where e1 in ('a', 'b') order by e1 desc", new List[0]); //$NON-NLS-1$
 	}
+	
+	@Test public void testCountStar() throws Exception {
+		sampleTable();
+		execute("select count(*) a from x", new List[] {Arrays.asList(4)});
+		execute("select count(*) a from x where e2 = 1 order by a", new List[] {Arrays.asList(2)});
+	}
 
 	private void sampleTable() throws Exception {
 		execute("create local temporary table x (e1 string, e2 integer, primary key (e1, e2))", new List[] {Arrays.asList(0)}); //$NON-NLS-1$



More information about the teiid-commits mailing list