[teiid-commits] teiid SVN: r3982 - in trunk: build/kits/jboss-as7/docs/teiid and 14 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Mon Apr 9 15:23:07 EDT 2012


Author: shawkins
Date: 2012-04-09 15:23:06 -0400 (Mon, 09 Apr 2012)
New Revision: 3982

Modified:
   trunk/api/src/main/java/org/teiid/metadata/AggregateAttributes.java
   trunk/api/src/main/java/org/teiid/metadata/FunctionMethod.java
   trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html
   trunk/engine/src/main/java/org/teiid/query/function/FunctionDescriptor.java
   trunk/engine/src/main/java/org/teiid/query/function/FunctionTree.java
   trunk/engine/src/main/java/org/teiid/query/function/aggregate/AggregateFunction.java
   trunk/engine/src/main/java/org/teiid/query/function/aggregate/UserDefined.java
   trunk/engine/src/main/java/org/teiid/query/processor/relational/GroupingNode.java
   trunk/engine/src/main/java/org/teiid/query/processor/relational/SortingFilter.java
   trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
   trunk/engine/src/main/java/org/teiid/query/sql/symbol/AggregateSymbol.java
   trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
   trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
   trunk/engine/src/main/resources/org/teiid/query/i18n.properties
   trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java
   trunk/engine/src/test/java/org/teiid/query/processor/TestAggregateProcessing.java
   trunk/engine/src/test/java/org/teiid/query/processor/relational/TestDuplicateFilter.java
   trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java
   trunk/metadata/src/main/java/org/teiid/metadata/index/IndexMetadataStore.java
   trunk/test-integration/common/src/test/java/org/teiid/jdbc/TestDynamicImportedMetaData.java
Log:
TEIID-1560 full processing tests and metadata load

Modified: trunk/api/src/main/java/org/teiid/metadata/AggregateAttributes.java
===================================================================
--- trunk/api/src/main/java/org/teiid/metadata/AggregateAttributes.java	2012-04-09 18:56:20 UTC (rev 3981)
+++ trunk/api/src/main/java/org/teiid/metadata/AggregateAttributes.java	2012-04-09 19:23:06 UTC (rev 3982)
@@ -31,12 +31,14 @@
 	
 	private static final long serialVersionUID = 5398000844375944790L;
 
+	private boolean analytic;
+	private boolean usesDistinctRows;
+	private boolean allowsOrderBy;
 	private boolean allowsDistinct;
-	private boolean windowable;
-	private boolean usesAllRows = true;
-	private boolean respectsNulls = true;
-	private boolean allowsOrderBy;
-	
+	private boolean decomposable;
+	/**
+	 * @return true if the aggregate allows an order by clause
+	 */
 	public boolean allowsOrderBy() {
 		return allowsOrderBy;
 	}
@@ -45,36 +47,55 @@
 		this.allowsOrderBy = allowsOrderBy;
 	}
 	
