[teiid-commits] teiid SVN: r4615 - branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Tue Nov 12 09:43:16 EST 2013


Author: jolee
Date: 2013-11-12 09:43:16 -0500 (Tue, 12 Nov 2013)
New Revision: 4615

Modified:
   branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushSelectCriteria.java
Log:
BZ1029532: determine if transitive condition is needed

Modified: branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushSelectCriteria.java
===================================================================
--- branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushSelectCriteria.java	2013-11-12 14:17:16 UTC (rev 4614)
+++ branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushSelectCriteria.java	2013-11-12 14:43:16 UTC (rev 4615)
@@ -40,11 +40,13 @@
 import org.teiid.query.optimizer.relational.OptimizerRule;
 import org.teiid.query.optimizer.relational.RuleStack;
 import org.teiid.query.optimizer.relational.plantree.NodeConstants;
+import org.teiid.query.optimizer.relational.plantree.NodeConstants.Info;
 import org.teiid.query.optimizer.relational.plantree.NodeEditor;
 import org.teiid.query.optimizer.relational.plantree.NodeFactory;
 import org.teiid.query.optimizer.relational.plantree.PlanNode;
-import org.teiid.query.optimizer.relational.plantree.NodeConstants.Info;
 import org.teiid.query.resolver.util.AccessPattern;
+import org.teiid.query.sql.LanguageObject;
+import org.teiid.query.sql.lang.CompareCriteria;
 import org.teiid.query.sql.lang.CompoundCriteria;
 import org.teiid.query.sql.lang.Criteria;
 import org.teiid.query.sql.lang.JoinType;
@@ -333,6 +335,29 @@
                     if (critNode.hasBooleanProperty(NodeConstants.Info.IS_DEPENDENT_SET) 
                     		&& NodeEditor.findNodePreOrder(currentNode.getFirstChild(), NodeConstants.Types.GROUP, NodeConstants.Types.SOURCE) == null) {
                         markDependent(critNode, currentNode);
+                        
+                        //if the source does not support array comparison and we have a dependent join, then we need to check
+                        //if the transitive condition is needed.
+                        Collection<ElementSymbol> elements = ElementCollectorVisitor.getElements((LanguageObject)critNode.getProperty(Info.SELECT_CRITERIA), true);
+                        for (PlanNode joinNode : NodeEditor.findAllNodes(currentNode, NodeConstants.Types.JOIN, NodeConstants.Types.SOURCE)) {
+                        	List<Criteria> joinCriteria = (List<Criteria>) joinNode.getProperty(Info.JOIN_CRITERIA);
+                            if (joinCriteria == null) {
+                            	continue;
+                            }
+                            for (Criteria crit : joinCriteria) {
+                            	if (!(crit instanceof CompareCriteria)) {
+                            		continue;
+                            	}
+                        		CompareCriteria cc = (CompareCriteria)crit;
+                        		if (!cc.isOptional()) {
+                        			continue;
+                        		}
+                        		if (!Collections.disjoint(elements, ElementCollectorVisitor.getElements(cc, false))) {
+                        			cc.setOptional(false);
+                        		}
+                            }
+                        }
+                        
                         return currentNode.getFirstChild();
                     } 
 				} catch(QueryMetadataException e) {



More information about the teiid-commits mailing list