You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by hy...@apache.org on 2013/09/30 05:34:05 UTC

[2/2] git commit: TAJO-211: Implement regexp_replace function. (hyunsik)

TAJO-211: Implement regexp_replace function. (hyunsik)


Project: http://git-wip-us.apache.org/repos/asf/incubator-tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tajo/commit/406337d9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tajo/tree/406337d9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tajo/diff/406337d9

Branch: refs/heads/master
Commit: 406337d9d15e5f818d481060e1efd73c958fe26f
Parents: 135b27a
Author: Hyunsik Choi <hy...@apache.org>
Authored: Mon Sep 30 12:31:44 2013 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Mon Sep 30 12:31:44 2013 +0900

----------------------------------------------------------------------
 CHANGES.txt                                     |   2 +
 .../tajo/catalog/function/AggFunction.java      |  51 ------
 .../tajo/catalog/function/FunctionContext.java  |  22 ---
 .../tajo/catalog/function/GeneralFunction.java  |  43 -----
 .../tajo/catalog/json/CatalogGsonHelper.java    |   5 -
 .../apache/tajo/catalog/TestFunctionDesc.java   |  16 +-
 .../org/apache/tajo/catalog/TestCatalog.java    |  27 +---
 .../tajo/engine/eval/AggFuncCallEval.java       | 103 ------------
 .../eval/AggregationFunctionCallEval.java       | 103 ++++++++++++
 .../tajo/engine/eval/BasicEvalNodeVisitor.java  |  10 +-
 .../tajo/engine/eval/EvalNodeVisitor2.java      |   4 +-
 .../apache/tajo/engine/eval/EvalTreeUtil.java   |  10 +-
 .../org/apache/tajo/engine/eval/EvalType.java   |   4 +-
 .../apache/tajo/engine/eval/FuncCallEval.java   |  90 -----------
 .../org/apache/tajo/engine/eval/FuncEval.java   | 141 ----------------
 .../apache/tajo/engine/eval/FunctionEval.java   | 162 +++++++++++++++++++
 .../tajo/engine/eval/GeneralFunctionEval.java   |  91 +++++++++++
 .../tajo/engine/function/AggFunction.java       |  52 ++++++
 .../apache/tajo/engine/function/Country.java    |   6 +-
 .../tajo/engine/function/FunctionContext.java   |  22 +++
 .../tajo/engine/function/GeneralFunction.java   |  50 ++++++
 .../apache/tajo/engine/function/InCountry.java  |   6 +-
 .../tajo/engine/function/builtin/AvgDouble.java |   4 +-
 .../tajo/engine/function/builtin/AvgFloat.java  |   4 +-
 .../tajo/engine/function/builtin/AvgInt.java    |   4 +-
 .../tajo/engine/function/builtin/AvgLong.java   |   4 +-
 .../tajo/engine/function/builtin/CountRows.java |   4 +-
 .../engine/function/builtin/CountValue.java     |   2 +-
 .../function/builtin/CountValueDistinct.java    |   2 +-
 .../tajo/engine/function/builtin/Date.java      |   7 +-
 .../tajo/engine/function/builtin/MaxDouble.java |   4 +-
 .../tajo/engine/function/builtin/MaxFloat.java  |   4 +-
 .../tajo/engine/function/builtin/MaxInt.java    |   4 +-
 .../tajo/engine/function/builtin/MaxLong.java   |   4 +-
 .../tajo/engine/function/builtin/MinDouble.java |   4 +-
 .../tajo/engine/function/builtin/MinFloat.java  |   4 +-
 .../tajo/engine/function/builtin/MinInt.java    |   4 +-
 .../tajo/engine/function/builtin/MinLong.java   |   4 +-
 .../tajo/engine/function/builtin/MinString.java |   4 +-
 .../tajo/engine/function/builtin/RandomInt.java |   4 +-
 .../tajo/engine/function/builtin/SumDouble.java |   4 +-
 .../tajo/engine/function/builtin/SumFloat.java  |   4 +-
 .../tajo/engine/function/builtin/SumInt.java    |   4 +-
 .../tajo/engine/function/builtin/SumLong.java   |   4 +-
 .../tajo/engine/function/builtin/Today.java     |   5 +-
 .../engine/function/string/RegexpReplace.java   | 104 ++++++++++++
 .../tajo/engine/function/string/SplitPart.java  |   5 +-
 .../apache/tajo/engine/json/CoreGsonHelper.java |   4 +-
 .../apache/tajo/engine/planner/LogicalPlan.java |   4 +-
 .../tajo/engine/planner/LogicalPlanner.java     |  12 +-
 .../apache/tajo/engine/planner/PlannerUtil.java |  14 +-
 .../org/apache/tajo/master/GlobalPlanner.java   |   6 +-
 .../java/org/apache/tajo/master/TajoMaster.java |  10 ++
 .../apache/tajo/engine/eval/TestEvalTree.java   |   2 +-
 .../tajo/engine/eval/TestEvalTreeUtil.java      |   4 +-
 .../tajo/engine/function/TestAggFunction.java   |   1 -
 .../TestStringOperatorsAndFunctions.java        |  26 +++
 .../planner/physical/TestPhysicalPlanner.java   |  10 +-
 .../tajo/storage/json/StorageGsonHelper.java    |   7 -
 59 files changed, 724 insertions(+), 597 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 419e492..a148c20 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -4,6 +4,8 @@ Release 0.2.0 - unreleased
 
   NEW FEATURES
 
