You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pig.apache.org by ol...@apache.org on 2008/09/13 18:52:06 UTC

svn commit: r694985 - in /incubator/pig/branches/types: CHANGES.txt src/org/apache/pig/impl/logicalLayer/optimizer/ImplicitSplitInserter.java

Author: olga
Date: Sat Sep 13 09:52:05 2008
New Revision: 694985

URL: http://svn.apache.org/viewvc?rev=694985&view=rev
Log:
PIG-429: Self join wth implicit split has the join output in wrong order

Modified:
    incubator/pig/branches/types/CHANGES.txt
    incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/optimizer/ImplicitSplitInserter.java

Modified: incubator/pig/branches/types/CHANGES.txt
URL: http://svn.apache.org/viewvc/incubator/pig/branches/types/CHANGES.txt?rev=694985&r1=694984&r2=694985&view=diff
==============================================================================
--- incubator/pig/branches/types/CHANGES.txt (original)
+++ incubator/pig/branches/types/CHANGES.txt Sat Sep 13 09:52:05 2008
@@ -196,3 +196,6 @@
     correctly (pradeepk vi olgan)
 
     PIG-421: error with complex nested plan (sms via olgan)
+    
+    PIG-429: Self join wth implicit split has the join output in wrong order
+    (pradeepk via olgan)

Modified: incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/optimizer/ImplicitSplitInserter.java
URL: http://svn.apache.org/viewvc/incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/optimizer/ImplicitSplitInserter.java?rev=694985&r1=694984&r2=694985&view=diff
==============================================================================
--- incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/optimizer/ImplicitSplitInserter.java (original)
+++ incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/optimizer/ImplicitSplitInserter.java Sat Sep 13 09:52:05 2008
@@ -23,6 +23,7 @@
 
 import org.apache.pig.data.DataType;
 import org.apache.pig.impl.logicalLayer.LOConst;
+import org.apache.pig.impl.logicalLayer.LOPrinter;
 import org.apache.pig.impl.logicalLayer.LOSplitOutput;
 import org.apache.pig.impl.logicalLayer.LogicalOperator;
 import org.apache.pig.impl.logicalLayer.LogicalPlan;
@@ -61,15 +62,30 @@
         try {
             mPlan.add(splitOp);
             
-            
-            // Find all the successors and disconnect them.  Keep our own copy
+            // Find all the successors and connect appropriately with split
+            // and splitoutput operators.  Keep our own copy
             // of the list, as we're changing the graph by doing these calls 
             // and that will change the list of predecessors.
             List<LogicalOperator> succs = 
                 new ArrayList<LogicalOperator>(mPlan.getSuccessors(nodes.get(0)));
             int index = -1;
+            boolean nodeConnectedToSplit = false;
             for (LogicalOperator succ : succs) {
-                mPlan.disconnect(nodes.get(0), succ);
+                if(!nodeConnectedToSplit) {
+                    mPlan.insertBetween(nodes.get(0), splitOp, succ);
+                    // nodes.get(0) should be connected to Split (only once) and
+                    // split -> splitoutput -> successor - this is for the first successor  
+                    // for the next successor we just want to connect in the order 
+                    // split -> splitoutput -> successor without involving nodes.get(0)
+                    // in the above call we have connected
+                    // nodes.get(0) to split (we will set the flag
+                    // to true later in this loop iteration). Hence in subsequent 
+                    // iterations we will only disconnect nodes.get(0) from its
+                    // successor and connect the split-splitoutput chain
+                    // to the successor
+                } else {
+                    mPlan.disconnect(nodes.get(0), succ);                    
+                }
                 LogicalPlan condPlan = new LogicalPlan();
                 LOConst cnst = new LOConst(mPlan, new OperatorKey(scope, 
                         idGen.getNextNodeId(scope)), new Boolean(true));
@@ -79,12 +95,22 @@
                         new OperatorKey(scope, idGen.getNextNodeId(scope)), ++index, condPlan);
                 splitOp.addOutput(splitOutput);
                 mPlan.add(splitOutput);
-                mPlan.connect(splitOp, splitOutput);
-                mPlan.connect(splitOutput, succ);
+                
+                if(!nodeConnectedToSplit) {
+                    // node.get(0) should be connected to Split (only once) and
+                    // split to splitoutput to successor - this is for the first successor  
+                    // for the next successor we just want to connect in the order 
+                    // split - splitoutput - successor.
+                    // the call below is in the first successor case
+                    mPlan.insertBetween(splitOp, splitOutput, succ);    
+                    nodeConnectedToSplit = true;
+                } else {
+                    mPlan.connect(splitOp, splitOutput);
+                    mPlan.connect(splitOutput, succ);
+                }
                 // Patch up the contained plans of succ
                 fixUpContainedPlans(nodes.get(0), splitOutput, succ, null);
             }
-            mPlan.connect(nodes.get(0), splitOp);
         } catch (Exception e) {
             throw new OptimizerException(e);
         }