[teiid-commits] teiid SVN: r1899 - trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules.
teiid-commits at lists.jboss.org
teiid-commits at lists.jboss.org
Thu Mar 4 00:02:10 EST 2010
Author: shawkins
Date: 2010-03-04 00:02:09 -0500 (Thu, 04 Mar 2010)
New Revision: 1899
Modified:
trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleMergeVirtual.java
Log:
TEIID-989 adding more aggressive view removal logic with an unrelated order by in the upper frame
Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleMergeVirtual.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleMergeVirtual.java 2010-03-04 03:27:35 UTC (rev 1898)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleMergeVirtual.java 2010-03-04 05:02:09 UTC (rev 1899)
@@ -50,6 +50,7 @@
import com.metamatrix.query.sql.symbol.GroupSymbol;
import com.metamatrix.query.sql.symbol.SingleElementSymbol;
import com.metamatrix.query.sql.util.SymbolMap;
+import com.metamatrix.query.sql.visitor.ElementCollectorVisitor;
import com.metamatrix.query.sql.visitor.FunctionCollectorVisitor;
import com.metamatrix.query.sql.visitor.GroupsUsedByElementsVisitor;
import com.metamatrix.query.sql.visitor.ValueIteratorProviderCollectorVisitor;
@@ -105,14 +106,33 @@
return root;
}
+ SymbolMap symbolMap = (SymbolMap)frame.getProperty(NodeConstants.Info.SYMBOL_MAP);
+
PlanNode sortNode = NodeEditor.findParent(parentProject, NodeConstants.Types.SORT, NodeConstants.Types.SOURCE);
if (sortNode != null && sortNode.hasBooleanProperty(NodeConstants.Info.UNRELATED_SORT)) {
- // the lower group cannot contain DUP_REMOVE, GROUP, UNION
- // or a projected expression for an unrelated sort column (until SQL 2003 sorts are supported).
-
- // for now though the simplification is to just not remove the inline view.
- return root;
+ OrderBy sortOrder = (OrderBy)sortNode.getProperty(NodeConstants.Info.SORT_ORDER);
+ boolean unrelated = false;
+ for (OrderByItem item : sortOrder.getOrderByItems()) {
+ if (!item.isUnrelated()) {
+ continue;
+ }
+ Collection<ElementSymbol> elements = ElementCollectorVisitor.getElements(item.getSymbol(), true);
+ for (ElementSymbol elementSymbol : elements) {
+ if (virtualGroup.equals(elementSymbol.getGroupSymbol())) {
+ unrelated = true;
+ if (!(symbolMap.getMappedExpression(elementSymbol) instanceof ElementSymbol)) {
+ return root;
+ }
+ }
+ }
+ }
+ // the lower frame cannot contain DUP_REMOVE, GROUP, UNION if unrelated
+ if (unrelated && NodeEditor.findNodePreOrder(frame, NodeConstants.Types.DUP_REMOVE, NodeConstants.Types.PROJECT) != null
+ || NodeEditor.findNodePreOrder(frame, NodeConstants.Types.SET_OP, NodeConstants.Types.SOURCE) != null
+ || NodeEditor.findNodePreOrder(frame, NodeConstants.Types.GROUP, NodeConstants.Types.SOURCE) != null) {
+ return root;
+ }
}
//try to remove the virtual layer if we are only doing a simple projection in the following cases:
@@ -138,8 +158,6 @@
groupCols = (List<SingleElementSymbol>)parentGroup.getProperty(NodeConstants.Info.GROUP_COLS);
}
- SymbolMap symbolMap = (SymbolMap)frame.getProperty(NodeConstants.Info.SYMBOL_MAP);
-
if (!checkProjectedSymbols(projectNode, virtualGroup, parentJoin, groupCols, symbolMap, metadata)) {
return root;
}
More information about the teiid-commits
mailing list