[teiid-commits] teiid SVN: r1889 - in trunk/engine/src: test/java/com/metamatrix/query/processor and 1 other directory.
teiid-commits at lists.jboss.org
teiid-commits at lists.jboss.org
Tue Mar 2 23:42:57 EST 2010
Author: shawkins
Date: 2010-03-02 23:42:56 -0500 (Tue, 02 Mar 2010)
New Revision: 1889
Modified:
trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleAssignOutputElements.java
trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleMergeVirtual.java
trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java
Log:
TEIID-989 expanding on the last fix to ensure that only source supporting unrelated seach will get the pushdown.
Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleAssignOutputElements.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleAssignOutputElements.java 2010-03-03 03:29:06 UTC (rev 1888)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleAssignOutputElements.java 2010-03-03 04:42:56 UTC (rev 1889)
@@ -38,6 +38,7 @@
import com.metamatrix.query.metadata.QueryMetadataInterface;
import com.metamatrix.query.metadata.SupportConstants;
import com.metamatrix.query.optimizer.capabilities.CapabilitiesFinder;
+import com.metamatrix.query.optimizer.capabilities.SourceCapabilities.Capability;
import com.metamatrix.query.optimizer.relational.OptimizerRule;
import com.metamatrix.query.optimizer.relational.RuleStack;
import com.metamatrix.query.optimizer.relational.plantree.NodeConstants;
@@ -160,7 +161,7 @@
assignOutputElements(root.getLastChild(), outputElements, metadata, capFinder, rules, analysisRecord, context);
break;
case NodeConstants.Types.SOURCE: {
- outputElements = (List<SingleElementSymbol>)determineSourceOutput(root, outputElements);
+ outputElements = (List<SingleElementSymbol>)determineSourceOutput(root, outputElements, metadata, capFinder);
root.setProperty(NodeConstants.Info.OUTPUT_COLS, outputElements);
List<SingleElementSymbol> childElements = filterVirtualElements(root, outputElements, metadata);
SymbolMap symbolMap = (SymbolMap)root.getProperty(NodeConstants.Info.SYMBOL_MAP);
@@ -237,9 +238,13 @@
* So, in this case filtering should not occur. In fact the output columns
* that were set on root above are filtered, but we actually want all the
* virtual elements - so just reset it and proceed as before
+ * @throws MetaMatrixComponentException
+ * @throws QueryMetadataException
*/
static List<? extends SingleElementSymbol> determineSourceOutput(PlanNode root,
- List<SingleElementSymbol> outputElements) {
+ List<SingleElementSymbol> outputElements,
+ QueryMetadataInterface metadata,
+ CapabilitiesFinder capFinder) throws QueryMetadataException, MetaMatrixComponentException {
PlanNode virtualRoot = root.getLastChild();
if(hasDupRemoval(virtualRoot)) {
@@ -247,7 +252,39 @@
SymbolMap symbolMap = (SymbolMap) root.getProperty(NodeConstants.Info.SYMBOL_MAP);
return symbolMap.getKeys();
}
- return outputElements;
+ PlanNode limit = NodeEditor.findNodePreOrder(root, NodeConstants.Types.TUPLE_LIMIT, NodeConstants.Types.PROJECT);
+ if (limit == null) {
+ return outputElements;
+ }
+ //reset the output elements to be the output columns + what's required by the sort
+ PlanNode sort = NodeEditor.findNodePreOrder(limit, NodeConstants.Types.SORT, NodeConstants.Types.PROJECT);
+ if (sort == null) {
+ return outputElements;
+ }
+ PlanNode access = NodeEditor.findParent(sort, NodeConstants.Types.ACCESS);
+ if (sort.hasBooleanProperty(NodeConstants.Info.UNRELATED_SORT) ||
+ (access != null && capFinder != null && CapabilitiesUtil.supports(Capability.QUERY_ORDERBY_UNRELATED, RuleRaiseAccess.getModelIDFromAccess(access, metadata), metadata, capFinder))) {
+ return outputElements;
+ }
+ OrderBy sortOrder = (OrderBy)sort.getProperty(NodeConstants.Info.SORT_ORDER);
+ List<SingleElementSymbol> topCols = FrameUtil.findTopCols(sort);
+
+ SymbolMap symbolMap = (SymbolMap)root.getProperty(NodeConstants.Info.SYMBOL_MAP);
+
+ List<ElementSymbol> symbolOrder = symbolMap.getKeys();
+
+ for (OrderByItem item : sortOrder.getOrderByItems()) {
+ final Expression expr = item.getSymbol();
+ int index = topCols.indexOf(expr);
+ if (index < 0) {
+ continue;
+ }
+ ElementSymbol symbol = symbolOrder.get(index);
+ if (!outputElements.contains(symbol)) {
+ outputElements.add(symbol);
+ }
+ }
+ return outputElements;
}
/**
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-03 03:29:06 UTC (rev 1888)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleMergeVirtual.java 2010-03-03 04:42:56 UTC (rev 1889)
@@ -78,7 +78,7 @@
static PlanNode doMerge(PlanNode frame,
PlanNode root,
- QueryMetadataInterface metadata) throws QueryPlannerException {
+ QueryMetadataInterface metadata) throws QueryPlannerException, QueryMetadataException, MetaMatrixComponentException {
GroupSymbol virtualGroup = frame.getGroups().iterator().next();
@@ -178,11 +178,13 @@
/**
* Removes source layers that only do a simple projection of the elements below.
+ * @throws MetaMatrixComponentException
+ * @throws QueryMetadataException
*/
private static PlanNode checkForSimpleProjection(PlanNode frame,
PlanNode root,
PlanNode parentProject,
- QueryMetadataInterface metadata) {
+ QueryMetadataInterface metadata) throws QueryMetadataException, MetaMatrixComponentException {
// check that the parent only performs projection
PlanNode nodeToCheck = parentProject.getFirstChild();
while (nodeToCheck != frame) {
@@ -200,7 +202,7 @@
return root;
}
- List<? extends SingleElementSymbol> requiredElements = getNecessaryOutput(frame);
+ List<? extends SingleElementSymbol> requiredElements = RuleAssignOutputElements.determineSourceOutput(frame, new ArrayList<SingleElementSymbol>(), metadata, null);
List<SingleElementSymbol> selectSymbols = (List<SingleElementSymbol>)parentProject.getProperty(NodeConstants.Info.PROJECT_COLS);
// check that it only performs simple projection and that all required symbols are projected
@@ -273,42 +275,6 @@
return root;
}
- private static List<? extends SingleElementSymbol> getNecessaryOutput(PlanNode root) {
- List<SingleElementSymbol> outputElements = new ArrayList<SingleElementSymbol>();
- List<? extends SingleElementSymbol> result = RuleAssignOutputElements.determineSourceOutput(root, outputElements);
- if (!result.isEmpty()) {
- return result;
- }
- PlanNode limit = NodeEditor.findNodePreOrder(root, NodeConstants.Types.TUPLE_LIMIT, NodeConstants.Types.PROJECT);
- if (limit == null) {
- return outputElements;
- }
- //reset the output elements to be the output columns + what's required by the sort
- PlanNode sort = NodeEditor.findNodePreOrder(limit, NodeConstants.Types.SORT, NodeConstants.Types.PROJECT);
- if (sort == null) {
- return outputElements;
- }
- OrderBy sortOrder = (OrderBy)sort.getProperty(NodeConstants.Info.SORT_ORDER);
- List<SingleElementSymbol> topCols = FrameUtil.findTopCols(sort);
-
- SymbolMap symbolMap = (SymbolMap)root.getProperty(NodeConstants.Info.SYMBOL_MAP);
-
- List<ElementSymbol> symbolOrder = symbolMap.getKeys();
-
- for (OrderByItem item : sortOrder.getOrderByItems()) {
- final Expression expr = item.getSymbol();
- int index = topCols.indexOf(expr);
- if (index < 0) {
- continue;
- }
- ElementSymbol symbol = symbolOrder.get(index);
- if (!outputElements.contains(symbol)) {
- outputElements.add(symbol);
- }
- }
- return outputElements;
- }
-
/**
* Check to ensure that we are not projecting a subquery or null dependent expressions
*/
Modified: trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java 2010-03-03 03:29:06 UTC (rev 1888)
+++ trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java 2010-03-03 04:42:56 UTC (rev 1889)
@@ -6990,7 +6990,27 @@
sampleData1(manager);
helpProcess(plan, manager, expected);
}
+
+ @Test public void testSortWithLimit4() {
+ String sql = "select c from (select pm1.g1.e1 a, pm1.g1.e2 b, pm1.g1.e3 c from pm1.g1 order by b limit 1) x"; //$NON-NLS-1$
+
+ FakeMetadataFacade metadata = FakeMetadataFactory.example1Cached();
+
+ BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
+ caps.setCapabilitySupport(Capability.QUERY_ORDERBY_UNRELATED, false);
+
+ ProcessorPlan plan = helpGetPlan(helpParse(sql), metadata, new DefaultCapabilitiesFinder(caps));
+
+ List[] expected = new List[] {
+ Arrays.asList(new Object[] { Boolean.FALSE }),
+ };
+ FakeDataManager manager = new FakeDataManager();
+ sampleData1(manager);
+ helpProcess(plan, manager, expected);
+ assertEquals("SELECT g_0.e3 AS c_0, g_0.e2 AS c_1 FROM pm1.g1 AS g_0 ORDER BY c_1", manager.getQueries().iterator().next()); //$NON-NLS-1$
+ }
+
@Test public void testCountWithHaving() {
String sql = "select e1, count(*) from pm1.g1 group by e1 having count(*) > 1"; //$NON-NLS-1$
More information about the teiid-commits
mailing list