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);