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/08/19 11:23:55 UTC

[4/4] git commit: TAJO-123: Clean up the logical plan's json format. (hyunsik)

TAJO-123: Clean up the logical plan's json format. (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/49607a54
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tajo/tree/49607a54
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tajo/diff/49607a54

Branch: refs/heads/master
Commit: 49607a5423c458d2821d7a5bc0db6dde78f8a559
Parents: 6899815
Author: Hyunsik Choi <hy...@apache.org>
Authored: Mon Aug 19 18:20:15 2013 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Mon Aug 19 18:21:21 2013 +0900

----------------------------------------------------------------------
 CHANGES.txt                                     |   2 +
 .../java/org/apache/tajo/catalog/TableDesc.java |   4 +-
 .../org/apache/tajo/catalog/TableDescImpl.java  |  24 +-
 .../tajo/catalog/json/FunctionAdapter.java      |  10 +-
 .../tajo/catalog/json/TableDescAdapter.java     |  23 +-
 .../tajo/catalog/json/TableMetaAdapter.java     |  22 +-
 .../org/apache/tajo/catalog/TestTableDesc.java  |   2 +-
 .../org/apache/tajo/catalog/store/DBStore.java  |  12 +-
 .../org/apache/tajo/catalog/store/MemStore.java |   2 +-
 .../org/apache/tajo/catalog/TestCatalog.java    |   2 +-
 .../org/apache/tajo/catalog/TestDBStore.java    |   8 +-
 .../org/apache/tajo/datum/DatumFactory.java     |  34 ++
 .../org/apache/tajo/json/DataTypeAdapter.java   |   2 +-
 .../java/org/apache/tajo/json/DatumAdapter.java |  21 +-
 .../org/apache/tajo/json/DatumTypeAdapter.java  |  55 ---
 .../org/apache/tajo/json/PathSerializer.java    |   6 +-
 .../org/apache/tajo/TaskAttemptContext.java     |  12 +-
 .../main/java/org/apache/tajo/cli/TajoCli.java  |   2 +-
 .../tajo/engine/eval/AggFuncCallEval.java       |   2 +-
 .../apache/tajo/engine/eval/AlgebraicUtil.java  |  56 +--
 .../org/apache/tajo/engine/eval/BinaryEval.java |  26 +-
 .../apache/tajo/engine/eval/CaseWhenEval.java   |   6 +-
 .../org/apache/tajo/engine/eval/ConstEval.java  |   2 +-
 .../org/apache/tajo/engine/eval/EvalNode.java   |  44 +--
 .../tajo/engine/eval/EvalTreeFactory.java       |   2 +-
 .../apache/tajo/engine/eval/EvalTreeUtil.java   |  43 +-
 .../org/apache/tajo/engine/eval/EvalType.java   |  63 +++
 .../org/apache/tajo/engine/eval/FieldEval.java  |   4 +-
 .../apache/tajo/engine/eval/FuncCallEval.java   |   2 +-
 .../org/apache/tajo/engine/eval/FuncEval.java   |   2 +-
 .../org/apache/tajo/engine/eval/IsNullEval.java |   8 +-
 .../org/apache/tajo/engine/eval/LikeEval.java   |   2 +-
 .../org/apache/tajo/engine/eval/NotEval.java    |   2 +-
 .../tajo/engine/eval/PartialBinaryExpr.java     |   4 +-
 .../tajo/engine/json/EvalNodeAdapter.java       |  41 +-
 .../tajo/engine/json/LogicalNodeAdapter.java    |  43 +-
 .../engine/planner/BasicLogicalPlanVisitor.java |  30 +-
 .../apache/tajo/engine/planner/FromTable.java   |   8 +-
 .../apache/tajo/engine/planner/LogicalPlan.java |   3 +-
 .../tajo/engine/planner/LogicalPlanner.java     |  82 ++--
 .../engine/planner/PhysicalPlannerImpl.java     |  36 +-
 .../apache/tajo/engine/planner/PlannerUtil.java |  94 ++---
 .../org/apache/tajo/engine/planner/Target.java  |   3 +-
 .../engine/planner/global/GlobalOptimizer.java  |  12 +-
 .../tajo/engine/planner/logical/BinaryNode.java |  22 +-
 .../engine/planner/logical/CreateTableNode.java |   2 +-
 .../engine/planner/logical/DropTableNode.java   |   2 +-
 .../engine/planner/logical/EvalExprNode.java    |   2 +-
 .../tajo/engine/planner/logical/ExceptNode.java |   8 +-
 .../tajo/engine/planner/logical/ExprType.java   |  52 ---
 .../engine/planner/logical/GroupbyNode.java     |  10 +-
 .../engine/planner/logical/IndexScanNode.java   |   2 +-
 .../engine/planner/logical/IntersectNode.java   |   8 +-
 .../tajo/engine/planner/logical/JoinNode.java   |  14 +-
 .../tajo/engine/planner/logical/LimitNode.java  |   6 +-
 .../engine/planner/logical/LogicalNode.java     |   8 +-
 .../engine/planner/logical/LogicalRootNode.java |   6 +-
 .../tajo/engine/planner/logical/NodeType.java   |  56 +++
 .../tajo/engine/planner/logical/PipeType.java   |  24 ++
 .../engine/planner/logical/ProjectionNode.java  |  10 +-
 .../engine/planner/logical/ReceiveNode.java     | 122 ++++++
 .../engine/planner/logical/RepartitionType.java |  25 ++
 .../tajo/engine/planner/logical/ScanNode.java   |   2 +-
 .../engine/planner/logical/SelectionNode.java   |   6 +-
 .../tajo/engine/planner/logical/SendNode.java   | 145 +++++++
 .../tajo/engine/planner/logical/SortNode.java   |   6 +-
 .../engine/planner/logical/StoreTableNode.java  |   6 +-
 .../tajo/engine/planner/logical/UnaryNode.java  |  18 +-
 .../tajo/engine/planner/logical/UnionNode.java  |   8 +-
 .../planner/logical/extended/PipeType.java      |  24 --
 .../planner/logical/extended/ReceiveNode.java   | 122 ------
 .../logical/extended/RepartitionType.java       |  25 --
 .../planner/logical/extended/SendNode.java      | 145 -------
 .../planner/physical/AggregationExec.java       |   3 +-
 .../planner/rewrite/FilterPushDownRule.java     |  16 +-
 .../planner/rewrite/ProjectionPushDownRule.java |  31 +-
 .../org/apache/tajo/master/ExecutionBlock.java  |  13 +-
 .../org/apache/tajo/master/GlobalEngine.java    |  10 +-
 .../org/apache/tajo/master/GlobalPlanner.java   | 178 ++++-----
 .../tajo/master/TajoMasterClientService.java    |   2 +-
 .../tajo/master/querymaster/QueryMaster.java    |   4 +-
 .../tajo/master/querymaster/QueryUnit.java      |  11 +-
 .../tajo/master/querymaster/Repartitioner.java  |  14 +-
 .../tajo/master/querymaster/SubQuery.java       |   4 +-
 .../java/org/apache/tajo/util/IndexUtil.java    |  16 +-
 .../main/java/org/apache/tajo/worker/Task.java  |   4 +-
 .../org/apache/tajo/client/TestTajoClient.java  |   2 +-
 .../apache/tajo/engine/eval/TestEvalTree.java   | 121 +++---
 .../tajo/engine/eval/TestEvalTreeUtil.java      |  27 +-
 .../plan/global/TestGlobalQueryPlanner.java     |  62 +--
 .../engine/planner/TestLogicalOptimizer.java    | 103 +++--
 .../tajo/engine/planner/TestLogicalPlanner.java | 390 +++++++++----------
 .../tajo/engine/planner/TestPlannerUtil.java    |  97 +++--
 .../global/TestGlobalQueryOptimizer.java        |  28 +-
 .../engine/planner/logical/TestReceiveNode.java |  61 +++
 .../engine/planner/logical/TestSendNode.java    |  49 +++
 .../logical/extended/TestReceiveNode.java       |  62 ---
 .../planner/logical/extended/TestSendNode.java  |  50 ---
 .../planner/physical/TestPhysicalPlanner.java   |   8 +-
 .../org/apache/tajo/storage/TestFragment.java   |   6 +-
 .../java/org/apache/tajo/storage/Fragment.java  |  40 +-
 .../tajo/storage/json/StorageGsonHelper.java    |   1 -
 102 files changed, 1565 insertions(+), 1597 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 45d1f17..6f4cd5b 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -15,6 +15,8 @@ Release 0.2.0 - unreleased
 
   IMPROVEMENTS
 
