#!/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
                    }
                ]
            } 
        ]
    }
;




