[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