You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by hj...@apache.org on 2014/10/26 20:27:35 UTC

[29/35] TAJO-1125: Separate logical plan and optimizer into a maven module.

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/BitLength.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/BitLength.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/BitLength.java
index 3a5c216..c099c77 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/BitLength.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/BitLength.java
@@ -23,7 +23,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/CharLength.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/CharLength.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/CharLength.java
index 76d3b55..b287c93 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/CharLength.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/CharLength.java
@@ -23,7 +23,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Chr.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Chr.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Chr.java
index fac4b27..4d0a4a9 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Chr.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Chr.java
@@ -23,7 +23,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat.java
index 50b1440..3268817 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat.java
@@ -23,7 +23,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat_ws.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat_ws.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat_ws.java
index d8e2113..4a723cb 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat_ws.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat_ws.java
@@ -25,7 +25,7 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.datum.TextDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Decode.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Decode.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Decode.java
index 13f0749..72d3501 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Decode.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Decode.java
@@ -25,7 +25,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Digest.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Digest.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Digest.java
index 163c6fe..3de914a 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Digest.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Digest.java
@@ -23,7 +23,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Encode.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Encode.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Encode.java
index 0023ae6..4cdbc24 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Encode.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Encode.java
@@ -25,7 +25,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/FindInSet.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/FindInSet.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/FindInSet.java
index 0c3e221..ced7d4e 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/FindInSet.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/FindInSet.java
@@ -23,7 +23,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/InitCap.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/InitCap.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/InitCap.java
index 4347dbb..35bb164 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/InitCap.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/InitCap.java
@@ -24,7 +24,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/LTrim.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/LTrim.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/LTrim.java
index db6b714..f345293 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/LTrim.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/LTrim.java
@@ -25,10 +25,10 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.eval.FunctionEval;
-import org.apache.tajo.engine.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
+import org.apache.tajo.plan.expr.FunctionEval;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.storage.Tuple;
 
 /**

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Left.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Left.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Left.java
index 31469f5..bf3fbfb 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Left.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Left.java
@@ -24,7 +24,7 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.datum.TextDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Length.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Length.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Length.java
index 389f358..39bdd2f 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Length.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Length.java
@@ -23,7 +23,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Locate.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Locate.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Locate.java
index 67ee389..7b70399 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Locate.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Locate.java
@@ -24,7 +24,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Lower.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Lower.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Lower.java
index 80c8192..7c1e33e 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Lower.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Lower.java
@@ -23,7 +23,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Lpad.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Lpad.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Lpad.java
index bc0031e..58c0951 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Lpad.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Lpad.java
@@ -25,10 +25,10 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.eval.FunctionEval;
-import org.apache.tajo.engine.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
+import org.apache.tajo.plan.expr.FunctionEval;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.storage.Tuple;
 
 /**

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Md5.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Md5.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Md5.java
index fb5f73c..f4cb7cb 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Md5.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Md5.java
@@ -23,7 +23,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/OctetLength.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/OctetLength.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/OctetLength.java
index dc71907..cb5af15 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/OctetLength.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/OctetLength.java
@@ -23,7 +23,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/QuoteIdent.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/QuoteIdent.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/QuoteIdent.java
index d5237d7..aaef10d 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/QuoteIdent.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/QuoteIdent.java
@@ -23,7 +23,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/RTrim.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/RTrim.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/RTrim.java
index 9e3ff8d..8e295fa 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/RTrim.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/RTrim.java
@@ -25,10 +25,10 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.eval.FunctionEval;
-import org.apache.tajo.engine.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
+import org.apache.tajo.plan.expr.FunctionEval;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.storage.Tuple;
 
 /**

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/RegexpReplace.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/RegexpReplace.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/RegexpReplace.java
index 2b59d34..da06f73 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/RegexpReplace.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/RegexpReplace.java
@@ -20,17 +20,20 @@ package org.apache.tajo.engine.function.string;
 
 import com.google.gson.annotations.Expose;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.engine.function.GeneralFunction;
 import org.apache.tajo.common.TajoDataTypes;
-import org.apache.tajo.datum.*;
+import org.apache.tajo.datum.BooleanDatum;
+import org.apache.tajo.datum.Datum;
+import org.apache.tajo.datum.DatumFactory;
+import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.storage.Tuple;
 
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import static org.apache.tajo.engine.eval.FunctionEval.ParamType;
+import static org.apache.tajo.plan.expr.FunctionEval.ParamType;
 
 /**
  * This function is defined as:
@@ -67,7 +70,7 @@ public class RegexpReplace extends GeneralFunction {
     });
   }
 
-  public void init(ParamType [] paramTypes) {
+  public void init(ParamType[] paramTypes) {
     if (paramTypes[0] == ParamType.NULL || paramTypes[1] == ParamType.NULL || paramTypes[2] == ParamType.NULL) {
       isAlwaysNull = true;
     } else if (paramTypes[1] == ParamType.CONSTANT) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Repeat.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Repeat.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Repeat.java
index 4c52a6e..c02ef66 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Repeat.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Repeat.java
@@ -23,7 +23,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Reverse.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Reverse.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Reverse.java
index a77ba69..bf67294 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Reverse.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Reverse.java
@@ -23,7 +23,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Right.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Right.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Right.java
index aa0dad0..68af423 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Right.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Right.java
@@ -24,7 +24,7 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.datum.TextDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Rpad.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Rpad.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Rpad.java
index 225777b..9d42848 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Rpad.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Rpad.java
@@ -25,10 +25,10 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.eval.FunctionEval;
-import org.apache.tajo.engine.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
+import org.apache.tajo.plan.expr.FunctionEval;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.storage.Tuple;
 
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/SplitPart.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/SplitPart.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/SplitPart.java
index fd1de55..1c3be00 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/SplitPart.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/SplitPart.java
@@ -20,7 +20,7 @@ package org.apache.tajo.engine.function.string;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/StrPos.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/StrPos.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/StrPos.java
index d6f88de..9c3e4f1 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/StrPos.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/StrPos.java
@@ -23,7 +23,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/StrPosb.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/StrPosb.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/StrPosb.java
index 56fb3a1..c332006 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/StrPosb.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/StrPosb.java
@@ -23,7 +23,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Substr.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Substr.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Substr.java
index 74492b1..7e4ddd6 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Substr.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Substr.java
@@ -23,7 +23,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/ToBin.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/ToBin.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/ToBin.java
index 3048aa8..a9f85f3 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/ToBin.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/ToBin.java
@@ -22,7 +22,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/ToHex.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/ToHex.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/ToHex.java
index a8624ab..2e20008 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/ToHex.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/ToHex.java
@@ -24,7 +24,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Upper.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Upper.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Upper.java
index 47d38ba..fc6ff3a 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Upper.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Upper.java
@@ -23,7 +23,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/window/Rank.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/window/Rank.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/window/Rank.java
index e461f9d..0df3f23 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/window/Rank.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/window/Rank.java
@@ -24,8 +24,8 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.Int8Datum;
-import org.apache.tajo.engine.function.FunctionContext;
-import org.apache.tajo.engine.function.WindowAggFunc;
+import org.apache.tajo.plan.function.FunctionContext;
+import org.apache.tajo.plan.function.WindowAggFunc;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/function/window/RowNumber.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/window/RowNumber.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/window/RowNumber.java
index 8b0943f..bd838f8 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/window/RowNumber.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/window/RowNumber.java
@@ -23,8 +23,8 @@ import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.Int8Datum;
-import org.apache.tajo.engine.function.FunctionContext;
-import org.apache.tajo.engine.function.WindowAggFunc;
+import org.apache.tajo.plan.function.FunctionContext;
+import org.apache.tajo.plan.function.WindowAggFunc;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/json/CoreGsonHelper.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/json/CoreGsonHelper.java b/tajo-core/src/main/java/org/apache/tajo/engine/json/CoreGsonHelper.java
index 0340a32..57f2536 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/json/CoreGsonHelper.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/json/CoreGsonHelper.java
@@ -22,16 +22,18 @@ import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import org.apache.hadoop.fs.Path;
 import org.apache.tajo.catalog.TableMeta;
-import org.apache.tajo.function.Function;
 import org.apache.tajo.catalog.json.FunctionAdapter;
 import org.apache.tajo.catalog.json.TableMetaAdapter;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.datum.Datum;
-import org.apache.tajo.engine.eval.EvalNode;
-import org.apache.tajo.engine.function.AggFunction;
-import org.apache.tajo.engine.function.GeneralFunction;
-import org.apache.tajo.engine.planner.logical.LogicalNode;
+import org.apache.tajo.plan.expr.EvalNode;
+import org.apache.tajo.plan.function.AggFunction;
+import org.apache.tajo.plan.function.GeneralFunction;
+import org.apache.tajo.plan.logical.LogicalNode;
+import org.apache.tajo.function.Function;
 import org.apache.tajo.json.*;
+import org.apache.tajo.plan.serder.EvalNodeAdapter;
+import org.apache.tajo.plan.serder.LogicalNodeAdapter;
 import org.apache.tajo.util.TUtil;
 
 import java.lang.reflect.Type;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/json/EvalNodeAdapter.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/json/EvalNodeAdapter.java b/tajo-core/src/main/java/org/apache/tajo/engine/json/EvalNodeAdapter.java
deleted file mode 100644
index 56600a6..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/json/EvalNodeAdapter.java
+++ /dev/null
@@ -1,50 +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.json;
-
-import com.google.gson.*;
-import org.apache.tajo.engine.eval.EvalNode;
-import org.apache.tajo.engine.eval.EvalType;
-import org.apache.tajo.json.GsonSerDerAdapter;
-
-import java.lang.reflect.Type;
-
-public class EvalNodeAdapter implements GsonSerDerAdapter<EvalNode> {
-
-  @Override
-  public EvalNode deserialize(JsonElement json, Type type,
-                              JsonDeserializationContext ctx) throws JsonParseException {
-    JsonObject jsonObject = json.getAsJsonObject();
-    String nodeName = jsonObject.get("type").getAsString();
-    Class clazz = EvalType.valueOf(nodeName).getBaseClass();
-    return ctx.deserialize(jsonObject.get("body"), clazz);
-  }
-
-  @Override
-  public JsonElement serialize(EvalNode evalNode, Type type,
-                               JsonSerializationContext ctx) {
-    JsonObject json = new JsonObject();
-    json.addProperty("type", evalNode.getType().name());
-    json.add("body", ctx.serialize(evalNode));
-    return json;
-  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/json/LogicalNodeAdapter.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/json/LogicalNodeAdapter.java b/tajo-core/src/main/java/org/apache/tajo/engine/json/LogicalNodeAdapter.java
deleted file mode 100644
index e2becef..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/json/LogicalNodeAdapter.java
+++ /dev/null
@@ -1,50 +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.json;
-
-import com.google.gson.*;
-import org.apache.tajo.engine.planner.logical.LogicalNode;
-import org.apache.tajo.engine.planner.logical.NodeType;
-import org.apache.tajo.json.GsonSerDerAdapter;
-
-import java.lang.reflect.Type;
-
-public class LogicalNodeAdapter implements GsonSerDerAdapter<LogicalNode> {
-
-  @Override
-  public LogicalNode deserialize(JsonElement src, Type type,
-                                 JsonDeserializationContext ctx) throws JsonParseException {
-    JsonObject jsonObject = src.getAsJsonObject();
-    String nodeName = jsonObject.get("type").getAsString();
-    Class clazz = NodeType.valueOf(nodeName).getBaseClass();
-    return ctx.deserialize(jsonObject.get("body"), clazz);
-  }
-
-  @Override
-  public JsonElement serialize(LogicalNode src, Type typeOfSrc,
-                               JsonSerializationContext context) {
-    JsonObject json = new JsonObject();
-    json.addProperty("type", src.getType().name());
-    json.add("body", context.serialize(src));
-    return json;
-  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/optimizer/eval/EvalTreeOptimizationRule.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/optimizer/eval/EvalTreeOptimizationRule.java b/tajo-core/src/main/java/org/apache/tajo/engine/optimizer/eval/EvalTreeOptimizationRule.java
deleted file mode 100644
index 2f17663..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/optimizer/eval/EvalTreeOptimizationRule.java
+++ /dev/null
@@ -1,27 +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.optimizer.eval;
-
-import org.apache.tajo.engine.eval.EvalNode;
-import org.apache.tajo.engine.planner.LogicalPlanner;
-
-@Prioritized
-public interface EvalTreeOptimizationRule {
-  public EvalNode optimize(LogicalPlanner.PlanContext context, EvalNode tree);
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/optimizer/eval/EvalTreeOptimizer.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/optimizer/eval/EvalTreeOptimizer.java b/tajo-core/src/main/java/org/apache/tajo/engine/optimizer/eval/EvalTreeOptimizer.java
deleted file mode 100644
index 3ed272e..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/optimizer/eval/EvalTreeOptimizer.java
+++ /dev/null
@@ -1,78 +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.optimizer.eval;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Lists;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.tajo.engine.eval.EvalNode;
-import org.apache.tajo.engine.planner.LogicalPlanner;
-import org.apache.tajo.util.ClassUtil;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Set;
-
-public class EvalTreeOptimizer {
-  private static final Log LOG = LogFactory.getLog(EvalTreeOptimizer.class);
-
-  private List<EvalTreeOptimizationRule> rules = Lists.newArrayList();
-
-  public EvalTreeOptimizer() {
-    Set<Class> functionClasses = ClassUtil.findClasses(EvalTreeOptimizationRule.class,
-        EvalTreeOptimizationRule.class.getPackage().getName() + ".rules");
-
-    for (Class eachRule : functionClasses) {
-      if (!EvalTreeOptimizationRule.class.isAssignableFrom(eachRule)) {
-        continue;
-      }
-
-      EvalTreeOptimizationRule rule = null;
-      try {
-        rule = (EvalTreeOptimizationRule)eachRule.newInstance();
-      } catch (Exception e) {
-        LOG.warn(eachRule + " cannot instantiate EvalTreeOptimizerRule class because of " + e.getMessage());
-        continue;
-      }
-      rules.add(rule);
-    }
-
-    Collections.sort(rules, new Comparator<EvalTreeOptimizationRule>() {
-      @Override
-      public int compare(EvalTreeOptimizationRule o1, EvalTreeOptimizationRule o2) {
-        int priority1 = o1.getClass().getAnnotation(Prioritized.class).priority();
-        int priority2 = o2.getClass().getAnnotation(Prioritized.class).priority();
-        return priority1 - priority2;
-      }
-    });
-  }
-
-  public EvalNode optimize(LogicalPlanner.PlanContext context, EvalNode node) {
-    Preconditions.checkNotNull(node);
-
-    EvalNode optimized = node;
-    for (EvalTreeOptimizationRule rule : rules) {
-      optimized = rule.optimize(context, optimized);
-    }
-
-    return optimized;
-  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/optimizer/eval/Prioritized.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/optimizer/eval/Prioritized.java b/tajo-core/src/main/java/org/apache/tajo/engine/optimizer/eval/Prioritized.java
deleted file mode 100644
index 865d895..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/optimizer/eval/Prioritized.java
+++ /dev/null
@@ -1,30 +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.optimizer.eval;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-public @interface Prioritized {
-  int priority() default 99;
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/optimizer/eval/rules/ConstantFolding.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/optimizer/eval/rules/ConstantFolding.java b/tajo-core/src/main/java/org/apache/tajo/engine/optimizer/eval/rules/ConstantFolding.java
deleted file mode 100644
index 8bcb0cd..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/optimizer/eval/rules/ConstantFolding.java
+++ /dev/null
@@ -1,92 +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.optimizer.eval.rules;
-
-import org.apache.tajo.engine.eval.*;
-import org.apache.tajo.engine.optimizer.eval.EvalTreeOptimizationRule;
-import org.apache.tajo.engine.optimizer.eval.Prioritized;
-import org.apache.tajo.engine.planner.LogicalPlanner;
-
-import java.util.Stack;
-
-@Prioritized(priority = 10)
-public class ConstantFolding extends SimpleEvalNodeVisitor<LogicalPlanner.PlanContext>
-    implements EvalTreeOptimizationRule {
-
-  @Override
-  public EvalNode optimize(LogicalPlanner.PlanContext context, EvalNode evalNode) {
-    return visit(context, evalNode, new Stack<EvalNode>());
-  }
-
-  @Override
-  public EvalNode visitBinaryEval(LogicalPlanner.PlanContext context, Stack<EvalNode> stack, BinaryEval binaryEval) {
-    stack.push(binaryEval);
-    EvalNode lhs = visit(context, binaryEval.getLeftExpr(), stack);
-    EvalNode rhs = visit(context, binaryEval.getRightExpr(), stack);
-    stack.pop();
-
-    if (!binaryEval.getLeftExpr().equals(lhs)) {
-      binaryEval.setLeftExpr(lhs);
-    }
-    if (!binaryEval.getRightExpr().equals(rhs)) {
-      binaryEval.setRightExpr(rhs);
-    }
-
-    if (lhs.getType() == EvalType.CONST && rhs.getType() == EvalType.CONST) {
-      return new ConstEval(binaryEval.eval(null, null));
-    }
-
-    return binaryEval;
-  }
-
-  @Override
-  public EvalNode visitUnaryEval(LogicalPlanner.PlanContext context, Stack<EvalNode> stack, UnaryEval unaryEval) {
-    stack.push(unaryEval);
-    EvalNode child = visit(context, unaryEval.getChild(), stack);
-    stack.pop();
-
-    if (child.getType() == EvalType.CONST) {
-      return new ConstEval(unaryEval.eval(null, null));
-    }
-
-    return unaryEval;
-  }
-
-  @Override
-  public EvalNode visitFuncCall(LogicalPlanner.PlanContext context, FunctionEval evalNode, Stack<EvalNode> stack) {
-    boolean constantOfAllDescendents = true;
-
-    if ("sleep".equals(evalNode.getFuncDesc().getFunctionName())) {
-      constantOfAllDescendents = false;
-    } else {
-      if (evalNode.getArgs() != null) {
-        for (EvalNode arg : evalNode.getArgs()) {
-          arg = visit(context, arg, stack);
-          constantOfAllDescendents &= (arg.getType() == EvalType.CONST);
-        }
-      }
-    }
-
-    if (constantOfAllDescendents && evalNode.getType() == EvalType.FUNCTION) {
-      return new ConstEval(evalNode.eval(null, null));
-    } else {
-      return evalNode;
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/optimizer/eval/rules/ConstantPropagation.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/optimizer/eval/rules/ConstantPropagation.java b/tajo-core/src/main/java/org/apache/tajo/engine/optimizer/eval/rules/ConstantPropagation.java
deleted file mode 100644
index c7c6bd0..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/optimizer/eval/rules/ConstantPropagation.java
+++ /dev/null
@@ -1,112 +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.optimizer.eval.rules;
-
-import org.apache.tajo.engine.eval.*;
-import org.apache.tajo.engine.optimizer.eval.EvalTreeOptimizationRule;
-import org.apache.tajo.engine.optimizer.eval.Prioritized;
-import org.apache.tajo.engine.planner.LogicalPlanner;
-
-import java.util.Stack;
-
-/**
- * It replaces all field references which actually point to constant values by constant values.
- * In order to maximize the effectiveness of constant folding, ConstantPropagation should be performed after
- * constant folding.
- */
-@Prioritized(priority = 15)
-public class ConstantPropagation extends SimpleEvalNodeVisitor<LogicalPlanner.PlanContext>
-    implements EvalTreeOptimizationRule {
-
-  @Override
-  public EvalNode optimize(LogicalPlanner.PlanContext context, EvalNode evalNode) {
-    if (evalNode.getType() == EvalType.FIELD) {
-      FieldEval fieldEval = (FieldEval) evalNode;
-
-      // if a reference points to a const value
-      if (context.getQueryBlock().isConstReference(fieldEval.getName())) {
-        return context.getQueryBlock().getConstByReference(fieldEval.getName());
-      } else {
-        return evalNode; // otherwise, it just returns.
-      }
-    } else {
-      return visit(context, evalNode, new Stack<EvalNode>());
-    }
-  }
-
-  @Override
-  public EvalNode visitBinaryEval(LogicalPlanner.PlanContext context, Stack<EvalNode> stack, BinaryEval binaryEval) {
-    stack.push(binaryEval);
-
-    for (int i = 0; i < 2; i++) {
-      if (binaryEval.getChild(i).getType() == EvalType.FIELD) {
-        FieldEval fieldEval = (FieldEval) binaryEval.getChild(i);
-        if (context.getQueryBlock().isConstReference(fieldEval.getName())) {
-          binaryEval.setChild(i, context.getQueryBlock().getConstByReference(fieldEval.getName()));
-          continue;
-        }
-      }
-
-      visit(context, binaryEval.getChild(i), stack);
-    }
-
-    stack.pop();
-
-    return binaryEval;
-  }
-
-  @Override
-  public EvalNode visitUnaryEval(LogicalPlanner.PlanContext context, Stack<EvalNode> stack, UnaryEval unaryEval) {
-    stack.push(unaryEval);
-
-    if (unaryEval.getChild().getType() == EvalType.FIELD) {
-      FieldEval fieldEval = (FieldEval) unaryEval.getChild();
-      if (context.getQueryBlock().isConstReference(fieldEval.getName())) {
-        unaryEval.setChild(context.getQueryBlock().getConstByReference(fieldEval.getName()));
-        stack.pop();
-        return unaryEval;
-      }
-    }
-    visit(context, unaryEval.getChild(), stack);
-    stack.pop();
-
-    return unaryEval;
-  }
-
-  @Override
-  public EvalNode visitFuncCall(LogicalPlanner.PlanContext context, FunctionEval function, Stack<EvalNode> stack) {
-    stack.push(function);
-
-    for (int i = 0; i < function.getArgs().length; i++) {
-      if (function.getArgs()[i].getType() == EvalType.FIELD) {
-        FieldEval fieldEval = (FieldEval) function.getArgs()[i];
-        if (context.getQueryBlock().isConstReference(fieldEval.getName())) {
-          function.setArg(i, context.getQueryBlock().getConstByReference(fieldEval.getName()));
-          continue;
-        }
-      }
-
-      visit(context, function.getArgs()[i], stack);
-    }
-
-    stack.pop();
-
-    return function;
-  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLSyntaxError.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLSyntaxError.java b/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLSyntaxError.java
index d565509..e4bfc7c 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLSyntaxError.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLSyntaxError.java
@@ -19,7 +19,7 @@
 package org.apache.tajo.engine.parser;
 
 
-import org.apache.tajo.engine.exception.InvalidQueryException;
+import org.apache.tajo.plan.InvalidQueryException;
 
 public class SQLSyntaxError extends InvalidQueryException {
   private static final long serialVersionUID = 5388279335175632066L;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/plan/EvalTreeProtoDeserializer.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/plan/EvalTreeProtoDeserializer.java b/tajo-core/src/main/java/org/apache/tajo/engine/plan/EvalTreeProtoDeserializer.java
deleted file mode 100644
index b62e236..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/plan/EvalTreeProtoDeserializer.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Lisensed 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.plan;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.FunctionDesc;
-import org.apache.tajo.catalog.exception.NoSuchFunctionException;
-import org.apache.tajo.catalog.proto.CatalogProtos;
-import org.apache.tajo.datum.*;
-import org.apache.tajo.engine.eval.*;
-import org.apache.tajo.engine.function.AggFunction;
-import org.apache.tajo.engine.function.GeneralFunction;
-import org.apache.tajo.engine.plan.proto.PlanProto;
-import org.apache.tajo.exception.InternalException;
-
-import java.util.*;
-
-/**
- * It deserializes a serialized eval tree consisting of a number of EvalNodes.
- *
- * {@link org.apache.tajo.engine.plan.EvalTreeProtoSerializer} serializes an eval tree in a postfix traverse order.
- * So, this class firstly sorts all serialized eval nodes in ascending order of their sequence IDs. Then,
- * it sequentially restores each serialized node to EvalNode instance.
- *
- * @see org.apache.tajo.engine.plan.EvalTreeProtoSerializer
- */
-public class EvalTreeProtoDeserializer {
-
-  public static EvalNode deserialize(PlanProto.EvalTree tree) {
-    Map<Integer, EvalNode> evalNodeMap = Maps.newHashMap();
-
-    // sort serialized eval nodes in an ascending order of their IDs.
-    List<PlanProto.EvalNode> nodeList = Lists.newArrayList(tree.getNodesList());
-    Collections.sort(nodeList, new Comparator<PlanProto.EvalNode>() {
-      @Override
-      public int compare(PlanProto.EvalNode o1, PlanProto.EvalNode o2) {
-        return o1.getId() - o2.getId();
-      }
-    });
-
-    EvalNode current = null;
-
-    // The sorted order is the same of a postfix traverse order.
-    // So, it sequentially transforms each serialized node into a EvalNode instance in a postfix order of
-    // the original eval tree.
-
-    Iterator<PlanProto.EvalNode> it = nodeList.iterator();
-    while (it.hasNext()) {
-      PlanProto.EvalNode protoNode = it.next();
-
-      EvalType type = EvalType.valueOf(protoNode.getType().name());
-
-      if (EvalType.isUnaryOperator(type)) {
-        PlanProto.UnaryEval unaryProto = protoNode.getUnary();
-        EvalNode child = evalNodeMap.get(unaryProto.getChildId());
-
-        switch (type) {
-        case NOT:
-          current = new NotEval(child);
-          break;
-        case IS_NULL:
-          current = new IsNullEval(unaryProto.getNegative(), child);
-          break;
-        case CAST:
-          current = new CastEval(child, unaryProto.getCastingType());
-          break;
-        case SIGNED:
-          current = new SignedEval(unaryProto.getNegative(), child);
-          break;
-        default:
-          throw new RuntimeException("Unknown EvalType: " + type.name());
-        }
-
-      } else if (EvalType.isBinaryOperator(type)) {
-        PlanProto.BinaryEval binProto = protoNode.getBinary();
-        EvalNode lhs = evalNodeMap.get(binProto.getLhsId());
-        EvalNode rhs = evalNodeMap.get(binProto.getRhsId());
-
-        switch (type) {
-        case IN:
-          current = new InEval(lhs, (RowConstantEval) rhs, binProto.getNegative());
-          break;
-        default:
-          current = new BinaryEval(type, lhs, rhs);
-        }
-
-      } else if (type == EvalType.CONST) {
-        PlanProto.ConstEval constProto = protoNode.getConst();
-        current = new ConstEval(deserialize(constProto.getValue()));
-
-      } else if (type == EvalType.ROW_CONSTANT) {
-        PlanProto.RowConstEval rowConstProto = protoNode.getRowConst();
-        Datum[] values = new Datum[rowConstProto.getValuesCount()];
-        for (int i = 0; i < rowConstProto.getValuesCount(); i++) {
-          values[i] = deserialize(rowConstProto.getValues(i));
-        }
-        current = new RowConstantEval(values);
-
-      } else if (type == EvalType.FIELD) {
-        CatalogProtos.ColumnProto columnProto = protoNode.getField();
-        current = new FieldEval(new Column(columnProto));
-
-      } else if (type == EvalType.BETWEEN) {
-        PlanProto.BetweenEval betweenProto = protoNode.getBetween();
-        current = new BetweenPredicateEval(betweenProto.getNegative(), betweenProto.getSymmetric(),
-            evalNodeMap.get(betweenProto.getPredicand()),
-            evalNodeMap.get(betweenProto.getBegin()),
-            evalNodeMap.get(betweenProto.getEnd()));
-
-      } else if (type == EvalType.CASE) {
-        PlanProto.CaseWhenEval caseWhenProto = protoNode.getCasewhen();
-        CaseWhenEval caseWhenEval = new CaseWhenEval();
-        for (int i = 0; i < caseWhenProto.getIfCondsCount(); i++) {
-          caseWhenEval.addIfCond((CaseWhenEval.IfThenEval) evalNodeMap.get(caseWhenProto.getIfConds(i)));
-        }
-        if (caseWhenProto.hasElse()) {
-          caseWhenEval.setElseResult(evalNodeMap.get(caseWhenProto.getElse()));
-        }
-        current = caseWhenEval;
-
-      } else if (type == EvalType.IF_THEN) {
-        PlanProto.IfCondEval ifCondProto = protoNode.getIfCond();
-        current = new CaseWhenEval.IfThenEval(evalNodeMap.get(ifCondProto.getCondition()),
-            evalNodeMap.get(ifCondProto.getThen()));
-
-      } else if (EvalType.isFunction(type)) {
-        PlanProto.FunctionEval funcProto = protoNode.getFunction();
-
-        EvalNode [] params = new EvalNode[funcProto.getParamIdsCount()];
-        for (int i = 0; i < funcProto.getParamIdsCount(); i++) {
-          params[i] = evalNodeMap.get(funcProto.getParamIds(i));
-        }
-
-        FunctionDesc funcDesc = null;
-        try {
-          funcDesc = new FunctionDesc(funcProto.getFuncion());
-          if (type == EvalType.FUNCTION) {
-            GeneralFunction instance = (GeneralFunction) funcDesc.newInstance();
-            current = new GeneralFunctionEval(new FunctionDesc(funcProto.getFuncion()), instance, params);
-          } else if (type == EvalType.AGG_FUNCTION || type == EvalType.WINDOW_FUNCTION) {
-            AggFunction instance = (AggFunction) funcDesc.newInstance();
-            if (type == EvalType.AGG_FUNCTION) {
-              current = new AggregationFunctionCallEval(new FunctionDesc(funcProto.getFuncion()), instance, params);
-            } else {
-              current = new WindowFunctionEval(new FunctionDesc(funcProto.getFuncion()), instance, params, null);
-            }
-          }
-        } catch (ClassNotFoundException cnfe) {
-          throw new NoSuchFunctionException(funcDesc.getFunctionName(), funcDesc.getParamTypes());
-        } catch (InternalException ie) {
-          throw new NoSuchFunctionException(funcDesc.getFunctionName(), funcDesc.getParamTypes());
-        }
-      } else {
-        throw new RuntimeException("Unknown EvalType: " + type.name());
-      }
-
-      evalNodeMap.put(protoNode.getId(), current);
-    }
-
-    return current;
-  }
-
-  public static Datum deserialize(PlanProto.Datum datum) {
-    switch (datum.getType()) {
-    case BOOLEAN:
-      return DatumFactory.createBool(datum.getBoolean());
-    case CHAR:
-      return DatumFactory.createChar(datum.getText());
-    case INT1:
-    case INT2:
-      return DatumFactory.createInt2((short) datum.getInt4());
-    case INT4:
-      return DatumFactory.createInt4(datum.getInt4());
-    case INT8:
-      return DatumFactory.createInt8(datum.getInt8());
-    case FLOAT4:
-      return DatumFactory.createFloat4(datum.getFloat4());
-    case FLOAT8:
-      return DatumFactory.createFloat8(datum.getFloat8());
-    case VARCHAR:
-    case TEXT:
-      return DatumFactory.createText(datum.getText());
-    case TIMESTAMP:
-      return new TimestampDatum(datum.getInt8());
-    case DATE:
-      return DatumFactory.createDate(datum.getInt4());
-    case TIME:
-      return DatumFactory.createTime(datum.getInt8());
-    case BINARY:
-    case BLOB:
-      return DatumFactory.createBlob(datum.getBlob().toByteArray());
-    case INTERVAL:
-      return new IntervalDatum(datum.getInterval().getMonth(), datum.getInterval().getMsec());
-    case NULL_TYPE:
-      return NullDatum.get();
-    default:
-      throw new RuntimeException("Unknown data type: " + datum.getType().name());
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/plan/EvalTreeProtoSerializer.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/plan/EvalTreeProtoSerializer.java b/tajo-core/src/main/java/org/apache/tajo/engine/plan/EvalTreeProtoSerializer.java
deleted file mode 100644
index d2b6fd7..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/plan/EvalTreeProtoSerializer.java
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
- * Lisensed 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.plan;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Maps;
-import com.google.protobuf.ByteString;
-import org.apache.tajo.datum.Datum;
-import org.apache.tajo.datum.IntervalDatum;
-import org.apache.tajo.engine.eval.*;
-import org.apache.tajo.engine.plan.proto.PlanProto;
-
-import java.util.Map;
-import java.util.Stack;
-
-/**
- * It traverses an eval tree consisting of a number of {@link org.apache.tajo.engine.eval.EvalNode}
- * in a postfix traverse order. The postfix traverse order guarantees that all child nodes of some node N
- * were already visited when the node N is visited. This manner makes tree serialization possible in a simple logic.
- */
-public class EvalTreeProtoSerializer
-    extends SimpleEvalNodeVisitor<EvalTreeProtoSerializer.EvalTreeProtoBuilderContext> {
-
-  private static final EvalTreeProtoSerializer instance;
-
-  static {
-    instance = new EvalTreeProtoSerializer();
-  }
-
-  public static class EvalTreeProtoBuilderContext {
-    private int seqId = 0;
-    private Map<EvalNode, Integer> idMap = Maps.newHashMap();
-    private PlanProto.EvalTree.Builder treeBuilder = PlanProto.EvalTree.newBuilder();
-  }
-
-  public static PlanProto.EvalTree serialize(EvalNode evalNode) {
-    EvalTreeProtoSerializer.EvalTreeProtoBuilderContext context =
-        new EvalTreeProtoSerializer.EvalTreeProtoBuilderContext();
-    instance.visit(context, evalNode, new Stack<EvalNode>());
-    return context.treeBuilder.build();
-  }
-
-  /**
-   * Return child's serialization IDs. Usually, 0 is used for a child id of unary node or left child of
-   * binary node. 1 is used for right child of binary node. Between will use 0 as predicand, 1 as begin, and 2 as
-   * end eval node. For more detail, you should refer to each EvalNode implementation.
-   *
-   * @param context Context
-   * @param evalNode EvalNode
-   * @return The array of IDs which points to stored EvalNode.
-   * @see org.apache.tajo.engine.eval.EvalNode
-   */
-  private int [] registerGetChildIds(EvalTreeProtoBuilderContext context, EvalNode evalNode) {
-    int [] childIds = new int[evalNode.childNum()];
-    for (int i = 0; i < evalNode.childNum(); i++) {
-      if (context.idMap.containsKey(evalNode.getChild(i))) {
-        childIds[i] = context.idMap.get(evalNode.getChild(i));
-      } else {
-        childIds[i] = context.seqId++;
-      }
-    }
-    return childIds;
-  }
-
-  private PlanProto.EvalNode.Builder createEvalBuilder(EvalTreeProtoBuilderContext context, EvalNode node) {
-    int sid; // serialization sequence id
-    if (context.idMap.containsKey(node)) {
-      sid = context.idMap.get(node);
-    } else {
-      sid = context.seqId++;
-      context.idMap.put(node, sid);
-    }
-
-    PlanProto.EvalNode.Builder nodeBuilder = PlanProto.EvalNode.newBuilder();
-    nodeBuilder.setId(sid);
-    nodeBuilder.setDataType(node.getValueType());
-    nodeBuilder.setType(PlanProto.EvalType.valueOf(node.getType().name()));
-    return nodeBuilder;
-  }
-
-  @Override
-  public EvalNode visitUnaryEval(EvalTreeProtoBuilderContext context, Stack<EvalNode> stack, UnaryEval unary) {
-    // visiting and registering childs
-    super.visitUnaryEval(context, stack, unary);
-    int [] childIds = registerGetChildIds(context, unary);
-
-    // building itself
-    PlanProto.UnaryEval.Builder unaryBuilder = PlanProto.UnaryEval.newBuilder();
-    unaryBuilder.setChildId(childIds[0]);
-    if (unary.getType() == EvalType.IS_NULL) {
-      IsNullEval isNullEval = (IsNullEval) unary;
-      unaryBuilder.setNegative(isNullEval.isNot());
-    } else if (unary.getType() == EvalType.SIGNED) {
-      SignedEval signedEval = (SignedEval) unary;
-      unaryBuilder.setNegative(signedEval.isNegative());
-    } else if (unary.getType() == EvalType.CAST) {
-      CastEval castEval = (CastEval) unary;
-      unaryBuilder.setCastingType(castEval.getValueType());
-    }
-
-    // registering itself and building EvalNode
-    PlanProto.EvalNode.Builder builder = createEvalBuilder(context, unary);
-    builder.setUnary(unaryBuilder);
-    context.treeBuilder.addNodes(builder);
-    return unary;
-  }
-
-  @Override
-  public EvalNode visitBinaryEval(EvalTreeProtoBuilderContext context, Stack<EvalNode> stack, BinaryEval binary) {
-    // visiting and registering childs
-    super.visitBinaryEval(context, stack, binary);
-    int [] childIds = registerGetChildIds(context, binary);
-
-    // building itself
-    PlanProto.BinaryEval.Builder binaryBuilder = PlanProto.BinaryEval.newBuilder();
-    binaryBuilder.setLhsId(childIds[0]);
-    binaryBuilder.setRhsId(childIds[1]);
-
-    // registering itself and building EvalNode
-    PlanProto.EvalNode.Builder builder = createEvalBuilder(context, binary);
-    builder.setBinary(binaryBuilder);
-    context.treeBuilder.addNodes(builder);
-    return binary;
-  }
-
-  @Override
-  public EvalNode visitConst(EvalTreeProtoBuilderContext context, ConstEval constant, Stack<EvalNode> stack) {
-    PlanProto.EvalNode.Builder builder = createEvalBuilder(context, constant);
-    builder.setConst(PlanProto.ConstEval.newBuilder().setValue(serialize(constant.getValue())));
-    context.treeBuilder.addNodes(builder);
-    return constant;
-  }
-
-  @Override
-  public EvalNode visitRowConstant(EvalTreeProtoBuilderContext context, RowConstantEval rowConst,
-                                   Stack<EvalNode> stack) {
-
-    PlanProto.RowConstEval.Builder rowConstBuilder = PlanProto.RowConstEval.newBuilder();
-    for (Datum d : rowConst.getValues()) {
-      rowConstBuilder.addValues(serialize(d));
-    }
-
-    PlanProto.EvalNode.Builder builder = createEvalBuilder(context, rowConst);
-    builder.setRowConst(rowConstBuilder);
-    context.treeBuilder.addNodes(builder);
-    return rowConst;
-  }
-
-  public EvalNode visitField(EvalTreeProtoBuilderContext context, Stack<EvalNode> stack, FieldEval field) {
-    PlanProto.EvalNode.Builder builder = createEvalBuilder(context, field);
-    builder.setField(field.getColumnRef().getProto());
-    context.treeBuilder.addNodes(builder);
-    return field;
-  }
-
-  public EvalNode visitBetween(EvalTreeProtoBuilderContext context, BetweenPredicateEval between,
-                               Stack<EvalNode> stack) {
-    // visiting and registering childs
-    super.visitBetween(context, between, stack);
-    int [] childIds = registerGetChildIds(context, between);
-    Preconditions.checkState(childIds.length == 3, "Between must have three childs, but there are " + childIds.length
-        + " child nodes");
-
-    // building itself
-    PlanProto.BetweenEval.Builder betweenBuilder = PlanProto.BetweenEval.newBuilder();
-    betweenBuilder.setNegative(between.isNot());
-    betweenBuilder.setSymmetric(between.isSymmetric());
-    betweenBuilder.setPredicand(childIds[0]);
-    betweenBuilder.setBegin(childIds[1]);
-    betweenBuilder.setEnd(childIds[2]);
-
-    // registering itself and building EvalNode
-    PlanProto.EvalNode.Builder builder = createEvalBuilder(context, between);
-    builder.setBetween(betweenBuilder);
-    context.treeBuilder.addNodes(builder);
-    return between;
-  }
-
-  public EvalNode visitCaseWhen(EvalTreeProtoBuilderContext context, CaseWhenEval caseWhen, Stack<EvalNode> stack) {
-    // visiting and registering childs
-    super.visitCaseWhen(context, caseWhen, stack);
-    int [] childIds = registerGetChildIds(context, caseWhen);
-    Preconditions.checkState(childIds.length > 0, "Case When must have at least one child, but there is no child");
-
-    // building itself
-    PlanProto.CaseWhenEval.Builder caseWhenBuilder = PlanProto.CaseWhenEval.newBuilder();
-    int ifCondsNum = childIds.length - (caseWhen.hasElse() ? 1 : 0);
-    for (int i = 0; i < ifCondsNum; i++) {
-      caseWhenBuilder.addIfConds(childIds[i]);
-    }
-    if (caseWhen.hasElse()) {
-      caseWhenBuilder.setElse(childIds[childIds.length - 1]);
-    }
-
-    // registering itself and building EvalNode
-    PlanProto.EvalNode.Builder builder = createEvalBuilder(context, caseWhen);
-    builder.setCasewhen(caseWhenBuilder);
-    context.treeBuilder.addNodes(builder);
-
-    return caseWhen;
-  }
-
-  public EvalNode visitIfThen(EvalTreeProtoBuilderContext context, CaseWhenEval.IfThenEval ifCond,
-                              Stack<EvalNode> stack) {
-    // visiting and registering childs
-    super.visitIfThen(context, ifCond, stack);
-    int [] childIds = registerGetChildIds(context, ifCond);
-
-    // building itself
-    PlanProto.IfCondEval.Builder ifCondBuilder = PlanProto.IfCondEval.newBuilder();
-    ifCondBuilder.setCondition(childIds[0]);
-    ifCondBuilder.setThen(childIds[1]);
-
-    // registering itself and building EvalNode
-    PlanProto.EvalNode.Builder builder = createEvalBuilder(context, ifCond);
-    builder.setIfCond(ifCondBuilder);
-    context.treeBuilder.addNodes(builder);
-
-    return ifCond;
-  }
-
-  public EvalNode visitFuncCall(EvalTreeProtoBuilderContext context, FunctionEval function, Stack<EvalNode> stack) {
-    // visiting and registering childs
-    super.visitFuncCall(context, function, stack);
-    int [] childIds = registerGetChildIds(context, function);
-
-    // building itself
-    PlanProto.FunctionEval.Builder funcBuilder = PlanProto.FunctionEval.newBuilder();
-    funcBuilder.setFuncion(function.getFuncDesc().getProto());
-    for (int i = 0; i < childIds.length; i++) {
-      funcBuilder.addParamIds(childIds[i]);
-    }
-
-    // registering itself and building EvalNode
-    PlanProto.EvalNode.Builder builder = createEvalBuilder(context, function);
-    builder.setFunction(funcBuilder);
-    context.treeBuilder.addNodes(builder);
-
-    return function;
-  }
-
-  public static PlanProto.Datum serialize(Datum datum) {
-    PlanProto.Datum.Builder builder = PlanProto.Datum.newBuilder();
-
-    builder.setType(datum.type());
-
-    switch (datum.type()) {
-    case NULL_TYPE:
-      break;
-    case BOOLEAN:
-      builder.setBoolean(datum.asBool());
-      break;
-    case INT1:
-    case INT2:
-    case INT4:
-    case DATE:
-      builder.setInt4(datum.asInt4());
-      break;
-    case INT8:
-    case TIMESTAMP:
-    case TIME:
-      builder.setInt8(datum.asInt8());
-      break;
-    case FLOAT4:
-      builder.setFloat4(datum.asFloat4());
-      break;
-    case FLOAT8:
-      builder.setFloat8(datum.asFloat8());
-      break;
-    case CHAR:
-    case VARCHAR:
-    case TEXT:
-      builder.setText(datum.asChars());
-      break;
-    case BINARY:
-    case BLOB:
-      builder.setBlob(ByteString.copyFrom(datum.asByteArray()));
-      break;
-    case INTERVAL:
-      IntervalDatum interval = (IntervalDatum) datum;
-      PlanProto.Interval.Builder intervalBuilder = PlanProto.Interval.newBuilder();
-      intervalBuilder.setMonth(interval.getMonths());
-      intervalBuilder.setMsec(interval.getMilliSeconds());
-      builder.setInterval(intervalBuilder);
-      break;
-    default:
-      throw new RuntimeException("Unknown data type: " + datum.type().name());
-    }
-
-    return builder.build();
-  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/planner/AlgebraVisitor.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/AlgebraVisitor.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/AlgebraVisitor.java
deleted file mode 100644
index 8c3e606..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/AlgebraVisitor.java
+++ /dev/null
@@ -1,113 +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.planner;
-
-import org.apache.tajo.algebra.*;
-
-import java.util.Stack;
-
-public interface AlgebraVisitor<CONTEXT, RESULT> {
-  // Relational Operators
-  RESULT visitProjection(CONTEXT ctx, Stack<Expr> stack, Projection expr) throws PlanningException;
-  RESULT visitLimit(CONTEXT ctx, Stack<Expr> stack, Limit expr) throws PlanningException;
-  RESULT visitSort(CONTEXT ctx, Stack<Expr> stack, Sort expr) throws PlanningException;
-  RESULT visitHaving(CONTEXT ctx, Stack<Expr> stack, Having expr) throws PlanningException;
-  RESULT visitGroupBy(CONTEXT ctx, Stack<Expr> stack, Aggregation expr) throws PlanningException;
-  RESULT visitJoin(CONTEXT ctx, Stack<Expr> stack, Join expr) throws PlanningException;
-  RESULT visitFilter(CONTEXT ctx, Stack<Expr> stack, Selection expr) throws PlanningException;
-  RESULT visitUnion(CONTEXT ctx, Stack<Expr> stack, SetOperation expr) throws PlanningException;
-  RESULT visitExcept(CONTEXT ctx, Stack<Expr> stack, SetOperation expr) throws PlanningException;
-  RESULT visitIntersect(CONTEXT ctx, Stack<Expr> stack, SetOperation expr) throws PlanningException;
-  RESULT visitSimpleTableSubQuery(CONTEXT ctx, Stack<Expr> stack, SimpleTableSubQuery expr) throws PlanningException;
-  RESULT visitTableSubQuery(CONTEXT ctx, Stack<Expr> stack, TablePrimarySubQuery expr) throws PlanningException;
-  RESULT visitRelationList(CONTEXT ctx, Stack<Expr> stack, RelationList expr) throws PlanningException;
-  RESULT visitRelation(CONTEXT ctx, Stack<Expr> stack, Relation expr) throws PlanningException;
-  RESULT visitScalarSubQuery(CONTEXT ctx, Stack<Expr> stack, ScalarSubQuery expr) throws PlanningException;
-  RESULT visitExplain(CONTEXT ctx, Stack<Expr> stack, Explain expr) throws PlanningException;
-
-  // Data definition language
-  RESULT visitCreateDatabase(CONTEXT ctx, Stack<Expr> stack, CreateDatabase expr) throws PlanningException;
-  RESULT visitDropDatabase(CONTEXT ctx, Stack<Expr> stack, DropDatabase expr) throws PlanningException;
-  RESULT visitCreateTable(CONTEXT ctx, Stack<Expr> stack, CreateTable expr) throws PlanningException;
-  RESULT visitDropTable(CONTEXT ctx, Stack<Expr> stack, DropTable expr) throws PlanningException;
-  RESULT visitAlterTablespace(CONTEXT ctx, Stack<Expr> stack, AlterTablespace expr) throws PlanningException;
-  RESULT visitAlterTable(CONTEXT ctx, Stack<Expr> stack, AlterTable expr) throws PlanningException;
-  RESULT visitTruncateTable(CONTEXT ctx, Stack<Expr> stack, TruncateTable expr) throws PlanningException;
-
-    // Insert or Update
-  RESULT visitInsert(CONTEXT ctx, Stack<Expr> stack, Insert expr) throws PlanningException;
-
-  // Logical operators
-  RESULT visitAnd(CONTEXT ctx, Stack<Expr> stack, BinaryOperator expr) throws PlanningException;
-  RESULT visitOr(CONTEXT ctx, Stack<Expr> stack, BinaryOperator expr) throws PlanningException;
-  RESULT visitNot(CONTEXT ctx, Stack<Expr> stack, NotExpr expr) throws PlanningException;
-
-  // comparison predicates
-  RESULT visitEquals(CONTEXT ctx, Stack<Expr> stack, BinaryOperator expr) throws PlanningException;
-  RESULT visitNotEquals(CONTEXT ctx, Stack<Expr> stack, BinaryOperator expr) throws PlanningException;
-  RESULT visitLessThan(CONTEXT ctx, Stack<Expr> stack, BinaryOperator expr) throws PlanningException;
-  RESULT visitLessThanOrEquals(CONTEXT ctx, Stack<Expr> stack, BinaryOperator expr) throws PlanningException;
-  RESULT visitGreaterThan(CONTEXT ctx, Stack<Expr> stack, BinaryOperator expr) throws PlanningException;
-  RESULT visitGreaterThanOrEquals(CONTEXT ctx, Stack<Expr> stack, BinaryOperator expr) throws PlanningException;
-
-  // Other Predicates
-  RESULT visitBetween(CONTEXT ctx, Stack<Expr> stack, BetweenPredicate expr) throws PlanningException;
-  RESULT visitCaseWhen(CONTEXT ctx, Stack<Expr> stack, CaseWhenPredicate expr) throws PlanningException;
-  RESULT visitIsNullPredicate(CONTEXT ctx, Stack<Expr> stack, IsNullPredicate expr) throws PlanningException;
-  RESULT visitInPredicate(CONTEXT ctx, Stack<Expr> stack, InPredicate expr) throws PlanningException;
-  RESULT visitValueListExpr(CONTEXT ctx, Stack<Expr> stack, ValueListExpr expr) throws PlanningException;
-  RESULT visitExistsPredicate(CONTEXT ctx, Stack<Expr> stack, ExistsPredicate expr) throws PlanningException;
-
-  // String Operator or Pattern Matching Predicates
-  RESULT visitLikePredicate(CONTEXT ctx, Stack<Expr> stack, PatternMatchPredicate expr) throws PlanningException;
-  RESULT visitSimilarToPredicate(CONTEXT ctx, Stack<Expr> stack, PatternMatchPredicate expr) throws PlanningException;
-  RESULT visitRegexpPredicate(CONTEXT ctx, Stack<Expr> stack, PatternMatchPredicate expr) throws PlanningException;
-  RESULT visitConcatenate(CONTEXT ctx, Stack<Expr> stack, BinaryOperator expr) throws PlanningException;
-
-  // arithmetic operators
-  RESULT visitPlus(CONTEXT ctx, Stack<Expr> stack, BinaryOperator expr) throws PlanningException;
-  RESULT visitMinus(CONTEXT ctx, Stack<Expr> stack, BinaryOperator expr) throws PlanningException;
-  RESULT visitMultiply(CONTEXT ctx, Stack<Expr> stack, BinaryOperator expr) throws PlanningException;
-  RESULT visitDivide(CONTEXT ctx, Stack<Expr> stack, BinaryOperator expr) throws PlanningException;
-  RESULT visitModular(CONTEXT ctx, Stack<Expr> stack, BinaryOperator expr) throws PlanningException;
-
-  // other expressions
-  RESULT visitSign(CONTEXT ctx, Stack<Expr> stack, SignedExpr expr) throws PlanningException;
-  RESULT visitColumnReference(CONTEXT ctx, Stack<Expr> stack, ColumnReferenceExpr expr) throws PlanningException;
-  RESULT visitTargetExpr(CONTEXT ctx, Stack<Expr> stack, NamedExpr expr) throws PlanningException;
-  RESULT visitQualifiedAsterisk(CONTEXT ctx, Stack<Expr> stack, QualifiedAsteriskExpr expr) throws PlanningException;
-
-  // functions
-  RESULT visitFunction(CONTEXT ctx, Stack<Expr> stack, FunctionExpr expr) throws PlanningException;
-  RESULT visitGeneralSetFunction(CONTEXT ctx, Stack<Expr> stack, GeneralSetFunctionExpr expr)
-      throws PlanningException;
-  RESULT visitCountRowsFunction(CONTEXT ctx, Stack<Expr> stack, CountRowsFunctionExpr expr) throws PlanningException;
-  RESULT visitWindowFunction(CONTEXT ctx, Stack<Expr> stack, WindowFunctionExpr expr) throws PlanningException;
-
-  // Literal
-  RESULT visitCastExpr(CONTEXT ctx, Stack<Expr> stack, CastExpr expr) throws PlanningException;
-
-  RESULT visitDataType(CONTEXT ctx, Stack<Expr> stack, DataTypeExpr expr) throws PlanningException;
-  RESULT visitLiteral(CONTEXT ctx, Stack<Expr> stack, LiteralValue expr) throws PlanningException;
-  RESULT visitNullLiteral(CONTEXT ctx, Stack<Expr> stack, NullLiteral expr) throws PlanningException;
-  RESULT visitTimestampLiteral(CONTEXT ctx, Stack<Expr> stack, TimestampLiteral expr) throws PlanningException;
-  RESULT visitIntervalLiteral(CONTEXT ctx, Stack<Expr> stack, IntervalLiteral expr) throws PlanningException;
-  RESULT visitTimeLiteral(CONTEXT ctx, Stack<Expr> stack, TimeLiteral expr) throws PlanningException;
-  RESULT visitDateLiteral(CONTEXT ctx, Stack<Expr> stack, DateLiteral expr) throws PlanningException;
-}