diff --git ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/Vectorizer.java ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/Vectorizer.java index 1186bd4..244dcf1 100644 --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/Vectorizer.java +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/Vectorizer.java @@ -27,6 +27,8 @@ import java.util.Collection; import java.util.HashMap; import java.util.HashSet; +import java.util.IdentityHashMap; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -354,6 +356,8 @@ private BaseWork currentBaseWork; private Operator currentOperator; private Collection> vectorizedInputFormatExcludes; + private Map, Set, Operator>>> delayedFixups = + new IdentityHashMap, Set, Operator>>>(); public void testSetCurrentBaseWork(BaseWork testBaseWork) { currentBaseWork = testBaseWork; @@ -749,6 +753,8 @@ public VectorDesc getVectorDesc() { List> currentVectorParentList = newOperatorList(); currentVectorParentList.add(dummyVectorOperator); + delayedFixups.clear(); + do { List> nextParentList = newOperatorList(); List> nextVectorParentList= newOperatorList(); @@ -778,6 +784,8 @@ public VectorDesc getVectorDesc() { currentVectorParentList = nextVectorParentList; } while (currentParentList.size() > 0); + runDelayedFixups(); + return dummyVectorOperator; } @@ -844,12 +852,44 @@ private void fixupNewVectorChild( if (childMultipleParent == parent) { childMultipleParents.set(i, vectorParent); } else { - fixupOtherParent(childMultipleParent, child, vectorChild); + queueDelayedFixup(childMultipleParent, child, vectorChild); } } vectorChild.setParentOperators(childMultipleParents); } + /* + * The fix up is delayed so that the parent operators aren't modified until the entire operator + * tree has been vectorized. + */ + private void queueDelayedFixup(Operator parent, + Operator child, Operator vectorChild) { + if (delayedFixups.get(parent) == null) { + HashSet, Operator>> value = + new HashSet, Operator>>(1); + delayedFixups.put(parent, value); + } + delayedFixups.get(parent).add( + new ImmutablePair, Operator>( + child, vectorChild)); + } + + private void runDelayedFixups() { + for (Entry, Set, Operator>>> delayed + : delayedFixups.entrySet()) { + Operator key = delayed.getKey(); + Set, Operator>> value = + delayed.getValue(); + for (Iterator, Operator>> iterator = + value.iterator(); iterator.hasNext();) { + ImmutablePair, Operator> swap = + iterator.next(); + fixupOtherParent(key, swap.getLeft(), swap.getRight()); + } + } + delayedFixups.clear(); + } + private void fixupOtherParent( Operator childMultipleParent, Operator child,