[teiid-commits] teiid SVN: r3323 - in trunk: documentation/developer-guide/src/main/docbook/en-US/content and 22 other directories.
teiid-commits at lists.jboss.org
teiid-commits at lists.jboss.org
Thu Jul 21 15:28:45 EDT 2011
Author: shawkins
Date: 2011-07-21 15:28:44 -0400 (Thu, 21 Jul 2011)
New Revision: 3323
Removed:
trunk/engine/src/main/java/org/teiid/query/sql/symbol/AllInGroupSymbol.java
trunk/engine/src/main/java/org/teiid/query/sql/symbol/AllSymbol.java
trunk/engine/src/main/java/org/teiid/query/validator/AggregateValidationVisitor.java
Modified:
trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java
trunk/documentation/developer-guide/src/main/docbook/en-US/content/translator-api.xml
trunk/engine/src/main/java/org/teiid/dqp/internal/process/MetaDataProcessor.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleChooseJoinStrategy.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushAggregates.java
trunk/engine/src/main/java/org/teiid/query/optimizer/xml/QueryUtil.java
trunk/engine/src/main/java/org/teiid/query/optimizer/xml/XMLPlanner.java
trunk/engine/src/main/java/org/teiid/query/resolver/command/SimpleQueryResolver.java
trunk/engine/src/main/java/org/teiid/query/resolver/command/XMLQueryResolver.java
trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java
trunk/engine/src/main/java/org/teiid/query/sql/lang/Select.java
trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java
trunk/engine/src/main/java/org/teiid/query/sql/symbol/AggregateSymbol.java
trunk/engine/src/main/java/org/teiid/query/sql/symbol/DerivedColumn.java
trunk/engine/src/main/java/org/teiid/query/sql/symbol/MultipleElementSymbol.java
trunk/engine/src/main/java/org/teiid/query/sql/symbol/SelectSymbol.java
trunk/engine/src/main/java/org/teiid/query/sql/symbol/SingleElementSymbol.java
trunk/engine/src/main/java/org/teiid/query/sql/symbol/WindowFunction.java
trunk/engine/src/main/java/org/teiid/query/sql/visitor/AbstractSymbolMappingVisitor.java
trunk/engine/src/main/java/org/teiid/query/sql/visitor/AggregateSymbolCollectorVisitor.java
trunk/engine/src/main/java/org/teiid/query/sql/visitor/ElementCollectorVisitor.java
trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.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/cdk/CommandBuilder.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java
trunk/engine/src/test/java/org/teiid/query/optimizer/relational/rules/TestRulePlaceAccess.java
trunk/engine/src/test/java/org/teiid/query/parser/TestLimitParsing.java
trunk/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java
trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java
trunk/engine/src/test/java/org/teiid/query/parser/TestSetQueryParsing.java
trunk/engine/src/test/java/org/teiid/query/processor/xml/TestXMLProcessor.java
trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java
trunk/engine/src/test/java/org/teiid/query/sql/lang/TestSelect.java
trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestAggregateSymbolCollectorVisitor.java
trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java
trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestStaticSymbolMappingVisitor.java
trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java
Log:
TEIID-1667 refining agg and window function validation and also continuing to refine the language object model to move beyond the symbol base class
Modified: trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java
===================================================================
--- trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -725,8 +725,6 @@
/**
* <p>Support indicates that the connector supports functions in GROUP BY, such as:
* <code>SELECT dayofmonth(theDate), COUNT(*) FROM table GROUP BY dayofmonth(theDate)</code></p>
- *
- * <br>NOT CURRENTLY USED - group by expressions create an inline view for pushdown
* @since 5.0
*/
public boolean supportsFunctionsInGroupBy() {
Modified: trunk/documentation/developer-guide/src/main/docbook/en-US/content/translator-api.xml
===================================================================
--- trunk/documentation/developer-guide/src/main/docbook/en-US/content/translator-api.xml 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/documentation/developer-guide/src/main/docbook/en-US/content/translator-api.xml 2011-07-21 19:28:44 UTC (rev 3323)
@@ -1229,7 +1229,7 @@
<para>GroupBy</para>
</entry>
<entry>
- <para>Not currently used - non-element expressions in the group by create an inline view.</para>
+ <para>Translator can support non-column reference grouping expressions.</para>
</entry>
</row>
<row>
@@ -1287,6 +1287,28 @@
<para>Translator supports the WITH clause.</para>
</entry>
</row>
+ <row>
+ <entry>
+ <para>ElementaryOlapOperations</para>
+ </entry>
+ <entry>
+ <para/>
+ </entry>
+ <entry>
+ <para>Translator supports window functions and analytic functions RANK, DENSE_RANK, and ROW_NUMBER.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para>AdvancedOlapOperations</para>
+ </entry>
+ <entry>
+ <para/>
+ </entry>
+ <entry>
+ <para>Translator supports aggregate conditions.</para>
+ </entry>
+ </row>
</tbody>
</tgroup>
</table>
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/MetaDataProcessor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/MetaDataProcessor.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/MetaDataProcessor.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -180,12 +180,12 @@
this.metadata = tempFacade;
}
- List projectedSymbols = originalCommand.getProjectedSymbols();
+ List<SingleElementSymbol> projectedSymbols = originalCommand.getProjectedSymbols();
columnMetadata = new Map[projectedSymbols.size()];
- Iterator symbolIter = projectedSymbols.iterator();
+ Iterator<SingleElementSymbol> symbolIter = projectedSymbols.iterator();
for(int i=0; symbolIter.hasNext(); i++) {
- SingleElementSymbol symbol = (SingleElementSymbol) symbolIter.next();
+ SingleElementSymbol symbol = symbolIter.next();
String shortColumnName = SingleElementSymbol.getShortName(symbol.getOutputName());
if(symbol instanceof AliasSymbol) {
symbol = ((AliasSymbol)symbol).getSymbol();
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -112,7 +112,7 @@
import org.teiid.query.sql.proc.TriggerAction;
import org.teiid.query.sql.symbol.AggregateSymbol;
import org.teiid.query.sql.symbol.AliasSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.Expression;
@@ -744,7 +744,7 @@
Collection<AggregateSymbol> aggs = AggregateSymbolCollectorVisitor.getAggregates(query.getSelect(), true);
boolean hasGrouping = !aggs.isEmpty();
if (query.getHaving() != null) {
- AggregateSymbolCollectorVisitor.getAggregates(query.getHaving(), aggs, null);
+ aggs.addAll(AggregateSymbolCollectorVisitor.getAggregates(query.getHaving(), true));
hasGrouping = true;
}
if (query.getGroupBy() != null) {
@@ -1224,7 +1224,7 @@
}else{
this.context.accessedPlanningObject(matMetadataId);
qnode = new QueryNode(null);
- Query query = createMatViewQuery(matMetadataId, matTableName, Arrays.asList(new AllSymbol()), isImplicitGlobal);
+ Query query = createMatViewQuery(matMetadataId, matTableName, Arrays.asList(new MultipleElementSymbol()), isImplicitGlobal);
query.setCacheHint(hint);
qnode.setCommand(query);
cacheString = "matview"; //$NON-NLS-1$
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleChooseJoinStrategy.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleChooseJoinStrategy.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleChooseJoinStrategy.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -24,11 +24,9 @@
import java.util.ArrayList;
import java.util.Collection;
-import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
-import java.util.concurrent.atomic.AtomicInteger;
import org.teiid.api.exception.query.QueryMetadataException;
import org.teiid.core.TeiidComponentException;
@@ -169,22 +167,14 @@
}
}
- private static AtomicInteger EXPRESSION_INDEX = new AtomicInteger(0);
-
public static List<SingleElementSymbol> createExpressionSymbols(List<? extends Expression> expressions) {
- HashMap<Expression, ExpressionSymbol> uniqueExpressions = new HashMap<Expression, ExpressionSymbol>();
List<SingleElementSymbol> result = new ArrayList<SingleElementSymbol>();
for (Expression expression : expressions) {
if (expression instanceof SingleElementSymbol) {
result.add((SingleElementSymbol)expression);
continue;
}
- ExpressionSymbol expressionSymbol = uniqueExpressions.get(expression);
- if (expressionSymbol == null) {
- expressionSymbol = new ExpressionSymbol("$" + EXPRESSION_INDEX.getAndIncrement(), expression); //$NON-NLS-1$
- uniqueExpressions.put(expression, expressionSymbol);
- }
- result.add(expressionSymbol);
+ result.add(new ExpressionSymbol("expr", expression)); //$NON-NLS-1$
}
return result;
}
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -68,10 +68,10 @@
import org.teiid.query.sql.lang.SubquerySetCriteria;
import org.teiid.query.sql.navigator.DeepPostOrderNavigator;
import org.teiid.query.sql.symbol.AggregateSymbol;
-import org.teiid.query.sql.symbol.AliasSymbol;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.Expression;
+import org.teiid.query.sql.symbol.ExpressionSymbol;
import org.teiid.query.sql.symbol.GroupSymbol;
import org.teiid.query.sql.symbol.Reference;
import org.teiid.query.sql.symbol.ScalarSubquery;
@@ -455,7 +455,7 @@
private boolean isSimpleJoin(Query query) {
if (query.getFrom() != null) {
- for (FromClause clause : (List<FromClause>)query.getFrom().getClauses()) {
+ for (FromClause clause : query.getFrom().getClauses()) {
if (RuleCollapseSource.hasOuterJoins(clause)) {
return false;
}
@@ -479,7 +479,7 @@
plannedResult.query.setLimit(null);
List<GroupSymbol> rightGroups = plannedResult.query.getFrom().getGroups();
- Set<SingleElementSymbol> requiredExpressions = new LinkedHashSet<SingleElementSymbol>();
+ Set<Expression> requiredExpressions = new LinkedHashSet<Expression>();
final SymbolMap refs = plannedResult.query.getCorrelatedReferences();
boolean addGroupBy = false;
if (refs != null) {
@@ -494,7 +494,7 @@
return false;
}
if (plannedResult.query.getGroupBy() == null) {
- processCriteria(leftGroups, plannedResult, rightGroups, requiredExpressions, refs, where, true);
+ processCriteria(leftGroups, plannedResult, rightGroups, requiredExpressions, refs, where, null, true);
if (hasAggregates) {
if (!plannedResult.nonEquiJoinCriteria.isEmpty()) {
return false;
@@ -502,7 +502,7 @@
addGroupBy = true;
}
}
- processCriteria(leftGroups, plannedResult, rightGroups, requiredExpressions, refs, having, false);
+ processCriteria(leftGroups, plannedResult, rightGroups, requiredExpressions, refs, having, plannedResult.query.getGroupBy(), false);
}
if (plannedResult.additionalCritieria != null) {
@@ -525,29 +525,29 @@
}
if (addGroupBy) {
- LinkedHashSet<SingleElementSymbol> groupingSymbols = new LinkedHashSet<SingleElementSymbol>();
- ArrayList<SingleElementSymbol> aggs = new ArrayList<SingleElementSymbol>();
+ LinkedHashSet<Expression> groupingSymbols = new LinkedHashSet<Expression>();
for (Expression expr : (List<Expression>)plannedResult.rightExpressions) {
- AggregateSymbolCollectorVisitor.getAggregates(expr, aggs, groupingSymbols);
+ AggregateSymbolCollectorVisitor.getAggregates(expr, null, groupingSymbols, null, null, null);
}
if (!groupingSymbols.isEmpty()) {
- plannedResult.query.setGroupBy((GroupBy) new GroupBy(new ArrayList<SingleElementSymbol>(groupingSymbols)).clone());
+ plannedResult.query.setGroupBy((GroupBy) new GroupBy(new ArrayList<Expression>(groupingSymbols)).clone());
}
}
- HashSet<SingleElementSymbol> projectedSymbols = new HashSet<SingleElementSymbol>();
+ HashSet<Expression> projectedSymbols = new HashSet<Expression>();
for (SingleElementSymbol ses : plannedResult.query.getProjectedSymbols()) {
- if (ses instanceof AliasSymbol) {
- ses = ((AliasSymbol)ses).getSymbol();
- }
- projectedSymbols.add(ses);
+ projectedSymbols.add(SymbolMap.getExpression(ses));
}
- for (SingleElementSymbol ses : requiredExpressions) {
+ for (Expression ses : requiredExpressions) {
if (projectedSymbols.add(ses)) {
- plannedResult.query.getSelect().addSymbol((SingleElementSymbol) ses.clone());
+ if (ses instanceof SingleElementSymbol) {
+ plannedResult.query.getSelect().addSymbol((SingleElementSymbol)ses);
+ } else {
+ plannedResult.query.getSelect().addSymbol(new ExpressionSymbol("expr", (Expression) ses.clone())); //$NON-NLS-1$
+ }
}
}
for (SingleElementSymbol ses : (List<SingleElementSymbol>)plannedResult.rightExpressions) {
- if (projectedSymbols.add(ses)) {
+ if (projectedSymbols.add(SymbolMap.getExpression(ses))) {
plannedResult.query.getSelect().addSymbol((SingleElementSymbol)ses.clone());
}
}
@@ -556,8 +556,8 @@
private void processCriteria(Collection<GroupSymbol> leftGroups,
PlannedResult plannedResult, List<GroupSymbol> rightGroups,
- Set<SingleElementSymbol> requiredExpressions, final SymbolMap refs,
- Criteria joinCriteria, boolean where) {
+ Set<Expression> requiredExpressions, final SymbolMap refs,
+ Criteria joinCriteria, GroupBy groupBy, boolean where) {
if (joinCriteria == null) {
return;
}
@@ -565,9 +565,8 @@
for (Iterator<Criteria> critIter = crits.iterator(); critIter.hasNext();) {
Criteria conjunct = critIter.next();
- List<SingleElementSymbol> aggregates = new LinkedList<SingleElementSymbol>();
- List<SingleElementSymbol> elements = new LinkedList<SingleElementSymbol>();
- AggregateSymbolCollectorVisitor.getAggregates(conjunct, aggregates, elements);
+ List<Expression> additionalRequired = new LinkedList<Expression>();
+ AggregateSymbolCollectorVisitor.getAggregates(conjunct, additionalRequired, additionalRequired, additionalRequired, null, groupBy!=null?groupBy.getSymbols():null);
ReferenceReplacementVisitor emv = new ReferenceReplacementVisitor(refs);
DeepPostOrderNavigator.doVisit(conjunct, emv);
if (!emv.replacedAny) {
@@ -579,8 +578,7 @@
plannedResult.query.setHaving(Criteria.combineCriteria(plannedResult.query.getHaving(), conjunct));
}
} else {
- requiredExpressions.addAll(aggregates);
- requiredExpressions.addAll(elements);
+ requiredExpressions.addAll(additionalRequired);
}
}
RuleChooseJoinStrategy.separateCriteria(leftGroups, rightGroups, plannedResult.leftExpressions, plannedResult.rightExpressions, crits, plannedResult.nonEquiJoinCriteria);
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushAggregates.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushAggregates.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushAggregates.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -277,7 +277,7 @@
if (ex instanceof AggregateSymbol) {
compositeAggs.add((AggregateSymbol) ex);
} else {
- AggregateSymbolCollectorVisitor.getAggregates(ex, compositeAggs, null);
+ compositeAggs.addAll(AggregateSymbolCollectorVisitor.getAggregates(ex, false));
hasExpressionMapping = true;
}
}
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/xml/QueryUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/xml/QueryUtil.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/xml/QueryUtil.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -51,10 +51,10 @@
import org.teiid.query.sql.lang.Query;
import org.teiid.query.sql.lang.Select;
import org.teiid.query.sql.navigator.DeepPreOrderNavigator;
-import org.teiid.query.sql.symbol.AllInGroupSymbol;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.Reference;
import org.teiid.query.sql.visitor.ElementCollectorVisitor;
import org.teiid.query.sql.visitor.ReferenceCollectorVisitor;
@@ -135,7 +135,7 @@
static Query wrapQuery(FromClause fromClause, String groupName) {
Select select = new Select();
- select.addSymbol(new AllInGroupSymbol(groupName + ".*")); //$NON-NLS-1$
+ select.addSymbol(new MultipleElementSymbol(groupName));
Query query = new Query();
query.setSelect(select);
From from = new From();
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/xml/XMLPlanner.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/xml/XMLPlanner.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/xml/XMLPlanner.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -53,9 +53,9 @@
import org.teiid.query.sql.lang.OrderBy;
import org.teiid.query.sql.lang.Query;
import org.teiid.query.sql.lang.Select;
-import org.teiid.query.sql.symbol.AllSymbol;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.SelectSymbol;
import org.teiid.query.sql.symbol.SingleElementSymbol;
import org.teiid.query.sql.visitor.ElementCollectorVisitor;
@@ -247,7 +247,7 @@
SelectSymbol firstSymbol = select.getSymbol(0);
// 0. mark the nodes to be excluded
- if(firstSymbol instanceof AllSymbol) {
+ if(firstSymbol instanceof MultipleElementSymbol && ((MultipleElementSymbol)firstSymbol).getGroup() == null) {
return doc;
}
Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/SimpleQueryResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/SimpleQueryResolver.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/SimpleQueryResolver.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -76,12 +76,11 @@
import org.teiid.query.sql.lang.XMLTable;
import org.teiid.query.sql.navigator.PostOrderNavigator;
import org.teiid.query.sql.symbol.AliasSymbol;
-import org.teiid.query.sql.symbol.AllInGroupSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.symbol.ExpressionSymbol;
import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.Reference;
import org.teiid.query.sql.symbol.ScalarSubquery;
import org.teiid.query.sql.symbol.SingleElementSymbol;
@@ -89,8 +88,6 @@
public class SimpleQueryResolver implements CommandResolver {
- private static final String ALL_IN_GROUP_SUFFIX = ".*"; //$NON-NLS-1$
-
/**
* @see org.teiid.query.resolver.CommandResolver#resolveCommand(org.teiid.query.sql.lang.Command, org.teiid.query.metadata.TempMetadataAdapter, boolean)
*/
@@ -107,14 +104,14 @@
ResolverVisitor visitor = (ResolverVisitor)qrv.getVisitor();
visitor.throwException(true);
} catch (TeiidRuntimeException e) {
- if (e.getChild() instanceof QueryMetadataException) {
- throw (QueryMetadataException)e.getChild();
+ if (e.getCause() instanceof QueryMetadataException) {
+ throw (QueryMetadataException)e.getCause();
}
- if (e.getChild() instanceof QueryResolverException) {
- throw (QueryResolverException)e.getChild();
+ if (e.getCause() instanceof QueryResolverException) {
+ throw (QueryResolverException)e.getCause();
}
- if (e.getChild() instanceof TeiidComponentException) {
- throw (TeiidComponentException)e.getChild();
+ if (e.getCause() instanceof TeiidComponentException) {
+ throw (TeiidComponentException)e.getCause();
}
throw e;
}
@@ -185,18 +182,18 @@
}
}
- private static GroupSymbol resolveAllInGroup(AllInGroupSymbol allInGroupSymbol, Set<GroupSymbol> groups, QueryMetadataInterface metadata) throws QueryResolverException, QueryMetadataException, TeiidComponentException {
- String name = allInGroupSymbol.getName();
- int index = name.lastIndexOf(ALL_IN_GROUP_SUFFIX);
- String groupAlias = name.substring(0, index);
- List<GroupSymbol> groupSymbols = ResolverUtil.findMatchingGroups(groupAlias.toUpperCase(), groups, metadata);
+ private static GroupSymbol resolveAllInGroup(MultipleElementSymbol allInGroupSymbol, Set<GroupSymbol> groups, QueryMetadataInterface metadata) throws QueryResolverException, QueryMetadataException, TeiidComponentException {
+ String groupAlias = allInGroupSymbol.getGroup().getCanonicalName();
+ List<GroupSymbol> groupSymbols = ResolverUtil.findMatchingGroups(groupAlias, groups, metadata);
if(groupSymbols.isEmpty() || groupSymbols.size() > 1) {
String msg = QueryPlugin.Util.getString(groupSymbols.isEmpty()?"ERR.015.008.0047":"SimpleQueryResolver.ambiguous_all_in_group", allInGroupSymbol); //$NON-NLS-1$ //$NON-NLS-2$
QueryResolverException qre = new QueryResolverException(msg);
qre.addUnresolvedSymbol(new UnresolvedSymbolDescription(allInGroupSymbol.toString(), msg));
throw qre;
}
-
+ GroupSymbol gs = allInGroupSymbol.getGroup();
+ allInGroupSymbol.setGroup(groupSymbols.get(0).clone());
+ allInGroupSymbol.getGroup().setOutputName(gs.getOutputName());
return groupSymbols.get(0);
}
@@ -260,14 +257,19 @@
}
}
- public void visit(AllSymbol obj) {
+ public void visit(MultipleElementSymbol obj) {
+ // Determine group that this symbol is for
try {
List<ElementSymbol> elementSymbols = new ArrayList<ElementSymbol>();
- for (GroupSymbol group : currentGroups) {
+ Collection<GroupSymbol> groups = currentGroups;
+ if (obj.getGroup() != null) {
+ groups = Arrays.asList(resolveAllInGroup(obj, currentGroups, metadata));
+ }
+ for (GroupSymbol group : groups) {
elementSymbols.addAll(resolveSelectableElements(group));
}
obj.setElementSymbols(elementSymbols);
- } catch (TeiidComponentException err) {
+ } catch (TeiidException err) {
throw new TeiidRuntimeException(err);
}
}
@@ -289,19 +291,6 @@
return result;
}
- public void visit(AllInGroupSymbol obj) {
- // Determine group that this symbol is for
- try {
- GroupSymbol group = resolveAllInGroup(obj, currentGroups, metadata);
-
- List<ElementSymbol> elements = resolveSelectableElements(group);
-
- obj.setElementSymbols(elements);
- } catch (TeiidException err) {
- throw new TeiidRuntimeException(err);
- }
- }
-
public void visit(ScalarSubquery obj) {
resolveSubQuery(obj, this.currentGroups);
}
@@ -471,7 +460,7 @@
from.addClause(new SubqueryFromClause("X", storedProcedureCommand)); //$NON-NLS-1$
procQuery.setFrom(from);
Select select = new Select();
- select.addSymbol(new AllInGroupSymbol("X.*")); //$NON-NLS-1$
+ select.addSymbol(new MultipleElementSymbol("X")); //$NON-NLS-1$
procQuery.setSelect(select);
List<String> accessPatternElementNames = new LinkedList<String>();
Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/XMLQueryResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/XMLQueryResolver.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/XMLQueryResolver.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -58,11 +58,10 @@
import org.teiid.query.sql.lang.Select;
import org.teiid.query.sql.lang.SubqueryContainer;
import org.teiid.query.sql.symbol.AliasSymbol;
-import org.teiid.query.sql.symbol.AllInGroupSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.ExpressionSymbol;
import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.SelectSymbol;
import org.teiid.query.sql.visitor.ElementCollectorVisitor;
import org.teiid.query.sql.visitor.GroupCollectorVisitor;
@@ -337,47 +336,38 @@
// There are other cases of "xml", such as, element name = "xml",
// but those are ok because those will be resolved later as normal elements
- String symbolName = ss.getName();
+ ElementSymbol es = (ElementSymbol)ss;
+ String symbolName = es.getName();
if(!subquery && (symbolName.equalsIgnoreCase("xml") || symbolName.equalsIgnoreCase(group.getName() + ".xml"))) { //$NON-NLS-1$ //$NON-NLS-2$
if(elements.size() != 1) {
throw new QueryResolverException(QueryPlugin.Util.getString("XMLQueryResolver.xml_only_valid_alone")); //$NON-NLS-1$
}
select.clearSymbols();
- AllSymbol all = new AllSymbol();
+ MultipleElementSymbol all = new MultipleElementSymbol();
all.setElementSymbols(validElements.values());
select.addSymbol(all);
query.setSelect(select);
return;
}
// normal elements
- resolveElement((ElementSymbol)ss, validElements, externalGroups, metadata);
- } else if (ss instanceof AllInGroupSymbol) {
+ resolveElement(es, validElements, externalGroups, metadata);
+ } else if (ss instanceof MultipleElementSymbol) {
// Resolve the element with "*" case. such as "A.*"
// by stripping off the ".*" part,
- String symbolName = ss.getName();
- int index = symbolName.indexOf("*"); //$NON-NLS-1$
- String elementPart = symbolName.substring(0, index-1);
+ MultipleElementSymbol all = (MultipleElementSymbol)ss;
// Check for case where we have model.doc.*
- if(elementPart.equalsIgnoreCase(group.getName())) {
- select.clearSymbols();
- AllSymbol all = new AllSymbol();
+ if(all.getGroup() == null || all.getGroup().getName().equalsIgnoreCase(group.getName())) {
all.setElementSymbols(validElements.values());
- select.addSymbol(all);
- query.setSelect(select);
- } else {
- // resovlve the node which is specified
- ElementSymbol elementSymbol = new ElementSymbol(elementPart);
- resolveElement(elementSymbol, validElements, externalGroups, metadata);
-
- // now find all the elements under this node and set as elements.
- List<ElementSymbol> elementsInNode = getElementsUnderNode(elementSymbol.getMetadataID(), validElements.values(), metadata);
- ((AllInGroupSymbol)ss).setElementSymbols(elementsInNode);
+ return;
}
- } else if (ss instanceof AllSymbol) {
- AllSymbol all = (AllSymbol)ss;
- all.setElementSymbols(validElements.values());
- return;
+ // resovlve the node which is specified
+ ElementSymbol elementSymbol = new ElementSymbol(all.getGroup().getName());
+ resolveElement(elementSymbol, validElements, externalGroups, metadata);
+
+ // now find all the elements under this node and set as elements.
+ List<ElementSymbol> elementsInNode = getElementsUnderNode(elementSymbol.getMetadataID(), validElements.values(), metadata);
+ all.setElementSymbols(elementsInNode);
} else if (ss instanceof ExpressionSymbol) {
throw new QueryResolverException(QueryPlugin.Util.getString("XMLQueryResolver.no_expressions_in_select")); //$NON-NLS-1$
} else if (ss instanceof AliasSymbol) {
Modified: trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -83,8 +83,6 @@
import org.teiid.query.sql.proc.WhileStatement;
import org.teiid.query.sql.symbol.AggregateSymbol;
import org.teiid.query.sql.symbol.AliasSymbol;
-import org.teiid.query.sql.symbol.AllInGroupSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
import org.teiid.query.sql.symbol.CaseExpression;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.DerivedColumn;
@@ -92,6 +90,7 @@
import org.teiid.query.sql.symbol.ExpressionSymbol;
import org.teiid.query.sql.symbol.Function;
import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.QueryString;
import org.teiid.query.sql.symbol.Reference;
import org.teiid.query.sql.symbol.ScalarSubquery;
@@ -172,8 +171,7 @@
// Visitor methods for symbol objects
public void visit(AggregateSymbol obj) {}
public void visit(AliasSymbol obj) {}
- public void visit(AllInGroupSymbol obj) {}
- public void visit(AllSymbol obj) {}
+ public void visit(MultipleElementSymbol obj) {}
public void visit(Constant obj) {}
public void visit(ElementSymbol obj) {}
public void visit(ExpressionSymbol obj) {}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/Select.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/Select.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/Select.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -30,7 +30,6 @@
import org.teiid.core.util.HashCodeUtil;
import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.LanguageVisitor;
-import org.teiid.query.sql.symbol.AllSymbol;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.SelectSymbol;
@@ -85,7 +84,7 @@
* @return True if Select * is used
*/
public boolean isStar() {
- return (symbols.size() == 1 && symbols.get(0) instanceof AllSymbol);
+ return (symbols.size() == 1 && symbols.get(0) instanceof MultipleElementSymbol && ((MultipleElementSymbol)symbols.get(0)).getGroup() == null);
}
/**
Modified: trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -87,8 +87,6 @@
import org.teiid.query.sql.proc.WhileStatement;
import org.teiid.query.sql.symbol.AggregateSymbol;
import org.teiid.query.sql.symbol.AliasSymbol;
-import org.teiid.query.sql.symbol.AllInGroupSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
import org.teiid.query.sql.symbol.CaseExpression;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.DerivedColumn;
@@ -97,6 +95,7 @@
import org.teiid.query.sql.symbol.ExpressionSymbol;
import org.teiid.query.sql.symbol.Function;
import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.QueryString;
import org.teiid.query.sql.symbol.Reference;
import org.teiid.query.sql.symbol.ScalarSubquery;
@@ -154,14 +153,10 @@
visitNode(obj.getSymbol());
postVisitVisitor(obj);
}
- public void visit(AllInGroupSymbol obj) {
+ public void visit(MultipleElementSymbol obj) {
preVisitVisitor(obj);
postVisitVisitor(obj);
}
- public void visit(AllSymbol obj) {
- preVisitVisitor(obj);
- postVisitVisitor(obj);
- }
public void visit(AssignmentStatement obj) {
preVisitVisitor(obj);
visitNode(obj.getVariable());
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 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/AggregateSymbol.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -72,6 +72,7 @@
private boolean distinct;
private OrderBy orderBy;
private Expression condition;
+ private boolean isWindowed;
private static final Class<Integer> COUNT_TYPE = DataTypeManager.DefaultDataClasses.INTEGER;
private static final Map<Class<?>, Class<?>> SUM_TYPES;
@@ -224,6 +225,7 @@
if (condition != null) {
copy.setCondition((Expression) condition.clone());
}
+ copy.isWindowed = this.isWindowed;
return copy;
}
@@ -247,6 +249,7 @@
return this.aggregate.equals(other.aggregate)
&& this.distinct == other.distinct
+ && this.isWindowed == other.isWindowed
&& EquivalenceUtil.areEqual(this.getExpression(), other.getExpression())
&& EquivalenceUtil.areEqual(this.condition, other.condition)
&& EquivalenceUtil.areEqual(this.getOrderBy(), other.getOrderBy());
@@ -302,5 +305,13 @@
}
return true;
}
+
+ public boolean isWindowed() {
+ return isWindowed;
+ }
+
+ public void setWindowed(boolean isWindowed) {
+ this.isWindowed = isWindowed;
+ }
}
Deleted: trunk/engine/src/main/java/org/teiid/query/sql/symbol/AllInGroupSymbol.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/AllInGroupSymbol.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/AllInGroupSymbol.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -1,72 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership. Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.query.sql.symbol;
-
-import java.util.List;
-
-import org.teiid.query.sql.LanguageObject;
-import org.teiid.query.sql.LanguageVisitor;
-
-/**
- * <p>This is a subclass of Symbol representing <group>.*, which contains all of
- * the elements from a single group in the query. The name of this symbol is "group.*",
- * when resolved it contains a single Group Symbols and a set of Element Symbols</p>
- */
-public class AllInGroupSymbol extends MultipleElementSymbol {
-
- /**
- * Constructor used for cloning
- * @param name
- * @param canonicalName
- * @since 4.3
- */
- protected AllInGroupSymbol(String name, String canonicalName) {
- super(name, canonicalName);
- }
-
- /**
- * Default constructor
- */
- public AllInGroupSymbol(String name) {
- super(name);
- }
-
- public void acceptVisitor(LanguageVisitor visitor) {
- visitor.visit(this);
- }
-
- /**
- * Return a deep copy of this object
- * @return Deep copy of this object
- */
- public Object clone() {
- AllInGroupSymbol copy = new AllInGroupSymbol(getName(), getCanonical());
-
- List<ElementSymbol> elements = getElementSymbols();
- if(elements != null && elements.size() > 0) {
- copy.setElementSymbols(LanguageObject.Util.deepClone(elements, ElementSymbol.class));
- }
-
- return copy;
- }
-}
Deleted: trunk/engine/src/main/java/org/teiid/query/sql/symbol/AllSymbol.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/AllSymbol.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/AllSymbol.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -1,75 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership. Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.query.sql.symbol;
-
-import java.util.List;
-
-import org.teiid.query.sql.LanguageObject;
-import org.teiid.query.sql.LanguageVisitor;
-
-/**
- * <p>This is a subclass of Symbol representing *, which contains all of
- * the elements from all groups in the query. The name of this symbol is always "*",
- * when resolved it contains a set of Element Symbols referred to by the AllSymbol</p>
- */
-public class AllSymbol extends MultipleElementSymbol {
-
- private static final String ALL_SYMBOL_NAME = "*"; //$NON-NLS-1$
-
- /**
- * Constructor used for cloning
- * @param name
- * @param canonicalName
- * @since 4.3
- */
- protected AllSymbol(String name, String canonicalName) {
- super(name, canonicalName);
- }
-
- /**
- * Default constructor
- */
- public AllSymbol(){
- this(ALL_SYMBOL_NAME, ALL_SYMBOL_NAME);
- }
-
- public void acceptVisitor(LanguageVisitor visitor) {
- visitor.visit(this);
- }
-
- /**
- * Return a deep copy of this object
- * @return Deep copy of this object
- */
- public Object clone() {
- AllSymbol copy = new AllSymbol(ALL_SYMBOL_NAME, ALL_SYMBOL_NAME);
-
- List<ElementSymbol> elements = getElementSymbols();
- if(elements != null && elements.size() > 0) {
- copy.setElementSymbols(LanguageObject.Util.deepClone(elements, ElementSymbol.class));
- }
-
- return copy;
- }
-
-}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/symbol/DerivedColumn.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/DerivedColumn.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/DerivedColumn.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -24,7 +24,6 @@
import org.teiid.core.util.EquivalenceUtil;
import org.teiid.core.util.HashCodeUtil;
-import org.teiid.query.function.source.XMLSystemFunctions;
import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.LanguageVisitor;
import org.teiid.query.sql.visitor.SQLStringVisitor;
Modified: trunk/engine/src/main/java/org/teiid/query/sql/symbol/MultipleElementSymbol.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/MultipleElementSymbol.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/MultipleElementSymbol.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -22,22 +22,23 @@
package org.teiid.query.sql.symbol;
-import java.util.*;
+import java.util.LinkedList;
+import java.util.List;
+import org.teiid.core.util.EquivalenceUtil;
+import org.teiid.core.util.HashCodeUtil;
+import org.teiid.query.sql.LanguageObject;
+import org.teiid.query.sql.LanguageVisitor;
+import org.teiid.query.sql.visitor.SQLStringVisitor;
+
/**
* <p>This is a subclass of Symbol representing multiple output columns.</p>
*/
-public abstract class MultipleElementSymbol extends SelectSymbol {
+public class MultipleElementSymbol implements SelectSymbol {
private List<ElementSymbol> elementSymbols;
+ private GroupSymbol group;
- /**
- * Passthrough constructor used for cloning
- * @param name
- * @param canonicalName
- * @since 4.3
- */
- protected MultipleElementSymbol(String name, String canonicalName) {
- super(name, canonicalName);
+ public MultipleElementSymbol() {
}
/**
@@ -45,7 +46,7 @@
* @param name Name of the symbol
*/
public MultipleElementSymbol(String name){
- super(name);
+ this.group = new GroupSymbol(name);
}
/**
@@ -83,5 +84,60 @@
public boolean isResolved() {
return(elementSymbols != null);
}
+
+ public void acceptVisitor(LanguageVisitor visitor) {
+ visitor.visit(this);
+ }
+ /**
+ * Return a deep copy of this object
+ * @return Deep copy of this object
+ */
+ public Object clone() {
+ MultipleElementSymbol copy = new MultipleElementSymbol();
+ if (group != null) {
+ copy.group = group.clone();
+ }
+
+ List<ElementSymbol> elements = getElementSymbols();
+ if(elements != null && elements.size() > 0) {
+ copy.setElementSymbols(LanguageObject.Util.deepClone(elements, ElementSymbol.class));
+ }
+
+ return copy;
+ }
+
+ /**
+ * @return null if selecting all groups, otherwise the specific group
+ */
+ public GroupSymbol getGroup() {
+ return group;
+ }
+
+ public void setGroup(GroupSymbol group) {
+ this.group = group;
+ }
+
+ @Override
+ public String toString() {
+ return SQLStringVisitor.getSQLString(this);
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeUtil.hashCode(0, group);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof MultipleElementSymbol)) {
+ return false;
+ }
+ MultipleElementSymbol other = (MultipleElementSymbol)obj;
+ return EquivalenceUtil.areEqual(this.group, other.group);
+ }
+
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/symbol/SelectSymbol.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/SelectSymbol.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/SelectSymbol.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -22,29 +22,14 @@
package org.teiid.query.sql.symbol;
+import org.teiid.query.sql.LanguageObject;
+
/**
* This is the server's representation of a metadata symbol that can be used
* in a SELECT statement. It exists as a typing mechanism and to provide a single
* additional method to get an ordered list of elements from each symbol.
*/
-public abstract class SelectSymbol extends Symbol {
+public interface SelectSymbol extends LanguageObject {
+
- /**
- * Passthrough constructor used for cloning
- * @param name
- * @param canonicalName
- * @since 4.3
- */
- protected SelectSymbol(String name, String canonicalName) {
- super(name, canonicalName);
- }
-
- /**
- * Construct a symbol with a name
- * @param name Name of symbol
- */
- public SelectSymbol(String name) {
- super(name);
- }
-
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/symbol/SingleElementSymbol.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/SingleElementSymbol.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/SingleElementSymbol.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -27,7 +27,7 @@
/**
* <p>This is a subclass of Symbol representing a single output column.</p>
*/
-public abstract class SingleElementSymbol extends SelectSymbol implements Expression {
+public abstract class SingleElementSymbol extends Symbol implements Expression, SelectSymbol {
/**
* Character used to delimit name components in a symbol
Modified: trunk/engine/src/main/java/org/teiid/query/sql/symbol/WindowFunction.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/WindowFunction.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/WindowFunction.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -29,6 +29,7 @@
import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.LanguageVisitor;
import org.teiid.query.sql.lang.OrderBy;
+import org.teiid.query.sql.visitor.SQLStringVisitor;
public class WindowFunction implements Expression {
@@ -46,6 +47,7 @@
public void setFunction(AggregateSymbol expression) {
this.function = expression;
+ this.function.setWindowed(true);
}
public List<Expression> getPartition() {
@@ -111,4 +113,9 @@
return clone;
}
+ @Override
+ public String toString() {
+ return SQLStringVisitor.getSQLString(this);
+ }
+
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/AbstractSymbolMappingVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/AbstractSymbolMappingVisitor.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/AbstractSymbolMappingVisitor.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -33,11 +33,10 @@
import org.teiid.query.sql.lang.UnaryFromClause;
import org.teiid.query.sql.lang.Update;
import org.teiid.query.sql.proc.CriteriaSelector;
-import org.teiid.query.sql.symbol.AllInGroupSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.Symbol;
@@ -124,70 +123,28 @@
* Swap each ElementSymbol referenced by AllInGroupSymbol
* @param obj Object to remap
*/
- public void visit(AllInGroupSymbol obj) {
- // Discover new group name during course of mapping
- String newGroupName = null;
-
- List oldSymbols = obj.getElementSymbols();
+ public void visit(MultipleElementSymbol obj) {
+ List<ElementSymbol> oldSymbols = obj.getElementSymbols();
if(oldSymbols != null && oldSymbols.size() > 0) {
- List newSymbols = new ArrayList(oldSymbols.size());
+ List<ElementSymbol> newSymbols = new ArrayList<ElementSymbol>(oldSymbols.size());
- Iterator iter = oldSymbols.iterator();
+ Iterator<ElementSymbol> iter = oldSymbols.iterator();
while(iter.hasNext()) {
- ElementSymbol es = (ElementSymbol) iter.next();
+ ElementSymbol es = iter.next();
ElementSymbol mappedSymbol = getMappedElement(es);
-
- // Save group name on first valid mapped element
- if(newGroupName == null && mappedSymbol != null) {
- GroupSymbol newGroup = mappedSymbol.getGroupSymbol();
- if(newGroup != null) {
- newGroupName = newGroup.getName();
- }
- }
-
newSymbols.add( mappedSymbol );
}
obj.setElementSymbols(newSymbols);
}
-
- // If haven't discovered group name yet (if, for instance, stuff isn't resolved),
- // then fake up a group symbol, map it, and use the name of the mapped group symbol
- if(newGroupName == null) {
- String symbolName = obj.getName();
- String oldGroupName = symbolName.substring(0, symbolName.length()-2); // cut .* off
-
- GroupSymbol fakeSymbol = new GroupSymbol(oldGroupName);
- GroupSymbol mappedSymbol = getMappedGroup(fakeSymbol);
-
- newGroupName = mappedSymbol.getName();
+
+ if (obj.getGroup() == null) {
+ return;
}
- // Finally, swap name of group, which should be the name of the group
- // for all of the element symbols
- obj.setShortName(newGroupName + ".*"); //$NON-NLS-1$
-
+ obj.setGroup(getMappedGroup(obj.getGroup()));
}
/**
- * Swap each ElementSymbol referenced by AllSymbol
- * @param obj Object to remap
- */
- public void visit(AllSymbol obj) {
- List oldSymbols = obj.getElementSymbols();
- if(oldSymbols != null && oldSymbols.size() > 0) {
- List newSymbols = new ArrayList(oldSymbols.size());
-
- Iterator iter = oldSymbols.iterator();
- while(iter.hasNext()) {
- ElementSymbol es = (ElementSymbol) iter.next();
- newSymbols.add( getMappedElement(es) );
- }
-
- obj.setElementSymbols(newSymbols);
- }
- }
-
- /**
* Swap group in unary from clause.
* @param obj Object to remap
*/
Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/AggregateSymbolCollectorVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/AggregateSymbolCollectorVisitor.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/AggregateSymbolCollectorVisitor.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -32,15 +32,21 @@
import org.teiid.query.sql.navigator.PreOrPostOrderNavigator;
import org.teiid.query.sql.symbol.AggregateSymbol;
import org.teiid.query.sql.symbol.ElementSymbol;
-import org.teiid.query.sql.symbol.SingleElementSymbol;
+import org.teiid.query.sql.symbol.Expression;
+import org.teiid.query.sql.symbol.WindowFunction;
public class AggregateSymbolCollectorVisitor extends LanguageVisitor {
public static class AggregateStopNavigator extends PreOrPostOrderNavigator {
-
- public AggregateStopNavigator(LanguageVisitor visitor) {
- super(visitor, PreOrPostOrderNavigator.POST_ORDER, false);
+
+ private Collection<? extends Expression> groupingCols;
+ private Collection<? super Expression> groupingColsUsed;
+
+ public AggregateStopNavigator(LanguageVisitor visitor, Collection<? super Expression> groupingColsUsed, Collection<? extends Expression> groupingCols) {
+ super(visitor, PreOrPostOrderNavigator.PRE_ORDER, false);
+ this.groupingCols = groupingCols;
+ this.groupingColsUsed = groupingColsUsed;
}
public void visit(AggregateSymbol obj) {
@@ -49,32 +55,56 @@
postVisitVisitor(obj);
}
+ @Override
+ protected void visitNode(LanguageObject obj) {
+ if (groupingCols != null && obj instanceof Expression && groupingCols.contains(obj)) {
+ if (groupingColsUsed != null) {
+ groupingColsUsed.add((Expression)obj);
+ }
+ return;
+ }
+ super.visitNode(obj);
+ }
+
}
private Collection<? super AggregateSymbol> aggregates;
- private Collection<? super SingleElementSymbol> groupingSymbols;
+ private Collection<? super ElementSymbol> otherElements;
+ private Collection<? super WindowFunction> windowFunctions;
- public AggregateSymbolCollectorVisitor(Collection<? super AggregateSymbol> aggregates, Collection<? super SingleElementSymbol> elements) {
+ public AggregateSymbolCollectorVisitor(Collection<? super AggregateSymbol> aggregates, Collection<? super ElementSymbol> elements) {
this.aggregates = aggregates;
- this.groupingSymbols = elements;
+ this.otherElements = elements;
}
public void visit(AggregateSymbol obj) {
- if (aggregates != null) {
+ if (aggregates != null && !obj.isWindowed()) {
this.aggregates.add(obj);
}
}
+ public void visit(WindowFunction windowFunction) {
+ if (this.windowFunctions != null) {
+ this.windowFunctions.add(windowFunction);
+ }
+ }
+
public void visit(ElementSymbol obj) {
- if (this.groupingSymbols != null) {
- this.groupingSymbols.add(obj);
+ if (this.otherElements != null && !obj.isExternalReference()) {
+ this.otherElements.add(obj);
}
}
- public static final void getAggregates(LanguageObject obj, Collection<? super AggregateSymbol> aggregates, Collection<SingleElementSymbol> elements) {
- AggregateSymbolCollectorVisitor visitor = new AggregateSymbolCollectorVisitor(aggregates, elements);
- AggregateStopNavigator asn = new AggregateStopNavigator(visitor);
- obj.acceptVisitor(asn);
+ public static final void getAggregates(LanguageObject obj,
+ Collection<? super AggregateSymbol> aggregates,
+ Collection<? super ElementSymbol> otherElements,
+ Collection<? super Expression> groupingColsUsed,
+ Collection<? super Expression> windowFunctions,
+ Collection<? extends Expression> groupingCols) {
+ AggregateSymbolCollectorVisitor visitor = new AggregateSymbolCollectorVisitor(aggregates, otherElements);
+ visitor.windowFunctions = windowFunctions;
+ AggregateStopNavigator asn = new AggregateStopNavigator(visitor, groupingColsUsed, groupingCols);
+ asn.visitNode(obj);
}
public static final Collection<AggregateSymbol> getAggregates(LanguageObject obj, boolean removeDuplicates) {
@@ -88,7 +118,7 @@
aggregates = new ArrayList<AggregateSymbol>();
}
AggregateSymbolCollectorVisitor visitor = new AggregateSymbolCollectorVisitor(aggregates, null);
- AggregateStopNavigator asn = new AggregateStopNavigator(visitor);
+ AggregateStopNavigator asn = new AggregateStopNavigator(visitor, null, null);
obj.acceptVisitor(asn);
return aggregates;
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/ElementCollectorVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/ElementCollectorVisitor.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/ElementCollectorVisitor.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -32,9 +32,8 @@
import org.teiid.query.sql.LanguageVisitor;
import org.teiid.query.sql.navigator.DeepPreOrderNavigator;
import org.teiid.query.sql.navigator.PreOrderNavigator;
-import org.teiid.query.sql.symbol.AllInGroupSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
import org.teiid.query.sql.symbol.ElementSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
/**
@@ -81,24 +80,13 @@
* called directly.
* @param obj Language object
*/
- public void visit(AllInGroupSymbol obj) {
+ public void visit(MultipleElementSymbol obj) {
if(obj.getElementSymbols() != null) {
this.elements.addAll(obj.getElementSymbols());
}
}
/**
- * Visit a language object and collect symbols. This method should <b>NOT</b> be
- * called directly.
- * @param obj Language object
- */
- public void visit(AllSymbol obj) {
- if(obj.getElementSymbols() != null) {
- this.elements.addAll(obj.getElementSymbols());
- }
- }
-
- /**
* Helper to quickly get the elements from obj in the elements collection
* @param obj Language object
* @param elements Collection to collect elements in
Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -109,8 +109,6 @@
import org.teiid.query.sql.proc.WhileStatement;
import org.teiid.query.sql.symbol.AggregateSymbol;
import org.teiid.query.sql.symbol.AliasSymbol;
-import org.teiid.query.sql.symbol.AllInGroupSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
import org.teiid.query.sql.symbol.CaseExpression;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.DerivedColumn;
@@ -119,6 +117,7 @@
import org.teiid.query.sql.symbol.ExpressionSymbol;
import org.teiid.query.sql.symbol.Function;
import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.QueryString;
import org.teiid.query.sql.symbol.Reference;
import org.teiid.query.sql.symbol.ScalarSubquery;
@@ -1157,14 +1156,16 @@
append(escapeSinglePart(obj.getOutputName()));
}
- public void visit( AllInGroupSymbol obj ) {
- append(obj.getName());
+ public void visit( MultipleElementSymbol obj ) {
+ if (obj.getGroup() == null) {
+ append(Tokens.ALL_COLS);
+ } else {
+ visitNode(obj.getGroup());
+ append(Tokens.DOT);
+ append(Tokens.ALL_COLS);
+ }
}
- public void visit( AllSymbol obj ) {
- append(obj.getName());
- }
-
public void visit( Constant obj ) {
Class<?> type = obj.getType();
String[] constantParts = null;
Deleted: trunk/engine/src/main/java/org/teiid/query/validator/AggregateValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/AggregateValidationVisitor.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/validator/AggregateValidationVisitor.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -1,163 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership. Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.query.validator;
-
-import java.util.Collection;
-import java.util.Set;
-
-import org.teiid.core.types.DataTypeManager;
-import org.teiid.query.QueryPlugin;
-import org.teiid.query.sql.LanguageObject;
-import org.teiid.query.sql.navigator.PreOrderNavigator;
-import org.teiid.query.sql.symbol.AggregateSymbol;
-import org.teiid.query.sql.symbol.CaseExpression;
-import org.teiid.query.sql.symbol.ElementSymbol;
-import org.teiid.query.sql.symbol.Expression;
-import org.teiid.query.sql.symbol.ExpressionSymbol;
-import org.teiid.query.sql.symbol.Function;
-import org.teiid.query.sql.symbol.SearchedCaseExpression;
-import org.teiid.query.sql.symbol.AggregateSymbol.Type;
-import org.teiid.query.sql.visitor.AggregateSymbolCollectorVisitor;
-import org.teiid.query.sql.visitor.ElementCollectorVisitor;
-
-/**
- * Validate that all ElementSymbol and ExpressionSymbols used in the HAVING
- * and SELECT clauses are based on symbols used in the GROUP BY clause.
- * @since 4.2
- */
-public class AggregateValidationVisitor extends AbstractValidationVisitor {
-
- private boolean validateBelow = true;
-
- // Symbols from GROUP BY - may be null if no group symbols
- private Set<Expression> groupExpressions;
-
- public AggregateValidationVisitor(Set<Expression> groupExpressions) {
- this.groupExpressions = groupExpressions;
- }
-
- public void visit(AggregateSymbol obj) {
- Expression aggExp = obj.getExpression();
-
- validateNoNestedAggs(aggExp);
- validateNoNestedAggs(obj.getOrderBy());
- validateNoNestedAggs(obj.getCondition());
-
- // Verify data type of aggregate expression
- Type aggregateFunction = obj.getAggregateFunction();
- if((aggregateFunction == Type.SUM || aggregateFunction == Type.AVG) && obj.getType() == null) {
- handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0041", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
- } else if (obj.getType() != DataTypeManager.DefaultDataClasses.NULL) {
- if (aggregateFunction == Type.XMLAGG && aggExp.getType() != DataTypeManager.DefaultDataClasses.XML) {
- handleValidationError(QueryPlugin.Util.getString("AggregateValidationVisitor.non_xml", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
- } else if (obj.isBoolean() && aggExp.getType() != DataTypeManager.DefaultDataClasses.BOOLEAN) {
- handleValidationError(QueryPlugin.Util.getString("AggregateValidationVisitor.non_boolean", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
- }
- }
- if((obj.isDistinct() || aggregateFunction == Type.MIN || aggregateFunction == Type.MAX) && DataTypeManager.isNonComparable(DataTypeManager.getDataTypeName(aggExp.getType()))) {
- handleValidationError(QueryPlugin.Util.getString("AggregateValidationVisitor.non_comparable", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
- }
- if(obj.isEnhancedNumeric()) {
- if (!Number.class.isAssignableFrom(aggExp.getType())) {
- handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0041", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
- }
- if (obj.isDistinct()) {
- handleValidationError(QueryPlugin.Util.getString("AggregateValidationVisitor.invalid_distinct", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
- }
- }
- validateBelow = false;
- }
-
- private void validateNoNestedAggs(LanguageObject aggExp) {
- // Check for any nested aggregates (which are not allowed)
- if(aggExp != null) {
- Collection<AggregateSymbol> nestedAggs = AggregateSymbolCollectorVisitor.getAggregates(aggExp, true);
- if(nestedAggs.size() > 0) {
- handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0039", nestedAggs), nestedAggs); //$NON-NLS-1$
- }
- }
- }
-
- public void visit(ElementSymbol obj) {
- validateExpression(obj);
- }
-
- public void visit(ExpressionSymbol obj) {
- validateExpression(obj);
- }
-
- public void visit(CaseExpression obj) {
- validateExpression(obj);
- }
-
- public void visit(SearchedCaseExpression obj) {
- validateExpression(obj);
- }
-
- public void visit(Function obj) {
- validateExpression(obj);
- }
-
- private void validateExpression(Expression symbol) {
- if (ElementCollectorVisitor.getElements(symbol, false).isEmpty()) {
- validateBelow = false;
- return;
- }
-
- if(groupExpressions == null) {
- if (symbol instanceof ElementSymbol && !((ElementSymbol)symbol).isExternalReference()) {
- handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0037", symbol), symbol); //$NON-NLS-1$
- }
- } else if(! groupExpressions.contains(symbol)) {
- if (symbol instanceof ElementSymbol && !((ElementSymbol)symbol).isExternalReference()) {
- handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0038", symbol), symbol); //$NON-NLS-1$
- }
- } else {
- validateBelow = false;
- }
- }
-
- public static void validate(LanguageObject obj, final AggregateValidationVisitor visitor) {
- visitor.validateBelow = true;
- PreOrderNavigator nav = new PreOrderNavigator(visitor) {
- private boolean validateBelow;
-
- protected void visitNode(LanguageObject obj) {
- if (validateBelow) {
- super.visitNode(obj);
- }
- }
-
- protected void preVisitVisitor(LanguageObject obj) {
- super.preVisitVisitor(obj);
- this.validateBelow = visitor.validateBelow;
- }
-
- protected void postVisitVisitor(LanguageObject obj) {
- this.validateBelow = true;
- }
- };
- obj.acceptVisitor(nav);
- }
-
-}
Modified: trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -27,6 +27,7 @@
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
+import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -121,6 +122,7 @@
import org.teiid.query.sql.symbol.ScalarSubquery;
import org.teiid.query.sql.symbol.SingleElementSymbol;
import org.teiid.query.sql.symbol.TextLine;
+import org.teiid.query.sql.symbol.WindowFunction;
import org.teiid.query.sql.symbol.XMLAttributes;
import org.teiid.query.sql.symbol.XMLElement;
import org.teiid.query.sql.symbol.XMLForest;
@@ -752,42 +754,38 @@
validateNoAggsInClause(groupBy);
validateNoAggsInClause(query.getCriteria());
validateNoAggsInClause(query.getFrom());
- if(groupBy != null || having != null || !AggregateSymbolCollectorVisitor.getAggregates(select, false).isEmpty()) {
- Set<Expression> groupSymbols = null;
- if(groupBy != null) {
- groupSymbols = new HashSet<Expression>();
- for (final Iterator<Expression> iterator = groupBy.getSymbols().iterator(); iterator.hasNext();) {
- final Expression element = iterator.next();
- groupSymbols.add(element);
- }
- }
-
- // Validate HAVING, if it exists
- AggregateValidationVisitor visitor = new AggregateValidationVisitor(groupSymbols);
- if(having != null) {
- AggregateValidationVisitor.validate(having, visitor);
- }
-
- // Validate SELECT
- List<SingleElementSymbol> projectedSymbols = select.getProjectedSymbols();
- for (SingleElementSymbol symbol : projectedSymbols) {
- AggregateValidationVisitor.validate(symbol, visitor);
- }
-
- // Move items to this report
- ValidatorReport report = visitor.getReport();
- Collection<ValidatorFailure> items = report.getItems();
- super.getReport().addItems(items);
+ Set<Expression> groupSymbols = null;
+ boolean hasAgg = false;
+ if (groupBy != null) {
+ groupSymbols = new HashSet<Expression>(groupBy.getSymbols());
+ hasAgg = true;
}
+ LinkedHashSet<Expression> invalid = new LinkedHashSet<Expression>();
+ LinkedHashSet<Expression> invalidWindowFunctions = new LinkedHashSet<Expression>();
+ LinkedList<AggregateSymbol> aggs = new LinkedList<AggregateSymbol>();
+ if (having != null) {
+ AggregateSymbolCollectorVisitor.getAggregates(having, aggs, invalid, null, invalidWindowFunctions, groupSymbols);
+ hasAgg = true;
+ }
+ for (SingleElementSymbol symbol : select.getProjectedSymbols()) {
+ AggregateSymbolCollectorVisitor.getAggregates(symbol, aggs, invalid, null, null, groupSymbols);
+ }
+ if ((!aggs.isEmpty() || hasAgg) && !invalid.isEmpty()) {
+ handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0037", invalid), invalid); //$NON-NLS-1$
+ }
+ if (!invalidWindowFunctions.isEmpty()) {
+ handleValidationError(QueryPlugin.Util.getString("SQLParser.window_only_top_level", invalidWindowFunctions), invalidWindowFunctions); //$NON-NLS-1$
+ }
}
private void validateNoAggsInClause(LanguageObject clause) {
if (clause == null) {
return;
}
- Collection<AggregateSymbol> aggs = AggregateSymbolCollectorVisitor.getAggregates(clause, false);
+ LinkedHashSet<Expression> aggs = new LinkedHashSet<Expression>();
+ AggregateSymbolCollectorVisitor.getAggregates(clause, aggs, null, null, aggs, null);
if (!aggs.isEmpty()) {
- handleValidationError(QueryPlugin.Util.getString("SQLParser.Aggregate_only_top_level", aggs), aggs);
+ handleValidationError(QueryPlugin.Util.getString("SQLParser.Aggregate_only_top_level", aggs), aggs); //$NON-NLS-1$
}
}
@@ -1204,18 +1202,56 @@
}
@Override
+ public void visit(WindowFunction windowFunction) {
+ AggregateSymbol.Type type = windowFunction.getFunction().getAggregateFunction();
+ switch (type) {
+ case RANK:
+ case DENSE_RANK:
+ case ROW_NUMBER:
+ if (windowFunction.getOrderBy() == null) {
+ handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.analytical_requires_order_by", windowFunction), windowFunction); //$NON-NLS-1$
+ }
+ }
+ validateNoSubqueriesOrOuterReferences(windowFunction);
+ }
+
+ @Override
public void visit(AggregateSymbol obj) {
if (obj.getCondition() != null) {
Expression condition = obj.getCondition();
- if (!ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(condition).isEmpty()) {
- handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.filter_subquery", condition), condition); //$NON-NLS-1$
- }
- for (ElementSymbol es : ElementCollectorVisitor.getElements(condition, false)) {
- if (es.isExternalReference()) {
- handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.filter_subquery", es), es); //$NON-NLS-1$
- }
- }
+ validateNoSubqueriesOrOuterReferences(condition);
}
+ Expression aggExp = obj.getExpression();
+
+ validateNoNestedAggs(aggExp);
+ validateNoNestedAggs(obj.getOrderBy());
+ validateNoNestedAggs(obj.getCondition());
+
+ // Verify data type of aggregate expression
+ Type aggregateFunction = obj.getAggregateFunction();
+ if((aggregateFunction == Type.SUM || aggregateFunction == Type.AVG) && obj.getType() == null) {
+ handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0041", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
+ } else if (obj.getType() != DataTypeManager.DefaultDataClasses.NULL) {
+ if (aggregateFunction == Type.XMLAGG && aggExp.getType() != DataTypeManager.DefaultDataClasses.XML) {
+ handleValidationError(QueryPlugin.Util.getString("AggregateValidationVisitor.non_xml", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
+ } else if (obj.isBoolean() && aggExp.getType() != DataTypeManager.DefaultDataClasses.BOOLEAN) {
+ handleValidationError(QueryPlugin.Util.getString("AggregateValidationVisitor.non_boolean", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
+ }
+ }
+ if((obj.isDistinct() || aggregateFunction == Type.MIN || aggregateFunction == Type.MAX) && DataTypeManager.isNonComparable(DataTypeManager.getDataTypeName(aggExp.getType()))) {
+ handleValidationError(QueryPlugin.Util.getString("AggregateValidationVisitor.non_comparable", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
+ }
+ if(obj.isEnhancedNumeric()) {
+ if (!Number.class.isAssignableFrom(aggExp.getType())) {
+ handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0041", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
+ }
+ if (obj.isDistinct()) {
+ handleValidationError(QueryPlugin.Util.getString("AggregateValidationVisitor.invalid_distinct", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
+ }
+ }
+ if (obj.isWindowed() && obj.getOrderBy() != null) {
+ handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0042", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
+ }
if (obj.getAggregateFunction() != Type.TEXTAGG) {
return;
}
@@ -1235,7 +1271,29 @@
}
}
}
+
+ private void validateNoSubqueriesOrOuterReferences(Expression expr) {
+ if (!ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(expr).isEmpty()) {
+ handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.filter_subquery", expr), expr); //$NON-NLS-1$
+ }
+ for (ElementSymbol es : ElementCollectorVisitor.getElements(expr, false)) {
+ if (es.isExternalReference()) {
+ handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.filter_subquery", es), es); //$NON-NLS-1$
+ }
+ }
+ }
+ private void validateNoNestedAggs(LanguageObject aggExp) {
+ // Check for any nested aggregates (which are not allowed)
+ if(aggExp != null) {
+ HashSet<Expression> nestedAggs = new LinkedHashSet<Expression>();
+ AggregateSymbolCollectorVisitor.getAggregates(aggExp, nestedAggs, null, null, nestedAggs, null);
+ if(!nestedAggs.isEmpty()) {
+ handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0039", nestedAggs), nestedAggs); //$NON-NLS-1$
+ }
+ }
+ }
+
private String[] validateQName(LanguageObject obj, String name) {
try {
return Name11Checker.getInstance().getQNameParts(name);
Modified: trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
===================================================================
--- trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj 2011-07-21 19:28:44 UTC (rev 3323)
@@ -1740,7 +1740,7 @@
query=query(info) |
(<TABLE> name=id() {
Query q = new Query();
- q.setSelect(new Select(Arrays.asList(new AllSymbol())));
+ q.setSelect(new Select(Arrays.asList(new MultipleElementSymbol())));
q.setFrom(new From(Arrays.asList(new UnaryFromClause(new GroupSymbol(name)))));
query = q;
}) |
@@ -1826,7 +1826,7 @@
[<ALL> | (<DISTINCT> {isDistinct=true;})]
(<STAR>
{
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
}
|
( symbol=selectSymbol(info) { select.addSymbol(symbol); }
@@ -1908,7 +1908,7 @@
}
}
-AllInGroupSymbol allInGroupSymbol() :
+MultipleElementSymbol allInGroupSymbol() :
{
Token allInGroupToken = null;
@@ -1916,7 +1916,7 @@
{
allInGroupToken = <ALL_IN_GROUP>
{
- return new AllInGroupSymbol(normalizeId(allInGroupToken.image));
+ return new MultipleElementSymbol(normalizeId(allInGroupToken.image.substring(0, allInGroupToken.image.length() - 2)));
}
}
@@ -2773,7 +2773,7 @@
proc = storedProcedure(info, new StoredProcedure()) //deprecated
)
{
- subquery = new Query(new Select(Arrays.asList(new AllSymbol())), new From(Arrays.asList(new SubqueryFromClause("x", proc))), null, null, null);
+ subquery = new Query(new Select(Arrays.asList(new MultipleElementSymbol())), new From(Arrays.asList(new SubqueryFromClause("x", proc))), null, null, null);
}
)
<RPAREN>
Modified: trunk/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2011-07-21 19:28:44 UTC (rev 3323)
@@ -204,10 +204,10 @@
ERR.015.012.0033 = Metadata does not allow updates on the group: {0}
ERR.015.012.0034 = Queries involving UNIONs, INTERSECTs and EXCEPTs not allowed on XML documents
ERR.015.012.0035 = Queries combined with the set operator {0} must have the same number of output elements.
-ERR.015.012.0037 = Invalid symbol: {0}. When an aggregate function is used in the SELECT clause and no GROUP BY clause is specified, the SELECT clause may contain only aggregate functions and constants.
-ERR.015.012.0038 = Invalid symbol: {0}. When a GROUP BY clause is used, all elements in the SELECT clause must be declared in the GROUP BY clause.
+ERR.015.012.0037 = {0} cannot be used outside of aggregate functions since they are not present in a GROUP BY clause.
ERR.015.012.0039 = Nested aggregate expressions are not allowed: {0}
ERR.015.012.0041 = The aggregate function {0} cannot be used with non-numeric expressions: {1}
+ERR.015.012.0042 = The aggregate function {0} cannot use its own order by clause when windowed: {1}
AggregateValidationVisitor.non_comparable = The aggregate function {0} cannot be used with non-comparable expressions: {1}
AggregateValidationVisitor.non_xml = The XMLAGG aggregate function {0} requires an expression of type XML: {1}
AggregateValidationVisitor.non_boolean=The boolean aggregate functions ANY, SOME, EVERY require a boolean expression.
@@ -259,7 +259,8 @@
SQLParser.Unknown_join_type=Unknown join type: {0}
-SQLParser.Aggregate_only_top_level=Aggregate functions are not allowed in the FROM/WHERE/GROUP BY clauses: {0}
+SQLParser.Aggregate_only_top_level=Aggregate and window functions are not allowed in the FROM/WHERE/GROUP BY clauses: {0}
+SQLParser.window_only_top_level=Window functions are not allowed in the HAVING clause: {0}
SQLParser.Unknown_agg_func=Unknown aggregate function: {0}
SQLParser.Invalid_func=Invalid function name: [{0}]
SQLParser.Integer_parse=Unable to parse integer literal: {0}
@@ -678,7 +679,8 @@
SimpleQueryResolver.procedure_cache_not_usable=Procedure caching will not be used for {0} since the result set cache is disabled or the results/parameters cannot be cached.
SimpleQueryResolver.procedure_cache_not_used=Procedure caching will not be used for {0} due to the use of OPTION NOCACHE.
ValidationVisitor.groupby_subquery=Expressions used in a GROUP BY clause cannot be constant and must not contain subqueries: "{0}".
-ValidationVisitor.filter_subquery=Expressions used in a FILTER clause must not contain subqueries nor outer references: "{0}".
+ValidationVisitor.filter_subquery=Expressions used in a FILTER clause or a window function must not contain subqueries nor outer references: "{0}".
+ValidationVisitor.analytical_requires_order_by=The window analytical functions RANK, DENSE_RANK, and ROW_NUMBER require the use of an ORDER BY clause in the window specification: {0}.
ValidationVisitor.Procedure_has_group_self_reference=Procedure cannot have a Group reference to itself.
ExpressionEvaluator.Expected_props_for_payload_function=Unable to evaluate {0}: expected Properties for command payload but got object of type {1}
ValidationVisitor.The_rowlimit_function_cannot_be_used_in_a_non-XML_command=The ''rowlimit'' and ''rowlimitexception'' functions cannot be used in a non-XML command
Modified: trunk/engine/src/test/java/org/teiid/cdk/CommandBuilder.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/cdk/CommandBuilder.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/cdk/CommandBuilder.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -38,7 +38,7 @@
import org.teiid.query.sql.lang.Command;
import org.teiid.query.sql.lang.Query;
import org.teiid.query.sql.lang.Select;
-import org.teiid.query.sql.symbol.AllSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
/**
@@ -90,8 +90,8 @@
List expandedSymbols = new ArrayList();
for (Iterator i = originalSymbols.iterator(); i.hasNext(); ) {
Object next = i.next();
- if (next instanceof AllSymbol) {
- AllSymbol allSymbol = (AllSymbol) next;
+ if (next instanceof MultipleElementSymbol) {
+ MultipleElementSymbol allSymbol = (MultipleElementSymbol) next;
expandedSymbols.addAll(allSymbol.getElementSymbols());
} else {
expandedSymbols.add(next);
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -823,6 +823,11 @@
System.setProperty(RuleMergeCriteria.UNNEST_DEFAULT, Boolean.TRUE.toString());
TestQueryRewriter.helpTestRewriteCommand("Select e1 from pm3.g1 where pm3.g1.e2 < (select max(e2) FROM pm1.g1 WHERE pm3.g1.e1 = e1 HAVING min(e3) < pm3.g1.e3)", "SELECT e1 FROM pm3.g1, (SELECT MAX(e2) AS MAX, e1, MIN(e3) AS MIN FROM pm1.g1 GROUP BY e1) AS X__1 WHERE (X__1.MIN < pm3.g1.e3) AND (pm3.g1.e2 < X__1.MAX) AND (pm3.g1.e1 = X__1.e1)", RealMetadataFactory.example4());
}
+
+ @Test public void testSubqueryRewriteToJoinWithGroupingExpression() throws Exception {
+ System.setProperty(RuleMergeCriteria.UNNEST_DEFAULT, Boolean.TRUE.toString());
+ TestQueryRewriter.helpTestRewriteCommand("Select distinct e1 from pm3.g1 where exists (select 1 FROM pm1.g1 group by e4 || 'x' HAVING min(e3) || (e4 || 'x') = pm3.g1.e3)", "SELECT DISTINCT e1 FROM pm3.g1, (SELECT 1 AS EXPR, MIN(e3) AS MIN, concat(e4, 'x') AS EXPR_0, concat(MIN(e3), concat(e4, 'x')) AS EXPR_1 FROM pm1.g1 GROUP BY concat(e4, 'x')) AS X__1 WHERE pm3.g1.e3 = X__1.EXPR_1", RealMetadataFactory.example4());
+ }
/**
* A join will not be used here because of the not
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/relational/rules/TestRulePlaceAccess.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/relational/rules/TestRulePlaceAccess.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/relational/rules/TestRulePlaceAccess.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -32,7 +32,7 @@
import org.teiid.query.sql.lang.From;
import org.teiid.query.sql.lang.Query;
import org.teiid.query.sql.lang.Select;
-import org.teiid.query.sql.symbol.AllSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.GroupSymbol;
import org.teiid.query.unittest.RealMetadataFactory;
@@ -67,7 +67,7 @@
query.setFrom(from);
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
group.setMetadataID(METADATA.getGroupID("pm4.g2")); //$NON-NLS-1$
Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestLimitParsing.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestLimitParsing.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestLimitParsing.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -34,7 +34,7 @@
import org.teiid.query.sql.lang.SetQuery;
import org.teiid.query.sql.lang.UnaryFromClause;
import org.teiid.query.sql.lang.SetQuery.Operation;
-import org.teiid.query.sql.symbol.AllSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.GroupSymbol;
import org.teiid.query.sql.symbol.Reference;
@@ -43,7 +43,7 @@
@Test public void testLimit() {
Query query = new Query();
- Select select = new Select(Arrays.asList(new AllSymbol()));
+ Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
query.setSelect(select);
query.setFrom(from);
@@ -53,7 +53,7 @@
@Test public void testLimitWithOffset() {
Query query = new Query();
- Select select = new Select(Arrays.asList(new AllSymbol()));
+ Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
query.setSelect(select);
query.setFrom(from);
@@ -63,7 +63,7 @@
@Test public void testLimitWithReferences1() {
Query query = new Query();
- Select select = new Select(Arrays.asList(new AllSymbol()));
+ Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
query.setSelect(select);
query.setFrom(from);
@@ -73,7 +73,7 @@
@Test public void testLimitWithReferences2() {
Query query = new Query();
- Select select = new Select(Arrays.asList(new AllSymbol()));
+ Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
query.setSelect(select);
query.setFrom(from);
@@ -83,7 +83,7 @@
@Test public void testLimitWithReferences3() {
Query query = new Query();
- Select select = new Select(Arrays.asList(new AllSymbol()));
+ Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
query.setSelect(select);
query.setFrom(from);
@@ -93,7 +93,7 @@
@Test public void testSetQueryLimit() {
Query query = new Query();
- Select select = new Select(Arrays.asList(new AllSymbol()));
+ Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
query.setSelect(select);
query.setFrom(from);
@@ -104,7 +104,7 @@
@Test public void testOffset() {
Query query = new Query();
- Select select = new Select(Arrays.asList(new AllSymbol()));
+ Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
query.setSelect(select);
query.setFrom(from);
@@ -114,7 +114,7 @@
@Test public void testFetchFirst() {
Query query = new Query();
- Select select = new Select(Arrays.asList(new AllSymbol()));
+ Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
query.setSelect(select);
query.setFrom(from);
@@ -124,7 +124,7 @@
@Test public void testFetchFirstRow() {
Query query = new Query();
- Select select = new Select(Arrays.asList(new AllSymbol()));
+ Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
query.setSelect(select);
query.setFrom(from);
@@ -134,7 +134,7 @@
@Test public void testOffsetFetch() {
Query query = new Query();
- Select select = new Select(Arrays.asList(new AllSymbol()));
+ Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
query.setSelect(select);
query.setFrom(from);
Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -57,7 +57,7 @@
import org.teiid.query.sql.proc.HasCriteria;
import org.teiid.query.sql.proc.IfStatement;
import org.teiid.query.sql.proc.Statement;
-import org.teiid.query.sql.symbol.AllSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.Expression;
@@ -434,7 +434,7 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
@@ -452,7 +452,7 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
@@ -470,7 +470,7 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
@@ -488,7 +488,7 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
@@ -506,7 +506,7 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
@@ -524,7 +524,7 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
@@ -542,7 +542,7 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
from.addGroup(new GroupSymbol("t1")); //$NON-NLS-1$
@@ -560,7 +560,7 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
@@ -578,7 +578,7 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
from.addGroup(new GroupSymbol("t1")); //$NON-NLS-1$
@@ -596,13 +596,13 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
Query query2 = new Query();
select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query2.setSelect(select);
From from2 = new From();
from2.addGroup(new GroupSymbol("t1")); //$NON-NLS-1$
@@ -623,7 +623,7 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
@@ -692,7 +692,7 @@
Query query2 = new Query();
select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
From from2 = new From();
from2.addGroup(new GroupSymbol("t1")); //$NON-NLS-1$
from2.addGroup(new GroupSymbol("t2")); //$NON-NLS-1$
@@ -1042,7 +1042,7 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
@@ -1058,7 +1058,7 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
@@ -1087,7 +1087,7 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
@@ -1106,7 +1106,7 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
@@ -1116,7 +1116,7 @@
Query query1 = new Query();
select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query1.setSelect(select);
from = new From();
ufc = new UnaryFromClause();
Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -101,8 +101,6 @@
import org.teiid.query.sql.proc.WhileStatement;
import org.teiid.query.sql.symbol.AggregateSymbol;
import org.teiid.query.sql.symbol.AliasSymbol;
-import org.teiid.query.sql.symbol.AllInGroupSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
import org.teiid.query.sql.symbol.CaseExpression;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.DerivedColumn;
@@ -111,6 +109,7 @@
import org.teiid.query.sql.symbol.ExpressionSymbol;
import org.teiid.query.sql.symbol.Function;
import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.Reference;
import org.teiid.query.sql.symbol.ScalarSubquery;
import org.teiid.query.sql.symbol.SearchedCaseExpression;
@@ -217,7 +216,7 @@
From from = new From();
from.addClause(jp);
- AllSymbol all = new AllSymbol();
+ MultipleElementSymbol all = new MultipleElementSymbol();
Select select = new Select();
select.addSymbol(all);
@@ -237,7 +236,7 @@
From from = new From();
from.addClause(jp);
- AllSymbol all = new AllSymbol();
+ MultipleElementSymbol all = new MultipleElementSymbol();
Select select = new Select();
select.addSymbol(all);
@@ -259,7 +258,7 @@
from.addClause(jp);
from.addClause(new UnaryFromClause(new GroupSymbol("g3"))); //$NON-NLS-1$
- AllSymbol all = new AllSymbol();
+ MultipleElementSymbol all = new MultipleElementSymbol();
Select select = new Select();
select.addSymbol(all);
@@ -286,7 +285,7 @@
From from = new From();
from.addClause(jp2);
- AllSymbol all = new AllSymbol();
+ MultipleElementSymbol all = new MultipleElementSymbol();
Select select = new Select();
select.addSymbol(all);
@@ -311,7 +310,7 @@
From from = new From();
from.addClause(jp3);
- AllSymbol all = new AllSymbol();
+ MultipleElementSymbol all = new MultipleElementSymbol();
Select select = new Select();
select.addSymbol(all);
@@ -334,7 +333,7 @@
From from = new From();
from.addClause(jp2);
- AllSymbol all = new AllSymbol();
+ MultipleElementSymbol all = new MultipleElementSymbol();
Select select = new Select();
select.addSymbol(all);
@@ -358,7 +357,7 @@
from.addClause(jp2);
from.addClause(new UnaryFromClause(new GroupSymbol("g4"))); //$NON-NLS-1$
- AllSymbol all = new AllSymbol();
+ MultipleElementSymbol all = new MultipleElementSymbol();
Select select = new Select();
select.addSymbol(all);
@@ -387,7 +386,7 @@
from.addClause(g4);
from.addClause(jp3);
- AllSymbol all = new AllSymbol();
+ MultipleElementSymbol all = new MultipleElementSymbol();
Select select = new Select();
select.addSymbol(all);
@@ -416,7 +415,7 @@
from.addClause(g1);
from.addClause(jp);
- AllSymbol all = new AllSymbol();
+ MultipleElementSymbol all = new MultipleElementSymbol();
Select select = new Select();
select.addSymbol(all);
@@ -1918,7 +1917,7 @@
from.addGroup(h);
Select select = new Select();
- AllInGroupSymbol myG = new AllInGroupSymbol("myG.*"); //$NON-NLS-1$
+ MultipleElementSymbol myG = new MultipleElementSymbol("myG"); //$NON-NLS-1$
select.addSymbol(myG);
select.addSymbol(new ElementSymbol("myH.b")); //$NON-NLS-1$
@@ -1939,7 +1938,7 @@
from.addGroup(h);
Select select = new Select();
- AllInGroupSymbol myG = new AllInGroupSymbol("myG.*"); //$NON-NLS-1$
+ MultipleElementSymbol myG = new MultipleElementSymbol("myG"); //$NON-NLS-1$
select.addSymbol(myG);
select.addSymbol(new ElementSymbol("myH.b")); //$NON-NLS-1$
@@ -2309,7 +2308,7 @@
from.addGroup(g);
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
Query query = new Query();
query.setSelect(select);
@@ -2327,7 +2326,7 @@
from.addGroup(g);
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
Query query = new Query();
query.setSelect(select);
@@ -2345,7 +2344,7 @@
from.addGroup(g);
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
Query query = new Query();
query.setSelect(select);
@@ -2676,10 +2675,10 @@
/** SELECT a FROM db.g WHERE b = aString order by c desc,d desc*/
@Test public void testOrderBysDesc(){
- ArrayList elements = new ArrayList();
+ ArrayList<ElementSymbol> elements = new ArrayList<ElementSymbol>();
elements.add(new ElementSymbol("c")); //$NON-NLS-1$
elements.add(new ElementSymbol("d")); //$NON-NLS-1$
- ArrayList orderTypes = new ArrayList();
+ ArrayList<Boolean> orderTypes = new ArrayList<Boolean>();
orderTypes.add(Boolean.FALSE);
orderTypes.add(Boolean.FALSE);
OrderBy orderBy = new OrderBy(elements, orderTypes);
@@ -2692,10 +2691,10 @@
/** SELECT a FROM db.g WHERE b = aString order by c desc,d*/
@Test public void testMixedOrderBys(){
- ArrayList elements = new ArrayList();
+ ArrayList<ElementSymbol> elements = new ArrayList<ElementSymbol>();
elements.add(new ElementSymbol("c")); //$NON-NLS-1$
elements.add(new ElementSymbol("d")); //$NON-NLS-1$
- ArrayList orderTypes = new ArrayList();
+ ArrayList<Boolean> orderTypes = new ArrayList<Boolean>();
orderTypes.add(Boolean.FALSE);
orderTypes.add(Boolean.TRUE);
OrderBy orderBy = new OrderBy(elements, orderTypes);
@@ -3358,7 +3357,7 @@
@Test public void testHasEQCriteria() throws Exception {
ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
- List elements = new ArrayList();
+ List<ElementSymbol> elements = new ArrayList<ElementSymbol>();
elements.add(a);
CriteriaSelector critSelector = new CriteriaSelector();
@@ -3391,7 +3390,7 @@
/**HAS IN CRITERIA ON (a)*/
@Test public void testHasInCriteria() throws Exception {
ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
- List elements = new ArrayList();
+ List<ElementSymbol> elements = new ArrayList<ElementSymbol>();
elements.add(a);
CriteriaSelector critSelector = new CriteriaSelector();
@@ -3408,7 +3407,7 @@
/**HAS COMPARE_LT CRITERIA ON (a)*/
@Test public void testHasLTCriteria() throws Exception {
ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
- List elements = new ArrayList();
+ List<ElementSymbol> elements = new ArrayList<ElementSymbol>();
elements.add(a);
CriteriaSelector critSelector = new CriteriaSelector();
@@ -3425,7 +3424,7 @@
/**HAS COMPARE_LE CRITERIA ON (a)*/
@Test public void testHasLECriteria() throws Exception {
ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
- List elements = new ArrayList();
+ List<ElementSymbol> elements = new ArrayList<ElementSymbol>();
elements.add(a);
CriteriaSelector critSelector = new CriteriaSelector();
@@ -3604,7 +3603,7 @@
* @return
*/
private Query sampleQuery() {
- List symbols = new ArrayList();
+ List<ElementSymbol> symbols = new ArrayList<ElementSymbol>();
symbols.add(new ElementSymbol("a1")); //$NON-NLS-1$
Select select = new Select(symbols);
@@ -3645,7 +3644,7 @@
//sql is a variable, also uses the as, into, and update clauses
@Test public void testDynamicCommandStatement1() throws Exception {
- List symbols = new ArrayList();
+ List<ElementSymbol> symbols = new ArrayList<ElementSymbol>();
ElementSymbol a1 = new ElementSymbol("a1"); //$NON-NLS-1$
a1.setType(DataTypeManager.DefaultDataClasses.STRING);
@@ -3737,7 +3736,7 @@
Statement declStmt = new DeclareStatement(var1, shortType);
//ifblock
- List symbols = new ArrayList();
+ List<ElementSymbol> symbols = new ArrayList<ElementSymbol>();
symbols.add(new ElementSymbol("a1")); //$NON-NLS-1$
Select select = new Select(symbols);
@@ -3761,7 +3760,7 @@
ElementSymbol var2 = new ElementSymbol("var2"); //$NON-NLS-1$
Statement elseDeclStmt = new DeclareStatement(var2, shortType);
- List elseSymbols = new ArrayList();
+ List<ElementSymbol> elseSymbols = new ArrayList<ElementSymbol>();
elseSymbols.add(new ElementSymbol("b1")); //$NON-NLS-1$
Select elseSelect = new Select(elseSymbols);
@@ -3770,7 +3769,6 @@
elseQuery.setFrom(from);
elseQuery.setCriteria(criteria);
- Command elseQueryCmd = elseQuery;
AssignmentStatement elseQueryStmt = new AssignmentStatement(var2, elseQuery);
Block elseBlock = new Block();
@@ -3867,7 +3865,7 @@
ElementSymbol var2 = new ElementSymbol("var2"); //$NON-NLS-1$
Statement elseDeclStmt = new DeclareStatement(var2, shortType);
- List elseSymbols = new ArrayList();
+ List<ElementSymbol> elseSymbols = new ArrayList<ElementSymbol>();
elseSymbols.add(new ElementSymbol("b1")); //$NON-NLS-1$
Select elseSelect = new Select(elseSymbols);
@@ -5011,7 +5009,7 @@
StoredProcedure exec = new StoredProcedure();
exec.setProcedureName("m.sq1"); //$NON-NLS-1$
- Query query = new Query(new Select(Arrays.asList(new AllSymbol())), new From(Arrays.asList(new SubqueryFromClause("x", exec))), null, null, null);
+ Query query = new Query(new Select(Arrays.asList(new MultipleElementSymbol())), new From(Arrays.asList(new SubqueryFromClause("x", exec))), null, null, null);
SubquerySetCriteria subCrit = new SubquerySetCriteria(expr, query);
Query outer = new Query();
@@ -5079,7 +5077,7 @@
@Test public void testExecSubquery(){
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
from.addClause(new UnaryFromClause(new GroupSymbol("newModel2.Table1"))); //$NON-NLS-1$
@@ -5102,7 +5100,7 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
from.addGroup(new GroupSymbol("TestDocument.TestDocument")); //$NON-NLS-1$
@@ -5122,7 +5120,7 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
from.addGroup(new GroupSymbol("TestDocument.TestDocument")); //$NON-NLS-1$
@@ -5165,7 +5163,7 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
from.addGroup(new GroupSymbol("a.thing")); //$NON-NLS-1$
@@ -5184,7 +5182,7 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
from.addGroup(new GroupSymbol("a.thing")); //$NON-NLS-1$
@@ -5203,7 +5201,7 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
from.addGroup(new GroupSymbol("a.thing")); //$NON-NLS-1$
@@ -5220,7 +5218,7 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
from.addGroup(new GroupSymbol("a.thing")); //$NON-NLS-1$
@@ -5265,7 +5263,7 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
@@ -5307,7 +5305,7 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
@@ -5353,7 +5351,7 @@
Query query = new Query();
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
@@ -5998,7 +5996,7 @@
@Test public void testAndOrPrecedence_1575() {
Select s = new Select();
- s.addSymbol(new AllSymbol());
+ s.addSymbol(new MultipleElementSymbol());
From f = new From();
f.addGroup(new GroupSymbol("m.g1")); //$NON-NLS-1$
CompareCriteria c1 = new CompareCriteria(new ElementSymbol("e1"), CompareCriteria.EQ, new Constant(new Integer(0))); //$NON-NLS-1$
@@ -6017,7 +6015,7 @@
@Test public void testAndOrPrecedence2_1575() {
Select s = new Select();
- s.addSymbol(new AllSymbol());
+ s.addSymbol(new MultipleElementSymbol());
From f = new From();
f.addGroup(new GroupSymbol("m.g1")); //$NON-NLS-1$
CompareCriteria c1 = new CompareCriteria(new ElementSymbol("e1"), CompareCriteria.EQ, new Constant(new Integer(0))); //$NON-NLS-1$
@@ -6040,7 +6038,7 @@
*/
private void helpTestCompoundNonJoinCriteria(String sqlPred, PredicateCriteria predCrit) {
Select s = new Select();
- s.addSymbol(new AllSymbol());
+ s.addSymbol(new MultipleElementSymbol());
From f = new From();
CompareCriteria c1 = new CompareCriteria(new ElementSymbol("e1"), CompareCriteria.EQ, new Constant(new Integer(0))); //$NON-NLS-1$
@@ -6486,7 +6484,7 @@
Query query = new Query();
Select select = new Select();
query.setSelect(select);
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
From from = new From();
query.setFrom(from);
Criteria compareCriteria = new CompareCriteria(new ElementSymbol("A.x"), CompareCriteria.EQ, new ElementSymbol("B.x")); //$NON-NLS-1$ //$NON-NLS-2$
@@ -6522,7 +6520,7 @@
String expected = "SELECT * FROM pm1.g1 UNION JOIN pm1.g2 WHERE g1.e1 = 1"; //$NON-NLS-1$
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
From from = new From();
from.addClause(new JoinPredicate(new UnaryFromClause(new GroupSymbol("pm1.g1")), new UnaryFromClause(new GroupSymbol("pm1.g2")), JoinType.JOIN_UNION)); //$NON-NLS-1$ //$NON-NLS-2$
@@ -6696,7 +6694,7 @@
@Test public void testNestedTable() throws Exception {
String sql = "SELECT * from TABLE(exec foo()) as x"; //$NON-NLS-1$
Query query = new Query();
- query.setSelect(new Select(Arrays.asList(new AllSymbol())));
+ query.setSelect(new Select(Arrays.asList(new MultipleElementSymbol())));
StoredProcedure sp = new StoredProcedure();
sp.setProcedureName("foo");
SubqueryFromClause sfc = new SubqueryFromClause("x", sp);
@@ -6708,7 +6706,7 @@
@Test public void testTextTable() throws Exception {
String sql = "SELECT * from texttable(file columns x string WIDTH 1, y date width 10 skip 10) as x"; //$NON-NLS-1$
Query query = new Query();
- query.setSelect(new Select(Arrays.asList(new AllSymbol())));
+ query.setSelect(new Select(Arrays.asList(new MultipleElementSymbol())));
TextTable tt = new TextTable();
tt.setFile(new ElementSymbol("file"));
List<TextTable.TextColumn> columns = new ArrayList<TextTable.TextColumn>();
@@ -6738,7 +6736,7 @@
@Test public void testXMLTable() throws Exception {
String sql = "SELECT * from xmltable(xmlnamespaces(no default), '/' columns x for ordinality, y date default {d'2000-01-01'} path '@date') as x"; //$NON-NLS-1$
Query query = new Query();
- query.setSelect(new Select(Arrays.asList(new AllSymbol())));
+ query.setSelect(new Select(Arrays.asList(new MultipleElementSymbol())));
XMLTable xt = new XMLTable();
xt.setName("x");
xt.setNamespaces(new XMLNamespaces(Arrays.asList(new XMLNamespaces.NamespaceItem())));
@@ -6802,7 +6800,7 @@
Query query = new Query();
Select select = new Select();
query.setSelect(select);
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("X"))));
query.setFrom(from);
helpTest("TABLE X", "SELECT * FROM X", query);
@@ -6811,7 +6809,7 @@
@Test public void testArrayTable() throws Exception {
String sql = "SELECT * from arraytable(null columns x string, y date) as x"; //$NON-NLS-1$
Query query = new Query();
- query.setSelect(new Select(Arrays.asList(new AllSymbol())));
+ query.setSelect(new Select(Arrays.asList(new MultipleElementSymbol())));
ArrayTable tt = new ArrayTable();
tt.setArrayValue(new Constant(null, DataTypeManager.DefaultDataClasses.OBJECT));
List<TableFunctionReference.ProjectedColumn> columns = new ArrayList<TableFunctionReference.ProjectedColumn>();
Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestSetQueryParsing.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestSetQueryParsing.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestSetQueryParsing.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -28,7 +28,7 @@
import org.teiid.query.sql.lang.Select;
import org.teiid.query.sql.lang.SetQuery;
import org.teiid.query.sql.lang.SetQuery.Operation;
-import org.teiid.query.sql.symbol.AllSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.GroupSymbol;
@@ -81,7 +81,7 @@
from.addGroup(g);
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
Query query1 = new Query();
query1.setSelect(select);
Modified: trunk/engine/src/test/java/org/teiid/query/processor/xml/TestXMLProcessor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/xml/TestXMLProcessor.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/processor/xml/TestXMLProcessor.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -7846,7 +7846,7 @@
"</Catalogs>\r\n\r\n"; //$NON-NLS-1$
- helpTestProcess("SELECT Catalogs.Catalog.Items.Item.ItemID, Order.* " + //$NON-NLS-1$
+ helpTestProcess("SELECT Catalogs.Catalog.Items.Item.ItemID, \"Order\".* " + //$NON-NLS-1$
" FROM xmltest.doc9c " + //$NON-NLS-1$
" WHERE SupplierID > '54' " + //$NON-NLS-1$
" ORDER BY ItemID DESC, OrderID DESC", //$NON-NLS-1$
Modified: trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -93,7 +93,6 @@
import org.teiid.query.sql.symbol.Function;
import org.teiid.query.sql.symbol.GroupSymbol;
import org.teiid.query.sql.symbol.Reference;
-import org.teiid.query.sql.symbol.SelectSymbol;
import org.teiid.query.sql.symbol.SingleElementSymbol;
import org.teiid.query.sql.visitor.CommandCollectorVisitor;
import org.teiid.query.sql.visitor.ElementCollectorVisitor;
@@ -293,11 +292,11 @@
private void helpCheckSelect(Query query, String[] elementNames) {
Select select = query.getSelect();
- List elements = select.getSymbols();
+ List<SingleElementSymbol> elements = select.getProjectedSymbols();
assertEquals("Wrong number of select symbols: ", elementNames.length, elements.size()); //$NON-NLS-1$
for(int i=0; i<elements.size(); i++) {
- SelectSymbol symbol = (SelectSymbol) elements.get(i);
+ SingleElementSymbol symbol = elements.get(i);
assertEquals("Element name does not match: ", elementNames[i].toUpperCase(), symbol.getName().toUpperCase()); //$NON-NLS-1$
}
}
@@ -594,7 +593,6 @@
@Test public void testSelectStar() {
Query resolvedQuery = (Query) helpResolve("SELECT * FROM pm1.g1"); //$NON-NLS-1$
helpCheckFrom(resolvedQuery, new String[] { "pm1.g1" }); //$NON-NLS-1$
- helpCheckSelect(resolvedQuery, new String[] { "*" }); //$NON-NLS-1$
helpCheckElements(resolvedQuery.getSelect(),
new String[] { "pm1.g1.e1", "pm1.g1.e2", "pm1.g1.e3", "pm1.g1.e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
new String[] { "pm1.g1.e1", "pm1.g1.e2", "pm1.g1.e3", "pm1.g1.e4" } ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
@@ -603,7 +601,6 @@
@Test public void testSelectStarFromAliasedGroup() {
Query resolvedQuery = (Query) helpResolve("SELECT * FROM pm1.g1 as x"); //$NON-NLS-1$
helpCheckFrom(resolvedQuery, new String[] { "pm1.g1" }); //$NON-NLS-1$
- helpCheckSelect(resolvedQuery, new String[] { "*" }); //$NON-NLS-1$
helpCheckElements(resolvedQuery.getSelect(),
new String[] { "x.e1", "x.e2", "x.e3", "x.e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
new String[] { "pm1.g1.e1", "pm1.g1.e2", "pm1.g1.e3", "pm1.g1.e4" } ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
@@ -612,7 +609,6 @@
@Test public void testSelectStarFromMultipleAliasedGroups() {
Query resolvedQuery = (Query) helpResolve("SELECT * FROM pm1.g1 as x, pm1.g1 as y"); //$NON-NLS-1$
helpCheckFrom(resolvedQuery, new String[] { "pm1.g1", "pm1.g1" }); //$NON-NLS-1$ //$NON-NLS-2$
- helpCheckSelect(resolvedQuery, new String[] { "*" }); //$NON-NLS-1$
helpCheckElements(resolvedQuery.getSelect(),
new String[] { "x.e1", "x.e2", "x.e3", "x.e4", "y.e1", "y.e2", "y.e3", "y.e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
new String[] { "pm1.g1.e1", "pm1.g1.e2", "pm1.g1.e3", "pm1.g1.e4", "pm1.g1.e1", "pm1.g1.e2", "pm1.g1.e3", "pm1.g1.e4" } ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
@@ -621,7 +617,6 @@
@Test public void testSelectStarWhereSomeElementsAreNotSelectable() {
Query resolvedQuery = (Query) helpResolve("SELECT * FROM pm1.g4"); //$NON-NLS-1$
helpCheckFrom(resolvedQuery, new String[] { "pm1.g4" }); //$NON-NLS-1$
- helpCheckSelect(resolvedQuery, new String[] { "*" }); //$NON-NLS-1$
helpCheckElements(resolvedQuery.getSelect(),
new String[] { "pm1.g4.e1", "pm1.g4.e3" }, //$NON-NLS-1$ //$NON-NLS-2$
new String[] { "pm1.g4.e1", "pm1.g4.e3" } ); //$NON-NLS-1$ //$NON-NLS-2$
@@ -630,7 +625,6 @@
@Test public void testSelectGroupStarWhereSomeElementsAreNotSelectable() {
Query resolvedQuery = (Query) helpResolve("SELECT pm1.g4.* FROM pm1.g4"); //$NON-NLS-1$
helpCheckFrom(resolvedQuery, new String[] { "pm1.g4" }); //$NON-NLS-1$
- helpCheckSelect(resolvedQuery, new String[] { "pm1.g4.*" }); //$NON-NLS-1$
helpCheckElements(resolvedQuery.getSelect(),
new String[] { "pm1.g4.e1", "pm1.g4.e3" }, //$NON-NLS-1$ //$NON-NLS-2$
new String[] { "pm1.g4.e1", "pm1.g4.e3" } ); //$NON-NLS-1$ //$NON-NLS-2$
@@ -639,7 +633,6 @@
@Test public void testFullyQualifiedSelectStar() {
Query resolvedQuery = (Query) helpResolve("SELECT pm1.g1.* FROM pm1.g1"); //$NON-NLS-1$
helpCheckFrom(resolvedQuery, new String[] { "pm1.g1" }); //$NON-NLS-1$
- helpCheckSelect(resolvedQuery, new String[] { "pm1.g1.*" }); //$NON-NLS-1$
helpCheckElements(resolvedQuery.getSelect(),
new String[] { "pm1.g1.e1", "pm1.g1.e2", "pm1.g1.e3", "pm1.g1.e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
new String[] { "pm1.g1.e1", "pm1.g1.e2", "pm1.g1.e3", "pm1.g1.e4" } ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
@@ -648,7 +641,6 @@
@Test public void testSelectAllInAliasedGroup() {
Query resolvedQuery = (Query) helpResolve("SELECT x.* FROM pm1.g1 as x"); //$NON-NLS-1$
helpCheckFrom(resolvedQuery, new String[] { "pm1.g1" }); //$NON-NLS-1$
- helpCheckSelect(resolvedQuery, new String[] { "x.*" }); //$NON-NLS-1$
helpCheckElements(resolvedQuery.getSelect(),
new String[] { "x.e1", "x.e2", "x.e3", "x.e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
new String[] { "pm1.g1.e1", "pm1.g1.e2", "pm1.g1.e3", "pm1.g1.e4" } ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
Modified: trunk/engine/src/test/java/org/teiid/query/sql/lang/TestSelect.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/sql/lang/TestSelect.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/sql/lang/TestSelect.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -28,7 +28,7 @@
import org.teiid.core.util.UnitTestUtil;
import org.teiid.query.sql.lang.Select;
import org.teiid.query.sql.symbol.AliasSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.ElementSymbol;
import junit.framework.TestCase;
@@ -50,7 +50,7 @@
symbols.add(new ElementSymbol("b")); //$NON-NLS-1$
Select select = new Select();
- AllSymbol all = new AllSymbol();
+ MultipleElementSymbol all = new MultipleElementSymbol();
all.setElementSymbols(symbols);
select.addSymbol(all);
return select;
@@ -69,7 +69,7 @@
public void testGetProjectedNoElements() {
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
List projectedSymbols = select.getProjectedSymbols();
assertEquals("Did not get empty list for select * with no elements: ", new ArrayList(), projectedSymbols); //$NON-NLS-1$
@@ -81,7 +81,7 @@
symbols.add(new ElementSymbol("b")); //$NON-NLS-1$
Select select = new Select();
- AllSymbol all = new AllSymbol();
+ MultipleElementSymbol all = new MultipleElementSymbol();
all.setElementSymbols(symbols);
select.addSymbol(all);
Modified: trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestAggregateSymbolCollectorVisitor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestAggregateSymbolCollectorVisitor.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestAggregateSymbolCollectorVisitor.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -25,16 +25,15 @@
import java.util.ArrayList;
import java.util.List;
+import junit.framework.TestCase;
+
import org.teiid.api.exception.query.QueryParserException;
import org.teiid.query.parser.QueryParser;
import org.teiid.query.sql.lang.Command;
-import org.teiid.query.sql.symbol.SingleElementSymbol;
-import org.teiid.query.sql.visitor.AggregateSymbolCollectorVisitor;
+import org.teiid.query.sql.symbol.Expression;
-import junit.framework.TestCase;
-
public class TestAggregateSymbolCollectorVisitor extends TestCase {
public TestAggregateSymbolCollectorVisitor(String name) {
@@ -46,9 +45,9 @@
Command command = QueryParser.getQueryParser().parseCommand(sql);
// Find aggregates
- List<SingleElementSymbol> foundAggs = new ArrayList<SingleElementSymbol>();
- List<SingleElementSymbol> foundElements = new ArrayList<SingleElementSymbol>();
- AggregateSymbolCollectorVisitor.getAggregates(command, foundAggs, foundElements);
+ List<Expression> foundAggs = new ArrayList<Expression>();
+ List<Expression> foundElements = new ArrayList<Expression>();
+ AggregateSymbolCollectorVisitor.getAggregates(command, foundAggs, foundElements, null, null, null);
// Compare
assertEquals("Incorrect number of aggregates: " + foundAggs, aggs.length, foundAggs.size()); //$NON-NLS-1$
Modified: trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -77,8 +77,6 @@
import org.teiid.query.sql.proc.RaiseErrorStatement;
import org.teiid.query.sql.symbol.AggregateSymbol;
import org.teiid.query.sql.symbol.AliasSymbol;
-import org.teiid.query.sql.symbol.AllInGroupSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
import org.teiid.query.sql.symbol.CaseExpression;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.ElementSymbol;
@@ -86,6 +84,7 @@
import org.teiid.query.sql.symbol.ExpressionSymbol;
import org.teiid.query.sql.symbol.Function;
import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.Reference;
import org.teiid.query.sql.symbol.ScalarSubquery;
import org.teiid.query.sql.symbol.SearchedCaseExpression;
@@ -571,7 +570,7 @@
public void testQuery1() {
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
From from = new From();
from.addGroup(new GroupSymbol("m.g")); //$NON-NLS-1$
Query query = new Query();
@@ -583,7 +582,7 @@
public void testQuery2() {
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
From from = new From();
from.addGroup(new GroupSymbol("m.g")); //$NON-NLS-1$
CompareCriteria cc = new CompareCriteria(new ElementSymbol("e1"), CompareCriteria.EQ, new Constant(new Integer(5))); //$NON-NLS-1$
@@ -606,7 +605,7 @@
public void testQuery3() {
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
From from = new From();
from.addGroup(new GroupSymbol("m.g")); //$NON-NLS-1$
GroupBy groupBy = new GroupBy();
@@ -627,7 +626,7 @@
public void testQuery4() {
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
From from = new From();
from.addGroup(new GroupSymbol("m.g")); //$NON-NLS-1$
CompareCriteria cc = new CompareCriteria(new ElementSymbol("e1"), CompareCriteria.EQ, new Constant(new Integer(5))); //$NON-NLS-1$
@@ -647,7 +646,7 @@
public void testQuery5() {
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
From from = new From();
from.addGroup(new GroupSymbol("m.g")); //$NON-NLS-1$
CompareCriteria cc = new CompareCriteria(new ElementSymbol("e1"), CompareCriteria.EQ, new Constant(new Integer(5))); //$NON-NLS-1$
@@ -668,7 +667,7 @@
public void testQuery6() {
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
From from = new From();
from.addGroup(new GroupSymbol("m.g")); //$NON-NLS-1$
CompareCriteria cc = new CompareCriteria(new ElementSymbol("e1"), CompareCriteria.EQ, new Constant(new Integer(5))); //$NON-NLS-1$
@@ -688,7 +687,7 @@
public void testQuery7() {
Select select = new Select();
- select.addSymbol(new AllSymbol());
+ select.addSymbol(new MultipleElementSymbol());
From from = new From();
from.addGroup(new GroupSymbol("m.g")); //$NON-NLS-1$
CompareCriteria cc = new CompareCriteria(new ElementSymbol("e1"), CompareCriteria.EQ, new Constant(new Integer(5))); //$NON-NLS-1$
@@ -1042,11 +1041,11 @@
}
public void testAllSymbol() {
- helpTest(new AllSymbol(), "*"); //$NON-NLS-1$
+ helpTest(new MultipleElementSymbol(), "*"); //$NON-NLS-1$
}
public void testAllInGroupSymbol() {
- helpTest(new AllInGroupSymbol("m.g.*"), "m.g.*"); //$NON-NLS-1$ //$NON-NLS-2$
+ helpTest(new MultipleElementSymbol("m.g"), "m.g.*"); //$NON-NLS-1$ //$NON-NLS-2$
}
public void testConstantNull() {
@@ -1851,7 +1850,7 @@
public void testLimit() {
Query query = new Query();
- Select select = new Select(Arrays.asList(new AllSymbol()));
+ Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
query.setSelect(select);
query.setFrom(from);
@@ -1861,7 +1860,7 @@
public void testLimitWithOffset() {
Query query = new Query();
- Select select = new Select(Arrays.asList(new AllSymbol()));
+ Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
query.setSelect(select);
query.setFrom(from);
Modified: trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestStaticSymbolMappingVisitor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestStaticSymbolMappingVisitor.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestStaticSymbolMappingVisitor.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -28,6 +28,8 @@
import java.util.List;
import java.util.Map;
+import junit.framework.TestCase;
+
import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.lang.BetweenCriteria;
import org.teiid.query.sql.lang.CompareCriteria;
@@ -48,23 +50,17 @@
import org.teiid.query.sql.proc.CriteriaSelector;
import org.teiid.query.sql.proc.TranslateCriteria;
import org.teiid.query.sql.symbol.AliasSymbol;
-import org.teiid.query.sql.symbol.AllInGroupSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.symbol.ExpressionSymbol;
import org.teiid.query.sql.symbol.Function;
import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.Symbol;
-import org.teiid.query.sql.visitor.ElementCollectorVisitor;
-import org.teiid.query.sql.visitor.GroupCollectorVisitor;
-import org.teiid.query.sql.visitor.StaticSymbolMappingVisitor;
-import junit.framework.TestCase;
-
public class TestStaticSymbolMappingVisitor extends TestCase {
// ################################## FRAMEWORK ################################
@@ -209,14 +205,14 @@
public void testVisitSelect2() {
Select select = new Select();
- AllSymbol all = new AllSymbol();
+ MultipleElementSymbol all = new MultipleElementSymbol();
select.addSymbol(all);
helpTest(select, getSymbolMap());
}
public void testVisitSelect3() {
Select select = new Select();
- AllSymbol all = new AllSymbol();
+ MultipleElementSymbol all = new MultipleElementSymbol();
all.addElementSymbol(exampleElement(true, 0));
select.addSymbol(all);
helpTest(select, getSymbolMap());
@@ -226,7 +222,7 @@
Select select = new Select();
select.addSymbol( new ExpressionSymbol(
"x", new Function("length", new Expression[] {exampleElement(true, 0)})) ); //$NON-NLS-1$ //$NON-NLS-2$
- select.addSymbol( new AllInGroupSymbol("abc.*") ); //$NON-NLS-1$
+ select.addSymbol( new MultipleElementSymbol("abc.*") ); //$NON-NLS-1$
select.addSymbol( exampleElement(true, 1) );
helpTest(select,getSymbolMap());
}
@@ -266,7 +262,7 @@
}
public void testVisitAllSymbol() {
- AllSymbol as = new AllSymbol();
+ MultipleElementSymbol as = new MultipleElementSymbol();
ArrayList elements = new ArrayList();
elements.add(exampleElement(true, 0));
elements.add(exampleElement(true, 1));
@@ -274,8 +270,8 @@
helpTest(as, getSymbolMap());
}
- public void testVisitAllInGroupSymbol() {
- AllInGroupSymbol aigs = new AllInGroupSymbol("OLDG0.*"); //$NON-NLS-1$
+ public void testVisitMultipleElementSymbol() {
+ MultipleElementSymbol aigs = new MultipleElementSymbol("OLDG0.*"); //$NON-NLS-1$
ArrayList elements = new ArrayList();
elements.add(exampleElement(true, 0));
elements.add(exampleElement(true, 1));
@@ -299,9 +295,9 @@
helpTest(f2, getSymbolMap());
}
- public void testMapAllInGroupSymbolName() {
- AllInGroupSymbol aigs = new AllInGroupSymbol("OLDG0.*"); //$NON-NLS-1$
- ArrayList elements = new ArrayList();
+ public void testMapMultipleElementSymbolName() {
+ MultipleElementSymbol aigs = new MultipleElementSymbol("OLDG0"); //$NON-NLS-1$
+ ArrayList<ElementSymbol> elements = new ArrayList<ElementSymbol>();
elements.add(exampleElement(true, 0));
elements.add(exampleElement(true, 1));
aigs.setElementSymbols(elements);
@@ -311,7 +307,7 @@
DeepPreOrderNavigator.doVisit(aigs, visitor);
// Check name of all in group symbol
- assertEquals("AllInGroupSymbol name did not get mapped correctly: ", "NEWG0.*", aigs.getName()); //$NON-NLS-1$ //$NON-NLS-2$
+ assertEquals("MultipleElementSymbol name did not get mapped correctly: ", "NEWG0.*", aigs.toString()); //$NON-NLS-1$ //$NON-NLS-2$
}
public void testExecName() {
Modified: trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java 2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java 2011-07-21 19:28:44 UTC (rev 3323)
@@ -1859,5 +1859,21 @@
@Test public void testNestedAgg() {
helpValidate("SELECT min(g1.e1) filter (where max(e2) = 1) from pm1.g1", new String[] {"MAX(e2)"}, RealMetadataFactory.example1Cached());
}
+
+ @Test public void testWindowFunction() {
+ helpValidate("SELECT e1 from pm1.g1 where row_number() over (order by e2) = 1", new String[] {"ROW_NUMBER() OVER (ORDER BY e2)"}, RealMetadataFactory.example1Cached());
+ }
+
+ @Test public void testWindowFunction1() {
+ helpValidate("SELECT 1 from pm1.g1 having row_number() over (order by e2) = 1", new String[] {"e2", "ROW_NUMBER() OVER (ORDER BY e2)"}, RealMetadataFactory.example1Cached());
+ }
+
+ @Test public void testWindowFunctionWithoutOrdering() {
+ helpValidate("SELECT row_number() over () from pm1.g1", new String[] {"ROW_NUMBER() OVER ()"}, RealMetadataFactory.example1Cached());
+ }
+ @Test public void testWindowFunctionWithNestedOrdering() {
+ helpValidate("SELECT xmlagg(xmlelement(name x, e1) order by e2) over () from pm1.g1", new String[] {"XMLAGG(XMLELEMENT(NAME x, e1) ORDER BY e2)"}, RealMetadataFactory.example1Cached());
+ }
+
}
More information about the teiid-commits
mailing list