-	public boolean allowsDistinct() {
-		return allowsDistinct;
+	/**
+	 * @return true if the aggregate can only be used as a windowed function
+	 */
+	public boolean isAnalytic() {
+		return analytic;
 	}
 	
-	public void setAllowsDistinct(boolean allowsDistinct) {
-		this.allowsDistinct = allowsDistinct;
+	public void setAnalytic(boolean analytic) {
+		this.analytic = analytic;
 	}
 	
-	public boolean isWindowable() {
-		return windowable;
+	/**
+	 * 
+	 * @return True if the aggregate function specified without the
+	 * distinct keyword effectively uses only distinct rows.  
+	 * For example min/max would return true
+	 * and avg would return false.
+	 */
+	public boolean usesDistinctRows() {
+		return usesDistinctRows;
 	}
 	
-	public void setWindowable(boolean windowable) {
-		this.windowable = windowable;
+	public void setUsesDistinctRows(boolean usesDistinctRows) {
+		this.usesDistinctRows = usesDistinctRows;
 	}
 	
-	public boolean respectsNulls() {
-		return respectsNulls;
+	/**
+	 * @return true if the aggregate function may be decomposed as
+	 * agg(agg(x)) for non-partitioned aggregate pushdown.
+	 * This is only meaningful for single argument aggregate
+	 * functions. 
+	 */
+	public boolean isDecomposable() {
+		return decomposable;
 	}
 	
-	public void setRespectsNulls(boolean respectsNulls) {
-		this.respectsNulls = respectsNulls;
+	public void setDecomposable(boolean decomposable) {
+		this.decomposable = decomposable;
 	}
 	
-	public void setUsesAllRows(boolean usesAllRows) {
-		this.usesAllRows = usesAllRows;
+	/**
+	 * @return true if the aggregate function can use the DISTINCT keyword
+	 */
+	public boolean allowsDistinct() {
+		return allowsDistinct;
 	}
 	
-	public boolean usesAllRows() {
-		return this.usesAllRows;
+	public void setAllowsDistinct(boolean allowsDistinct) {
+		this.allowsDistinct = allowsDistinct;
 	}
 	
 }

Modified: trunk/api/src/main/java/org/teiid/metadata/FunctionMethod.java
===================================================================
--- trunk/api/src/main/java/org/teiid/metadata/FunctionMethod.java	2012-04-09 18:56:20 UTC (rev 3981)
+++ trunk/api/src/main/java/org/teiid/metadata/FunctionMethod.java	2012-04-09 19:23:06 UTC (rev 3982)
@@ -481,6 +481,11 @@
     	this.classLoader = classloader;
     }
     
+    /**
+     * Gets the {@link AggregateAttributes} for this function if it 
+     * represents an aggregate function.  Must be null for non-aggregates.
+     * @return
+     */
     public AggregateAttributes getAggregateAttributes() {
 		return aggregateAttributes;
 	}

Modified: trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html
===================================================================
--- trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html	2012-04-09 18:56:20 UTC (rev 3981)
+++ trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html	2012-04-09 19:23:06 UTC (rev 3982)
@@ -46,7 +46,8 @@
     </UL>
   <LI><B>VARBINARY type support</B> - the Teiid VARBINARY type can now be used to support source BINARY and VARBINARY types.
   <LI><B>Greenplum Translator</B> - for use with the Greenplum database.
-  <LI><B>Enhanced parse/format pushdown</B> - added more built-in support and extension points for parse/format function pushdown.  Added parse/format timestamp handling for SQLServer, Sybase, Oracle, and PostgreSQL. 
+  <LI><B>Enhanced parse/format pushdown</B> - added more built-in support and extension points for parse/format function pushdown.  Added parse/format timestamp handling for SQLServer, Sybase, Oracle, and PostgreSQL.
+  <LI><B>User Defined Aggregates</B> - user defined aggregate functions can be defined via extension metadata or connector metadata. 
 </UL>
 
 <h2><a name="Compatibility">Compatibility Issues</a></h2>

Modified: trunk/engine/src/main/java/org/teiid/query/function/FunctionDescriptor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/function/FunctionDescriptor.java	2012-04-09 18:56:20 UTC (rev 3981)
+++ trunk/engine/src/main/java/org/teiid/query/function/FunctionDescriptor.java	2012-04-09 19:23:06 UTC (rev 3982)
@@ -23,6 +23,7 @@
 package org.teiid.query.function;
 
 import java.io.Serializable;
+import java.lang.reflect.Array;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.Arrays;
@@ -222,7 +223,17 @@
         	if (method.isVarArgs()) {
         		int i = invocationMethod.getParameterTypes().length;
         		Object[] newValues = Arrays.copyOf(values, i);
-        		newValues[i - 1] = Arrays.copyOfRange(values, i - 1, values.length);
+        		Object varArgs = null;
+        		if (invocationMethod.getParameterTypes()[i - 1].getComponentType() != Object.class) {
+	        		int varArgCount = values.length - i + 1;
+	        		varArgs = Array.newInstance(invocationMethod.getParameterTypes()[i - 1].getComponentType(), varArgCount);
+	        		for (int j = 0; j < varArgCount; j++) {
+	        			Array.set(varArgs, j, values[i-1+j]);
+	        		}
+        		} else {
+        			varArgs = Arrays.copyOfRange(values, i - 1, values.length);
+        		}
+        		newValues[i - 1] = varArgs;
         		values = newValues;
         	}
             Object result = invocationMethod.invoke(functionTarget, values);

Modified: trunk/engine/src/main/java/org/teiid/query/function/FunctionTree.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/function/FunctionTree.java	2012-04-09 18:56:20 UTC (rev 3981)
+++ trunk/engine/src/main/java/org/teiid/query/function/FunctionTree.java	2012-04-09 19:23:06 UTC (rev 3982)
@@ -346,7 +346,7 @@
         			throw new TeiidRuntimeException(QueryPlugin.Event.TEIID30600, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30600, method.getName(), invocationMethod));
         		}
         		
-        		if (method.getAggregateAttributes() != null && !(UserDefinedAggregate.class.isAssignableFrom(method.getClass()))) {
+        		if (method.getAggregateAttributes() != null && !(UserDefinedAggregate.class.isAssignableFrom(invocationMethod.getDeclaringClass()))) {
     				throw new TeiidRuntimeException(QueryPlugin.Event.TEIID30601, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30601, method.getName(), method.getInvocationClass(), UserDefinedAggregate.class.getName()));
         		}
             }

Modified: trunk/engine/src/main/java/org/teiid/query/function/aggregate/AggregateFunction.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/function/aggregate/AggregateFunction.java	2012-04-09 18:56:20 UTC (rev 3981)
+++ trunk/engine/src/main/java/org/teiid/query/function/aggregate/AggregateFunction.java	2012-04-09 19:23:06 UTC (rev 3982)
@@ -71,15 +71,22 @@
     	if (conditionIndex != -1 && !Boolean.TRUE.equals(tuple.get(conditionIndex))) {
 			return;
     	}
-    	if (!respectsNull()) {
+    	if (filter(tuple)) {
+    		return;
+    	}
+		addInputDirect(tuple, commandContext);
+    }
+
+	public boolean filter(List<?> tuple) {
+		if (!respectsNull()) {
     		for (int i = 0; i < argIndexes.length; i++) {
     			if (tuple.get(argIndexes[i]) == null) {
-    				return;
+    				return true;
     			}
     		}
     	}
-		addInputDirect(tuple, commandContext);
-    }
+		return false;
+	}
     
     public boolean respectsNull() {
     	return false;

Modified: trunk/engine/src/main/java/org/teiid/query/function/aggregate/UserDefined.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/function/aggregate/UserDefined.java	2012-04-09 18:56:20 UTC (rev 3981)
+++ trunk/engine/src/main/java/org/teiid/query/function/aggregate/UserDefined.java	2012-04-09 19:23:06 UTC (rev 3982)
@@ -70,4 +70,9 @@
 		return instance.getResult(commandContext);
 	}
 	
+	@Override
+	public boolean respectsNull() {
+		return !fd.getMethod().isNullOnNull();
+	}
+	
 }

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/GroupingNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/GroupingNode.java	2012-04-09 18:56:20 UTC (rev 3981)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/GroupingNode.java	2012-04-09 19:23:06 UTC (rev 3982)
@@ -245,6 +245,7 @@
 			break;     
 		case USER_DEFINED:
 			result = new UserDefined(aggSymbol.getFunctionDescriptor());
+			break;
 		default:
 			result = new StatsFunction(function);
 		}

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/SortingFilter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/SortingFilter.java	2012-04-09 18:56:20 UTC (rev 3981)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/SortingFilter.java	2012-04-09 19:23:06 UTC (rev 3982)
@@ -109,7 +109,9 @@
         for (int i = 0; i < argIndexes.length; i++) {
 			row.add(tuple.get(argIndexes[i]));
 		}
