# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#  http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

###############################################################################
# Nightly tests for pig.
#
# Author:  Alan F. Gates (gates@)
# $Header:$
#

#use Yahoo::Miners::Test::PigSetup;

#PigSetup::setup();

#my $me = `whoami`;
#chomp $me;

$cfg = {
  'driver' => 'Pig',

  'groups' => [
    {
      'name' => 'Macro_DefinitionAndInline',
      'tests' => [
        {
          # simple macro, no args
          'num' => 1,
          'pig' => q#define simple_macro() returns void {
                         a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                         b = foreach a generate age, name;
                         store b into ':OUTPATH:';
                     }

                     simple_macro();#,
          'verify_pig_script' => q#a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                   b = foreach a generate age, name;
                                   store b into ':OUTPATH:';#,
        },{
          # input args, no return
          'num' => 2,
          'pig' => q#define simple_macro(loadfile) returns void {
                         a = load '$loadfile' as (name, age, gpa);
                         b = foreach a generate age, name;
                         store b into ':OUTPATH:';
                     }

                     simple_macro(':INPATH:/singlefile/studenttab10k');#,
          'verify_pig_script' => q#a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                   b = foreach a generate age, name;
                                   store b into ':OUTPATH:';#,
        },{
          # input args, return value
          'num' => 3,
          'pig' => q#define simple_macro(loadfile) returns b {
                         a = load '$loadfile' as (name, age, gpa);
                         $b = foreach a generate age, name;
                     }

                     x = simple_macro(':INPATH:/singlefile/studenttab10k');
                     store x into ':OUTPATH:';#,
          'verify_pig_script' => q#a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                   b = foreach a generate age, name;
                                   store b into ':OUTPATH:';#,
        },
        {
          # input args, filter on double and int, return value
          'num' => 4,
          'pig' => q#define simple_macro(in_relation, min_gpa, max_age) returns c {
                         b = filter $in_relation by gpa >= $min_gpa and age <= $max_age;
                         $c = foreach b generate age, name;
                     }

                     a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                     x = simple_macro(a, '3.0', '40');
                     store x into ':OUTPATH:';#,
          'verify_pig_script' => q#a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                   b = filter a by gpa >= 3.0 and age <= 40;
                                   c = foreach b generate age, name;
                                   store c into ':OUTPATH:';#,
        },
        {
          #Definition multiple input, no output, multiple returns value    
          #x = with multiple input, no output, multiple returns value    
          #Query based on FilterEq from nightly.conf
          'num' => 5, 
          'pig' => q\define test (in1, in2) returns r1, r2 {
                          a = load '$in1' using PigStorage() as (name, age, gpa);
                          $r1 = filter a by (age >= 50 or name > 'fred') and (gpa <= 3.0 or name >= 'bob');
                          b = load '$in2' using PigStorage() as (name:chararray, age:int, registration, contributions:double);
                          $r2 = filter b by name matches 'f.ed' and (chararray)registration matches 'd.m';
                      }

                      x1, x2 = test(':INPATH:/singlefile/studenttab10k', ':INPATH:/singlefile/votertab10k');

                      store x1 into ':OUTPATH:.1' using PigStorage;
                      store x2 into ':OUTPATH:.2' using PigStorage;\,


          'verify_pig_script' => q\a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                   a1 = filter a by (age >= 50 or name > 'fred') and (gpa <= 3.0 or name >= 'bob');
                                   store a1 into ':OUTPATH:.1' using PigStorage;
                                   b = load ':INPATH:/singlefile/votertab10k' using PigStorage() as (name:chararray, age:int, registration, contributions:double);
                                   b2 = filter b by name matches 'f.ed' and (chararray)registration matches 'd.m';
                                   store b2 into ':OUTPATH:.2' using PigStorage;\,
          'floatpostprocess' => 1,
          'delimiter' => '  ',
        },
        {
          # use positional parameters inside macro
          'num' => 6,
          'pig' => q#define simple_macro(in_relation, min_gpa, max_age) returns c {
                         b = filter $in_relation by $2 >= $min_gpa and $1 <= $max_age;
                         $c = foreach b generate age, name;
                     }

                     a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                     x = simple_macro(a, '3.0', '40');
                     store x into ':OUTPATH:';#,
          'verify_pig_script' => q#a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                   b = filter a by gpa >= 3.0 and age <= 40;
                                   c = foreach b generate age, name;
                                   store c into ':OUTPATH:';#,
        },
        {
          # Test nested macros
          'num' => 7,
          'pig' => q\define sum_it(in, relation, scol) returns d {
                          $d = foreach $in generate group, SUM($relation.$scol);
                      }

                      define group_it(in_relation, group_key, sum_col) returns c {
                          b = group $in_relation by $group_key ;
                          $c = sum_it(b, $in_relation, $sum_col);
                      }

                      a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                      x = group_it(a, 'name', 'age');
                      store x into ':OUTPATH:';\,
          'verify_pig_script' => q#a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                   b = group a by name;
                                   c = foreach b generate group, SUM(a.age);
                                   store c into ':OUTPATH:';#,
        },
        {
          # single macro definition invoked multiple times
          'num' => 8,
          'pig' => q#define simple_macro(in_relation, min_gpa, max_age) returns c {
                         b = filter $in_relation by gpa >= $min_gpa and age <= $max_age;
                         $c = foreach b generate age, name;
                     }

                     a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                     x = simple_macro(a, '3.0', '40');
                     store x into ':OUTPATH:.1';

                     z = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                     y = simple_macro(a, '2.0', '50');
                     store y into ':OUTPATH:.2';#,

          'verify_pig_script' => q#a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                   b = filter a by gpa >= 3.0 and age <= 40;
                                   c = foreach b generate age, name;
                                   store c into ':OUTPATH:.1';

                                   d = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                   e = filter d by gpa >= 2.0 and age <= 50;
                                   f = foreach e generate age, name;
                                   store f into ':OUTPATH:.2';#,
        },
        {
          # macro arg used as function arg
          'num' => 9,
          'pig' => q#define simple_macro(loadfile, sep) returns b {
                         a = load '$loadfile' using PigStorage('$sep') as (name, age, gpa);
                         $b = foreach a generate age, name;
                     }

                     x = simple_macro(':INPATH:/singlefile/studentcolon10k', ':');
                     store x into ':OUTPATH:';#,
          'verify_pig_script' => q#a = load ':INPATH:/singlefile/studentcolon10k' using PigStorage(':') as (name, age, gpa);
                                   b = foreach a generate age, name;
                                   store b into ':OUTPATH:';#,
        },
        {
          # Multiple returns via split in the data flow
          'num' => 10, 
          'pig' => q\define test (in1) returns r1, r2 {
                          a = load '$in1' using PigStorage() as (name, age, gpa);
                          $r1 = filter a by (age >= 50 or name > 'fred') and (gpa <= 3.0 or name >= 'bob');
                          $r2 = filter a by name > 'fred';
                      }

                      x1, x2 = test(':INPATH:/singlefile/studenttab10k');

                      store x1 into ':OUTPATH:.1' using PigStorage;
                      store x2 into ':OUTPATH:.2' using PigStorage;\,


          'verify_pig_script' => q\a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                   a1 = filter a by (age >= 50 or name > 'fred') and (gpa <= 3.0 or name >= 'bob');
                                   store a1 into ':OUTPATH:.1' using PigStorage;
                                   a2 = filter a by name > 'fred';
                                   store a2 into ':OUTPATH:.2' using PigStorage;\,
          'floatpostprocess' => 1,
          'delimiter' => '  ',
        },
        {
          # parameter substitution at the top level
          'num' => 11,
          'pig_params' => ['-p', qq(loadfile='singlefile/studenttab10k')],
          'pig' => q#define simple_macro(in_relation, min_gpa, max_age) returns c {
                         b = filter $in_relation by gpa >= $min_gpa and age <= $max_age;
                         $c = foreach b generate age, name;
                     }

                     a = load ':INPATH:/$loadfile' as (name, age, gpa);
                     x = simple_macro(a, '3.0', '40');
                     store x into ':OUTPATH:';#,
          'verify_pig_script' => q#a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                   b = filter a by gpa >= 3.0 and age <= 40;
                                   c = foreach b generate age, name;
                                   store c into ':OUTPATH:';#,
        }
      ]
    },
    {
      'name' => 'Macro_Scope',
      'tests' => [
        {
          # re-use of variable in macro and global scope
          'num' => 1,
          'pig' => q#define simple_macro(in_relation, min_gpa, max_age) returns b {
                         $b = filter $in_relation by $2 >= $min_gpa and $1 <= $max_age;
                     }

                     a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                     x = simple_macro(a, '3.0', '40');
                     b = foreach x generate age, name;
                     store b into ':OUTPATH:';#,
          'verify_pig_script' => q#a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                   b = filter a by gpa >= 3.0 and age <= 40;
                                   c = foreach b generate age, name;
                                   store c into ':OUTPATH:';#,
        },
        {
          #Definition where there is a name collision between parameters in parent/child macro
          'num' => 2,
          'pig' => q\define sum_it(in_relation, relation, sum_col) returns c {
                          b = foreach $in_relation generate group, SUM($relation.$sum_col);
                          $c = order b by $1;
                      }

                      define group_it(in_relation, group_key, sum_col) returns c {
                          b = group $in_relation by $group_key ;
                          $c = sum_it(b, $in_relation, $sum_col);
                      }

                      a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                      x = group_it(a, name, age);
                      store x into ':OUTPATH:';\,
          'verify_pig_script' => q#a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                   b = group a by name;
                                   c = foreach b generate group, SUM(a.age);
                                   store c into ':OUTPATH:';#,
        },
        {
          #Definition where there is a name collision between macro and returns value in main pig script    
          'num' => 3,
          'pig' => q#define simple_macro(in_relation, min_gpa, max_age) returns c {
                         b = filter $in_relation by gpa >= $min_gpa and age <= $max_age;
                         $c = foreach b generate age, name;
                     }

                     a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                     c = simple_macro(a, '3.0', '40');
                     store c into ':OUTPATH:';#,
          'verify_pig_script' => q#a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                   b = filter a by gpa >= 3.0 and age <= 40;
                                   c = foreach b generate age, name;
                                   store c into ':OUTPATH:';#,
        } 
      ]
    },
    {
      'name' => 'Macro_Schema',
      'tests' => [
        {
          # macro that does not change the schema
          'num' => 1,
          'pig' => q\define test(in) returns a {
                         $a = filter $in by age > 30;
                     }

                     a = load ':INPATH:/singlefile/studenttab10k' as (name:chararray, age:int, gpa:double);
                     b = test(a);
                     describe b;\,
          'rc' => 0,
          'expected_out_regex'=> "b: {name: chararray,age: int,gpa: double}"
        },
        {
          # macro that does change the schema
          'num' => 2,
          'pig' => q\define test(in) returns a {
                         $a = foreach $in generate name;
                     }

                     a = load ':INPATH:/singlefile/studenttab10k' as (name:chararray, age:int, gpa:double);
                     b = test(a);
                     describe b;\,
          'rc' => 0,
          'expected_out_regex'=> "b: {name: chararray}"
        }
      ]
    },
    {
      'name' => 'Macro_Misc',
      'tests' => [
        {
          #Comments in macro
          'num' => 1,
          'pig' => q#define simple_macro(in_relation, min_gpa, max_age) returns c {
                         b = filter $in_relation by gpa >= $min_gpa and age <= $max_age;
                         $c = foreach b generate age, name;
                         -- add a comment
                     }

                     a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                     x = simple_macro(a, '3.0', '40');
                     store x into ':OUTPATH:';#,
          'verify_pig_script' => q#a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                   b = filter a by gpa >= 3.0 and age <= 40;
                                   c = foreach b generate age, name;
                                   store c into ':OUTPATH:';#,
        },
        {
          #register
          'num' => 2,
          'pig' => q\define test (in) returns b {
                          $b = foreach $in generate name, org.apache.pig.test.udf.evalfunc.Fred() as fred;
                      }

                      register :FUNCPATH:/testudf.jar;
                      a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                      x = test(a);
                      store x into ':OUTPATH:';\,
          'verify_pig_script' => q#a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                   register :FUNCPATH:/testudf.jar;
                                   b = foreach a generate name, org.apache.pig.test.udf.evalfunc.Fred() as fred;
                                   store b into ':OUTPATH:';#,
        },
        {
          #define for streaming combines with define for macros
          'num' => 3,
          ,'pig' => q#define CMD `perl -ne 'print $_;'`;
                      define test(in) returns B {
                          $B = stream $in through CMD as (name, age, gpa);
                      }

                      A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                      x = test(A);
                      store x into ':OUTPATH:';#,
          'pig_win' => q#define CMD `perl -ne "print $_;"`;
                      define test(in) returns B {
                          $B = stream $in through CMD as (name, age, gpa);
                      }

                      A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                      x = test(A);
                      store x into ':OUTPATH:';#,
          'verify_pig_script' => q#A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                   store A into ':OUTPATH:';#,
          'floatpostprocess' => 1,
          'delimiter' => '  ' 
        },
        {
                #JIRA: PIG-2681
                'num' => 4,
               ,'pig' => q\
                    define test (in,out) returns b {
                       a = load '$in' as (name, age, gpa);
                       $b = foreach a generate name, org.apache.pig.test.udf.evalfunc.Fred() as fred;
                       store $b into '$out';
}
                       register :FUNCPATH:/testudf.jar;
                       x = test(':INPATH:/singlefile/studenttab10k',':OUTPATH:');
\,
        }
      ]
    },
    {
       'name' => 'Macro_Import',
       'tests' => [
         {
           'num' => 1,
           'pig' => q#import ':SCRIPTHOMEPATH:/macro1.pig';
                      a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                      x = simple_macro(a, '3.0', '40');
                      store x into ':OUTPATH:';#,
          'verify_pig_script' => q#a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                   b = filter a by gpa >= 3.0 and age <= 40;
                                   c = foreach b generate age, name;
                                   store c into ':OUTPATH:';#,
          }

        ]
      },
      {
       'name' => 'Macro_Error',
       'tests' => [
         {
           # parameter names repeated
           'num' => 1,
           'ignore' => 'https://issues.apache.org/jira/browse/PIG-2247',
           'pig' => q#define simple_macro(in_relation, min_gpa, min_gpa) returns c {
                          b = filter $in_relation by gpa >= $min_gpa;
                          $c = foreach b generate age, name;
                      }
 
                      a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                      x = simple_macro(a, '3.0', '40');
                      store x into ':OUTPATH:';#,
            'expected_err_regex' => "Multiple arguments min_gpa found"
         },
         {
           # undefined parameter in macro
           'num' => 2,
           'pig' => q#define simple_macro(in_relation, min_gpa) returns c {
                          b = filter $in_relation by gpa >= $min_gpa and age <= $max_age;
                          $c = foreach b generate age, name;
                      }

                      a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                      x = simple_macro(a, '3.0');
                      store x into ':OUTPATH:';#,
            'expected_err_regex' => "Macro inline failed for macro 'simple_macro'. Reason: Undefined parameter : max_age"
          },
          {
            # name collision between arg and return value
            'num' => 3,
            'pig' => q#define simple_macro(in_relation, min_gpa, c) returns c {
                           b = filter $in_relation by gpa >= $min_gpa and age <= $c;
                           $c = foreach b generate age, name;
                       }

                       a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                       x = simple_macro(a, '3.0', '40');
                       store x into ':OUTPATH:';#,
            'expected_err_regex' => "Multiple values found for c"
          },
          {
            # keyword as macro name
            'num' => 4,
            'pig' => q#define foreach(in_relation, min_gpa) returns c {
                           b = filter $in_relation by gpa >= $min_gpa;
                           $c = foreach b generate age, name;
                       }

                       a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                       x = simple_macro(a, '3.0', '40');
                       store x into ':OUTPATH:';#,
            'expected_err_regex' => "mismatched input 'foreach' expecting IDENTIFIER"
          },
          {
            # UDF as macro name
            'num' => 5,
            'ignore' => 'https://issues.apache.org/jira/browse/PIG-2248',
            'pig' => q#define COUNT(in_relation, min_gpa) returns c {
                           b = filter $in_relation by gpa >= $min_gpa;
                           $c = foreach b generate age, name;
                       }

                       a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                       x = COUNT(a, '3.0');
                       store x into ':OUTPATH:';#,
            'expected_err_regex' => "macro name hides UDF COUNT"
          },
          {
            # redefine a macro
            'num' => 6,
            'pig' => q#define simple_macro(in_relation, min_gpa) returns c {
                           b = filter $in_relation by gpa >= $min_gpa;
                           $c = foreach b generate age, name;
                       }

                       define simple_macro(in, min_age) returns d {
                           b = filter $in by age >= $min_age;
                           $d = foreach b generate age, name;
                       }

                       a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                       x = simple_macro(a, '3.0', '40');
                       store x into ':OUTPATH:';#,
            'expected_err_regex' => "Duplicated macro name 'simple_macro'"
          },
          {
            # invoke non-existent macro
            'num' => 7,
            'pig' => q#
                       a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                       x = nosuch_macro('a', '3.0', '40');
                       store x into ':OUTPATH:';#,
            'expected_err_regex' => "Cannot expand macro 'nosuch_macro'. Reason: Macro must be defined before expansion."
          },
          {
            # Specifies two returns, but only actually returns one
            'num' => 8,
            'pig' => q#define simple(in_relation, min_gpa) returns c,d {
                           b = filter $in_relation by gpa >= $min_gpa;
                           $c = foreach b generate age, name;
                       }

                       a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                       x, y = simple(a, '3.0');
                       store x into ':OUTPATH:.1';
                       store y into ':OUTPATH:.2';#,
            'expected_err_regex' => "Invalid macro definition: . Reason: Macro 'simple' missing return alias: d"
          },
          {
            # syntax error in a macro, check for correct line number
            'num' => 9,
            'pig' => q#define simple(in_relation, min_gpa) returns c {
                           b = fiter $in_relation by gpa >= $min_gpa;
                           $c = foreach b generate age, name;
                       }

                       a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                       x = simple(a, '3.0');
                       store x into ':OUTPATH:';#,
            'expected_err_regex' => "line 2"
          },
          {
           # too many args passed to macro
           'num' => 10,
           'pig' => q#define simple_macro(in_relation, min_gpa) returns c {
                          b = filter $in_relation by gpa >= $min_gpa;
                          $c = foreach b generate age, name;
                      }

                      a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                      x = simple_macro(a, '3.0', '40');
                      store x into ':OUTPATH:';#,
            'expected_err_regex' => "Failed to expand macro 'simple_macro'. Reason: Expected number of parameters: 2 actual number of inputs: 3"
          },
          {
            # return two values, but script only accepts 1
            'num' => 11,
            'pig' => q#define simple(in_relation, min_gpa) returns c,d {
                           b = filter $in_relation by gpa >= $min_gpa;
                           $c = foreach b generate age, name;
                           $d = foreach b generate name, age;
                       }

                       a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                       x = simple(a, '3.0');
                       store x into ':OUTPATH:';#,
            'expected_err_regex' => "Failed to expand macro 'simple'. Reason: Expected number of return aliases: 2 actual number of return values: 1"
          },
          {
            # return 1 value, but script expects 2
            'num' => 12,
            'pig' => q#define simple(in_relation, min_gpa) returns c {
                           b = filter $in_relation by gpa >= $min_gpa;
                           $c = foreach b generate age, name;
                       }

                       a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                       x, y = simple(a, '3.0');
                       store x into ':OUTPATH:.1';
                       store y into ':OUTPATH:.2';#,
            'expected_err_regex' => "Failed to expand macro 'simple'. Reason: Expected number of return aliases: 1 actual number of return values: 2"
          }
        ]
      },
      {
       'name' => 'Macro_Import_Error',
       'tests' => [
         {
           # import non-existent file
           'num' => 1,
           'ignore' => 1, # different error message for different version of hadoop
           'pig' => q#import 'nosuchfile';
 
                      a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                      x = simple_macro('a', '3.0', '40');
                      store x into ':OUTPATH:';#,
            'expected_err_regex' => "Failed to import file 'nosuchfile'. Reason: Can't find the Specified file nosuchfile"
         },
         {
           # import a macro with a syntax error
           'num' => 2,
           'pig' => q#import ':SCRIPTHOMEPATH:/macro_bad1.pig';
                      a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                      x = simple_macro(a, '3.0', '40');
                      store x into ':OUTPATH:';#,
            'expected_err_regex' => "Invalid macro definition"
         }
        ]
      }
    ],
  },
;

# import non-existent file, import script with error