+    TAJO-211: Implement regexp_replace function. (hyunsik)
+
     TAJO-212: Implement type cast expresion. (hyunsik)
 
     TAJO-206: Implement String concatenation operator (||). (hyunsik)

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/function/AggFunction.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/function/AggFunction.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/function/AggFunction.java
deleted file mode 100644
index 6eb6a8b..0000000
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/function/AggFunction.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * 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.tajo.catalog.function;
-
-import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.json.CatalogGsonHelper;
-import org.apache.tajo.common.TajoDataTypes.DataType;
-import org.apache.tajo.datum.Datum;
-import org.apache.tajo.storage.Tuple;
-
-public abstract class AggFunction<T extends Datum> extends Function<T> {
-
-  public AggFunction(Column[] definedArgs) {
-    super(definedArgs);
-  }
-
-  public abstract FunctionContext newContext();
-
-  public abstract void eval(FunctionContext ctx, Tuple params);
-
-  public void merge(FunctionContext ctx, Tuple part) {
-    eval(ctx, part);
-  }
-
-  public abstract Datum getPartialResult(FunctionContext ctx);
-
-  public abstract DataType [] getPartialResultType();
-
-  public abstract T terminate(FunctionContext ctx);
-
-  @Override
-  public String toJson() {
-    return CatalogGsonHelper.toJson(this, AggFunction.class);
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/function/FunctionContext.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/function/FunctionContext.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/function/FunctionContext.java
deleted file mode 100644
index 39f60dd..0000000
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/function/FunctionContext.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * 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.tajo.catalog.function;
-
-public interface FunctionContext {
-}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/function/GeneralFunction.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/function/GeneralFunction.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/function/GeneralFunction.java
deleted file mode 100644
index 7f639ae..0000000
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/function/GeneralFunction.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * 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.tajo.catalog.function;
-
-import org.apache.tajo.json.GsonObject;
-import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.json.CatalogGsonHelper;
-import org.apache.tajo.datum.Datum;
-import org.apache.tajo.storage.Tuple;
-
-public abstract class GeneralFunction<T extends Datum> extends Function<T> implements GsonObject {
-  public GeneralFunction(Column[] definedArgs) {
-    super(definedArgs);
-  }
-
-  public abstract Datum eval(Tuple params);
-
-	public enum Type {
-	  AGG,
-	  GENERAL
-	}
-
-  @Override
-  public String toJson() {
-    return CatalogGsonHelper.toJson(this, GeneralFunction.class);
-  }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/CatalogGsonHelper.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/CatalogGsonHelper.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/CatalogGsonHelper.java
index a3e9e94..9f031f4 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/CatalogGsonHelper.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/CatalogGsonHelper.java
@@ -21,12 +21,9 @@ package org.apache.tajo.catalog.json;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import org.apache.hadoop.fs.Path;
-import org.apache.tajo.json.GsonObject;
 import org.apache.tajo.catalog.TableDesc;
 import org.apache.tajo.catalog.TableMeta;
-import org.apache.tajo.catalog.function.AggFunction;
 import org.apache.tajo.catalog.function.Function;
-import org.apache.tajo.catalog.function.GeneralFunction;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.json.*;
@@ -49,8 +46,6 @@ public class CatalogGsonHelper {
     adapters.put(TableDesc.class, new TableDescAdapter());
     adapters.put(TableMeta.class, new TableMetaAdapter());
     adapters.put(Function.class, new FunctionAdapter());
-    adapters.put(GeneralFunction.class, new FunctionAdapter());
-    adapters.put(AggFunction.class, new FunctionAdapter());
     adapters.put(Datum.class, new DatumAdapter());
     adapters.put(DataType.class, new DataTypeAdapter());
     return adapters;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestFunctionDesc.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestFunctionDesc.java b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestFunctionDesc.java
index 1ede050..8359453 100644
--- a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestFunctionDesc.java
+++ b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestFunctionDesc.java
@@ -18,15 +18,12 @@
 
 package org.apache.tajo.catalog;
 
-import org.apache.tajo.catalog.function.GeneralFunction;
+import org.apache.tajo.catalog.function.Function;
 import org.apache.tajo.catalog.json.CatalogGsonHelper;
 import org.apache.tajo.catalog.proto.CatalogProtos.FunctionDescProto;
 import org.apache.tajo.catalog.proto.CatalogProtos.FunctionType;
 import org.apache.tajo.common.TajoDataTypes.Type;
-import org.apache.tajo.datum.Datum;
-import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.exception.InternalException;
-import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.util.CommonTestingUtil;
 import org.apache.tajo.util.FileUtil;
 import org.junit.Test;
@@ -39,7 +36,7 @@ import static org.junit.Assert.*;
 public class TestFunctionDesc {
   private static final String TEST_PATH = "target/test-data/TestFunctionDesc";
 
-  public static class TestSum extends GeneralFunction {
+  public static class TestSum extends Function {
     private Integer x;
     private Integer y;
 
@@ -48,15 +45,8 @@ public class TestFunctionDesc {
           new Column("arg2", org.apache.tajo.common.TajoDataTypes.Type.INT4) });
     }
 
-    @Override
-    public Datum eval(Tuple params) {
-      x =  params.get(0).asInt4();
-      y =  params.get(1).asInt4();
-      return DatumFactory.createInt4(x + y);
-    }
-
     public String toJSON() {
-      return CatalogGsonHelper.toJson(this, GeneralFunction.class);
+      return CatalogGsonHelper.toJson(this, Function.class);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
index bc3bf4b..6c42439 100644
--- a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
+++ b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
@@ -19,18 +19,16 @@
 package org.apache.tajo.catalog;
 
 import org.apache.hadoop.fs.Path;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.apache.tajo.catalog.function.GeneralFunction;
+import org.apache.tajo.catalog.function.Function;
 import org.apache.tajo.catalog.proto.CatalogProtos.FunctionType;
 import org.apache.tajo.catalog.proto.CatalogProtos.IndexMethod;
 import org.apache.tajo.catalog.proto.CatalogProtos.StoreType;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
-import org.apache.tajo.datum.Datum;
-import org.apache.tajo.storage.Tuple;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
 
 import java.io.IOException;
 
@@ -82,8 +80,6 @@ public class TestCatalog {
 		catalog.addTable(meta);
 		assertTrue(catalog.existsTable("getTable"));
 		
-		TableDesc meta2 = catalog.getTableDesc("getTable");
-		
 		catalog.deleteTable("getTable");
 		assertFalse(catalog.existsTable("getTable"));
 	}
@@ -145,7 +141,7 @@ public class TestCatalog {
 	  catalog.deleteTable(desc.getName());
 	}
 	
-	public static class TestFunc1 extends GeneralFunction {
+	public static class TestFunc1 extends Function {
 		public TestFunc1() {
 			super(					
 					new Column [] {
@@ -153,15 +149,9 @@ public class TestCatalog {
 					}
 			);
 		}
-
-    @Override
-    public Datum eval(Tuple params) {
-      return params.get(0);
-    }
 	}
 
-  public static class TestFunc2 extends GeneralFunction {
-    private Datum param;
+  public static class TestFunc2 extends Function {
     public TestFunc2() {
       super(
           new Column [] {
@@ -170,11 +160,6 @@ public class TestCatalog {
           }
       );
     }
-
-    @Override
-    public Datum eval(Tuple params) {
-      return params.get(1);
-    }
   }
 
 	@Test

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/AggFuncCallEval.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/AggFuncCallEval.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/AggFuncCallEval.java
deleted file mode 100644
index 1282d1d..0000000
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/AggFuncCallEval.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/**
- * 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.tajo.engine.eval;
-
-import com.google.gson.annotations.Expose;
-import org.apache.tajo.catalog.FunctionDesc;
-import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.catalog.function.AggFunction;
-import org.apache.tajo.catalog.function.FunctionContext;
-import org.apache.tajo.common.TajoDataTypes.DataType;
-import org.apache.tajo.datum.Datum;
-import org.apache.tajo.storage.Tuple;
-import org.apache.tajo.storage.VTuple;
-
-public class AggFuncCallEval extends FuncEval implements Cloneable {
-  @Expose protected AggFunction instance;
-  @Expose boolean firstPhase = false;
-  private Tuple params;
-
-  public AggFuncCallEval(FunctionDesc desc, AggFunction instance, EvalNode[] givenArgs) {
-    super(EvalType.AGG_FUNCTION, desc, givenArgs);
-    this.instance = instance;
-  }
-
-  @Override
-  public EvalContext newContext() {
-    return new AggFunctionCtx(argEvals, instance.newContext());
-  }
-
-  @Override
-  public void eval(EvalContext ctx, Schema schema, Tuple tuple) {
-    AggFunctionCtx localCtx = (AggFunctionCtx) ctx;
-    if (params == null) {
-      this.params = new VTuple(argEvals.length);
-    }
-
-    if (argEvals != null) {
-      params.clear();
-
-      for (int i = 0; i < argEvals.length; i++) {
-        argEvals[i].eval(localCtx.argCtxs[i], schema, tuple);
-        params.put(i, argEvals[i].terminate(localCtx.argCtxs[i]));
-      }
-    }
-
-    if (firstPhase) {
-      instance.eval(localCtx.funcCtx, params);
-    } else {
-      instance.merge(localCtx.funcCtx, params);
-    }
-  }
-
-  @Override
-  public Datum terminate(EvalContext ctx) {
-    if (firstPhase) {
-      return instance.getPartialResult(((AggFunctionCtx)ctx).funcCtx);
-    } else {
-      return instance.terminate(((AggFunctionCtx)ctx).funcCtx);
-    }
-  }
-
-  @Override
-  public DataType[] getValueType() {
-    if (firstPhase) {
-      return instance.getPartialResultType();
-    } else {
-      return funcDesc.getReturnType();
-    }
-  }
-
-  public Object clone() throws CloneNotSupportedException {
-    return super.clone();
-  }
-
-  public void setFirstPhase() {
-    this.firstPhase = true;
-  }
-
-  protected class AggFunctionCtx extends FuncCallCtx {
-    FunctionContext funcCtx;
-
-    AggFunctionCtx(EvalNode [] argEvals, FunctionContext funcCtx) {
-      super(argEvals);
-      this.funcCtx = funcCtx;
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/AggregationFunctionCallEval.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/AggregationFunctionCallEval.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/AggregationFunctionCallEval.java
new file mode 100644
index 0000000..3f7431e
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/AggregationFunctionCallEval.java
@@ -0,0 +1,103 @@
+/**
+ * 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.tajo.engine.eval;
+
+import com.google.gson.annotations.Expose;
+import org.apache.tajo.catalog.FunctionDesc;
+import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
+import org.apache.tajo.common.TajoDataTypes.DataType;
+import org.apache.tajo.datum.Datum;
+import org.apache.tajo.storage.Tuple;
+import org.apache.tajo.storage.VTuple;
+
+public class AggregationFunctionCallEval extends FunctionEval implements Cloneable {
+  @Expose protected AggFunction instance;
+  @Expose boolean firstPhase = false;
+  private Tuple params;
+
+  public AggregationFunctionCallEval(FunctionDesc desc, AggFunction instance, EvalNode[] givenArgs) {
+    super(EvalType.AGG_FUNCTION, desc, givenArgs);
+    this.instance = instance;
+  }
+
+  @Override
+  public EvalContext newContext() {
+    return new AggFunctionCtx(argEvals, instance.newContext());
+  }
+
+  @Override
+  public void eval(EvalContext ctx, Schema schema, Tuple tuple) {
+    AggFunctionCtx localCtx = (AggFunctionCtx) ctx;
+    if (params == null) {
+      this.params = new VTuple(argEvals.length);
+    }
+
+    if (argEvals != null) {
+      params.clear();
+
+      for (int i = 0; i < argEvals.length; i++) {
+        argEvals[i].eval(localCtx.argCtxs[i], schema, tuple);
+        params.put(i, argEvals[i].terminate(localCtx.argCtxs[i]));
+      }
+    }
+
+    if (firstPhase) {
+      instance.eval(localCtx.funcCtx, params);
+    } else {
+      instance.merge(localCtx.funcCtx, params);
+    }
+  }
+
+  @Override
+  public Datum terminate(EvalContext ctx) {
+    if (firstPhase) {
+      return instance.getPartialResult(((AggFunctionCtx)ctx).funcCtx);
+    } else {
+      return instance.terminate(((AggFunctionCtx)ctx).funcCtx);
+    }
+  }
+
+  @Override
+  public DataType[] getValueType() {
+    if (firstPhase) {
+      return instance.getPartialResultType();
+    } else {
+      return funcDesc.getReturnType();
+    }
+  }
+
+  public Object clone() throws CloneNotSupportedException {
+    return super.clone();
+  }
+
+  public void setFirstPhase() {
+    this.firstPhase = true;
+  }
+
+  protected class AggFunctionCtx extends FuncCallCtx {
+    FunctionContext funcCtx;
+
+    AggFunctionCtx(EvalNode [] argEvals, FunctionContext funcCtx) {
+      super(argEvals);
+      this.funcCtx = funcCtx;
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/BasicEvalNodeVisitor.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/BasicEvalNodeVisitor.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/BasicEvalNodeVisitor.java
index 205e452..9755716 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/BasicEvalNodeVisitor.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/BasicEvalNodeVisitor.java
@@ -111,10 +111,10 @@ public class BasicEvalNodeVisitor<CONTEXT, RESULT> implements EvalNodeVisitor2<C
 
       // Functions
       case FUNCTION:
-        result = visitFuncCall(context, stack, (FuncCallEval) evalNode);
+        result = visitFuncCall(context, stack, (GeneralFunctionEval) evalNode);
         break;
       case AGG_FUNCTION:
-        result = visitAggrFuncCall(context, stack, (AggFuncCallEval) evalNode);
+        result = visitAggrFuncCall(context, stack, (AggregationFunctionCallEval) evalNode);
         break;
 
       default:
@@ -132,7 +132,7 @@ public class BasicEvalNodeVisitor<CONTEXT, RESULT> implements EvalNodeVisitor2<C
     return result;
   }
 
-  private RESULT visitDefaultFunctionEval(CONTEXT context, Stack<EvalNode> stack, FuncEval functionEval) {
+  private RESULT visitDefaultFunctionEval(CONTEXT context, Stack<EvalNode> stack, FunctionEval functionEval) {
     RESULT result = null;
     stack.push(functionEval);
     for (EvalNode arg : functionEval.getArgs()) {
@@ -287,12 +287,12 @@ public class BasicEvalNodeVisitor<CONTEXT, RESULT> implements EvalNodeVisitor2<C
   }
 
   @Override
-  public RESULT visitFuncCall(CONTEXT context, Stack<EvalNode> stack, FuncCallEval evalNode) {
+  public RESULT visitFuncCall(CONTEXT context, Stack<EvalNode> stack, GeneralFunctionEval evalNode) {
     return visitDefaultFunctionEval(context, stack, evalNode);
   }
 
   @Override
-  public RESULT visitAggrFuncCall(CONTEXT context, Stack<EvalNode> stack, AggFuncCallEval evalNode) {
+  public RESULT visitAggrFuncCall(CONTEXT context, Stack<EvalNode> stack, AggregationFunctionCallEval evalNode) {
     return visitDefaultFunctionEval(context, stack, evalNode);
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalNodeVisitor2.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalNodeVisitor2.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalNodeVisitor2.java
index 5c48008..209f45d 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalNodeVisitor2.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalNodeVisitor2.java
@@ -60,6 +60,6 @@ public interface EvalNodeVisitor2<CONTEXT, RESULT> {
   RESULT visitRegex(CONTEXT context, Stack<EvalNode> stack, RegexPredicateEval evalNode);
 
   // Functions
-  RESULT visitFuncCall(CONTEXT context, Stack<EvalNode> stack, FuncCallEval evalNode);
-  RESULT visitAggrFuncCall(CONTEXT context, Stack<EvalNode> stack, AggFuncCallEval evalNode);
+  RESULT visitFuncCall(CONTEXT context, Stack<EvalNode> stack, GeneralFunctionEval evalNode);
+  RESULT visitAggrFuncCall(CONTEXT context, Stack<EvalNode> stack, AggregationFunctionCallEval evalNode);
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalTreeUtil.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalTreeUtil.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalTreeUtil.java
index 6be0996..d8a0a82 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalTreeUtil.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalTreeUtil.java
@@ -326,25 +326,25 @@ public class EvalTreeUtil {
     }
   }
 
-  public static List<AggFuncCallEval> findDistinctAggFunction(EvalNode expr) {
+  public static List<AggregationFunctionCallEval> findDistinctAggFunction(EvalNode expr) {
     AllAggFunctionFinder finder = new AllAggFunctionFinder();
     expr.postOrder(finder);
     return Lists.newArrayList(finder.getAggregationFunction());
   }
 
   public static class AllAggFunctionFinder implements EvalNodeVisitor {
-    private Set<AggFuncCallEval> aggFucntions = Sets.newHashSet();
-    private AggFuncCallEval field = null;
+    private Set<AggregationFunctionCallEval> aggFucntions = Sets.newHashSet();
+    private AggregationFunctionCallEval field = null;
 
     @Override
     public void visit(EvalNode node) {
       if (node.getType() == EvalType.AGG_FUNCTION) {
-        field = (AggFuncCallEval) node;
+        field = (AggregationFunctionCallEval) node;
         aggFucntions.add(field);
       }
     }
 
-    public Set<AggFuncCallEval> getAggregationFunction() {
+    public Set<AggregationFunctionCallEval> getAggregationFunction() {
       return this.aggFucntions;
     }
   }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalType.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalType.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalType.java
index 9f81b05..cd80b3a 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalType.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalType.java
@@ -39,8 +39,8 @@ public enum EvalType {
   DIVIDE(BinaryEval.class, "/"),
 
   // Function
-  AGG_FUNCTION(AggFuncCallEval.class),
-  FUNCTION(FuncCallEval.class),
+  AGG_FUNCTION(AggregationFunctionCallEval.class),
+  FUNCTION(GeneralFunctionEval.class),
 
   // String operator or pattern matching predicates
   LIKE(LikePredicateEval.class),

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/FuncCallEval.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/FuncCallEval.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/FuncCallEval.java
deleted file mode 100644
index 2e7faaa..0000000
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/FuncCallEval.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * 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.tajo.engine.eval;
-
-import com.google.common.base.Objects;
-import com.google.gson.annotations.Expose;
-import org.apache.tajo.catalog.FunctionDesc;
-import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.catalog.function.GeneralFunction;
-import org.apache.tajo.datum.Datum;
-import org.apache.tajo.storage.Tuple;
-import org.apache.tajo.storage.VTuple;
-import org.apache.tajo.util.TUtil;
-
-public class FuncCallEval extends FuncEval {
-	@Expose protected GeneralFunction instance;
-  private Tuple tuple;
-  private Tuple params = null;
-  private Schema schema;
-
-	public FuncCallEval(FunctionDesc desc, GeneralFunction instance, EvalNode [] givenArgs) {
-		super(EvalType.FUNCTION, desc, givenArgs);
-		this.instance = instance;
-  }
-
-  /* (non-Javadoc)
-    * @see nta.query.executor.eval.Expr#evalVal(Tuple)
-    */
-	@Override
-	public void eval(EvalContext ctx, Schema schema, Tuple tuple) {
-    this.schema = schema;
-    this.tuple = tuple;
-	}
-
-  @Override
-  public Datum terminate(EvalContext ctx) {
-    FuncCallCtx localCtx = (FuncCallCtx) ctx;
-    if (this.params == null) {
-      params = new VTuple(argEvals.length);
-    }
-
-    if(argEvals != null) {
-      params.clear();
-      for(int i=0;i < argEvals.length; i++) {
-        argEvals[i].eval(localCtx.argCtxs[i], schema, tuple);
-        params.put(i, argEvals[i].terminate(localCtx.argCtxs[i]));
-      }
-    }
-    return instance.eval(params);
-  }
-	
-	@Override
-	public boolean equals(Object obj) {
-	  if (obj instanceof FuncCallEval) {
-      FuncCallEval other = (FuncCallEval) obj;
-      return super.equals(other) &&
-          TUtil.checkEquals(instance, other.instance);
-	  }
-	  
-	  return false;
-	}
-	
-	@Override
-	public int hashCode() {
-	  return Objects.hashCode(funcDesc, instance);
-	}
-	
-	@Override
-  public Object clone() throws CloneNotSupportedException {
-    FuncCallEval eval = (FuncCallEval) super.clone();
-    eval.instance = (GeneralFunction) instance.clone();
-    return eval;
-  }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/FuncEval.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/FuncEval.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/FuncEval.java
deleted file mode 100644
index afadaad..0000000
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/FuncEval.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/**
- * 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.tajo.engine.eval;
-
-import com.google.common.base.Objects;
-import com.google.gson.annotations.Expose;
-import org.apache.tajo.catalog.FunctionDesc;
-import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.common.TajoDataTypes.DataType;
-import org.apache.tajo.datum.Datum;
-import org.apache.tajo.storage.Tuple;
-import org.apache.tajo.util.TUtil;
-
-import static org.apache.tajo.catalog.proto.CatalogProtos.FunctionType.DISTINCT_AGGREGATION;
-import static org.apache.tajo.catalog.proto.CatalogProtos.FunctionType.DISTINCT_UDA;
-
-public abstract class FuncEval extends EvalNode implements Cloneable {
-	@Expose protected FunctionDesc funcDesc;
-	@Expose protected EvalNode [] argEvals;
-
-	public FuncEval(EvalType type, FunctionDesc funcDesc, EvalNode[] argEvals) {
-		super(type);
-		this.funcDesc = funcDesc;
-		this.argEvals = argEvals;
-	}
-
-  public boolean isDistinct() {
-    return funcDesc.getFuncType() == DISTINCT_AGGREGATION || funcDesc.getFuncType() == DISTINCT_UDA;
-  }
-
-  @Override
-  public EvalContext newContext() {
-    FuncCallCtx newCtx = new FuncCallCtx(argEvals);
-    return newCtx;
-  }
-	
-	public EvalNode [] getArgs() {
-	  return this.argEvals;
-	}
-
-  public void setArgs(EvalNode [] args) {
-    this.argEvals = args;
-  }
-	
-	public DataType [] getValueType() {
-		return this.funcDesc.getReturnType();
-	}
-
-	@Override
-	public abstract void eval(EvalContext ctx, Schema schema, Tuple tuple);
-
-  public abstract Datum terminate(EvalContext ctx);
-
-	@Override
-	public String getName() {
-		return funcDesc.getSignature();
-	}
-
-  @Override
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		for(int i=0; i < argEvals.length; i++) {
-			sb.append(argEvals[i]);
-			if(i+1 < argEvals.length)
-				sb.append(",");
-		}
-		return funcDesc.getSignature()+"("+sb+")";
-	}
-	
-	@Override
-	public boolean equals(Object obj) {
-	  if (obj instanceof FuncEval) {
-      FuncEval other = (FuncEval) obj;
-
-      boolean b1 = this.type == other.type;
-      boolean b2 = TUtil.checkEquals(funcDesc, other.funcDesc);
-      boolean b3 = TUtil.checkEquals(argEvals, other.argEvals);
-      return b1 && b2 && b3;
-	  }
-	  
-	  return false;
-	}
-	
-	@Override
-	public int hashCode() {
-	  return Objects.hashCode(funcDesc, argEvals);
-	}
-	
-	@Override
-  public Object clone() throws CloneNotSupportedException {
-    FuncEval eval = (FuncEval) super.clone();
-    eval.funcDesc = (FunctionDesc) funcDesc.clone();
-    eval.argEvals = new EvalNode[argEvals.length];
-    for (int i = 0; i < argEvals.length; i++) {
-      eval.argEvals[i] = (EvalNode) argEvals[i].clone();
-    }    
-    return eval;
-  }
-	
-	@Override
-  public void preOrder(EvalNodeVisitor visitor) {
-    for (EvalNode eval : argEvals) {
-      eval.postOrder(visitor);
-    }
-    visitor.visit(this);
-  }
-	
-	@Override
-	public void postOrder(EvalNodeVisitor visitor) {
-	  for (EvalNode eval : argEvals) {
-	    eval.postOrder(visitor);
-	  }
-	  visitor.visit(this);
-	}
-
-  protected class FuncCallCtx implements EvalContext {
-    EvalContext [] argCtxs;
-    FuncCallCtx(EvalNode [] argEvals) {
-      argCtxs = new EvalContext[argEvals.length];
-      for (int i = 0; i < argEvals.length; i++) {
-        argCtxs[i] = argEvals[i].newContext();
-      }
-    }
-  }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/FunctionEval.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/FunctionEval.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/FunctionEval.java
new file mode 100644
index 0000000..eea2b9c
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/FunctionEval.java
@@ -0,0 +1,162 @@
+/**
+ * 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.tajo.engine.eval;
+
+import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import org.apache.tajo.catalog.FunctionDesc;
+import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.common.TajoDataTypes;
+import org.apache.tajo.common.TajoDataTypes.DataType;
+import org.apache.tajo.datum.Datum;
+import org.apache.tajo.storage.Tuple;
+import org.apache.tajo.util.TUtil;
+
+import static org.apache.tajo.catalog.proto.CatalogProtos.FunctionType.DISTINCT_AGGREGATION;
+import static org.apache.tajo.catalog.proto.CatalogProtos.FunctionType.DISTINCT_UDA;
+
+public abstract class FunctionEval extends EvalNode implements Cloneable {
+  public static enum ParamType {
+    CONSTANT, VARIABLE, NULL
+  }
+
+  @Expose protected FunctionDesc funcDesc;
+	@Expose protected EvalNode [] argEvals;
+
+	public FunctionEval(EvalType type, FunctionDesc funcDesc, EvalNode[] argEvals) {
+		super(type);
+		this.funcDesc = funcDesc;
+		this.argEvals = argEvals;
+	}
+
+  public ParamType [] getParamType() {
+    ParamType [] paramTypes = new ParamType[argEvals.length];
+    for (int i = 0; i < argEvals.length; i++) {
+      if (argEvals[i].getType() == EvalType.CONST) {
+        if (argEvals[i].getValueType()[0].getType() == TajoDataTypes.Type.NULL) {
+          paramTypes[i] = ParamType.NULL;
+        } else {
+          paramTypes[i] = ParamType.CONSTANT;
+        }
+      } else {
+        paramTypes[i] = ParamType.VARIABLE;
+      }
+    }
+    return paramTypes;
+  }
+
+  public boolean isDistinct() {
+    return funcDesc.getFuncType() == DISTINCT_AGGREGATION || funcDesc.getFuncType() == DISTINCT_UDA;
+  }
+
+  @Override
+  public EvalContext newContext() {
+    FuncCallCtx newCtx = new FuncCallCtx(argEvals);
+    return newCtx;
+  }
+	
+	public EvalNode [] getArgs() {
+	  return this.argEvals;
+	}
+
+  public void setArgs(EvalNode [] args) {
+    this.argEvals = args;
+  }
+	
+	public DataType [] getValueType() {
+		return this.funcDesc.getReturnType();
+	}
+
+	@Override
+	public abstract void eval(EvalContext ctx, Schema schema, Tuple tuple);
+
+  public abstract Datum terminate(EvalContext ctx);
+
+	@Override
+	public String getName() {
+		return funcDesc.getSignature();
+	}
+
+  @Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		for(int i=0; i < argEvals.length; i++) {
+			sb.append(argEvals[i]);
+			if(i+1 < argEvals.length)
+				sb.append(",");
+		}
+		return funcDesc.getSignature()+"("+sb+")";
+	}
+	
+	@Override
+	public boolean equals(Object obj) {
+	  if (obj instanceof FunctionEval) {
+      FunctionEval other = (FunctionEval) obj;
+
+      boolean b1 = this.type == other.type;
+      boolean b2 = TUtil.checkEquals(funcDesc, other.funcDesc);
+      boolean b3 = TUtil.checkEquals(argEvals, other.argEvals);
+      return b1 && b2 && b3;
+	  }
+	  
+	  return false;
+	}
+	
+	@Override
+	public int hashCode() {
+	  return Objects.hashCode(funcDesc, argEvals);
+	}
+	
+	@Override
+  public Object clone() throws CloneNotSupportedException {
+    FunctionEval eval = (FunctionEval) super.clone();
+    eval.funcDesc = (FunctionDesc) funcDesc.clone();
+    eval.argEvals = new EvalNode[argEvals.length];
+    for (int i = 0; i < argEvals.length; i++) {
+      eval.argEvals[i] = (EvalNode) argEvals[i].clone();
+    }    
+    return eval;
+  }
+	
+	@Override
+  public void preOrder(EvalNodeVisitor visitor) {
+    for (EvalNode eval : argEvals) {
+      eval.postOrder(visitor);
+    }
+    visitor.visit(this);
+  }
+	
+	@Override
+	public void postOrder(EvalNodeVisitor visitor) {
+	  for (EvalNode eval : argEvals) {
+	    eval.postOrder(visitor);
+	  }
+	  visitor.visit(this);
+	}
+
+  protected class FuncCallCtx implements EvalContext {
+    EvalContext [] argCtxs;
+    FuncCallCtx(EvalNode [] argEvals) {
+      argCtxs = new EvalContext[argEvals.length];
+      for (int i = 0; i < argEvals.length; i++) {
+        argCtxs[i] = argEvals[i].newContext();
+      }
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/GeneralFunctionEval.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/GeneralFunctionEval.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/GeneralFunctionEval.java
new file mode 100644
index 0000000..aeb68aa
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/GeneralFunctionEval.java
@@ -0,0 +1,91 @@
+/**
+ * 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.tajo.engine.eval;
+
+import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import org.apache.tajo.catalog.FunctionDesc;
+import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.datum.Datum;
+import org.apache.tajo.storage.Tuple;
+import org.apache.tajo.storage.VTuple;
+import org.apache.tajo.util.TUtil;
+
+public class GeneralFunctionEval extends FunctionEval {
+  @Expose protected GeneralFunction instance;
+  private Tuple tuple;
+  private Tuple params = null;
+  private Schema schema;
+
+	public GeneralFunctionEval(FunctionDesc desc, GeneralFunction instance, EvalNode[] givenArgs) {
+		super(EvalType.FUNCTION, desc, givenArgs);
+		this.instance = instance;
+    this.instance.init(getParamType());
+  }
+
+  /* (non-Javadoc)
+    * @see nta.query.executor.eval.Expr#evalVal(Tuple)
+    */
+	@Override
+	public void eval(EvalContext ctx, Schema schema, Tuple tuple) {
+    this.schema = schema;
+    this.tuple = tuple;
+	}
+
+  @Override
+  public Datum terminate(EvalContext ctx) {
+    FuncCallCtx localCtx = (FuncCallCtx) ctx;
+    if (this.params == null) {
+      params = new VTuple(argEvals.length);
+    }
+
+    if(argEvals != null) {
+      params.clear();
+      for(int i=0;i < argEvals.length; i++) {
+        argEvals[i].eval(localCtx.argCtxs[i], schema, tuple);
+        params.put(i, argEvals[i].terminate(localCtx.argCtxs[i]));
+      }
+    }
+    return instance.eval(params);
+  }
+	
+	@Override
+	public boolean equals(Object obj) {
+	  if (obj instanceof GeneralFunctionEval) {
+      GeneralFunctionEval other = (GeneralFunctionEval) obj;
+      return super.equals(other) &&
+          TUtil.checkEquals(instance, other.instance);
+	  }
+	  
+	  return false;
+	}
+	
+	@Override
+	public int hashCode() {
+	  return Objects.hashCode(funcDesc, instance);
+	}
+	
+	@Override
+  public Object clone() throws CloneNotSupportedException {
+    GeneralFunctionEval eval = (GeneralFunctionEval) super.clone();
+    eval.instance = (GeneralFunction) instance.clone();
+    return eval;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/AggFunction.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/AggFunction.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/AggFunction.java
new file mode 100644
index 0000000..a79df8e
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/AggFunction.java
@@ -0,0 +1,52 @@
+/**
+ * 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.tajo.engine.function;
+
+import org.apache.tajo.catalog.Column;
+import org.apache.tajo.catalog.function.Function;
+import org.apache.tajo.catalog.json.CatalogGsonHelper;
+import org.apache.tajo.common.TajoDataTypes.DataType;
+import org.apache.tajo.datum.Datum;
+import org.apache.tajo.storage.Tuple;
+
+public abstract class AggFunction<T extends Datum> extends Function<T> {
+
+  public AggFunction(Column[] definedArgs) {
+    super(definedArgs);
+  }
+
+  public abstract FunctionContext newContext();
+
+  public abstract void eval(FunctionContext ctx, Tuple params);
+
+  public void merge(FunctionContext ctx, Tuple part) {
+    eval(ctx, part);
+  }
+
+  public abstract Datum getPartialResult(FunctionContext ctx);
+
+  public abstract DataType [] getPartialResultType();
+
+  public abstract T terminate(FunctionContext ctx);
+
+  @Override
+  public String toJson() {
+    return CatalogGsonHelper.toJson(this, AggFunction.class);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/Country.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/Country.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/Country.java
index fe0c6c1..672a358 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/Country.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/Country.java
@@ -19,22 +19,20 @@
 package org.apache.tajo.engine.function;
 
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.GeneralFunction;
-import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.TextDatum;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.util.GeoUtil;
 
 import static org.apache.tajo.common.TajoDataTypes.Type.TEXT;
 
-public class Country extends GeneralFunction<TextDatum> {
+public class Country extends GeneralFunction {
 
   public Country() {
     super(new Column[] {new Column("addr", TEXT)});
   }
 
   @Override
-  public Datum eval(Tuple params) {
+  public TextDatum eval(Tuple params) {
     return new TextDatum(GeoUtil.getCountryCode(params.get(0).asChars()));
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/FunctionContext.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/FunctionContext.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/FunctionContext.java
new file mode 100644
index 0000000..076c8ec
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/FunctionContext.java
@@ -0,0 +1,22 @@
+/**
+ * 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.tajo.engine.function;
+
+public interface FunctionContext {
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/GeneralFunction.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/GeneralFunction.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/GeneralFunction.java
new file mode 100644
index 0000000..aa43b12
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/GeneralFunction.java
@@ -0,0 +1,50 @@
+/**
+ * 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.tajo.engine.function;
+
+import org.apache.tajo.catalog.Column;
+import org.apache.tajo.catalog.function.Function;
+import org.apache.tajo.catalog.json.CatalogGsonHelper;
+import org.apache.tajo.datum.Datum;
+import org.apache.tajo.engine.eval.FunctionEval;
+import org.apache.tajo.json.GsonObject;
+import org.apache.tajo.storage.Tuple;
+
+public abstract class GeneralFunction extends Function implements GsonObject {
+  public GeneralFunction(Column[] definedArgs) {
+    super(definedArgs);
+  }
+
+  /**
+   * This method gives hints to an actual function instance.
+   */
+  public void init(FunctionEval.ParamType [] paramTypes) {}
+
+  public abstract Datum eval(Tuple params);
+
+	public enum Type {
+	  AGG,
+	  GENERAL
+	}
+
+  @Override
+  public String toJson() {
+    return CatalogGsonHelper.toJson(this, GeneralFunction.class);
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/InCountry.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/InCountry.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/InCountry.java
index 75c52f1..0043a12 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/InCountry.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/InCountry.java
@@ -19,14 +19,12 @@
 package org.apache.tajo.engine.function;
 
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.GeneralFunction;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.BooleanDatum;
-import org.apache.tajo.datum.Datum;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.util.GeoUtil;
 
-public class InCountry extends GeneralFunction<BooleanDatum> {
+public class InCountry extends GeneralFunction {
 
   public InCountry() {
     super(new Column[] {new Column("addr", TajoDataTypes.Type.TEXT),
@@ -34,7 +32,7 @@ public class InCountry extends GeneralFunction<BooleanDatum> {
   }
 
   @Override
-  public Datum eval(Tuple params) {
+  public BooleanDatum eval(Tuple params) {
     String addr = params.get(0).asChars();
     String otherCode = params.get(1).asChars();
     String thisCode = GeoUtil.getCountryCode(addr);

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgDouble.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgDouble.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgDouble.java
index 44ad3b1..5441726 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgDouble.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgDouble.java
@@ -20,8 +20,8 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.AggFunction;
-import org.apache.tajo.catalog.function.FunctionContext;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.ArrayDatum;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgFloat.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgFloat.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgFloat.java
index c1ac80c..a245eab 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgFloat.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgFloat.java
@@ -20,8 +20,8 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.AggFunction;
-import org.apache.tajo.catalog.function.FunctionContext;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.ArrayDatum;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgInt.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgInt.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgInt.java
index f7f528e..c34c890 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgInt.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgInt.java
@@ -20,8 +20,8 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.AggFunction;
-import org.apache.tajo.catalog.function.FunctionContext;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.ArrayDatum;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgLong.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgLong.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgLong.java
index bc7e984..1dc2084 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgLong.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgLong.java
@@ -20,8 +20,8 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.AggFunction;
-import org.apache.tajo.catalog.function.FunctionContext;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.ArrayDatum;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountRows.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountRows.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountRows.java
index 41d27e0..8f97ccc 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountRows.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountRows.java
@@ -20,8 +20,8 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.AggFunction;
-import org.apache.tajo.catalog.function.FunctionContext;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountValue.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountValue.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountValue.java
index 608c612..5959197 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountValue.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountValue.java
@@ -19,7 +19,7 @@
 package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.FunctionContext;
+import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountValueDistinct.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountValueDistinct.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountValueDistinct.java
index 05850be..4c4900b 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountValueDistinct.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountValueDistinct.java
@@ -19,7 +19,7 @@
 package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.FunctionContext;
+import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/Date.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/Date.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/Date.java
index e3f4af6..cbc789c 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/Date.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/Date.java
@@ -21,8 +21,7 @@ package org.apache.tajo.engine.function.builtin;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.GeneralFunction;
-import org.apache.tajo.datum.Datum;
+import org.apache.tajo.engine.function.GeneralFunction;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.Int8Datum;
 import org.apache.tajo.storage.Tuple;
@@ -32,7 +31,7 @@ import java.text.SimpleDateFormat;
 
 import static org.apache.tajo.common.TajoDataTypes.Type.TEXT;
 
-public class Date extends GeneralFunction<Int8Datum> {
+public class Date extends GeneralFunction {
   private final Log LOG = LogFactory.getLog(Date.class);
   private final static String dateFormat = "dd/MM/yyyy HH:mm:ss";
 
@@ -41,7 +40,7 @@ public class Date extends GeneralFunction<Int8Datum> {
   }
 
   @Override
-  public Datum eval(Tuple params) {
+  public Int8Datum eval(Tuple params) {
     try {
       return DatumFactory.createInt8(new SimpleDateFormat(dateFormat)
           .parse(params.get(0).asChars()).getTime());

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxDouble.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxDouble.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxDouble.java
index 419362e..0410150 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxDouble.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxDouble.java
@@ -20,8 +20,8 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.AggFunction;
-import org.apache.tajo.catalog.function.FunctionContext;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxFloat.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxFloat.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxFloat.java
index 9a85faf..d25288d 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxFloat.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxFloat.java
@@ -20,8 +20,8 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.AggFunction;
-import org.apache.tajo.catalog.function.FunctionContext;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxInt.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxInt.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxInt.java
index 34ef0f5..75889e7 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxInt.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxInt.java
@@ -20,8 +20,8 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.AggFunction;
-import org.apache.tajo.catalog.function.FunctionContext;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxLong.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxLong.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxLong.java
index 1364cf1..24e7b07 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxLong.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxLong.java
@@ -20,8 +20,8 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.AggFunction;
-import org.apache.tajo.catalog.function.FunctionContext;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinDouble.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinDouble.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinDouble.java
index 5a7a604..72af4a3 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinDouble.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinDouble.java
@@ -20,8 +20,8 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.AggFunction;
-import org.apache.tajo.catalog.function.FunctionContext;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinFloat.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinFloat.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinFloat.java
index 302a586..1937f07 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinFloat.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinFloat.java
@@ -20,8 +20,8 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.AggFunction;
-import org.apache.tajo.catalog.function.FunctionContext;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinInt.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinInt.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinInt.java
index 4aff484..13d3745 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinInt.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinInt.java
@@ -20,8 +20,8 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.AggFunction;
-import org.apache.tajo.catalog.function.FunctionContext;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinLong.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinLong.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinLong.java
index 932b88e..8641895 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinLong.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinLong.java
@@ -20,8 +20,8 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.AggFunction;
-import org.apache.tajo.catalog.function.FunctionContext;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinString.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinString.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinString.java
index 4a5f258..f771229 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinString.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinString.java
@@ -20,8 +20,8 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.AggFunction;
-import org.apache.tajo.catalog.function.FunctionContext;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/RandomInt.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/RandomInt.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/RandomInt.java
index 3ffddfe..304bd44 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/RandomInt.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/RandomInt.java
@@ -19,7 +19,7 @@
 package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.GeneralFunction;
+import org.apache.tajo.engine.function.GeneralFunction;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.storage.Tuple;
@@ -28,7 +28,7 @@ import java.util.Random;
 
 import static org.apache.tajo.common.TajoDataTypes.Type.INT4;
 
-public class RandomInt extends GeneralFunction<Datum> {
+public class RandomInt extends GeneralFunction {
   private Random random;
 
   public RandomInt() {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumDouble.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumDouble.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumDouble.java
index 277a3bf..c10cf1d 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumDouble.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumDouble.java
@@ -20,8 +20,8 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.AggFunction;
-import org.apache.tajo.catalog.function.FunctionContext;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumFloat.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumFloat.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumFloat.java
index 251c98d..40842e8 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumFloat.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumFloat.java
@@ -20,8 +20,8 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.AggFunction;
-import org.apache.tajo.catalog.function.FunctionContext;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumInt.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumInt.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumInt.java
index c1e607b..19b58b4 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumInt.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumInt.java
@@ -20,8 +20,8 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.AggFunction;
-import org.apache.tajo.catalog.function.FunctionContext;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumLong.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumLong.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumLong.java
index 3e800a5..260566e 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumLong.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumLong.java
@@ -20,8 +20,8 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.AggFunction;
-import org.apache.tajo.catalog.function.FunctionContext;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/406337d9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/Today.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/Today.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/Today.java
index c6a8518..e283c2f 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/Today.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/Today.java
@@ -19,13 +19,12 @@
 package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.function.GeneralFunction;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
-import org.apache.tajo.datum.Int8Datum;
+import org.apache.tajo.engine.function.GeneralFunction;
 import org.apache.tajo.storage.Tuple;
 
-public class Today extends GeneralFunction<Int8Datum> {
+public class Today extends GeneralFunction {
 
   public Today() {
     super(new Column[] {});