-        this.collectionBuffer.addTuple(row);
+        if (!this.proxy.filter(row)) {
+            this.collectionBuffer.addTuple(row);
+        }
 	}
 	
     /**
@@ -150,8 +152,7 @@
         return this.proxy.getResult(commandContext);
     }
     
-    @Override
     public boolean respectsNull() {
-    	return this.proxy.respectsNull();
+    	return true;
     }
 }

Modified: trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java	2012-04-09 18:56:20 UTC (rev 3981)
+++ trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java	2012-04-09 19:23:06 UTC (rev 3982)
@@ -2006,6 +2006,9 @@
         		return expression.getArg(0);
         	}
     	}
+    	if (expression.isDistinct() && expression.getAggregateFunction() == Type.USER_DEFINED && expression.getFunctionDescriptor().getMethod().getAggregateAttributes().usesDistinctRows()) {
+    		expression.setDistinct(false);
+    	}
     	if (expression.getArgs().length == 1 && expression.getCondition() != null && !expression.respectsNulls()) {
     		Expression cond = expression.getCondition();
     		Expression ex = expression.getArg(0);

Modified: trunk/engine/src/main/java/org/teiid/query/sql/symbol/AggregateSymbol.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/AggregateSymbol.java	2012-04-09 18:56:20 UTC (rev 3981)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/AggregateSymbol.java	2012-04-09 19:23:06 UTC (rev 3982)
@@ -303,7 +303,7 @@
 		case EVERY:
 			return false;
 		case USER_DEFINED:
-			return getFunctionDescriptor().getMethod().getAggregateAttributes().usesAllRows();
+			return !getFunctionDescriptor().getMethod().getAggregateAttributes().usesDistinctRows();
 		}
 		return true;
     }
@@ -342,7 +342,7 @@
 		case XMLAGG:
 			return orderBy == null;
 		case USER_DEFINED:
-			return false;
+			return this.getArgs().length == 1 && this.getFunctionDescriptor().getMethod().getAggregateAttributes().isDecomposable();
 		}
 		return true;
 	}

Modified: trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java	2012-04-09 18:56:20 UTC (rev 3981)
+++ trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java	2012-04-09 19:23:06 UTC (rev 3982)
@@ -994,8 +994,8 @@
     		if (!aa.allowsOrderBy() && obj.getOrderBy() != null) {
     			handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.uda_not_allowed", "ORDER BY", obj), obj); //$NON-NLS-1$ //$NON-NLS-2$
     		}
-    		if (!aa.isWindowable() && obj.isWindowed()) {
-    			handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.uda_not_allowed", "windowing", obj), obj); //$NON-NLS-1$ //$NON-NLS-2$ 
+    		if (aa.isAnalytic() && !obj.isWindowed()) {
+    			handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.uda_analytic", obj), obj); //$NON-NLS-1$  
     		}
     	}
     	if (obj.getCondition() != null) {

Modified: trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
===================================================================
--- trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj	2012-04-09 18:56:20 UTC (rev 3981)
+++ trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj	2012-04-09 19:23:06 UTC (rev 3982)
@@ -3698,7 +3698,7 @@
 			funcName = funcToken.image;
 		}
 		if (distinct != null || orderBy != null || condition != null) {
-			AggregateSymbol as = new AggregateSymbol(funcName, distinct, (Expression[])args.toArray(new Expression[args.size()]), orderBy);
+			AggregateSymbol as = new AggregateSymbol(funcName, distinct!=null?distinct:false, (Expression[])args.toArray(new Expression[args.size()]), orderBy);
 			as.setCondition(condition);
 			return as;
 		}	

Modified: trunk/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/org/teiid/query/i18n.properties	2012-04-09 18:56:20 UTC (rev 3981)
+++ trunk/engine/src/main/resources/org/teiid/query/i18n.properties	2012-04-09 19:23:06 UTC (rev 3982)
@@ -676,6 +676,7 @@
 ValidationVisitor.select_into_wrong_elements=Wrong number of elements being SELECTed INTO the target table. Expected {0} elements, but was {1}.
 ValidationVisitor.user_defined_aggregate_as_function=Cannot call user defined aggregate function {0} as a function.  To disambiguate, please include an ALL keyword - {1}(ALL ...)
 ValidationVisitor.uda_not_allowed=User defined aggregate function does not allow {0}: {1}
+ValidationVisitor.uda_analytic=User defined aggregate function is analytic and must be windowed: {0} 
 SimpleQueryResolver.Query_was_redirected_to_Mat_table=The query against {0} was redirected to the materialization table {1}.
 SimpleQueryResolver.ambiguous_all_in_group=The symbol {0} refers to more than one group defined in the FROM clause.
 TEIID30114=Cannot access procedure {0} using table semantics since the parameter and result set column names are not all unique.

Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java	2012-04-09 18:56:20 UTC (rev 3981)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java	2012-04-09 19:23:06 UTC (rev 3982)
@@ -5218,6 +5218,11 @@
 		Query actualCommand = (Query)QueryParser.getQueryParser().parseCommand("SELECT foo(ALL x, y)", new ParseInfo());
 		assertEquals("SELECT foo(ALL x, y)", actualCommand.toString());
     }
+    
+    @Test public void testUserDefinedAggregateParsing1() throws QueryParserException {
+		Query actualCommand = (Query)QueryParser.getQueryParser().parseCommand("SELECT foo(x, y order by e1)", new ParseInfo());
+		assertEquals("SELECT foo(ALL x, y ORDER BY e1)", actualCommand.toString());
+    }
 
     @Test(expected=QueryParserException.class) public void testWindowedExpression() throws QueryParserException {
 		QueryParser.getQueryParser().parseCommand("SELECT foo(x, y) over ()", new ParseInfo());

Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestAggregateProcessing.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestAggregateProcessing.java	2012-04-09 18:56:20 UTC (rev 3981)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestAggregateProcessing.java	2012-04-09 19:23:06 UTC (rev 3982)
@@ -31,9 +31,17 @@
 import java.util.List;
 
 import org.junit.Test;
+import org.teiid.UserDefinedAggregate;
 import org.teiid.common.buffer.BufferManagerFactory;
 import org.teiid.common.buffer.impl.BufferManagerImpl;
+import org.teiid.core.types.DataTypeManager;
+import org.teiid.metadata.AggregateAttributes;
+import org.teiid.metadata.FunctionMethod;
+import org.teiid.metadata.FunctionParameter;
+import org.teiid.metadata.MetadataStore;
+import org.teiid.metadata.Schema;
 import org.teiid.query.metadata.QueryMetadataInterface;
+import org.teiid.query.metadata.TransformationMetadata;
 import org.teiid.query.optimizer.TestAggregatePushdown;
 import org.teiid.query.optimizer.TestOptimizer;
 import org.teiid.query.optimizer.capabilities.BasicSourceCapabilities;
@@ -41,6 +49,7 @@
 import org.teiid.query.sql.lang.Command;
 import org.teiid.query.unittest.RealMetadataFactory;
 import org.teiid.query.util.CommandContext;
+import org.teiid.query.validator.TestValidator;
 import org.teiid.translator.SourceSystemFunctions;
 
 @SuppressWarnings({"nls", "unchecked"})
@@ -436,5 +445,90 @@
 		ProcessorPlan plan = helpGetPlan(sql, RealMetadataFactory.example1Cached());
 		helpProcess(plan, dataManager, expected);
 	}
+	
+	public static class SumAll implements UserDefinedAggregate<Integer> {
+		
+		private boolean isNull = true;
+		private int result;
+		
+		public void addInput(Integer... vals) {
+			isNull = false;
+			for (int i : vals) {
+				result += i;
+			}
+		}
+		
+		@Override
+		public Integer getResult(org.teiid.CommandContext commandContext) {
+			if (isNull) {
+				return null;
+			}
+			return result;
+		}
 
+		@Override
+		public void reset() {
+			isNull = true;
+			result = 0;
+		}
+		
+	}
+	
+	@Test public void testUserDefined() throws Exception {
+		MetadataStore ms = RealMetadataFactory.example1Store();
+		Schema s = ms.getSchemas().get("PM1");
+		FunctionMethod fm = new FunctionMethod();
+		fm.setName("myagg");
+		fm.setInvocationClass(SumAll.class.getName());
+		fm.setInvocationMethod("addInput");
+		FunctionParameter fp = new FunctionParameter();
+		fp.setType(DataTypeManager.DefaultDataTypes.INTEGER);
+		fp.setName("arg");
+		fp.setVarArg(true);
+		fm.getInputParameters().add(fp);
+		FunctionParameter fpout = new FunctionParameter();
+		fp.setType(DataTypeManager.DefaultDataTypes.INTEGER);
+		fp.setName("outp");
+		fm.setOutputParameter(fpout);
+
+		AggregateAttributes aa = new AggregateAttributes();
+		fm.setAggregateAttributes(aa);
+		s.getFunctions().put(fm.getName(), fm);
+		TransformationMetadata metadata = RealMetadataFactory.createTransformationMetadata(ms, "test");
+
+		//must be in agg form
+		TestValidator.helpValidate("SELECT myagg(e2) from pm1.g1", new String[] {"myagg(e2)"}, metadata);
+
+		//run validations over default AggregateAttributes
+		TestValidator.helpValidate("SELECT myagg(distinct e2) from pm1.g1", new String[] {"myagg(DISTINCT e2)"}, metadata);
+		TestValidator.helpValidate("SELECT myagg(e2 order by e1) from pm1.g1", new String[] {"myagg(ALL e2 ORDER BY e1)"}, metadata);
+		TestValidator.helpValidate("SELECT myagg(ALL e2, e2) over () from pm1.g1", new String[] {}, metadata);
+
+		aa.setAllowsDistinct(true);
+		aa.setAllowsOrderBy(true);
+		
+		TestValidator.helpValidate("SELECT myagg(distinct e2) from pm1.g1", new String[] {}, metadata);
+		TestValidator.helpValidate("SELECT myagg(e2 order by e1) from pm1.g1", new String[] {}, metadata);
+
+		aa.setAnalytic(true);
+
+		TestValidator.helpValidate("SELECT myagg(distinct e2) from pm1.g1", new String[] {"myagg(DISTINCT e2)"}, metadata);
+		TestValidator.helpValidate("SELECT myagg(ALL e2, e2) over () from pm1.g1", new String[] {}, metadata);
+		
+		aa.setAnalytic(false);
+
+		// Create expected results
+		List[] expected = new List[] {
+				Arrays.asList(6, 6),
+				Arrays.asList(8, 8),
+		};
+
+		// Construct data manager with data
+		FakeDataManager dataManager = new FakeDataManager();
+		sampleData1(dataManager);
+		
+		ProcessorPlan plan = helpGetPlan("select myagg(all e2, e2 order by e1), myagg(all e2, e2) from pm1.g1 group by e3", metadata);
+		helpProcess(plan, dataManager, expected);
+	}
+
 }

Modified: trunk/engine/src/test/java/org/teiid/query/processor/relational/TestDuplicateFilter.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/relational/TestDuplicateFilter.java	2012-04-09 18:56:20 UTC (rev 3981)
+++ trunk/engine/src/test/java/org/teiid/query/processor/relational/TestDuplicateFilter.java	2012-04-09 19:23:06 UTC (rev 3982)
@@ -42,7 +42,9 @@
     public void helpTestDuplicateFilter(Object[] input, Class<?> dataType, int expected) throws TeiidComponentException, TeiidProcessingException {
         BufferManager mgr = BufferManagerFactory.getStandaloneBufferManager();
         
-        SortingFilter filter = new SortingFilter(new Count(), mgr, "test", true); //$NON-NLS-1$
+        Count count = new Count();
+        count.setArgIndexes(new int[] {0});
+        SortingFilter filter = new SortingFilter(count, mgr, "test", true); //$NON-NLS-1$
         filter.initialize(dataType, new Class[] {dataType});
         ElementSymbol element = new ElementSymbol("val"); //$NON-NLS-1$
         element.setType(dataType);

Modified: trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java	2012-04-09 18:56:20 UTC (rev 3981)
+++ trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java	2012-04-09 19:23:06 UTC (rev 3982)
@@ -252,7 +252,7 @@
 		return command;
     }
         
-	static ValidatorReport helpValidate(String sql, String[] expectedStringArray, QueryMetadataInterface metadata) {
+	public static ValidatorReport helpValidate(String sql, String[] expectedStringArray, QueryMetadataInterface metadata) {
         Command command = helpResolve(sql, metadata);
 
         return helpRunValidator(command, expectedStringArray, metadata);

Modified: trunk/metadata/src/main/java/org/teiid/metadata/index/IndexMetadataStore.java
===================================================================
--- trunk/metadata/src/main/java/org/teiid/metadata/index/IndexMetadataStore.java	2012-04-09 18:56:20 UTC (rev 3981)
+++ trunk/metadata/src/main/java/org/teiid/metadata/index/IndexMetadataStore.java	2012-04-09 19:23:06 UTC (rev 3982)
@@ -547,6 +547,7 @@
 	        	boolean deterministic = Boolean.valueOf(procedureRecord.getProperty(AbstractMetadataRecord.RELATIONAL_URI + "deterministic", true)); //$NON-NLS-1$
 	        	boolean nullOnNull = Boolean.valueOf(procedureRecord.getProperty(AbstractMetadataRecord.RELATIONAL_URI + "null-on-null", false)); //$NON-NLS-1$
 	        	boolean varargs = Boolean.valueOf(procedureRecord.getProperty(AbstractMetadataRecord.RELATIONAL_URI + "varargs", false)); //$NON-NLS-1$
+	        	boolean aggregate = Boolean.valueOf(procedureRecord.getProperty(AbstractMetadataRecord.RELATIONAL_URI + "aggregate", false)); //$NON-NLS-1$
 	        	FunctionParameter outputParam = null;
 	        	List<FunctionParameter> args = new ArrayList<FunctionParameter>(procedureRecord.getParameters().size() - 1);
 	        	boolean valid = true;
@@ -576,6 +577,20 @@
 		        	if (varargs && !function.getInputParameters().isEmpty()) {
 		        		function.getInputParameters().get(args.size() - 1).setVarArg(varargs);
 		        	}
+		        	if (aggregate) {
+		        		boolean analytic = Boolean.valueOf(procedureRecord.getProperty(AbstractMetadataRecord.RELATIONAL_URI + "analytic", false)); //$NON-NLS-1$
+		        		boolean allowsOrderBy = Boolean.valueOf(procedureRecord.getProperty(AbstractMetadataRecord.RELATIONAL_URI + "allows-orderby", false)); //$NON-NLS-1$
+		        		boolean usesDistinctRows = Boolean.valueOf(procedureRecord.getProperty(AbstractMetadataRecord.RELATIONAL_URI + "uses-distinct-rows", false)); //$NON-NLS-1$
+		        		boolean allowsDistinct = Boolean.valueOf(procedureRecord.getProperty(AbstractMetadataRecord.RELATIONAL_URI + "allows-distinct", false)); //$NON-NLS-1$
+		        		boolean decomposable = Boolean.valueOf(procedureRecord.getProperty(AbstractMetadataRecord.RELATIONAL_URI + "decomposable", false)); //$NON-NLS-1$
+		        		AggregateAttributes aa = new AggregateAttributes();
+		        		aa.setAnalytic(analytic);
+		        		aa.setAllowsOrderBy(allowsOrderBy);
+		        		aa.setUsesDistinctRows(usesDistinctRows);
+		        		aa.setAllowsDistinct(allowsDistinct);
+		        		aa.setDecomposable(decomposable);
+		        		function.setAggregateAttributes(aa);
+		        	}
 					model.addFunction(function);
 					continue;
 	        	}

Modified: trunk/test-integration/common/src/test/java/org/teiid/jdbc/TestDynamicImportedMetaData.java
===================================================================
--- trunk/test-integration/common/src/test/java/org/teiid/jdbc/TestDynamicImportedMetaData.java	2012-04-09 18:56:20 UTC (rev 3981)
+++ trunk/test-integration/common/src/test/java/org/teiid/jdbc/TestDynamicImportedMetaData.java	2012-04-09 19:23:06 UTC (rev 3982)
@@ -22,9 +22,7 @@
 
 package org.teiid.jdbc;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
+import static org.junit.Assert.*;
 
 import java.sql.Connection;
 import java.util.List;
@@ -169,8 +167,6 @@
     
     @Test
     public void testDDLMetadata() throws Exception {
-    	FakeServer server = new FakeServer();
-    	
     	String ddl = "CREATE PROCEDURE getTextFiles(IN pathAndPattern varchar) RETURNS (file clob, filpath string) OPTIONS(UUID 'uuid')";
     	MetadataFactory mf = createMetadataFactory("MarketData", new Properties());
     	QueryParser.getQueryParser().parseDDL(mf, ddl);



More information about the teiid-commits mailing list