[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