You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pig.apache.org by ch...@apache.org on 2013/07/09 21:16:21 UTC

svn commit: r1501471 - in /pig/trunk: CHANGES.txt src/org/apache/pig/parser/LogicalPlanGenerator.g test/org/apache/pig/test/TestCase.java

Author: cheolsoo
Date: Tue Jul  9 19:16:21 2013
New Revision: 1501471

URL: http://svn.apache.org/r1501471
Log:
PIG-3375: CASE does not preserve the order of when branches (cheolsoo)

Modified:
    pig/trunk/CHANGES.txt
    pig/trunk/src/org/apache/pig/parser/LogicalPlanGenerator.g
    pig/trunk/test/org/apache/pig/test/TestCase.java

Modified: pig/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/pig/trunk/CHANGES.txt?rev=1501471&r1=1501470&r2=1501471&view=diff
==============================================================================
--- pig/trunk/CHANGES.txt (original)
+++ pig/trunk/CHANGES.txt Tue Jul  9 19:16:21 2013
@@ -200,6 +200,8 @@ PIG-3013: BinInterSedes improve chararra
 
 BUG FIXES
 
+PIG-3375: CASE does not preserve the order of when branches (cheolsoo)
+
 PIG-3364: Case expression fails with an even number of when branches (cheolsoo)
 
 PIG-3354: UDF example does not handle nulls (patc888 via daijy)

Modified: pig/trunk/src/org/apache/pig/parser/LogicalPlanGenerator.g
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/LogicalPlanGenerator.g?rev=1501471&r1=1501470&r2=1501471&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/LogicalPlanGenerator.g (original)
+++ pig/trunk/src/org/apache/pig/parser/LogicalPlanGenerator.g Tue Jul  9 19:16:21 2013
@@ -99,6 +99,7 @@ import org.apache.pig.data.DataBag;
 import org.apache.pig.data.DataType;
 import org.apache.pig.data.Tuple;
 import java.util.Arrays;
+import java.util.Collections;
 import java.math.BigInteger;
 import java.math.BigDecimal;
 }
@@ -1103,8 +1104,10 @@ case_cond[LogicalExpressionPlan plan] re
         // Convert CASE tree to nested bincond expressions. Please also see
         // QueryParser.g for how CASE tree is constructed from case statement.
         boolean hasElse = exprs.size() != conds.size();
-        LogicalExpression elseExpr = hasElse ? exprs.get(exprs.size() - 1)
+        LogicalExpression elseExpr = hasElse ? exprs.remove(exprs.size()-1)
                                              : new ConstantExpression($plan, null);
+        Collections.reverse(exprs);
+        Collections.reverse(conds);
         int numWhenBranches = conds.size();
         BinCondExpression prevBinCondExpr = null;
         BinCondExpression currBinCondExpr = null;

Modified: pig/trunk/test/org/apache/pig/test/TestCase.java
URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/test/TestCase.java?rev=1501471&r1=1501470&r2=1501471&view=diff
==============================================================================
--- pig/trunk/test/org/apache/pig/test/TestCase.java (original)
+++ pig/trunk/test/org/apache/pig/test/TestCase.java Tue Jul  9 19:16:21 2013
@@ -198,6 +198,46 @@ public class TestCase {
     }
 
     /**
+     * Verify that CASE statement preserves the order of conditions.
+     * @throws Exception
+     */
+    @Test
+    public void testOrderOfConditions() throws Exception {
+        PigServer pigServer = new PigServer(ExecType.LOCAL);
+        Data data = resetData(pigServer);
+
+        data.set("foo",
+                tuple(1),
+                tuple(5),
+                tuple(10),
+                tuple(15),
+                tuple(20),
+                tuple(25),
+                tuple(30)
+                );
+
+        pigServer.registerQuery("A = LOAD 'foo' USING mock.Storage() AS (i:int);");
+        pigServer.registerQuery("B = FOREACH A GENERATE i, (" +
+                "  CASE " +
+                "    WHEN i > 20 THEN '> 20'" + // Conditions are not mutually exclusive
+                "    WHEN i > 10 THEN '> 10'" +
+                "    ELSE             '> 0'" +
+                "  END" +
+                ");");
+        pigServer.registerQuery("STORE B INTO 'bar' USING mock.Storage();");
+
+        List<Tuple> out = data.get("bar");
+        assertEquals(7, out.size());
+        assertEquals(tuple(1,"> 0"),   out.get(0));
+        assertEquals(tuple(5,"> 0"),   out.get(1));
+        assertEquals(tuple(10,"> 0"),  out.get(2));
+        assertEquals(tuple(15,"> 10"), out.get(3));
+        assertEquals(tuple(20,"> 10"), out.get(4));
+        assertEquals(tuple(25,"> 20"), out.get(5));
+        assertEquals(tuple(30,"> 20"), out.get(6));
+    }
+
+    /**
      * Verify that FrontendException is thrown when case expression is missing,
      * and when branches do not contain conditional expressions.
      * @throws Exception