This check-in is a clean up of the asterix code.
It gets rid of redundant classes (FunIdentifier, FunctionUtil etc) and also corrects comparisons made using == instead of a .equals.
git-svn-id: https://asterixdb.googlecode.com/svn/trunk/asterix@39 eaa15691-b419-025a-1212-ee371bd00084
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/FunctionExpressionMap.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/FunctionExpressionMap.java
index e082fee..f30ae09 100644
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/FunctionExpressionMap.java
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/FunctionExpressionMap.java
@@ -2,9 +2,9 @@
import java.util.HashMap;
-import edu.uci.ics.asterix.aql.expression.FunIdentifier;
+import edu.uci.ics.asterix.om.functions.AsterixFunction;
-public class FunctionExpressionMap extends HashMap<Integer, FunIdentifier> {
+public class FunctionExpressionMap extends HashMap<Integer, AsterixFunction> {
/**
*
*/
@@ -24,7 +24,7 @@
this.varargs = varargs;
}
- public FunIdentifier get(int arity) {
+ public AsterixFunction get(int arity) {
if (varargs) {
return super.get(-1);
} else {
@@ -32,7 +32,7 @@
}
}
- public FunIdentifier put(int arity, FunIdentifier fd) {
+ public AsterixFunction put(int arity, AsterixFunction fd) {
if (varargs) {
return super.put(-1, fd);
} else {
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/FunctionSignatures.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/FunctionSignatures.java
index fa3e8fc..1027c42 100644
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/FunctionSignatures.java
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/FunctionSignatures.java
@@ -3,7 +3,7 @@
import java.util.HashMap;
import java.util.Map;
-import edu.uci.ics.asterix.aql.expression.FunIdentifier;
+import edu.uci.ics.asterix.om.functions.AsterixFunction;
public class FunctionSignatures {
private final Map<String, FunctionExpressionMap> functionMap;
@@ -12,7 +12,7 @@
functionMap = new HashMap<String, FunctionExpressionMap>();
}
- public FunIdentifier get(String name, int arity) {
+ public AsterixFunction get(String name, int arity) {
FunctionExpressionMap possibleFD = functionMap.get(name);
if (possibleFD == null) {
return null;
@@ -21,8 +21,8 @@
}
}
- public void put(FunIdentifier fd, boolean varargs) {
- String name = fd.getValue();
+ public void put(AsterixFunction fd, boolean varargs) {
+ String name = fd.getFunctionName();
FunctionExpressionMap func = functionMap.get(name);
if (func == null) {
func = new FunctionExpressionMap(varargs);
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/Scope.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/Scope.java
index 3f9c2be..ef338d4 100644
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/Scope.java
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/Scope.java
@@ -2,10 +2,10 @@
import java.util.HashMap;
-import edu.uci.ics.asterix.aql.expression.FunIdentifier;
import edu.uci.ics.asterix.aql.expression.Identifier;
import edu.uci.ics.asterix.aql.expression.VarIdentifier;
import edu.uci.ics.asterix.aql.parser.ScopeChecker;
+import edu.uci.ics.asterix.om.functions.AsterixFunction;
public final class Scope {
private Scope parent;
@@ -78,7 +78,7 @@
* @param varargs
* whether this function has varargs
*/
- public void addFunctionDescriptor(FunIdentifier fd, boolean varargs) {
+ public void addFunctionDescriptor(AsterixFunction fd, boolean varargs) {
if (functionSignatures == null) {
functionSignatures = new FunctionSignatures();
}
@@ -94,8 +94,8 @@
* # of arguments
* @return FunctionDescriptor of the function found; otherwise null
*/
- public FunIdentifier findFunctionSignature(String name, int arity) {
- FunIdentifier fd = null;
+ public AsterixFunction findFunctionSignature(String name, int arity) {
+ AsterixFunction fd = null;
if (functionSignatures != null) {
fd = functionSignatures.get(name, arity);
}
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/CallExpr.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/CallExpr.java
index 39a21e3..cda7e69 100644
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/CallExpr.java
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/CallExpr.java
@@ -6,25 +6,26 @@
import edu.uci.ics.asterix.aql.expression.visitor.IAqlExpressionVisitor;
import edu.uci.ics.asterix.aql.expression.visitor.IAqlVisitorWithVoidReturn;
import edu.uci.ics.asterix.common.exceptions.AsterixException;
+import edu.uci.ics.asterix.om.functions.AsterixFunction;
public class CallExpr implements Expression {
- private FunIdentifier ident;
+ private AsterixFunction ident;
private List<Expression> exprList;
private boolean isBuiltin;
public CallExpr() {
}
- public CallExpr(FunIdentifier ident, List<Expression> exprList) {
+ public CallExpr(AsterixFunction ident, List<Expression> exprList) {
this.ident = ident;
this.exprList = exprList;
}
- public FunIdentifier getIdent() {
+ public AsterixFunction getIdent() {
return ident;
}
- public void setIdent(FunIdentifier ident) {
+ public void setIdent(AsterixFunction ident) {
this.ident = ident;
}
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/CreateFunctionStatement.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/CreateFunctionStatement.java
index e18200f..6ffd39d 100644
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/CreateFunctionStatement.java
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/CreateFunctionStatement.java
@@ -3,26 +3,25 @@
import java.util.ArrayList;
import java.util.List;
-
import edu.uci.ics.asterix.aql.base.Statement;
import edu.uci.ics.asterix.aql.expression.visitor.IAqlExpressionVisitor;
import edu.uci.ics.asterix.aql.expression.visitor.IAqlVisitorWithVoidReturn;
-import edu.uci.ics.asterix.aql.util.FunctionUtil;
import edu.uci.ics.asterix.common.exceptions.AsterixException;
+import edu.uci.ics.asterix.om.functions.AsterixFunction;
public class CreateFunctionStatement implements Statement {
- private FunIdentifier funIdentifier;
+ private AsterixFunction asterixFunction;
private String functionBody;
private boolean ifNotExists;
private List<String> paramList;
- public FunIdentifier getFunctionIdentifier() {
- return funIdentifier;
+ public AsterixFunction getFunctionIdentifier() {
+ return asterixFunction;
}
- public void setFunctionIdentifier(FunIdentifier funIdentifier) {
- this.funIdentifier = funIdentifier;
+ public void setFunctionIdentifier(AsterixFunction AsterixFunction) {
+ this.asterixFunction = AsterixFunction;
}
public String getFunctionBody() {
@@ -37,10 +36,10 @@
this.ifNotExists = ifNotExists;
}
- public CreateFunctionStatement(FunIdentifier funIdentifier, List<VarIdentifier> parameterList, String functionBody,
+ public CreateFunctionStatement(AsterixFunction AsterixFunction, List<VarIdentifier> parameterList, String functionBody,
boolean ifNotExists) {
- this.funIdentifier = funIdentifier;
+ this.asterixFunction = AsterixFunction;
this.functionBody = functionBody;
this.ifNotExists = ifNotExists;
this.paramList = new ArrayList<String>();
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/FunIdentifier.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/FunIdentifier.java
deleted file mode 100644
index 85651fe..0000000
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/FunIdentifier.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package edu.uci.ics.asterix.aql.expression;
-
-public class FunIdentifier extends Identifier {
- private int arity;
-
- public FunIdentifier() {
- }
-
- public FunIdentifier(String name, int arity) {
- this.value = name;
- this.arity = arity;
- }
-
- public int getArity() {
- return arity;
- }
-
- public void setArity(int arity) {
- this.arity = arity;
- }
-
- public boolean equals(Object o) {
- if (FunIdentifier.class.isInstance(o)) {
- FunIdentifier obj = (FunIdentifier) o;
- if (obj.getArity() == arity && obj.getValue().equals(value)) {
- return true;
- } else {
- return false;
- }
- } else {
- return false;
- }
- }
-
- @Override
- public String toString() {
- return value + "@" + arity;
- }
-
-}
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/FunctionDecl.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/FunctionDecl.java
index 1428a54..e69035a 100644
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/FunctionDecl.java
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/FunctionDecl.java
@@ -7,26 +7,27 @@
import edu.uci.ics.asterix.aql.expression.visitor.IAqlExpressionVisitor;
import edu.uci.ics.asterix.aql.expression.visitor.IAqlVisitorWithVoidReturn;
import edu.uci.ics.asterix.common.exceptions.AsterixException;
+import edu.uci.ics.asterix.om.functions.AsterixFunction;
public class FunctionDecl implements Statement {
- private FunIdentifier ident;
+ private AsterixFunction ident;
private List<VarIdentifier> paramList;
private Expression funcBody;
public FunctionDecl() {
}
- public FunctionDecl(FunIdentifier ident, List<VarIdentifier> paramList, Expression funcBody) {
+ public FunctionDecl(AsterixFunction ident, List<VarIdentifier> paramList, Expression funcBody) {
this.ident = ident;
this.paramList = paramList;
this.funcBody = funcBody;
}
- public FunIdentifier getIdent() {
+ public AsterixFunction getIdent() {
return ident;
}
- public void setIdent(FunIdentifier ident) {
+ public void setIdent(AsterixFunction ident) {
this.ident = ident;
}
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/visitor/AQLPrintVisitor.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/visitor/AQLPrintVisitor.java
index f4b895b..f01991b 100644
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/visitor/AQLPrintVisitor.java
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/visitor/AQLPrintVisitor.java
@@ -294,7 +294,7 @@
@Override
public void visit(FunctionDecl fd, Integer step) throws AsterixException {
- out.println(skip(step) + "FunctionDecl " + fd.getIdent().getValue() + "(" + fd.getParamList().toString()
+ out.println(skip(step) + "FunctionDecl " + fd.getIdent().getFunctionName() + "(" + fd.getParamList().toString()
+ ") {");
fd.getFuncBody().accept(this, step + 1);
out.println(skip(step) + "}");
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/parser/ScopeChecker.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/parser/ScopeChecker.java
index 51537e3..5171d5a 100644
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/parser/ScopeChecker.java
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/parser/ScopeChecker.java
@@ -3,8 +3,8 @@
import java.util.Stack;
import edu.uci.ics.asterix.aql.context.Scope;
-import edu.uci.ics.asterix.aql.expression.FunIdentifier;
import edu.uci.ics.asterix.aql.expression.Identifier;
+import edu.uci.ics.asterix.om.functions.AsterixFunction;
import edu.uci.ics.hyracks.algebricks.core.algebra.base.Counter;
public abstract class ScopeChecker {
@@ -95,7 +95,7 @@
*
* @return functionDescriptor
*/
- public final FunIdentifier lookupFunctionSignature(String name, int arity) {
+ public final AsterixFunction lookupFunctionSignature(String name, int arity) {
if (name != null) {
return getCurrentScope().findFunctionSignature(name, arity);
} else {
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/AqlRewriter.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/AqlRewriter.java
index 5f03cca1..fdb56be 100644
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/AqlRewriter.java
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/AqlRewriter.java
@@ -7,8 +7,8 @@
import edu.uci.ics.asterix.aql.base.Clause;
import edu.uci.ics.asterix.aql.base.Expression;
-import edu.uci.ics.asterix.aql.base.Expression.Kind;
import edu.uci.ics.asterix.aql.base.Statement;
+import edu.uci.ics.asterix.aql.base.Expression.Kind;
import edu.uci.ics.asterix.aql.expression.BeginFeedStatement;
import edu.uci.ics.asterix.aql.expression.CallExpr;
import edu.uci.ics.asterix.aql.expression.ControlFeedStatement;
@@ -26,7 +26,6 @@
import edu.uci.ics.asterix.aql.expression.FieldAccessor;
import edu.uci.ics.asterix.aql.expression.FieldBinding;
import edu.uci.ics.asterix.aql.expression.ForClause;
-import edu.uci.ics.asterix.aql.expression.FunIdentifier;
import edu.uci.ics.asterix.aql.expression.FunctionDecl;
import edu.uci.ics.asterix.aql.expression.FunctionDropStatement;
import edu.uci.ics.asterix.aql.expression.GbyVariableExpressionPair;
@@ -65,13 +64,14 @@
import edu.uci.ics.asterix.aql.expression.WriteFromQueryResultStatement;
import edu.uci.ics.asterix.aql.expression.WriteStatement;
import edu.uci.ics.asterix.aql.expression.visitor.IAqlExpressionVisitor;
-import edu.uci.ics.asterix.aql.util.FunctionUtil;
+import edu.uci.ics.asterix.aql.util.FunctionUtils;
import edu.uci.ics.asterix.common.exceptions.AsterixException;
import edu.uci.ics.asterix.common.functions.FunctionConstants;
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.hyracks.algebricks.core.algebra.functions.AlgebricksBuiltinFunctions;
import edu.uci.ics.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -130,7 +130,7 @@
return;
}
List<FunctionDecl> fdecls = buildFunctionDeclList(topExpr);
- List<FunIdentifier> funIds = new ArrayList<FunIdentifier>();
+ List<AsterixFunction> funIds = new ArrayList<AsterixFunction>();
for (FunctionDecl fdecl : fdecls) {
funIds.add(fdecl.getIdent());
}
@@ -148,20 +148,20 @@
}
private void buildOtherUdfs(Expression expression, List<FunctionDecl> functionDecls,
- List<FunIdentifier> declaredFunctions) throws AsterixException {
+ List<AsterixFunction> declaredFunctions) throws AsterixException {
if (expression == null) {
return;
}
- List<FunIdentifier> functionCalls = getFunctionCalls(expression);
- for (FunIdentifier funId : functionCalls) {
+ List<AsterixFunction> functionCalls = getFunctionCalls(expression);
+ for (AsterixFunction funId : functionCalls) {
if (AsterixBuiltinFunctions.isBuiltinCompilerFunction(new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
- funId.getValue(), false))) {
+ funId.getFunctionName(), false))) {
continue;
}
if (AsterixBuiltinFunctions.isBuiltinCompilerFunction(new FunctionIdentifier(AlgebricksBuiltinFunctions.ALGEBRICKS_NS,
- funId.getValue(), false))) {
+ funId.getFunctionName(), false))) {
continue;
}
@@ -178,48 +178,48 @@
}
}
- private FunctionDecl getFunctionDecl(FunIdentifier funId) throws AsterixException {
- Function function = MetadataManager.INSTANCE.getFunction(mdTxnCtx, dataverseName, funId.getValue(), funId
+ private FunctionDecl getFunctionDecl(AsterixFunction funId) throws AsterixException {
+ Function function = MetadataManager.INSTANCE.getFunction(mdTxnCtx, dataverseName, funId.getFunctionName(), funId
.getArity());
if (function == null) {
throw new AsterixException(" unknown function " + funId);
}
- return FunctionUtil.getFunctionDecl(function);
+ return FunctionUtils.getFunctionDecl(function);
}
- private List<FunIdentifier> getFunctionCalls(Expression expression) throws AsterixException {
- Map<FunIdentifier, DfsColor> color = new HashMap<FunIdentifier, DfsColor>();
- Map<FunIdentifier, List<FunIdentifier>> arcs = new HashMap<FunIdentifier, List<FunIdentifier>>();
+ private List<AsterixFunction> getFunctionCalls(Expression expression) throws AsterixException {
+ Map<AsterixFunction, DfsColor> color = new HashMap<AsterixFunction, DfsColor>();
+ Map<AsterixFunction, List<AsterixFunction>> arcs = new HashMap<AsterixFunction, List<AsterixFunction>>();
GatherFunctionCalls gfc = new GatherFunctionCalls();
expression.accept(gfc, null);
- List<FunIdentifier> calls = gfc.getCalls();
+ List<AsterixFunction> calls = gfc.getCalls();
return calls;
}
private void checkRecursivity(List<FunctionDecl> fdecls) throws AsterixException {
- Map<FunIdentifier, DfsColor> color = new HashMap<FunIdentifier, DfsColor>();
- Map<FunIdentifier, List<FunIdentifier>> arcs = new HashMap<FunIdentifier, List<FunIdentifier>>();
+ Map<AsterixFunction, DfsColor> color = new HashMap<AsterixFunction, DfsColor>();
+ Map<AsterixFunction, List<AsterixFunction>> arcs = new HashMap<AsterixFunction, List<AsterixFunction>>();
for (FunctionDecl fd : fdecls) {
GatherFunctionCalls gfc = new GatherFunctionCalls();
fd.getFuncBody().accept(gfc, null);
- List<FunIdentifier> calls = gfc.getCalls();
+ List<AsterixFunction> calls = gfc.getCalls();
arcs.put(fd.getIdent(), calls);
color.put(fd.getIdent(), DfsColor.WHITE);
}
- for (FunIdentifier a : arcs.keySet()) {
+ for (AsterixFunction a : arcs.keySet()) {
if (color.get(a) == DfsColor.WHITE) {
checkRecursivityDfs(a, arcs, color);
}
}
}
- private void checkRecursivityDfs(FunIdentifier a, Map<FunIdentifier, List<FunIdentifier>> arcs,
- Map<FunIdentifier, DfsColor> color) throws AsterixException {
+ private void checkRecursivityDfs(AsterixFunction a, Map<AsterixFunction, List<AsterixFunction>> arcs,
+ Map<AsterixFunction, DfsColor> color) throws AsterixException {
color.put(a, DfsColor.GRAY);
- List<FunIdentifier> next = arcs.get(a);
+ List<AsterixFunction> next = arcs.get(a);
if (next != null) {
- for (FunIdentifier f : next) {
+ for (AsterixFunction f : next) {
DfsColor dc = color.get(f);
if (dc == DfsColor.GRAY) {
throw new AsterixException("Recursive function calls, created by calling " + f + " starting from "
@@ -245,7 +245,7 @@
private static class GatherFunctionCalls implements IAqlExpressionVisitor<Void, Void> {
- private final List<FunIdentifier> calls = new ArrayList<FunIdentifier>();
+ private final List<AsterixFunction> calls = new ArrayList<AsterixFunction>();
public GatherFunctionCalls() {
}
@@ -530,7 +530,7 @@
return null;
}
- public List<FunIdentifier> getCalls() {
+ public List<AsterixFunction> getCalls() {
return calls;
}
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/InlineUdfsVisitor.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/InlineUdfsVisitor.java
index 5c59c7c..f0b2da6 100644
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/InlineUdfsVisitor.java
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/InlineUdfsVisitor.java
@@ -6,8 +6,8 @@
import edu.uci.ics.asterix.aql.base.Clause;
import edu.uci.ics.asterix.aql.base.Expression;
-import edu.uci.ics.asterix.aql.base.Expression.Kind;
import edu.uci.ics.asterix.aql.base.IAqlExpression;
+import edu.uci.ics.asterix.aql.base.Expression.Kind;
import edu.uci.ics.asterix.aql.expression.BeginFeedStatement;
import edu.uci.ics.asterix.aql.expression.CallExpr;
import edu.uci.ics.asterix.aql.expression.ControlFeedStatement;
@@ -25,7 +25,6 @@
import edu.uci.ics.asterix.aql.expression.FieldAccessor;
import edu.uci.ics.asterix.aql.expression.FieldBinding;
import edu.uci.ics.asterix.aql.expression.ForClause;
-import edu.uci.ics.asterix.aql.expression.FunIdentifier;
import edu.uci.ics.asterix.aql.expression.FunctionDecl;
import edu.uci.ics.asterix.aql.expression.FunctionDropStatement;
import edu.uci.ics.asterix.aql.expression.GbyVariableExpressionPair;
@@ -65,6 +64,7 @@
import edu.uci.ics.asterix.aql.expression.WriteStatement;
import edu.uci.ics.asterix.aql.expression.visitor.IAqlExpressionVisitor;
import edu.uci.ics.asterix.common.exceptions.AsterixException;
+import edu.uci.ics.asterix.om.functions.AsterixFunction;
import edu.uci.ics.hyracks.algebricks.core.utils.Pair;
public class InlineUdfsVisitor implements IAqlExpressionVisitor<Boolean, List<FunctionDecl>> {
@@ -337,7 +337,7 @@
return new Pair<Boolean, ArrayList<Expression>>(changed, newList);
}
- private static FunctionDecl findFuncDeclaration(FunIdentifier fid, List<FunctionDecl> sequence) {
+ private static FunctionDecl findFuncDeclaration(AsterixFunction fid, List<FunctionDecl> sequence) {
for (FunctionDecl f : sequence) {
if (f.getIdent().equals(fid)) {
return f;
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/util/FunctionUtil.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/util/FunctionUtil.java
deleted file mode 100644
index 0214ada..0000000
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/util/FunctionUtil.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package edu.uci.ics.asterix.aql.util;
-
-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.metadata.entities.Function;
-
-public class FunctionUtil {
-
-
- 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;
- }
-}
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/util/FunctionUtils.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/util/FunctionUtils.java
new file mode 100644
index 0000000..d246a92
--- /dev/null
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/util/FunctionUtils.java
@@ -0,0 +1,97 @@
+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
+ }
+}
diff --git a/asterix-aql/src/main/javacc/AQL.jj b/asterix-aql/src/main/javacc/AQL.jj
index 544e855..1fa40b8 100644
--- a/asterix-aql/src/main/javacc/AQL.jj
+++ b/asterix-aql/src/main/javacc/AQL.jj
@@ -37,6 +37,7 @@
import edu.uci.ics.asterix.aql.context.RootScopeFactory;
import edu.uci.ics.asterix.common.annotations.*;
import edu.uci.ics.asterix.common.exceptions.AsterixException;
+import edu.uci.ics.asterix.om.functions.AsterixFunction;
public class AQLParser extends ScopeChecker {
@@ -1027,7 +1028,8 @@
FunctionDecl FunctionDeclaration() throws ParseException:
{
FunctionDecl func = new FunctionDecl();
- FunIdentifier ident = new FunIdentifier();
+ AsterixFunction ident;
+ String functionName;
int arity = 0;
List<VarIdentifier> paramList = new ArrayList<VarIdentifier>();
Expression funcBody;
@@ -1039,7 +1041,7 @@
<IDENTIFIER>
{
Token t = getToken(0);
- ident.setValue(t.toString());
+ functionName = t.toString();
}
<LEFTPAREN> (<VARIABLE>
{
@@ -1059,7 +1061,7 @@
})*)? <RIGHTPAREN> "{" funcBody = Expression() "}"
{
- ident.setArity(arity);
+ ident = new AsterixFunction(functionName,arity);
getCurrentScope().addFunctionDescriptor(ident, false);
func.setIdent(ident);
func.setFuncBody(funcBody);
@@ -1071,7 +1073,8 @@
CreateFunctionStatement FunctionCreation() throws ParseException:
{
CreateFunctionStatement cfs = null;
- FunIdentifier ident = new FunIdentifier();
+ AsterixFunction ident;
+ String functionName;
int arity = 0;
boolean ifNotExists = false;
List<VarIdentifier> paramList = new ArrayList<VarIdentifier>();
@@ -1084,7 +1087,7 @@
<IDENTIFIER>
{
Token t = getToken(0);
- ident.setValue(t.toString());
+ functionName= t.toString();
}
(
@@ -1115,7 +1118,7 @@
}
"}"
{
- ident.setArity(arity);
+ ident = new AsterixFunction(functionName, arity);
getCurrentScope().addFunctionDescriptor(ident, false);
cfs = new CreateFunctionStatement(ident, paramList, funcBody, ifNotExists);
return cfs;
@@ -1728,10 +1731,10 @@
} ("," tmp = Expression() { argList.add(tmp); arity++; })*)? <RIGHTPAREN>
{
- FunIdentifier fd = lookupFunctionSignature(funcName.toString(), arity);
+ AsterixFunction fd = lookupFunctionSignature(funcName.toString(), arity);
if(fd == null)
{
- fd = new FunIdentifier(funcName.toString(), arity);
+ fd = new AsterixFunction(funcName.toString(), arity);
// notFoundFunctionList.add(fd);
}
// throw new ParseException("can't find function "+ funcName.toString() + "@" + arity);