#!/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.                                                      
                                                                                       
###############################################################################
# Nightly tests for pig.
#
#

#PigSetup::setup();

$cfg = {
	'driver' => 'Pig',
    'execonly' => 'mapred,tez,spark',

	'groups' => [
		{
		'name' => 'HCatDDL',
		'tests' => [
			{
			'num' => 1,
			'java_params' => ['-Dhcat.bin=:HCATBIN:'],
			'pig' => q\sql drop table if exists pig_hcat_ddl_1;
sql create table pig_hcat_ddl_1(name string,
age int,
gpa double)
stored as textfile;\,
                        'rc' => 0
			},
			{
			'num' => 2,
			'java_params' => ['-Dhcat.bin=:HCATBIN:'],
			'pig' => q\a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
SQL drop table if exists pig_hcat_ddl_1 purge;
sql create table pig_hcat_ddl_1(name string,
age int,
gpa double)
stored as textfile;
store a into ':OUTPATH:';\,
                        'verify_pig_script' => q\a = load ':INPATH:/singlefile/studenttab10k' as (name, age, gpa);
store a into ':OUTPATH:';\,
			},
		]
		},
                {
                'name' => 'Jython_HCatDDL',
                'tests' => [
                    {
                        # sql command
                                'num' => 1
                                ,'java_params' => ['-Dhcat.bin=:HCATBIN:']
                                ,'pig' => q\#!/usr/bin/python
from org.apache.pig.scripting import Pig

#create pig script

Pig.sql("""sql drop table if exists pig_script_hcat_ddl_1;""")
ret = Pig.sql("""sql create table pig_script_hcat_ddl_1(name string,
age int,
gpa double)
stored as textfile;
""")

if ret==0:
    print "SQL command PASSED"

else:
    raise "SQL command FAILED"
\
                       ,'rc' => 0
                    },
               ]
               },
	]
}
;



