Author: shawkins
Date: 2010-02-10 15:37:15 -0500 (Wed, 10 Feb 2010)
New Revision: 1817
Modified:
trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RulePushSelectCriteria.java
trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java
Log:
TEIID-949 adding a fix for pushing criteria past implicit groupings
Modified:
trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RulePushSelectCriteria.java
===================================================================
---
trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RulePushSelectCriteria.java 2010-02-10
20:15:55 UTC (rev 1816)
+++
trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RulePushSelectCriteria.java 2010-02-10
20:37:15 UTC (rev 1817)
@@ -140,6 +140,12 @@
CapabilitiesFinder capFinder, PlanNode critNode)
throws MetaMatrixComponentException, QueryMetadataException {
if (critNode.getGroups().isEmpty()) {
+ //check to see if pushing may impact cardinality
+ PlanNode groupNode = NodeEditor.findNodePreOrder(critNode,
NodeConstants.Types.GROUP, NodeConstants.Types.SOURCE);
+ if (groupNode != null &&
!groupNode.hasCollectionProperty(NodeConstants.Info.GROUP_COLS)) {
+ return groupNode;
+ }
+
Object modelId = getSubqueryModelId(metadata, capFinder, critNode);
if (modelId != null) {
for (PlanNode node : NodeEditor.findAllNodes(critNode, NodeConstants.Types.SOURCE))
{
Modified: trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java
===================================================================
---
trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java 2010-02-10
20:15:55 UTC (rev 1816)
+++
trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java 2010-02-10
20:37:15 UTC (rev 1817)
@@ -7558,6 +7558,20 @@
helpProcess(plan, dataManager, expected);
}
+
+ @Test public void testImplicitAggregateWithInlineView() {
+ String sql = "SELECT * FROM (SELECT b.count, enterprise_id FROM (SELECT
COUNT(*), 2 AS enterprise_id FROM (SELECT 'A Name' AS Name, 1 AS enterprise_id) c
) b ) a WHERE enterprise_id = 1"; //$NON-NLS-1$
+
+ List[] expected = new List[] {};
+
+ FakeDataManager dataManager = new FakeDataManager();
+ sampleData1(dataManager);
+
+ ProcessorPlan plan = helpGetPlan(helpParse(sql),
FakeMetadataFactory.example1Cached());
+
+ helpProcess(plan, dataManager, expected);
+ }
+
private static final boolean DEBUG = false;
}
Show replies by date