blob: d4c6c6a472cfe0737108a930e3aa96338cbefb1a [file] [log] [blame]
/*
* 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.
*/
package org.apache.pig.scripting.js;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.pig.scripting.BoundScript;
import org.apache.pig.scripting.Pig;
import org.apache.pig.scripting.ScriptEngine;
import org.mozilla.javascript.NativeFunction;
import org.mozilla.javascript.NativeObject;
/**
* Pig entry point from javascript
* @author Julien Le Dem
*
*/
public class JSPig {
/**
* I'm using composition instead of inheritance because javascript to java calls finds the existing bind() methods ambiguous
*/
private Pig pig;
private JSPig(Pig pig) {
this.pig = pig;
}
/**
* See {@link Pig}
* @param cmd Filesystem command to run along with its arguments as one string.
* @throws IOException
*/
public static int fs(String cmd) throws IOException {
return Pig.fs(cmd);
}
/**
* See {@link Pig}
* @param jarfile Path of jar to include.
* @throws IOException if the indicated jarfile cannot be found.
*/
public static void registerJar(String jarfile) throws IOException {
Pig.registerJar(jarfile);
}
/**
* See {@link Pig}
* @param udffile Path of the script UDF file
* @param namespace namespace of the UDFs
* @throws IOException
*/
public static void registerUDF(String udffile, String namespace)
throws IOException {
Pig.registerUDF(udffile, namespace);
}
/**
* See {@link Pig}
* @param alias name of the defined alias
* @param definition string this alias is defined as
*/
public static void define(String alias, String definition)
throws IOException {
Pig.define(alias, definition);
}
/**
* See {@link Pig}
* @param var variable to set
* @param value to set it to
*/
public static void set(String var, String value) throws IOException {
Pig.set(var, value);
}
//-------------------------------------------------------------------------
/**
* Define a Pig pipeline.
* @param pl Pig Latin definition of the pipeline.
* @return Pig object representing this pipeline.
* @throws IOException if the Pig Latin does not compile.
*/
public static JSPig compile(String pl) throws IOException {
return new JSPig(Pig.compile(pl));
}
/**
* Define a named portion of a Pig pipeline. This allows it
* to be imported into another pipeline.
* @param name Name that will be used to define this pipeline.
* The namespace is global.
* @param pl Pig Latin definition of the pipeline.
* @return Pig object representing this pipeline.
* @throws IOException if the Pig Latin does not compile.
*/
public static JSPig compile(String name, String pl) throws IOException {
return new JSPig(Pig.compile(name, pl));
}
/**
* Define a Pig pipeline based on Pig Latin in a separate file.
* @param filename File to read Pig Latin from. This must be a purely
* Pig Latin file. It cannot contain host language constructs in it.
* @return Pig object representing this pipeline.
* @throws IOException if the Pig Latin does not compile or the file
* cannot be found.
*/
public static JSPig compileFromFile(String filename)
throws IOException {
return new JSPig(Pig.compileFromFile(filename));
}
/**
* Define a named Pig pipeline based on Pig Latin in a separate file.
* This allows it to be imported into another pipeline.
* @param name Name that will be used to define this pipeline.
* The namespace is global.
* @param filename File to read Pig Latin from. This must be a purely
* Pig Latin file. It cannot contain host language constructs in it.
* @return Pig object representing this pipeline.
* @throws IOException if the Pig Latin does not compile or the file
* cannot be found.
*/
public static JSPig compileFromFile(String name,
String filename) throws IOException {
return new JSPig(Pig.compileFromFile(name, filename));
}
/**
* javascript helper for binding parameters.
* See: {@link Pig#bind(Map)}
* @param o a javascript object to be converted into a Map
* @return the bound script
* @throws IOException if {@link Pig#bind(Map)} throws an IOException
*/
public BoundScript bind(Object o) throws IOException {
NativeObject vars = (NativeObject)o;
Map<String, Object> params = new HashMap<String, Object>();
Object[] ids = vars.getIds();
for (Object id : ids) {
if (id instanceof String) {
String name = (String) id;
Object value = vars.get(name, vars);
if (!(value instanceof NativeFunction) && value != null) {
params.put(name, value.toString());
}
}
}
return pig.bind(params);
}
/**
* See: {@link Pig#bind()}
* @throws IOException if host language variables are not found to resolve all
* Pig Latin parameters or if they contain unsupported types.
*/
public BoundScript bind() throws IOException {
return pig.bind();
}
}