You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pig.apache.org by rd...@apache.org on 2011/05/11 02:26:27 UTC

svn commit: r1101691 - in /pig/trunk: CHANGES.txt src/org/apache/pig/parser/PigMacro.java test/org/apache/pig/test/TestMacroExpansion.java

Author: rding
Date: Wed May 11 00:26:26 2011
New Revision: 1101691

URL: http://svn.apache.org/viewvc?rev=1101691&view=rev
Log:
PIG-2035: Macro expansion doesn't handle multiple expansions of same macro inside another macro

Modified:
    pig/trunk/CHANGES.txt
    pig/trunk/src/org/apache/pig/parser/PigMacro.java
    pig/trunk/test/org/apache/pig/test/TestMacroExpansion.java

Modified: pig/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/pig/trunk/CHANGES.txt?rev=1101691&r1=1101690&r2=1101691&view=diff
==============================================================================
--- pig/trunk/CHANGES.txt (original)
+++ pig/trunk/CHANGES.txt Wed May 11 00:26:26 2011
@@ -214,6 +214,8 @@ PIG-1696: Performance: Use System.arrayc
 
 BUG FIXES
 
+PIG-2035: Macro expansion doesn't handle multiple expansions of same macro inside another macro (rding)
+
 PIG-2030: Merged join/cogroup does not automatically ship loader (daijy)
 
 PIG-2052: Ship guava.jar to backend (daijy)

Modified: pig/trunk/src/org/apache/pig/parser/PigMacro.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/PigMacro.java?rev=1101691&r1=1101690&r2=1101691&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/PigMacro.java (original)
+++ pig/trunk/src/org/apache/pig/parser/PigMacro.java Wed May 11 00:26:26 2011
@@ -425,14 +425,17 @@ class PigMacro {
             throw new ParserException(msg);
         }
 
-        if (!macroStack.add(macro.name)) {
+        if (macroStack.contains(macro.name)) {
             String msg = getErrorMessage(file, t.getLine(),
                     "Cannot expand macro '" + mn + "'",
                       "Macro can't be defined circularly.");
             throw new ParserException(msg);
         }
         
-        macro.setStack(macroStack);
+        // set nested macro call stack
+        Set<String> newStack = new HashSet<String>(macroStack);
+        newStack.add(macro.name);
+        macro.setStack(newStack);
         
         // get return values
         int n = t.getChild(1).getChildCount();

Modified: pig/trunk/test/org/apache/pig/test/TestMacroExpansion.java
URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/test/TestMacroExpansion.java?rev=1101691&r1=1101690&r2=1101691&view=diff
==============================================================================
--- pig/trunk/test/org/apache/pig/test/TestMacroExpansion.java (original)
+++ pig/trunk/test/org/apache/pig/test/TestMacroExpansion.java Wed May 11 00:26:26 2011
@@ -1239,6 +1239,40 @@ public class TestMacroExpansion {
         verify(script, expected);
     }
     
+    @Test // PIG-2035
+    public void nestedMacrosTest() throws Exception {
+        String macro1 = "define test ( in, out, x ) returns void {\n" +
+            "a = load '$in' as (name, age, gpa);\n" +
+            "b = group a by gpa;\n" +
+            "c = foreach b generate group, COUNT(a.$x);\n" +
+            "store c into '$out';\n" +
+            "};\n";
+        
+        String macro2 = "define test2( in, out ) returns void {\n" +
+            "test( '$in', '$out', 'name' );\n" +
+            "test( '$in', '$out.1', 'age' );\n" +
+            "test( '$in', '$out.2', 'gpa' );\n" +
+            "};\n";
+        
+        String script = "test2('studenttab10k', 'myoutput');";
+        
+        String expected =
+            "macro_test2_macro_test_a_0_0 = load 'studenttab10k' as (name, age, gpa);\n" +
+            "macro_test2_macro_test_b_0_0 = group macro_test2_macro_test_a_0_0 by (gpa);\n" +
+            "macro_test2_macro_test_c_0_0 = foreach macro_test2_macro_test_b_0_0 generate group, COUNT(macro_test2_macro_test_a_0_0.(name));\n" +
+            "store macro_test2_macro_test_c_0_0 INTO 'myoutput';\n" +
+            "macro_test2_macro_test_a_1_0 = load 'studenttab10k' as (name, age, gpa);\n" +
+            "macro_test2_macro_test_b_1_0 = group macro_test2_macro_test_a_1_0 by (gpa);\n" +
+            "macro_test2_macro_test_c_1_0 = foreach macro_test2_macro_test_b_1_0 generate group, COUNT(macro_test2_macro_test_a_1_0.(age));\n" +
+            "store macro_test2_macro_test_c_1_0 INTO 'myoutput.1';\n" +
+            "macro_test2_macro_test_a_2_0 = load 'studenttab10k' as (name, age, gpa);\n" +
+            "macro_test2_macro_test_b_2_0 = group macro_test2_macro_test_a_2_0 by (gpa);\n" +
+            "macro_test2_macro_test_c_2_0 = foreach macro_test2_macro_test_b_2_0 generate group, COUNT(macro_test2_macro_test_a_2_0.(gpa));\n" +
+            "store macro_test2_macro_test_c_2_0 INTO 'myoutput.2';\n";
+            
+        verify(macro1 + macro2 + script, expected);
+    }
+    
     @Test
     public void sequenceMacrosTest() throws Exception {
         String macro1 = "define foreach_count(A, C) returns B {\n" +
@@ -2115,4 +2149,5 @@ public class TestMacroExpansion {
     private void validateFailure(String piglatin, String expectedErr) throws Throwable {
         validateFailure(piglatin, expectedErr, "Reason:");
     }
+    
 }