blob: d246a92194c4c52dad6eb47484c723a7091b2d6a [file] [log] [blame]
package edu.uci.ics.asterix.aql.util;
/*
* Copyright 2009-2011 by The Regents of the University of California
* Licensed 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 from
*
* 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.
*/
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import edu.uci.ics.asterix.aql.expression.FunctionDecl;
import edu.uci.ics.asterix.aql.expression.Query;
import edu.uci.ics.asterix.aql.expression.VarIdentifier;
import edu.uci.ics.asterix.aql.parser.AQLParser;
import edu.uci.ics.asterix.aql.parser.ParseException;
import edu.uci.ics.asterix.common.exceptions.AsterixException;
import edu.uci.ics.asterix.common.functions.FunctionConstants;
import edu.uci.ics.asterix.metadata.MetadataException;
import edu.uci.ics.asterix.metadata.MetadataManager;
import edu.uci.ics.asterix.metadata.MetadataTransactionContext;
import edu.uci.ics.asterix.metadata.entities.Function;
import edu.uci.ics.asterix.om.functions.AsterixBuiltinFunctions;
import edu.uci.ics.asterix.om.functions.AsterixFunction;
import edu.uci.ics.asterix.om.functions.AsterixFunctionInfo;
import edu.uci.ics.hyracks.algebricks.core.algebra.functions.AlgebricksBuiltinFunctions;
import edu.uci.ics.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import edu.uci.ics.hyracks.algebricks.core.algebra.functions.IFunctionInfo;
public class FunctionUtils {
public static FunctionDecl getFunctionDecl(Function function) throws AsterixException {
String functionBody = function.getFunctionBody();
List<String> params = function.getParams();
List<VarIdentifier> varIdentifiers = new ArrayList<VarIdentifier>();
StringBuilder builder = new StringBuilder();
builder.append(" declare function " + function.getFunctionName());
builder.append("(");
for (String param : params) {
VarIdentifier varId = new VarIdentifier(param);
varIdentifiers.add(varId);
builder.append(param);
builder.append(",");
}
builder.delete(builder.length() - 1, builder.length());
builder.append(")");
builder.append("{");
builder.append(functionBody);
builder.append("}");
AQLParser parser = new AQLParser(new StringReader(new String(builder)));
Query query = null;
try {
query = (Query) parser.Statement();
} catch (ParseException pe) {
throw new AsterixException(pe);
}
FunctionDecl decl = (FunctionDecl) query.getPrologDeclList().get(0);
return decl;
}
public static IFunctionInfo getFunctionInfo(FunctionIdentifier fi) {
return AsterixBuiltinFunctions.getAsterixFunctionInfo(fi);
}
public static IFunctionInfo getFunctionInfo(MetadataTransactionContext mdTxnCtx, String dataverseName,
AsterixFunction asterixFunction) throws MetadataException {
FunctionIdentifier fid = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
asterixFunction.getFunctionName(), asterixFunction.getArity(), true);
IFunctionInfo finfo = AsterixBuiltinFunctions.getAsterixFunctionInfo(fid);
if (fid == null) {
fid = new FunctionIdentifier(AlgebricksBuiltinFunctions.ALGEBRICKS_NS, asterixFunction.getFunctionName(),
asterixFunction.getArity(), true);
}
if (fid == null) {
Function function = MetadataManager.INSTANCE.getFunction(mdTxnCtx, dataverseName, asterixFunction
.getFunctionName(), asterixFunction.getArity());
if (function != null) {
finfo = new AsterixFunctionInfo(dataverseName, asterixFunction, false);
// todo: for external functions, we shall construct another kind of function info (that extends AsterixFunctionInfo)
// and has additional information.
}
}
return finfo; // could be null
}
}