#!/usr/bin/env perl

############################################################################           
#  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.                                                      
                                                                                       
###############################################################################
# Tests for Jython embedding
#
#

our $PASSED="Pig job PASSED";
our $FAILED="Pig job FAILED";


$cfg = {

	'driver' => 'Pig',
       ,'groups' => [
		{
                'name' => 'Jython_Checkin',
                'tests' => [
                        {
                        'num' => 2,
                        'floatpostprocess' => 1,
			'pig' => q\#!/usr/bin/python
from org.apache.pig.scripting import Pig

input1=':INPATH:/singlefile/studenttab10k'
input2=':INPATH:/singlefile/votertab10k'
output=':OUTPATH:'

P = Pig.compile("""
a = load '$in1' as (name, age, gpa);
b = load '$in2' as (name, age, registration, contributions);
c = filter a by age < 50;
d = filter b by age < 50;
e = cogroup c by (name, age), d by (name, age) ;
f = foreach e generate flatten(c), flatten(d);
g = group f by registration;
h = foreach g generate group, (float) ROUND(SUM(f.d::contributions) * 100) / 100.0;
i = order h by $1;
store i into '$out';
""").bind({'in1':input1,'in2':input2, 'out':output}).runSingle() 
if P.isSuccessful():
    print "Pig job PASSED"

else:
    raise "Pig job FAILED"    

\,
                'verify_pig_script' => q\a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                         b = load ':INPATH:/singlefile/votertab10k' as (name, age, registration, contributions);
                                         c = filter a by age < 50;
                                         d = filter b by age < 50;
                                         e = cogroup c by (name, age), d by (name, age) ;
                                         f = foreach e generate flatten(c), flatten(d);
                                         g = group f by registration;
                                         h = foreach g generate group, (float) ROUND(SUM(f.d::contributions) * 100) / 100.0;
                                         i = order h by $1;
                                         store i into ':OUTPATH:';
\,
				'sortArgs' => ['-t', '	', '-k', '2,2'],
			}, {
                        'num' => 3,
#jython uses 'python.home'/cachedir when python.cachedir is not specified.
#To test python.cachedir is set correctly by the framework,
#setting python.home to a random path
                        'java_params' => ['-Dpython.home=/dev/null/fake'],
'pig' => q\#!/usr/bin/python
import sys

from org.apache.hadoop.conf import *
from org.apache.hadoop.fs import *

config = Configuration()
hdfs = FileSystem.get(config)
\,
                ,'rc' => 0
                }
                ]

		}, {

			'name' => 'Jython_CompileBindRun'
		       ,'tests' => [
				{
                                # bind no parameters, runSingle
				'num' => 1
				,'pig' => q\#!/usr/bin/python
# JYTHON COMMENT
from org.apache.pig.scripting import Pig


P = Pig.compile("""A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa); 
store A into ':OUTPATH:';""")

Q = P.bind()

result = Q.runSingle()

if result.isSuccessful():
    print "Pig job PASSED"

else:
	raise "Pig job FAILED"    
\,

                'verify_pig_script' => q\A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa); 
                                         store A into ':OUTPATH:';\,
				,'floatpostprocess' => 1
				,'delimiter' => '	'

				},{
                        # bind single input parameter
			'num' => 2
			,'pig' => q\#!/usr/bin/python

from org.apache.pig.scripting import Pig

input= ":INPATH:/singlefile/studenttab10k"
output = ":OUTPATH:"

P = Pig.compile("""A = load '$in' as (name, age, gpa); store A into ':OUTPATH:';""")

Q = P.bind({'in':input}) 

result = Q.runSingle()

if result.isSuccessful():
    print "Pig job PASSED"

else:
    raise "Pig job FAILED"    
\,

                'verify_pig_script' => q\A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa); 
                                         store A into ':OUTPATH:';\,
				,'floatpostprocess' => 1
				,'delimiter' => '	'

#                       ,'expected_out_regex' => "Pig job PASSED"
			},{
                        # bind parallel execution with a multiple entries
			'num' => 3
			,'pig' => q\#!/usr/bin/python
from org.apache.pig.scripting import Pig

input= ":INPATH:/singlefile/studenttab10k"
max1="50";
output1= ":OUTPATH:.1"
max2="40.0";
output2= ":OUTPATH:.2"
max3="30.0f";
output3= ":OUTPATH:.3"

P = Pig.compile("""
A = load '$in' as (name, age, gpa);
B= filter A by age < $max;
C = foreach B generate name;
store C into '$out';
-- store C into put here as comment to fake multi-query
""")

Q = P.bind([
{'in':input ,'max':max1 ,'out':output1 } 
       ,{'in':input ,'max':max2 ,'out':output2 } 
       ,{'in':input ,'max':max3 ,'out':output3 }
  ])

results = Q.run()
for i in [0, 1, 2]:
    result = results[i]
    if result.isSuccessful():
       print "Pig job PASSED"
    else:
       raise "Pig job FAILED"    

\,

             'verify_pig_script' => q\A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                      B= filter A by age < 50;
                                      C = foreach B generate name;
                                      store C into ':OUTPATH:.1';
                                      A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                      B= filter A by age < 40.0;
                                      C = foreach B generate name;
                                      store C into ':OUTPATH:.2';
                                      A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                      B= filter A by age < 30.0f;
                                      C = foreach B generate name;
                                      store C into ':OUTPATH:.3';
\,

			},{
                # compile pig script file with no parameters
		'num' => 4
		,'pig' => q\#!/usr/bin/python
from org.apache.pig.scripting import Pig

#create pig script
pig_script = ":TMP:/script.pig"
pigfile = open( pig_script, 'w+')
pigfile.write("""
A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
-- a comment
store A into ':OUTPATH:';
""")
pigfile.close()

#execute pig script

result = Pig.compileFromFile( pig_script ).bind().runSingle()

if result.isSuccessful():
    print "Pig job PASSED"
else:
    raise "Pig job FAILED"    
\,

             'verify_pig_script' => q\A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                      store A into ':OUTPATH:';
\
                        ,'floatpostprocess' => 1
                        ,'delimiter' => '	'
		},{
                # compile pig script file with parameters
		'num' => 5
		,'pig' => q\#!/usr/bin/python
from org.apache.pig.scripting import Pig

#create pig script

from org.apache.pig.scripting import Pig

#create pig script

pig_script = ":TMP:/script.pig"
pigfile = open( pig_script, 'w+')
pigfile.write("""
A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
store A into '$out';
""")
pigfile.close()

#execute pig script
output= ":OUTPATH:"

result = Pig.compileFromFile(pig_script).bind({'out':output}).runSingle()

if result.isSuccessful():
    print "Pig job PASSED"
else:
    raise "Pig job FAILED"    
\,

             'verify_pig_script' => q\A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                      store A into ':OUTPATH:';
\
                        ,'floatpostprocess' => 1
                        ,'delimiter' => '	'

		},{
                    # results.getResults(alias) for null results
		    'num' => 6
		    ,'pig' => q\#!/usr/bin/python
from org.apache.pig.scripting import Pig

P = Pig.compile("""A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
EMPTY= filter A by age > 9999;
store EMPTY into ':OUTPATH:';
""")

result = P.bind().runSingle()
\,

             'verify_pig_script' => q\A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                      EMPTY= filter A by age > 9999;
                                      store EMPTY into ':OUTPATH:';\
		},
        {
                    # bind parameters from python context
		    'num' => 7
		    ,'pig' => q\#!/usr/bin/python
from org.apache.pig.scripting import Pig

P = Pig.compile("""A = load '$inpath' as (name, age, gpa);
B= filter A by age < $max;
store B into '$out';
""")

#execute pig script
inpath= ":INPATH:/singlefile/studenttab10k"
out= ":OUTPATH:"
max = 40

result = P.bind().runSingle()
\,
             'verify_pig_script' => q\A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                      B= filter A by age < 40;
                                      store B into ':OUTPATH:';\

		},{
                    # bind multiple times
		    'num' => 8
		    ,'pig' => q\#!/usr/bin/python
from org.apache.pig.scripting import Pig

P = Pig.compile("""A = load '$inpath' as (name, age, gpa);
B= foreach A generate age + $i;
store B into '$out';
-- extra store B into to force multiquery
""")

#execute pig script
inpath= ":INPATH:/singlefile/studenttab10k"
for i in [1,2,3]:
    out= ":OUTPATH:." + str(i)
    result = P.bind().runSingle()
\,
             'verify_pig_script' => q\A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                      B= foreach A generate age + 1;
                                      store B into ':OUTPATH:.1';
                                      A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                      B= foreach A generate age + 2;
                                      store B into ':OUTPATH:.2';
                                      A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                      B= foreach A generate age + 3;
                                      store B into ':OUTPATH:.3';\,

	},{
                # python script with parameters
                'num' => 11
                ,'pig_params' => ['-p', qq(loadfile='studenttab10k')],
                ,'pig' => q\#!/usr/bin/python
from org.apache.pig.scripting import Pig

P = Pig.compile("""A = load ':INPATH:/singlefile/$loadfile' as (name, age, gpa);
store A into ':OUTPATH:';""")

Q = P.bind()

result = Q.runSingle()

if result.isSuccessful():
    print "Pig job PASSED"
else:
    raise "Pig job FAILED"
\,

             'verify_pig_script' => q\A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                      store A into ':OUTPATH:';
\
                        ,'floatpostprocess' => 1
                        ,'delimiter' => '       '
        },{
                # python script with parameter file
                'num' => 12
                ,'pig_params' => ['-m', ":PARAMPATH:/params_3"],
                ,'pig' => q\#!/usr/bin/python
from org.apache.pig.scripting import Pig

P = Pig.compile("""A = load ':INPATH:/singlefile/$fname' as (name, age, gpa);
store A into ':OUTPATH:';""")

Q = P.bind()

result = Q.runSingle()

if result.isSuccessful():
    print "Pig job PASSED"
else:
    raise "Pig job FAILED"
\,

             'verify_pig_script' => q\A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                      store A into ':OUTPATH:';
\
                        ,'floatpostprocess' => 1
                        ,'delimiter' => '       '
	},{
                # python script with command line arguments
                'num' => 13
                ,'additional_cmd_args' => ['studenttab10k']
                ,'pig' => q\#!/usr/bin/python
from org.apache.pig.scripting import Pig
import sys

P = Pig.compile("A = load ':INPATH:/singlefile/" + sys.argv[1] + "' as (name, age, gpa);" +
"store A into ':OUTPATH:';");

Q = P.bind()

result = Q.runSingle()

if result.isSuccessful():
    print "Pig job PASSED"
else:
    raise "Pig job FAILED"
\,

             'verify_pig_script' => q\A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
                                      store A into ':OUTPATH:';
\
                        ,'floatpostprocess' => 1
                        ,'delimiter' => '       '
        }
      ]
        },{
	'name' => 'Jython_Diagnostics'
       ,'tests' => [
                {
                # explain() on a complex query
		'num' => 1
		,'pig' => q\#!/usr/bin/python
from org.apache.pig.scripting import Pig

input1= ":INPATH:/singlefile/studenttab10k"
input2= ":INPATH:/singlefile/votertab10k"
output1 = ":OUTPATH:.1"
output2 = ":OUTPATH:.2"
maximum="20";


#No Schema specified
P = Pig.compile("""
A = load '$in1' as (name, age, gpa);
B= filter A by age < $max;
C= foreach B generate name,age;
store C into '$out1';
D = load '$in2' using PigStorage() as (name:chararray, age:int, registration, contributions:double);
E= filter D by age < $max;
F= foreach E generate name,age;
store F into '$out2';
""")

result = P.bind({'in1':input1, 'in2':input2, 'max':maximum, 'out1':output1, 'out2':output2 }).explain()
\

                       ,'rc'=> 0

	}, {
                # illustrate() on a complex query
		'num' => 2
		,'execonly' => 'mapred,local' #TODO: PIG-3993,PIG-5204: Illustrate is yet to be implemented in Tez and in Spark
		,'pig' => q\#!/usr/bin/python
from org.apache.pig.scripting import Pig

input1= ":INPATH:/singlefile/studenttab10k"
input2= ":INPATH:/singlefile/votertab10k"
output1 = ":OUTPATH:.1"
output2 = ":OUTPATH:.2"
maximum="20";


#No Schema specified
P = Pig.compile("""
A = load '$in1' as (name, age, gpa);
B= filter A by age < $max;
C= foreach B generate name,age;
store C into '$out1';
D = load '$in2' using PigStorage() as (name:chararray, age:int, registration, contributions:double);
E= filter D by age < $max;
F= foreach E generate name,age;
store F into '$out2';
""")

result = P.bind({'in1':input1, 'in2':input2, 'max':maximum, 'out1':output1, 'out2':output2 }).illustrate();
\
                       ,'rc'=> 0
                       ,'expected_out_regex' => "A.*name:bytearray.*age:bytearray.*gpa:bytearray"
	}, {
                # describe() on an alias 	 
		'num' => 3
		,'pig' => q\#!/usr/bin/python
from org.apache.pig.scripting import Pig
input1= ":INPATH:/singlefile/studenttab10k"
input2= ":INPATH:/singlefile/votertab10k"
output1 = ":OUTPATH:.1"
output2 = ":OUTPATH:.2"
maximum="20";


#No Schema specified
P = Pig.compile("""
A = load '$in1' as (name, age, gpa);
B= filter A by age < $max;
C= foreach B generate name,age;
store C into '$out1';
D = load '$in2' using PigStorage() as (name:chararray, age:int, registration, contributions:double);
E= filter D by age < $max;
F= foreach E generate name,age;
store F into '$out2';
""")

result = P.bind({'in1':input1, 'in2':input2, 'max':maximum, 'out1':output1, 'out2':output2 }).describe('A');
\
                       ,'rc'=> 0
                       ,'expected_out_regex' => "A:.*{name:.*bytearray,age:.*bytearray,gpa:.*bytearray}"
	}, {
                # describe() on an undefined alias 
		'num' => 4
		,'pig' => q\#!/usr/bin/python
from org.apache.pig.scripting import Pig
input1= ":INPATH:/singlefile/studenttab10k"
input2= ":INPATH:/singlefile/votertab10k"
output1 = ":OUTPATH:.1"
output2 = ":OUTPATH:.2"
maximum="20";


#No Schema specified
P = Pig.compile("""
A = load '$in1' as (name, age, gpa);
B= filter A by age < $max;
C= foreach B generate name,age;
store C into '$out1';
D = load '$in2' using PigStorage() as (name:chararray, age:int, registration, contributions:double);
E= filter D by age < $max;
F= foreach E generate name,age;
store F into '$out2';
""")

result = P.bind({'in1':input1, 'in2':input2, 'max':maximum, 'out1':output1, 'out2':output2 }).describe('INVALID_ALIAS');
\
                       ,'rc'=> 6
                       ,'expected_err_regex' => "ERROR 1003: Unable to find an operator for alias INVALID_ALIAS"


	}, {
                # illustrate(alias) 	 
		'num' => 5
		,'pig' => q\#!/usr/bin/python
from org.apache.pig.scripting import Pig

input1= ":INPATH:/singlefile/studenttab10k"
input2= ":INPATH:/singlefile/votertab10k"
output1 = ":OUTPATH:.1"
output2 = ":OUTPATH:.2"
maximum="20";


#No Schema specified
P = Pig.compile("""
A = load '$in1' as (name, age, gpa);
B= filter A by age < $max;
C= foreach B generate name,age;
store C into '$out1';
D = load '$in2' using PigStorage() as (name:chararray, age:int, registration, contributions:double);
E= filter D by age < $max;
F= foreach E generate name,age;
store F into '$out2';
""")

result = P.bind({'in1':input1, 'in2':input2, 'max':maximum, 'out1':output1, 'out2':output2 }).illustrate('D');
\
                       ,'rc'=> 6
                       ,'expected_err_regex' => "ERROR 1121"

	}, {
                # explain(alias) 
		'num' => 6
		,'pig' => q\#!/usr/bin/python
from org.apache.pig.scripting import Pig

input1= ":INPATH:/singlefile/studenttab10k"
input2= ":INPATH:/singlefile/votertab10k"
output1 = ":OUTPATH:.1"
output2 = ":OUTPATH:.2"
maximum="20";


#No Schema specified
P = Pig.compile("""
A = load '$in1' as (name, age, gpa);
B= filter A by age < $max;
C= foreach B generate name,age;
store C into '$out1';
D = load '$in2' using PigStorage() as (name:chararray, age:int, registration, contributions:double);
E= filter D by age < $max;
F= foreach E generate name,age;
store F into '$out2';
""")

result = P.bind({'in1':input1, 'in2':input2, 'max':maximum, 'out1':output1, 'out2':output2 }).explain('C')
\
                       ,'rc'=> 6
                       ,'expected_err_regex' => "ERROR 1121"
#                       ,'expected_err_regex' => "TypeError: explain(): expected 0 args; got 1"

	}
	]
	}, {
	'name' => 'Iterator'
       ,'tests' => [
                {
		            'num' => 1
		            ,'pig' => q@#!/usr/bin/python
from org.apache.pig.scripting import Pig

P = Pig.compile("""A = load ':INPATH:/singlefile/studenttab10k';
store A into ':OUTPATH:.tmp';
""")

#execute pig script
result = P.bind().runSingle()

if not result.isSuccessful():
    raise "Pig job FAILED"    

pigfile = open(":TMP:/iterator_output.txt", 'wb+')
iter = result.result("A").iterator()
while iter.hasNext():
    t = iter.next()
    name = t.get(0)
    age = t.get(1)
    gpa = t.get(2)
    pigfile.write(str(name) + "\\t" + str(age) + "\\t" + str(gpa) + "\\n")
pigfile.close()
Pig.fs("-mkdir :OUTPATH:")
Pig.fs("-copyFromLocal :TMP:/iterator_output.txt :OUTPATH:/part-m-00000")
@,
             'verify_pig_script' => q\A = load ':INPATH:/singlefile/studenttab10k';
                                      store A into ':OUTPATH:';\,
		},
	]
	}, {
	'name' => 'Jython_Misc'
       ,'tests' => [
                {
                # fs commands: lists a file 	 
		'num' => 1
		,'pig' => q\#!/usr/bin/python
# JYTHON COMMENT
from org.apache.pig.scripting import Pig

Pig.fs( "-ls :INPATH:/singlefile/studenttab10k");
\

                       ,'expected_out_regex' => "studenttab10k"

                }
            ]
 	}, {

	'name' => 'Jython_Macro'
       ,'tests' => [
                {
		            'num' => 1
		            ,'pig' => q\#!/usr/bin/python
from org.apache.pig.scripting import Pig

#create pig script

# mymodule.pig
pig_script = ":TMP:/module.pig"
pigfile = open( pig_script, 'w+')
pigfile.write("""
define group_and_count (A, group_key) returns B {
    D = group $A by $group_key;
    $B = foreach D generate group, COUNT($A);
};
""")
pigfile.close()


#main.pig

P = Pig.compile("""import ':TMP:/module.pig';
alpha = load ':INPATH:/singlefile/studenttab10k' as (user, age, gpa);
gamma = group_and_count (alpha, user);
store gamma into ':OUTPATH:';
""")
P.bind().runSingle()
\,
                    'verify_pig_script' => q\A = load ':INPATH:/singlefile/studenttab10k' as (user, age, gpa);
                                             B = group A by user;
                                             C = foreach B generate group, COUNT(A);
                                             store C into ':OUTPATH:';\

	}
	]

	}, {
# SET debug 'on'
# SET job.name 'my job'
# SET default_parallel 100
 
                'name' => 'Jython_Properties',
                'tests' => [
                        {
                        # check if property is passed to Pig
                        'num' => 1 
		,'pig' => q\#!/usr/bin/python
# JYTHON COMMENT
from org.apache.pig.scripting import Pig
from java.util import Properties;

P = Pig.compile("""A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa); 
store A into ':OUTPATH:';""")

Q = P.bind()

prop = Properties()
prop.put("pig.default.load.func", "wrong")
result = Q.runSingle(prop)

if result.isSuccessful():
	print "Pig job PASSED"
else:
	raise "Pig job FAILED"    
\
                       ,'rc'=> 6
                       ,'expected_err_regex' => "ERROR 1070: Could not resolve wrong using imports"

	}
	]
            },
            {
                'name' => 'Jython_Error',
                'tests' => [
	                {
                                    # run a script that returns single negative result 
			            'num' => 1
			            ,'pig' => q\#!/usr/bin/python
from org.apache.pig.scripting import Pig

input= ":INPATH:/singlefile/studenttab10k"
output = ":OUTPATH:"

P = Pig.compile("""A = load '$in' as (name, age, gpa); store A into '$out';""")

Q = P.bind({'in':bad_input, 'out':output}) 

result = Q.runSingle()

if result.isSuccessful():
    print "Pig job PASSED"

else:
    raise "Pig job FAILED"    
\ 

		                ,'rc' => 6
                        ,'expected_err_regex' => "ERROR 1121"
			        },{
                                # compileFromFile for pig script file that does not exist throws IOException 	 
		                'num' => 4
		                ,'pig' => q\#!/usr/bin/python
import os
from org.apache.pig.scripting import Pig

# intentionally don't create pig script

pig_script = ":TMP:/script.pig"

os.remove(pig_script)

#execute pig script
input1= ":INPATH:/singlefile/studenttab10k"
input2= ":INPATH:/singlefile/votertab10k"
output1= ":OUTPATH:.1"
output2= ":OUTPATH:.2"

results = Pig.compileFromFile(pig_script).bind({'in1':input1,'in2':input2, 'out1':output1, 'out2':output2 }).run()

if results[0].isSuccessful():
    print "Pig job PASSED"

else:
    raise "Pig job FAILED"    
\

                       ,'expected_err_regex' => "ERROR 1121"
                       ,'rc'=> 6
		            },{
                        #  compileFromFile for pig script file without python library 
		                'num' => 6
		                ,'pig' => q\#!/usr/bin/python
# JYTHON COMMENT
#from org.apache.pig.scripting import Pig


P = Pig.compile("""A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa); 
store A into ':OUTPATH:';""")

Q = P.bind()

result = Q.runSingle()

if result.isSuccessful():
    print "Pig job PASSED"

else:
    raise "Pig job FAILED"    
\

                       ,'rc' => 6
                       ,'expected_err_regex' => "ERROR 1121"
                    },
                    {
                        # iter.next for an alias that is undefined 
		                'num' => 7
		                ,'pig' => q\#!/usr/bin/python
from org.apache.pig.scripting import Pig

#create pig script

out1= ":OUTPATH:.1"
out2= ":OUTPATH:.2"

P = Pig.compile("""A = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
B= filter A by age < 50;
store B into '$out1';
C = load ':INPATH:/singlefile/votertab10k' using PigStorage() as (name:chararray, age:int, registration, contributions:double);
D = filter C by name matches '^fred*';
store D into '$out2';
""")

results = P.bind().run()
iter = results[0].result("E").iterator()

if results[0].isSuccessful():
    print "Pig job PASSED"

else:
    raise "Pig job FAILED"    
\
                       ,'rc' => 6
                       ,'expected_err_regex' => "ERROR 1121"
                    },
                ]
            },
            {
                'name' => 'Jython_Command',
                'tests' => [
                    {
                        # sql command
		                'num' => 2
		                ,'pig' => q\#!/usr/bin/python
from org.apache.pig.scripting import Pig

Q = Pig.compile("sh echo mymessage")
result = Q.bind().runSingle()

if result.isSuccessful() :
    print 'Pig job succeeded'
else :
    raise 'Cant run sh command'
\
                       ,'rc' => 0
                       ,'expected_out_regex' => "mymessage\nPig job succeeded"
                    },
                    {
                        # sql command
		                'num' => 3
		                ,'pig' => q\#!/usr/bin/python
from org.apache.pig.scripting import Pig

Q = Pig.compile("sh cat nonexistfile")
result = Q.bind().runSingle()

if result.isSuccessful() :
    print 'Pig job succeeded'
else :
    raise 'Cant run sh command'
\
                       ,'rc' => 6
                    }
                ]
            } 
        ]
    }
;