+    TAJO-123: Clean up the logical plan's json format. (hyunsik)
+
     TAJO-129: Enable the constructor of NettyServerBase to take a service
     name. (hyunsik)
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/TableDesc.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/TableDesc.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/TableDesc.java
index d46bd14..b27492d 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/TableDesc.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/TableDesc.java
@@ -23,9 +23,9 @@ import org.apache.hadoop.fs.Path;
 import org.apache.tajo.json.GsonObject;
 
 public interface TableDesc extends Cloneable, GsonObject {
-  void setId(String tableId);
+  void setName(String tableId);
   
-  String getId();
+  String getName();
   
   void setPath(Path path);
   

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/TableDescImpl.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/TableDescImpl.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/TableDescImpl.java
index 2771157..5111116 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/TableDescImpl.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/TableDescImpl.java
@@ -30,7 +30,7 @@ import org.apache.tajo.common.ProtoObject;
 public class TableDescImpl implements TableDesc, ProtoObject<TableDescProto>, Cloneable {
   protected TableDescProto.Builder builder = null;
   
-	@Expose protected String tableId; // required
+	@Expose protected String tableName; // required
 	@Expose protected Path uri; // required
 	@Expose protected TableMeta meta; // required
   
@@ -38,30 +38,30 @@ public class TableDescImpl implements TableDesc, ProtoObject<TableDescProto>, Cl
 		builder = TableDescProto.newBuilder();
 	}
 	
-	public TableDescImpl(String tableId, TableMeta info, Path path) {
+	public TableDescImpl(String tableName, TableMeta info, Path path) {
 		this();
 		// tajo deems all identifiers as lowcase characters
-	  this.tableId = tableId.toLowerCase();
+	  this.tableName = tableName.toLowerCase();
 	  this.meta = info;
 	  this.uri = path;	   
 	}
 	
-	public TableDescImpl(String tableId, Schema schema, StoreType type, 
+	public TableDescImpl(String tableName, Schema schema, StoreType type,
 	    Options options, Path path) {
-	  this(tableId, new TableMetaImpl(schema, type, options), path);
+	  this(tableName, new TableMetaImpl(schema, type, options), path);
 	}
 	
 	public TableDescImpl(TableDescProto proto) {
 	  this(proto.getId(), new TableMetaImpl(proto.getMeta()), new Path(proto.getPath()));
 	}
 	
-	public void setId(String tableId) {
+	public void setName(String tableId) {
 	  // tajo deems all identifiers as lowcase characters
-		this.tableId = tableId.toLowerCase();
+		this.tableName = tableId.toLowerCase();
 	}
 	
-  public String getId() {
-    return this.tableId;
+  public String getName() {
+    return this.tableName;
   }
 	
 	public void setPath(Path uri) {
@@ -98,7 +98,7 @@ public class TableDescImpl implements TableDesc, ProtoObject<TableDescProto>, Cl
 	public Object clone() throws CloneNotSupportedException {	  
 	  TableDescImpl desc = (TableDescImpl) super.clone();
 	  desc.builder = TableDescProto.newBuilder();
-	  desc.tableId = tableId;
+	  desc.tableName = tableName;
 	  desc.uri = uri;
 	  desc.meta = (TableMeta) meta.clone();
 	  
@@ -119,8 +119,8 @@ public class TableDescImpl implements TableDesc, ProtoObject<TableDescProto>, Cl
     if (builder == null) {
       builder = TableDescProto.newBuilder();
     }
-    if (this.tableId != null) {
-      builder.setId(this.tableId);
+    if (this.tableName != null) {
+      builder.setId(this.tableName);
     }
     if (this.uri != null) {
       builder.setPath(this.uri.toString());

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/FunctionAdapter.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/FunctionAdapter.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/FunctionAdapter.java
index 4736631..ed5ff49 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/FunctionAdapter.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/FunctionAdapter.java
@@ -30,10 +30,10 @@ public class FunctionAdapter implements GsonSerDerAdapter<Function> {
   public JsonElement serialize(Function src, Type typeOfSrc,
       JsonSerializationContext context) {
     JsonObject jsonObj = new JsonObject();
-    String className = src.getClass().getCanonicalName();
-    jsonObj.addProperty("className", className);
+    String className = src.getClass().getName();
+    jsonObj.addProperty("class", className);
     JsonElement jsonElem = context.serialize(src);
-    jsonObj.add("property", jsonElem);
+    jsonObj.add("body", jsonElem);
     return jsonObj;
   }
 
@@ -41,7 +41,7 @@ public class FunctionAdapter implements GsonSerDerAdapter<Function> {
   public Function deserialize(JsonElement json, Type typeOfT,
       JsonDeserializationContext context) throws JsonParseException {
     JsonObject jsonObject = json.getAsJsonObject();
-    String className = jsonObject.get("className").getAsJsonPrimitive().getAsString();
+    String className = jsonObject.get("class").getAsJsonPrimitive().getAsString();
     
     Class clazz;
     try {
@@ -50,6 +50,6 @@ public class FunctionAdapter implements GsonSerDerAdapter<Function> {
       e.printStackTrace();
       throw new JsonParseException(e);
     }
-    return context.deserialize(jsonObject.get("property"), clazz);
+    return context.deserialize(jsonObject.get("body"), clazz);
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/TableDescAdapter.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/TableDescAdapter.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/TableDescAdapter.java
index e34ef61..f942048 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/TableDescAdapter.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/TableDescAdapter.java
@@ -18,8 +18,10 @@
 
 package org.apache.tajo.catalog.json;
 
+import com.google.common.base.Preconditions;
 import com.google.gson.*;
 import org.apache.tajo.catalog.TableDesc;
+import org.apache.tajo.catalog.TableDescImpl;
 import org.apache.tajo.json.GsonSerDerAdapter;
 
 import java.lang.reflect.Type;
@@ -30,27 +32,18 @@ public class TableDescAdapter implements GsonSerDerAdapter<TableDesc> {
 	public TableDesc deserialize(JsonElement json, Type type,
 			JsonDeserializationContext ctx) throws JsonParseException {
 		JsonObject jsonObject = json.getAsJsonObject();
-		String className = jsonObject.get("classname").getAsJsonPrimitive().getAsString();
-		
-		Class clazz;
-		try {
-			clazz = Class.forName(className);
-		} catch (ClassNotFoundException e) {
-			e.printStackTrace();
-			throw new JsonParseException(e);
-		}
-		return ctx.deserialize(jsonObject.get("property"), clazz);
+    String typeName = jsonObject.get("type").getAsJsonPrimitive().getAsString();
+    Preconditions.checkState(typeName.equals("TableDesc"));
+		return ctx.deserialize(jsonObject.get("body"), TableDescImpl.class);
 	}
 
 	@Override
 	public JsonElement serialize(TableDesc src, Type typeOfSrc,
 			JsonSerializationContext context) {
 		JsonObject jsonObj = new JsonObject();
-		String className = src.getClass().getCanonicalName();
-		jsonObj.addProperty("classname", className);
-
-		JsonElement jsonElem = context.serialize(src);
-		jsonObj.add("property", jsonElem);
+		jsonObj.addProperty("type", "TableDesc");
+		JsonElement jsonElem = context.serialize(src, TableDescImpl.class);
+		jsonObj.add("body", jsonElem);
 		return jsonObj;
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/TableMetaAdapter.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/TableMetaAdapter.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/TableMetaAdapter.java
index f8c02e2..3afda0a 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/TableMetaAdapter.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/TableMetaAdapter.java
@@ -18,8 +18,10 @@
 
 package org.apache.tajo.catalog.json;
 
+import com.google.common.base.Preconditions;
 import com.google.gson.*;
 import org.apache.tajo.catalog.TableMeta;
+import org.apache.tajo.catalog.TableMetaImpl;
 import org.apache.tajo.json.GsonSerDerAdapter;
 
 import java.lang.reflect.Type;
@@ -30,26 +32,18 @@ public class TableMetaAdapter implements GsonSerDerAdapter<TableMeta> {
 	public TableMeta deserialize(JsonElement json, Type typeOfT,
 			JsonDeserializationContext context) throws JsonParseException {
 		JsonObject jsonObject = json.getAsJsonObject();
-		String className = jsonObject.get("classname").getAsJsonPrimitive().getAsString();
-		
-		Class clazz;
-		try {
-			clazz = Class.forName(className);
-		} catch (ClassNotFoundException e) {
-			e.printStackTrace();
-			throw new JsonParseException(e);
-		}
-		return context.deserialize(jsonObject.get("property"), clazz);
+		String typeName = jsonObject.get("type").getAsJsonPrimitive().getAsString();
+    Preconditions.checkState(typeName.equals("TableMeta"));
+		return context.deserialize(jsonObject.get("body"), TableMetaImpl.class);
 	}
 
 	@Override
 	public JsonElement serialize(TableMeta src, Type typeOfSrc,
 			JsonSerializationContext context) {
 		JsonObject jsonObj = new JsonObject();
-		String className = src.getClass().getCanonicalName();
-		jsonObj.addProperty("classname", className);
-		JsonElement jsonElem = context.serialize(src);
-		jsonObj.add("property", jsonElem);
+		jsonObj.addProperty("type", "TableMeta");
+		JsonElement jsonElem = context.serialize(src, TableMetaImpl.class);
+		jsonObj.add("body", jsonElem);
 		return jsonObj;
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableDesc.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableDesc.java b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableDesc.java
index 5235af1..cf943c4 100644
--- a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableDesc.java
+++ b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableDesc.java
@@ -51,7 +51,7 @@ public class TestTableDesc {
     testClone(info);
 
     TableDesc desc = new TableDescImpl("table1", info, new Path("/tajo/data"));
-    assertEquals("table1", desc.getId());
+    assertEquals("table1", desc.getName());
     
     assertEquals(new Path("/tajo/data"), desc.getPath());
     assertEquals(info, desc.getMeta());

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/DBStore.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/DBStore.java b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/DBStore.java
index 41b2ca1..8fb19f0 100644
--- a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/DBStore.java
+++ b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/DBStore.java
@@ -365,7 +365,7 @@ public class DBStore implements CatalogStore {
 
     String sql = 
         "INSERT INTO " + TB_TABLES + " (" + C_TABLE_ID + ", path, store_type) "
-        + "VALUES('" + table.getId() + "', "
+        + "VALUES('" + table.getName() + "', "
         + "'" + table.getPath() + "', "
         + "'" + table.getMeta().getStoreType() + "'"
         + ")";
@@ -381,14 +381,14 @@ public class DBStore implements CatalogStore {
       
       stmt = conn.createStatement();
       sql = "SELECT TID from " + TB_TABLES + " WHERE " + C_TABLE_ID 
-          + " = '" + table.getId() + "'";
+          + " = '" + table.getName() + "'";
       if (LOG.isDebugEnabled()) {
         LOG.debug(sql);
       }
       res = stmt.executeQuery(sql);
       if (!res.next()) {
         throw new IOException("ERROR: there is no tid matched to " 
-            + table.getId());
+            + table.getName());
       }
       int tid = res.getInt("TID");
 
@@ -415,7 +415,7 @@ public class DBStore implements CatalogStore {
       stmt.executeBatch();
       if (table.getMeta().getStat() != null) {
         sql = "INSERT INTO " + TB_STATISTICS + " (" + C_TABLE_ID + ", num_rows, num_bytes) "
-            + "VALUES ('" + table.getId() + "', "
+            + "VALUES ('" + table.getName() + "', "
             + table.getMeta().getStat().getNumRows() + ","
             + table.getMeta().getStat().getNumBytes() + ")";
         if (LOG.isDebugEnabled()) {
@@ -442,7 +442,7 @@ public class DBStore implements CatalogStore {
         + " (tid, " + C_TABLE_ID + ", column_id, column_name, data_type) "
         + "VALUES("
         + tid + ","
-        + "'" + desc.getId() + "',"
+        + "'" + desc.getName() + "',"
         + columnId + ", "
         + "'" + col.getColumnName() + "',"
         + "'" + col.getDataType().getType().name() + "'"
@@ -457,7 +457,7 @@ public class DBStore implements CatalogStore {
         "INSERT INTO " + TB_OPTIONS 
         + " (" + C_TABLE_ID + ", key_, value_) "
         + "VALUES("
-        + "'" + desc.getId() + "',"
+        + "'" + desc.getName() + "',"
         + "'" + keyVal.getKey() + "',"
         + "'" + keyVal.getValue() + "'"
         + ")";

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/MemStore.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/MemStore.java b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/MemStore.java
index 4aacefd..7323393 100644
--- a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/MemStore.java
+++ b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/MemStore.java
@@ -61,7 +61,7 @@ public class MemStore implements CatalogStore {
   @Override
   public void addTable(TableDesc desc) throws IOException {
     synchronized(tables) {
-      tables.put(desc.getId(), desc);
+      tables.put(desc.getName(), desc);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/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 6d08521..5ac59d2 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
@@ -137,7 +137,7 @@ public class TestCatalog {
 	  catalog.deleteIndex(desc2.getName());
 	  assertFalse(catalog.existIndex(desc2.getName()));
 	  
-	  catalog.deleteTable(desc.getId());
+	  catalog.deleteTable(desc.getName());
 	}
 	
 	public static class TestFunc1 extends GeneralFunction {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestDBStore.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestDBStore.java b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestDBStore.java
index 3764b34..47ec4dd 100644
--- a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestDBStore.java
+++ b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestDBStore.java
@@ -141,7 +141,7 @@ public class TestDBStore {
     store.delIndex(TestCatalog.desc1.getName());
     assertFalse(store.existIndex(TestCatalog.desc1.getName()));
     
-    store.deleteTable(table.getId());
+    store.deleteTable(table.getName());
   }
   
   @Test
@@ -156,7 +156,7 @@ public class TestDBStore {
         new IndexDesc(store.getIndex(TestCatalog.desc2.getName())));
     store.delIndex(TestCatalog.desc2.getName());
     
-    store.deleteTable(table.getId());
+    store.deleteTable(table.getName());
   }
   
   @Test
@@ -174,7 +174,7 @@ public class TestDBStore {
         new IndexDesc(store.getIndex(tableId, columnName)));
     store.delIndex(TestCatalog.desc2.getName());
     
-    store.deleteTable(table.getId());
+    store.deleteTable(table.getName());
   }
   
   @Test
@@ -191,7 +191,7 @@ public class TestDBStore {
     store.delIndex(TestCatalog.desc1.getName());
     store.delIndex(TestCatalog.desc2.getName());
     
-    store.deleteTable(table.getId());
+    store.deleteTable(table.getName());
   }
   
   public static TableDesc prepareTable() {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java b/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
index dffd28a..453dd4a 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
@@ -18,6 +18,7 @@
 
 package org.apache.tajo.datum;
 
+import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.util.Bytes;
@@ -28,6 +29,39 @@ public class DatumFactory {
     return create(type.getType(), val);
   }
 
+  public static Class<? extends Datum> getDatumClass(Type type) {
+    switch (type) {
+      case BOOLEAN:
+        return BooleanDatum.class;
+      case INT2:
+        return Int2Datum.class;
+      case INT4:
+        return Int4Datum.class;
+      case INT8:
+        return Int8Datum.class;
+      case FLOAT4:
+        return Float4Datum.class;
+      case FLOAT8:
+        return Float8Datum.class;
+      case CHAR:
+        return CharDatum.class;
+      case TEXT:
+        return TextDatum.class;
+      case BIT:
+        return BitDatum.class;
+      case BLOB:
+        return BlobDatum.class;
+      case INET4:
+        return Inet4Datum.class;
+      case ANY:
+        return NullDatum.class;
+      case ARRAY:
+        return ArrayDatum.class;
+      default:
+        throw new UnsupportedOperationException(type.name());
+    }
+  }
+
   public static Datum create(Type type, byte[]  val) {
     switch (type) {
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-common/src/main/java/org/apache/tajo/json/DataTypeAdapter.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/json/DataTypeAdapter.java b/tajo-common/src/main/java/org/apache/tajo/json/DataTypeAdapter.java
index 3df6939..29aad47 100644
--- a/tajo-common/src/main/java/org/apache/tajo/json/DataTypeAdapter.java
+++ b/tajo-common/src/main/java/org/apache/tajo/json/DataTypeAdapter.java
@@ -33,7 +33,7 @@ public class DataTypeAdapter implements GsonSerDerAdapter<DataType> {
 
     JsonObject obj = (JsonObject) json;
     DataType.Builder builder = DataType.newBuilder();
-    TajoDataTypes.Type type = Enum.valueOf(TajoDataTypes.Type.class, obj.get("type").getAsString());
+    TajoDataTypes.Type type = TajoDataTypes.Type.valueOf(obj.get("type").getAsString());
     builder.setType(type);
 
     JsonElement len = obj.get("len");

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java b/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java
index 8f9bb4e..fe20a35 100644
--- a/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java
+++ b/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java
@@ -19,7 +19,9 @@
 package org.apache.tajo.json;
 
 import com.google.gson.*;
+import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
+import org.apache.tajo.datum.DatumFactory;
 
 import java.lang.reflect.Type;
 
@@ -29,26 +31,17 @@ public class DatumAdapter implements GsonSerDerAdapter<Datum> {
 	public Datum deserialize(JsonElement json, Type typeOfT,
 			JsonDeserializationContext context) throws JsonParseException {
 		JsonObject jsonObject = json.getAsJsonObject();
-		String className = jsonObject.get("classname").getAsJsonPrimitive().getAsString();
-		
-		Class clazz;
-		try {
-			clazz = Class.forName(className);
-		} catch (ClassNotFoundException e) {
-			e.printStackTrace();
-			throw new JsonParseException(e);
-		}
-		return context.deserialize(jsonObject.get("property"), clazz);
+		String typeName = jsonObject.get("type").getAsString();
+		return context.deserialize(jsonObject.get("body"),
+        DatumFactory.getDatumClass(TajoDataTypes.Type.valueOf(typeName)));
 	}
 
 	@Override
 	public JsonElement serialize(Datum src, Type typeOfSrc, JsonSerializationContext context) {
 		JsonObject jsonObj = new JsonObject();
-		String className = src.getClass().getCanonicalName();
-		jsonObj.addProperty("classname", className);
+		jsonObj.addProperty("type", src.type().name());
 		JsonElement jsonElem = context.serialize(src);
-		jsonObj.add("property", jsonElem);
+		jsonObj.add("body", jsonElem);
 		return jsonObj;
 	}
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-common/src/main/java/org/apache/tajo/json/DatumTypeAdapter.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/json/DatumTypeAdapter.java b/tajo-common/src/main/java/org/apache/tajo/json/DatumTypeAdapter.java
deleted file mode 100644
index 70af19f..0000000
--- a/tajo-common/src/main/java/org/apache/tajo/json/DatumTypeAdapter.java
+++ /dev/null
@@ -1,55 +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.json;
-
-import com.google.gson.*;
-import org.apache.tajo.datum.Datum;
-
-import java.lang.reflect.Type;
-
-public class DatumTypeAdapter implements GsonSerDerAdapter<Datum> {
-
-  @Override
-  public Datum deserialize(JsonElement json, Type typeOfT,
-      JsonDeserializationContext context) throws JsonParseException {
-    JsonObject jsonObject = json.getAsJsonObject();
-    String className = jsonObject.get("classname").getAsJsonPrimitive().getAsString();
-    
-    Class clazz;
-    try {
-      clazz = Class.forName(className);
-    } catch (ClassNotFoundException e) {
-      e.printStackTrace();
-      throw new JsonParseException(e);
-    }
-    return context.deserialize(jsonObject.get("property"), clazz);
-  }
-
-  @Override
-  public JsonElement serialize(Datum src, Type typeOfSrc,
-      JsonSerializationContext context) {
-    JsonObject jsonObj = new JsonObject();
-    String className = src.getClass().getCanonicalName();
-    jsonObj.addProperty("classname", className);
-    JsonElement jsonElem = context.serialize(src);
-    jsonObj.add("property", jsonElem);
-    return jsonObj;
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-common/src/main/java/org/apache/tajo/json/PathSerializer.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/json/PathSerializer.java b/tajo-common/src/main/java/org/apache/tajo/json/PathSerializer.java
index 3ee8e2b..bcd1bcf 100644
--- a/tajo-common/src/main/java/org/apache/tajo/json/PathSerializer.java
+++ b/tajo-common/src/main/java/org/apache/tajo/json/PathSerializer.java
@@ -29,14 +29,14 @@ import java.lang.reflect.Type;
 public class PathSerializer implements GsonSerDerAdapter<Path> {
 
 	@Override
-	public JsonElement serialize(Path arg0, Type arg1,
+	public JsonElement serialize(Path path, Type arg1,
 			JsonSerializationContext arg2) {
-		return new JsonPrimitive(arg0.toString());
+		return new JsonPrimitive(path.toString());
 	}
 
   @Override
   public Path deserialize(JsonElement arg0, Type arg1,
-                          JsonDeserializationContext arg2) throws JsonParseException {
+                          JsonDeserializationContext context) throws JsonParseException {
     return new Path(arg0.getAsJsonPrimitive().getAsString());
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/TaskAttemptContext.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/TaskAttemptContext.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/TaskAttemptContext.java
index 8f08d86..8ae2f2b 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/TaskAttemptContext.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/TaskAttemptContext.java
@@ -62,12 +62,12 @@ public class TaskAttemptContext {
     this.queryId = queryId;
     
     for(Fragment t : fragments) {
-      if (fragmentMap.containsKey(t.getId())) {
-        fragmentMap.get(t.getId()).add(t);
+      if (fragmentMap.containsKey(t.getName())) {
+        fragmentMap.get(t.getName()).add(t);
       } else {
         List<Fragment> frags = new ArrayList<Fragment>();
         frags.add(t);
-        fragmentMap.put(t.getId(), frags);
+        fragmentMap.put(t.getName(), frags);
       }
     }
 
@@ -155,12 +155,12 @@ public class TaskAttemptContext {
   public void changeFragment(String tableId, Fragment [] fragments) {
     fragmentMap.remove(tableId);
     for(Fragment t : fragments) {
-      if (fragmentMap.containsKey(t.getId())) {
-        fragmentMap.get(t.getId()).add(t);
+      if (fragmentMap.containsKey(t.getName())) {
+        fragmentMap.get(t.getName()).add(t);
       } else {
         List<Fragment> frags = new ArrayList<Fragment>();
         frags.add(t);
-        fragmentMap.put(t.getId(), frags);
+        fragmentMap.put(t.getName(), frags);
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/cli/TajoCli.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/cli/TajoCli.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/cli/TajoCli.java
index 86d47f9..2dd25de 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/cli/TajoCli.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/cli/TajoCli.java
@@ -426,7 +426,7 @@ public class TajoCli {
 
   private String toFormattedString(TableDesc desc) {
     StringBuilder sb = new StringBuilder();
-    sb.append("\ntable name: ").append(desc.getId()).append("\n");
+    sb.append("\ntable name: ").append(desc.getName()).append("\n");
     sb.append("table path: ").append(desc.getPath()).append("\n");
     sb.append("store type: ").append(desc.getMeta().getStoreType()).append("\n");
     if (desc.getMeta().getStat() != null) {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/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
index 9aae34e..1282d1d 100644
--- 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
@@ -34,7 +34,7 @@ public class AggFuncCallEval extends FuncEval implements Cloneable {
   private Tuple params;
 
   public AggFuncCallEval(FunctionDesc desc, AggFunction instance, EvalNode[] givenArgs) {
-    super(Type.AGG_FUNCTION, desc, givenArgs);
+    super(EvalType.AGG_FUNCTION, desc, givenArgs);
     this.instance = instance;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/AlgebraicUtil.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/AlgebraicUtil.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/AlgebraicUtil.java
index 46a3cdb..a5ee425 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/AlgebraicUtil.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/AlgebraicUtil.java
@@ -61,10 +61,10 @@ public class AlgebraicUtil {
      EvalNode lTerm = null;
      EvalNode rTerm = null;
      
-    if (left.getType() == EvalNode.Type.PLUS
-        || left.getType() == EvalNode.Type.MINUS
-        || left.getType() == EvalNode.Type.MULTIPLY
-        || left.getType() == EvalNode.Type.DIVIDE) {
+    if (left.getType() == EvalType.PLUS
+        || left.getType() == EvalType.MINUS
+        || left.getType() == EvalType.MULTIPLY
+        || left.getType() == EvalType.DIVIDE) {
       
       // If the left-left term is a variable, the left-right term is transposed.
       if(EvalTreeUtil.containColumnRef(left.getLeftExpr(), target)) {
@@ -92,16 +92,16 @@ public class AlgebraicUtil {
    * @param type
    * @return inversed operator type
    */
-  public static EvalNode.Type inverseOperator(EvalNode.Type type) {
+  public static EvalType inverseOperator(EvalType type) {
     switch (type) {
     case PLUS:
-      return EvalNode.Type.MINUS;
+      return EvalType.MINUS;
     case MINUS:
-      return EvalNode.Type.PLUS;
+      return EvalType.PLUS;
     case MULTIPLY:
-      return EvalNode.Type.DIVIDE;
+      return EvalType.DIVIDE;
     case DIVIDE:
-      return EvalNode.Type.MULTIPLY;
+      return EvalType.MULTIPLY;
     default : throw new AlgebraicException("ERROR: cannot inverse the operator: " 
       + type);
     }
@@ -114,7 +114,7 @@ public class AlgebraicUtil {
    * @return true if a given expr is a variable.
    */
   private static boolean isSingleVar(EvalNode node) {
-    if (node.getType() == EvalNode.Type.FIELD) {
+    if (node.getType() == EvalType.FIELD) {
       return true;
     } else {
       return false;
@@ -152,8 +152,8 @@ public class AlgebraicUtil {
       right = simplify(right);
       
       // If both are constants, they can be evaluated immediately.
-      if (left.getType() == EvalNode.Type.CONST
-          && right.getType() == EvalNode.Type.CONST) {
+      if (left.getType() == EvalType.CONST
+          && right.getType() == EvalType.CONST) {
         EvalContext exprCtx = expr.newContext();
         expr.eval(exprCtx, null, null);
         return new ConstEval(expr.terminate(exprCtx));
@@ -174,14 +174,14 @@ public class AlgebraicUtil {
    * @return true if expr has only one field
    */
   public static boolean containSingleVar(EvalNode expr) {
-    Map<EvalNode.Type, Integer> counter = EvalTreeUtil.getExprCounters(expr);
+    Map<EvalType, Integer> counter = EvalTreeUtil.getExprCounters(expr);
     
     int sum = 0;
     for (Integer cnt : counter.values()) {      
       sum += cnt;
     }
     
-    if (sum == 1 && counter.get(EvalNode.Type.FIELD) == 1) {
+    if (sum == 1 && counter.get(EvalType.FIELD) == 1) {
       return true;
     } else {
       return false;
@@ -199,14 +199,14 @@ public class AlgebraicUtil {
    */
   public static PartialBinaryExpr splitLeftTerm(EvalNode expr) {
     
-    if (!(expr.getType() == EvalNode.Type.PLUS
-        || expr.getType() == EvalNode.Type.MINUS
-        || expr.getType() == EvalNode.Type.MULTIPLY
-        || expr.getType() == EvalNode.Type.DIVIDE)) {
+    if (!(expr.getType() == EvalType.PLUS
+        || expr.getType() == EvalType.MINUS
+        || expr.getType() == EvalType.MULTIPLY
+        || expr.getType() == EvalType.DIVIDE)) {
       throw new AlgebraicException("Invalid algebraic operation: " + expr);
     }
     
-    if (expr.getLeftExpr().getType() != EvalNode.Type.CONST) {
+    if (expr.getLeftExpr().getType() != EvalType.CONST) {
       return splitLeftTerm(expr.getLeftExpr());
     }
     
@@ -227,14 +227,14 @@ public class AlgebraicUtil {
    */
   public static PartialBinaryExpr splitRightTerm(EvalNode expr) {
     
-    if (!(expr.getType() == EvalNode.Type.PLUS
-        || expr.getType() == EvalNode.Type.MINUS
-        || expr.getType() == EvalNode.Type.MULTIPLY
-        || expr.getType() == EvalNode.Type.DIVIDE)) {
+    if (!(expr.getType() == EvalType.PLUS
+        || expr.getType() == EvalType.MINUS
+        || expr.getType() == EvalType.MULTIPLY
+        || expr.getType() == EvalType.DIVIDE)) {
       throw new AlgebraicException("Invalid algebraic operation: " + expr);
     }
     
-    if (expr.getRightExpr().getType() != EvalNode.Type.CONST) {
+    if (expr.getRightExpr().getType() != EvalType.CONST) {
       return splitRightTerm(expr.getRightExpr());
     }
     
@@ -264,19 +264,19 @@ public class AlgebraicUtil {
       break;
       
     case GTH:
-      expr = EvalTreeFactory.create(EvalNode.Type.LTH,
+      expr = EvalTreeFactory.create(EvalType.LTH,
           inputExpr.getRightExpr(), inputExpr.getLeftExpr());
       break;
     case GEQ:
-      expr = EvalTreeFactory.create(EvalNode.Type.LEQ,
+      expr = EvalTreeFactory.create(EvalType.LEQ,
           inputExpr.getRightExpr(), inputExpr.getLeftExpr());
       break;
     case LTH:
-      expr = EvalTreeFactory.create(EvalNode.Type.GTH,
+      expr = EvalTreeFactory.create(EvalType.GTH,
           inputExpr.getRightExpr(), inputExpr.getLeftExpr());
       break;
     case LEQ:
-      expr = EvalTreeFactory.create(EvalNode.Type.GEQ,
+      expr = EvalTreeFactory.create(EvalType.GEQ,
           inputExpr.getRightExpr(), inputExpr.getLeftExpr());
       break;
       

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/BinaryEval.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/BinaryEval.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/BinaryEval.java
index 2a95ddf..6f742b6 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/BinaryEval.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/BinaryEval.java
@@ -41,28 +41,28 @@ public class BinaryEval extends EvalNode implements Cloneable {
 	/**
 	 * @param type
 	 */
-	public BinaryEval(Type type, EvalNode left, EvalNode right) {
+	public BinaryEval(EvalType type, EvalNode left, EvalNode right) {
 		super(type, left, right);		
 		Preconditions.checkNotNull(type);
 		Preconditions.checkNotNull(left);
 		Preconditions.checkNotNull(right);
 		
 		if(
-			type == Type.AND ||
-			type == Type.OR ||
-			type == Type.EQUAL ||
-			type == Type.LTH ||
-			type == Type.GTH ||
-			type == Type.LEQ ||
-			type == Type.GEQ
+			type == EvalType.AND ||
+			type == EvalType.OR ||
+			type == EvalType.EQUAL ||
+			type == EvalType.LTH ||
+			type == EvalType.GTH ||
+			type == EvalType.LEQ ||
+			type == EvalType.GEQ
 		) {
 			this.returnType = CatalogUtil.newDataTypesWithoutLen(TajoDataTypes.Type.BOOLEAN);
 		} else if (
-			type == Type.PLUS ||
-			type == Type.MINUS ||
-			type == Type.MULTIPLY ||
-			type == Type.DIVIDE ||
-      type == Type.MODULAR
+			type == EvalType.PLUS ||
+			type == EvalType.MINUS ||
+			type == EvalType.MULTIPLY ||
+			type == EvalType.DIVIDE ||
+      type == EvalType.MODULAR
 		) {
 			this.returnType = SchemaUtil.newNoNameSchema(determineType(left.getValueType()[0],
 				right.getValueType()[0]));

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/CaseWhenEval.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/CaseWhenEval.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/CaseWhenEval.java
index 4bbdcb8..1cb24d2 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/CaseWhenEval.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/CaseWhenEval.java
@@ -20,7 +20,6 @@ package org.apache.tajo.engine.eval;
 
 import com.google.common.collect.Lists;
 import com.google.gson.annotations.Expose;
-import org.apache.tajo.json.GsonObject;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.common.TajoDataTypes;
@@ -28,6 +27,7 @@ import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.engine.json.CoreGsonHelper;
+import org.apache.tajo.json.GsonObject;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.util.TUtil;
 
@@ -38,7 +38,7 @@ public class CaseWhenEval extends EvalNode implements GsonObject {
   @Expose private EvalNode elseResult;
 
   public CaseWhenEval() {
-    super(Type.CASE);
+    super(EvalType.CASE);
   }
 
   public void addWhen(EvalNode condition, EvalNode result) {
@@ -145,7 +145,7 @@ public class CaseWhenEval extends EvalNode implements GsonObject {
     @Expose private EvalNode result;
 
     public WhenEval(EvalNode condition, EvalNode result) {
-      super(Type.WHEN);
+      super(EvalType.WHEN);
       this.condition = condition;
       this.result = result;
     }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/ConstEval.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/ConstEval.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/ConstEval.java
index 069db2c..d677a73 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/ConstEval.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/ConstEval.java
@@ -29,7 +29,7 @@ public class ConstEval extends EvalNode implements Comparable<ConstEval>, Clonea
 	@Expose Datum datum = null;
 	
 	public ConstEval(Datum datum) {
-		super(Type.CONST);
+		super(EvalType.CONST);
 		this.datum = datum;
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalNode.java
index 12e1cf8..c6f0f2d 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalNode.java
@@ -27,15 +27,15 @@ import org.apache.tajo.engine.json.CoreGsonHelper;
 import org.apache.tajo.storage.Tuple;
 
 public abstract class EvalNode implements Cloneable, GsonObject {
-	@Expose protected Type type;
+	@Expose protected EvalType type;
 	@Expose protected EvalNode leftExpr;
 	@Expose protected EvalNode rightExpr;
 	
-	public EvalNode(Type type) {
+	public EvalNode(EvalType type) {
 		this.type = type;
 	}
 	
-	public EvalNode(Type type, EvalNode left, EvalNode right) {
+	public EvalNode(EvalType type, EvalNode left, EvalNode right) {
 		this(type);
 		this.leftExpr = left;
 		this.rightExpr = right;
@@ -43,7 +43,7 @@ public abstract class EvalNode implements Cloneable, GsonObject {
 
   public abstract EvalContext newContext();
 	
-	public Type getType() {
+	public EvalType getType() {
 		return this.type;
 	}
 	
@@ -101,42 +101,6 @@ public abstract class EvalNode implements Cloneable, GsonObject {
 	  rightExpr.postOrder(visitor);	  	  
 	  visitor.visit(this);
 	}
-	
-	public static enum Type {
-    AGG_FUNCTION,
-    AND,
-	  OR,
-	  EQUAL("="),
-    IS,
-	  NOT_EQUAL("<>"),
-	  LTH("<"),
-	  LEQ("<="),
-	  GTH(">"),
-	  GEQ(">="),
-	  NOT("!"),
-	  PLUS("+"),
-    MINUS("-"),
-    MODULAR("%"),
-    MULTIPLY("*"),
-    DIVIDE("/"),
-	  FIELD,
-    FUNCTION,
-    LIKE,
-    CONST,
-    CASE,
-    WHEN;
-
-    private String represent;
-    Type() {
-    }
-    Type(String represent) {
-      this.represent = represent;
-    }
-
-    public String toString() {
-      return represent == null ? this.name() : represent;
-    }
-	}
 
   public abstract boolean equals(Object obj);
 	

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalTreeFactory.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalTreeFactory.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalTreeFactory.java
index 5d5a9be..aa72f25 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalTreeFactory.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalTreeFactory.java
@@ -25,7 +25,7 @@ public class EvalTreeFactory {
 		return new ConstEval(datum);
 	}
 	
-	public static BinaryEval create(EvalNode.Type type, EvalNode e1, 
+	public static BinaryEval create(EvalType type, EvalNode e1,
 	    EvalNode e2) {
 		return new BinaryEval(type, e1, e2);
 	}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/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 973de99..3fc41dd 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
@@ -24,7 +24,6 @@ import com.google.common.collect.Sets;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.common.TajoDataTypes.DataType;
-import org.apache.tajo.engine.eval.EvalNode.Type;
 import org.apache.tajo.engine.planner.Target;
 import org.apache.tajo.engine.utils.SchemaUtil;
 import org.apache.tajo.exception.InternalException;
@@ -71,9 +70,9 @@ public class EvalTreeUtil {
   
   private static EvalNode transformCNF2Singleton_(EvalNode [] evalNode, int idx) {
     if (idx == evalNode.length - 2) {
-      return new BinaryEval(Type.AND, evalNode[idx], evalNode[idx + 1]);
+      return new BinaryEval(EvalType.AND, evalNode[idx], evalNode[idx + 1]);
     } else {
-      return new BinaryEval(Type.AND, evalNode[idx], 
+      return new BinaryEval(EvalType.AND, evalNode[idx],
           transformCNF2Singleton_(evalNode, idx + 1));
     }
   }
@@ -91,14 +90,14 @@ public class EvalTreeUtil {
   }
   
   private static void getConjNormalForm(EvalNode node, List<EvalNode> found) {
-    if (node.getType() == Type.AND) {
+    if (node.getType() == EvalType.AND) {
       getConjNormalForm(node.getLeftExpr(), found);
       getConjNormalForm(node.getRightExpr(), found);
     } else {
       found.add(node);
     }
   }
-
+  
   public static Schema getSchemaByTargets(Schema inputSchema, Target [] targets) 
       throws InternalException {
     Schema schema = new Schema();
@@ -160,7 +159,7 @@ public class EvalTreeUtil {
    * @param expr
    * @return
    */
-  public static Map<Type, Integer> getExprCounters(EvalNode expr) {
+  public static Map<EvalType, Integer> getExprCounters(EvalNode expr) {
     VariableCounter counter = new VariableCounter();
     expr.postOrder(counter);
     return counter.getCounter();
@@ -209,21 +208,21 @@ public class EvalTreeUtil {
   }
 
   public static boolean isComparisonOperator(EvalNode expr) {
-    return expr.getType() == Type.EQUAL ||
-        expr.getType() == Type.LEQ ||
-        expr.getType() == Type.LTH ||
-        expr.getType() == Type.GEQ ||
-        expr.getType() == Type.GTH;
+    return expr.getType() == EvalType.EQUAL ||
+        expr.getType() == EvalType.LEQ ||
+        expr.getType() == EvalType.LTH ||
+        expr.getType() == EvalType.GEQ ||
+        expr.getType() == EvalType.GTH;
   }
 
   public static boolean isJoinQual(EvalNode expr) {
     return isComparisonOperator(expr) &&
-        expr.getLeftExpr().getType() == Type.FIELD &&
-        expr.getRightExpr().getType() == Type.FIELD;
+        expr.getLeftExpr().getType() == EvalType.FIELD &&
+        expr.getRightExpr().getType() == EvalType.FIELD;
   }
 
   public static boolean isLogicalOperator(EvalNode expr) {
-    return expr.getType() == Type.AND || expr.getType() == Type.OR;
+    return expr.getType() == EvalType.AND || expr.getType() == EvalType.OR;
   }
   
   public static class ChangeColumnRefVisitor implements EvalNodeVisitor {    
@@ -237,7 +236,7 @@ public class EvalTreeUtil {
     
     @Override
     public void visit(EvalNode node) {
-      if (node.type == Type.FIELD) {
+      if (node.type == EvalType.FIELD) {
         FieldEval field = (FieldEval) node;
         if (field.getColumnName().equals(findColumn)
             || field.getName().equals(findColumn)) {
@@ -253,7 +252,7 @@ public class EvalTreeUtil {
     
     @Override
     public void visit(EvalNode node) {
-      if (node.getType() == Type.FIELD) {
+      if (node.getType() == EvalType.FIELD) {
         field = (FieldEval) node;
         colList.add(field.getColumnRef());
       } 
@@ -270,7 +269,7 @@ public class EvalTreeUtil {
     
     @Override
     public void visit(EvalNode node) {
-      if (node.getType() == Type.FIELD) {
+      if (node.getType() == EvalType.FIELD) {
         field = (FieldEval) node;
         colList.add(field.getColumnRef());
       }
@@ -282,12 +281,12 @@ public class EvalTreeUtil {
   }
   
   public static class VariableCounter implements EvalNodeVisitor {
-    private final Map<Type, Integer> counter;
+    private final Map<EvalType, Integer> counter;
     
     public VariableCounter() {
       counter = Maps.newHashMap();
-      counter.put(Type.FUNCTION, 0);
-      counter.put(Type.FIELD, 0);      
+      counter.put(EvalType.FUNCTION, 0);
+      counter.put(EvalType.FIELD, 0);
     }
     
     @Override
@@ -299,7 +298,7 @@ public class EvalTreeUtil {
       }
     }
     
-    public Map<Type, Integer> getCounter() {
+    public Map<EvalType, Integer> getCounter() {
       return counter;
     }
   }
@@ -316,7 +315,7 @@ public class EvalTreeUtil {
 
     @Override
     public void visit(EvalNode node) {
-      if (node.getType() == Type.AGG_FUNCTION) {
+      if (node.getType() == EvalType.AGG_FUNCTION) {
         field = (AggFuncCallEval) node;
         aggFucntions.add(field);
       }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/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
new file mode 100644
index 0000000..a22da0f
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalType.java
@@ -0,0 +1,63 @@
+/**
+ * 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;
+
+public enum EvalType {
+  // Unary expression
+  NOT(NotEval.class),
+
+  // Binary expression
+  AND(BinaryEval.class),
+  OR(BinaryEval.class),
+  EQUAL(BinaryEval.class),
+  IS_NULL(IsNullEval.class),
+  NOT_EQUAL(BinaryEval.class),
+  LTH(BinaryEval.class),
+  LEQ(BinaryEval.class),
+  GTH(BinaryEval.class),
+  GEQ(BinaryEval.class),
+  PLUS(BinaryEval.class),
+  MINUS(BinaryEval.class),
+  MODULAR(BinaryEval.class),
+  MULTIPLY(BinaryEval.class),
+  DIVIDE(BinaryEval.class),
+
+  // Function
+  AGG_FUNCTION(AggFuncCallEval.class),
+  FUNCTION(FuncCallEval.class),
+
+  // Predicate
+  LIKE(LikeEval.class),
+  CASE(CaseWhenEval.class),
+  WHEN(CaseWhenEval.WhenEval.class),
+
+  // Value or Reference
+  FIELD(FieldEval.class),
+  CONST(ConstEval.class);
+
+  private Class<? extends EvalNode> baseClass;
+
+  EvalType(Class<? extends EvalNode> type) {
+    this.baseClass = type;
+  }
+
+  public Class<? extends EvalNode> getBaseClass() {
+    return this.baseClass;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/FieldEval.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/FieldEval.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/FieldEval.java
index 9282497..cd9c48d 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/FieldEval.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/FieldEval.java
@@ -31,12 +31,12 @@ public class FieldEval extends EvalNode implements Cloneable {
 	@Expose	private int fieldId = -1;
 	
 	public FieldEval(String columnName, DataType domain) {
-		super(Type.FIELD);
+		super(EvalType.FIELD);
 		this.column = new Column(columnName, domain);
 	}
 	
 	public FieldEval(Column column) {
-	  super(Type.FIELD);
+	  super(EvalType.FIELD);
 	  this.column = column;
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/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
index d44385e..2e7faaa 100644
--- 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
@@ -35,7 +35,7 @@ public class FuncCallEval extends FuncEval {
   private Schema schema;
 
 	public FuncCallEval(FunctionDesc desc, GeneralFunction instance, EvalNode [] givenArgs) {
-		super(Type.FUNCTION, desc, givenArgs);
+		super(EvalType.FUNCTION, desc, givenArgs);
 		this.instance = instance;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/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
index 2ff6d19..f6c54cb 100644
--- 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
@@ -31,7 +31,7 @@ public abstract class FuncEval extends EvalNode implements Cloneable {
 	@Expose protected FunctionDesc funcDesc;
 	@Expose protected EvalNode [] argEvals;
 
-	public FuncEval(Type type, FunctionDesc funcDesc, EvalNode[] argEvals) {
+	public FuncEval(EvalType type, FunctionDesc funcDesc, EvalNode[] argEvals) {
 		super(type);
 		this.funcDesc = funcDesc;
 		this.argEvals = argEvals;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/IsNullEval.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/IsNullEval.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/IsNullEval.java
index 872edf9..1064974 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/IsNullEval.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/IsNullEval.java
@@ -31,9 +31,9 @@ import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.storage.Tuple;
 
 public class IsNullEval extends BinaryEval {
-  private final static ConstEval NULL_EVAL = new ConstEval(DatumFactory.createNullDatum());
-  private static final DataType [] RES_TYPE =
-      CatalogUtil.newDataTypesWithoutLen(TajoDataTypes.Type.BOOLEAN);
+  // it's just a hack to emulate a binary expression
+  private final static ConstEval DUMMY_EVAL = new ConstEval(DatumFactory.createBool(true));
+  private static final DataType [] RES_TYPE = CatalogUtil.newDataTypesWithoutLen(TajoDataTypes.Type.BOOLEAN);
 
   // persistent variables
   @Expose private boolean isNot;
@@ -41,7 +41,7 @@ public class IsNullEval extends BinaryEval {
   @Expose private Integer fieldId = null;
 
   public IsNullEval(boolean not, FieldEval field) {
-    super(Type.IS, field, NULL_EVAL);
+    super(EvalType.IS_NULL, field, DUMMY_EVAL);
     this.isNot = not;
     this.columnRef = field.getColumnRef();
   }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/LikeEval.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/LikeEval.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/LikeEval.java
index 4c7cbe8..d3ab277 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/LikeEval.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/LikeEval.java
@@ -46,7 +46,7 @@ public class LikeEval extends BinaryEval {
 
   
   public LikeEval(boolean not, FieldEval field, ConstEval pattern) {
-    super(Type.LIKE, field, pattern);
+    super(EvalType.LIKE, field, pattern);
     this.not = not;
     this.column = field.getColumnRef();
     this.pattern = pattern.getValue().asChars();

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/NotEval.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/NotEval.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/NotEval.java
index 71fac77..296850c 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/NotEval.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/NotEval.java
@@ -34,7 +34,7 @@ public class NotEval extends EvalNode implements Cloneable {
       CatalogUtil.newDataTypesWithoutLen(TajoDataTypes.Type.BOOLEAN);
 
   public NotEval(EvalNode subExpr) {
-    super(Type.NOT);
+    super(EvalType.NOT);
     Preconditions.checkArgument(
         subExpr instanceof BinaryEval || subExpr instanceof NotEval);
     this.subExpr = subExpr;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/PartialBinaryExpr.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/PartialBinaryExpr.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/PartialBinaryExpr.java
index d43c629..ab558d9 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/PartialBinaryExpr.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/PartialBinaryExpr.java
@@ -25,11 +25,11 @@ import org.apache.tajo.storage.Tuple;
 
 public class PartialBinaryExpr extends EvalNode {
   
-  public PartialBinaryExpr(Type type) {
+  public PartialBinaryExpr(EvalType type) {
     super(type);
   }
 
-  public PartialBinaryExpr(Type type, EvalNode left, EvalNode right) {
+  public PartialBinaryExpr(EvalType type, EvalNode left, EvalNode right) {
     super(type, left, right);
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/EvalNodeAdapter.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/EvalNodeAdapter.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/EvalNodeAdapter.java
index 74c7305..69b906f 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/EvalNodeAdapter.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/EvalNodeAdapter.java
@@ -23,34 +23,29 @@ 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.engine.planner.logical.NodeType;
 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 jsonObj = json.getAsJsonObject();
-		String className = jsonObj.get("type").getAsString();
-		JsonElement elem = jsonObj.get("properties");
-		
-		try {
-			return ctx.deserialize(elem, Class.forName(className));
-		} catch (ClassNotFoundException e) {
-			e.printStackTrace();
-		}
-		return null;
-	}
-
-	@Override
-	public JsonElement serialize(EvalNode evalNode, Type type,
-			JsonSerializationContext ctx) {
-		JsonObject json = new JsonObject();
-		json.add("type", new JsonPrimitive(evalNode.getClass().getName()));
-		json.add("properties", ctx.serialize(evalNode, evalNode.getClass()));
-		return json;
-	}
+  @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/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/LogicalNodeAdapter.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/LogicalNodeAdapter.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/LogicalNodeAdapter.java
index d98bd53..e2becef 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/LogicalNodeAdapter.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/LogicalNodeAdapter.java
@@ -23,37 +23,28 @@ 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 json, Type type,
-			JsonDeserializationContext ctx) throws JsonParseException {
-		JsonObject jsonObject = json.getAsJsonObject();
-		String className = jsonObject.get("classname").getAsJsonPrimitive().getAsString();
-		
-		Class clazz;
-		try {
-			clazz = Class.forName(className);
-		} catch (ClassNotFoundException e) {
-			e.printStackTrace();
-			throw new JsonParseException(e);
-		}
-		return ctx.deserialize(jsonObject.get("property"), clazz);
-	}
-
-	@Override
-	public JsonElement serialize(LogicalNode src, Type typeOfSrc,
-			JsonSerializationContext context) {
-		JsonObject jsonObj = new JsonObject();
-		String className = src.getClass().getCanonicalName();
-		jsonObj.addProperty("classname", className);
-		JsonElement jsonElem = context.serialize(src);
-		jsonObj.add("property", jsonElem);
-		return jsonObj;
-	}
+  @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/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BasicLogicalPlanVisitor.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BasicLogicalPlanVisitor.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BasicLogicalPlanVisitor.java
index a5e9530..9bc6b7d 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BasicLogicalPlanVisitor.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BasicLogicalPlanVisitor.java
@@ -93,7 +93,7 @@ public class BasicLogicalPlanVisitor<T> implements LogicalPlanVisitor<T> {
   public LogicalNode visitRoot(LogicalPlan plan, LogicalRootNode node, Stack<LogicalNode> stack, T data)
       throws PlanningException {
     stack.push(node);
-    visitChild(plan, node.getSubNode(), stack, data);
+    visitChild(plan, node.getChild(), stack, data);
     stack.pop();
     return node;
   }
@@ -102,7 +102,7 @@ public class BasicLogicalPlanVisitor<T> implements LogicalPlanVisitor<T> {
   public LogicalNode visitProjection(LogicalPlan plan, ProjectionNode node, Stack<LogicalNode> stack, T data)
       throws PlanningException {
     stack.push(node);
-    visitChild(plan, node.getSubNode(), stack, data);
+    visitChild(plan, node.getChild(), stack, data);
     stack.pop();
     return node;
   }
@@ -111,7 +111,7 @@ public class BasicLogicalPlanVisitor<T> implements LogicalPlanVisitor<T> {
   public LogicalNode visitLimit(LogicalPlan plan, LimitNode node, Stack<LogicalNode> stack, T data)
       throws PlanningException {
     stack.push(node);
-    visitChild(plan, node.getSubNode(), stack, data);
+    visitChild(plan, node.getChild(), stack, data);
     stack.pop();
     return node;
   }
@@ -120,7 +120,7 @@ public class BasicLogicalPlanVisitor<T> implements LogicalPlanVisitor<T> {
   public LogicalNode visitSort(LogicalPlan plan, SortNode node, Stack<LogicalNode> stack, T data)
       throws PlanningException {
     stack.push(node);
-    visitChild(plan, node.getSubNode(), stack, data);
+    visitChild(plan, node.getChild(), stack, data);
     stack.pop();
     return node;
   }
@@ -129,7 +129,7 @@ public class BasicLogicalPlanVisitor<T> implements LogicalPlanVisitor<T> {
   public LogicalNode visitGroupBy(LogicalPlan plan, GroupbyNode node, Stack<LogicalNode> stack, T data)
       throws PlanningException {
     stack.push(node);
-    visitChild(plan, node.getSubNode(), stack, data);
+    visitChild(plan, node.getChild(), stack, data);
     stack.pop();
     return node;
   }
@@ -138,7 +138,7 @@ public class BasicLogicalPlanVisitor<T> implements LogicalPlanVisitor<T> {
   public LogicalNode visitFilter(LogicalPlan plan, SelectionNode node, Stack<LogicalNode> stack, T data)
       throws PlanningException {
     stack.push(node);
-    visitChild(plan, node.getSubNode(), stack, data);
+    visitChild(plan, node.getChild(), stack, data);
     stack.pop();
     return node;
   }
@@ -147,8 +147,8 @@ public class BasicLogicalPlanVisitor<T> implements LogicalPlanVisitor<T> {
   public LogicalNode visitJoin(LogicalPlan plan, JoinNode node, Stack<LogicalNode> stack, T data)
       throws PlanningException {
     stack.push(node);
-    visitChild(plan, node.getOuterNode(), stack, data);
-    visitChild(plan, node.getInnerNode(), stack, data);
+    visitChild(plan, node.getLeftChild(), stack, data);
+    visitChild(plan, node.getRightChild(), stack, data);
     stack.pop();
     return node;
   }
@@ -157,8 +157,8 @@ public class BasicLogicalPlanVisitor<T> implements LogicalPlanVisitor<T> {
   public LogicalNode visitUnion(LogicalPlan plan, UnionNode node, Stack<LogicalNode> stack, T data)
       throws PlanningException {
     stack.push(node);
-    visitChild(plan, node.getOuterNode(), stack, data);
-    visitChild(plan, node.getInnerNode(), stack, data);
+    visitChild(plan, node.getLeftChild(), stack, data);
+    visitChild(plan, node.getRightChild(), stack, data);
     stack.pop();
     return node;
   }
@@ -167,8 +167,8 @@ public class BasicLogicalPlanVisitor<T> implements LogicalPlanVisitor<T> {
   public LogicalNode visitExcept(LogicalPlan plan, ExceptNode node, Stack<LogicalNode> stack, T data)
       throws PlanningException {
     stack.push(node);
-    visitChild(plan, node.getOuterNode(), stack, data);
-    visitChild(plan, node.getInnerNode(), stack, data);
+    visitChild(plan, node.getLeftChild(), stack, data);
+    visitChild(plan, node.getRightChild(), stack, data);
     stack.pop();
     return node;
   }
@@ -177,8 +177,8 @@ public class BasicLogicalPlanVisitor<T> implements LogicalPlanVisitor<T> {
   public LogicalNode visitIntersect(LogicalPlan plan, IntersectNode node, Stack<LogicalNode> stack, T data)
       throws PlanningException {
     stack.push(node);
-    visitChild(plan, node.getOuterNode(), stack, data);
-    visitChild(plan, node.getInnerNode(), stack, data);
+    visitChild(plan, node.getLeftChild(), stack, data);
+    visitChild(plan, node.getRightChild(), stack, data);
     stack.pop();
     return node;
   }
@@ -193,7 +193,7 @@ public class BasicLogicalPlanVisitor<T> implements LogicalPlanVisitor<T> {
   public LogicalNode visitStoreTable(LogicalPlan plan, StoreTableNode node, Stack<LogicalNode> stack, T data)
       throws PlanningException {
     stack.push(node);
-    visitChild(plan, node.getSubNode(), stack, data);
+    visitChild(plan, node.getChild(), stack, data);
     stack.pop();
     return node;
   }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/FromTable.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/FromTable.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/FromTable.java
index 0e3a174..3d4a607 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/FromTable.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/FromTable.java
@@ -46,11 +46,11 @@ public class FromTable implements Cloneable, GsonObject {
   }
 
   public final String getTableName() {
-    return desc.getId();
+    return desc.getName();
   }
 
   public final String getTableId() {
-    return alias == null ? desc.getId() : alias;
+    return alias == null ? desc.getName() : alias;
   }
 
   public final CatalogProtos.StoreType getStoreType() {
@@ -75,9 +75,9 @@ public class FromTable implements Cloneable, GsonObject {
 
   public final String toString() {
     if (alias != null)
-      return desc.getId() + " as " + alias;
+      return desc.getName() + " as " + alias;
     else
-      return desc.getId();
+      return desc.getName();
   }
 
   public boolean equals(Object obj) {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlan.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlan.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlan.java
index 8c39d00..ac6cb45e 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlan.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlan.java
@@ -26,6 +26,7 @@ import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.engine.eval.EvalNode;
 import org.apache.tajo.engine.eval.EvalTreeUtil;
+import org.apache.tajo.engine.eval.EvalType;
 import org.apache.tajo.engine.planner.logical.*;
 
 import java.util.*;
@@ -481,7 +482,7 @@ public class LogicalPlan {
             if (canTargetEvaluated(i, node)) {
 
               if (node instanceof ScanNode) { // for scan node
-                if (expr.getType() == EvalNode.Type.FIELD) {
+                if (expr.getType() == EvalType.FIELD) {
                   targetListManager.setEvaluated(i);
                   if (targetListManager.getTarget(i).hasAlias()) {
                     newEvaluatedTargetIds.add(i);