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/08 04:17:13 UTC

[2/4] TAJO-95: Eliminate the lazy copy approach from the classes wrapping protobuf-generated classes. (hyunsik)

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-common/src/main/java/org/apache/tajo/json/ClassNameSerializer.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/json/ClassNameSerializer.java b/tajo-common/src/main/java/org/apache/tajo/json/ClassNameSerializer.java
new file mode 100644
index 0000000..9e9a4ee
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/json/ClassNameSerializer.java
@@ -0,0 +1,46 @@
+/**
+ * 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 java.lang.reflect.Type;
+
+public class ClassNameSerializer implements GsonSerDerAdapter<Class> {
+
+	@Override
+	public JsonElement serialize(Class clazz, Type type,
+			JsonSerializationContext ctx) {
+		return new JsonPrimitive(clazz.getName());
+	}
+
+  @Override
+  public Class deserialize(JsonElement json, Type type,
+                           JsonDeserializationContext ctx) throws JsonParseException {
+    try {
+      return Class.forName(json.getAsString());
+    } catch (ClassNotFoundException e) {
+      e.printStackTrace();
+    }
+    return null;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-common/src/main/java/org/apache/tajo/json/CommonGsonHelper.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/json/CommonGsonHelper.java b/tajo-common/src/main/java/org/apache/tajo/json/CommonGsonHelper.java
new file mode 100644
index 0000000..3badbc0
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/json/CommonGsonHelper.java
@@ -0,0 +1,70 @@
+/**
+ * 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.Gson;
+import com.google.gson.GsonBuilder;
+import org.apache.tajo.datum.Datum;
+import org.apache.tajo.util.TUtil;
+
+import java.lang.reflect.Type;
+import java.util.Map;
+
+public class CommonGsonHelper {
+  private static Gson gson;
+  private static Gson gsonPretty;
+
+  private CommonGsonHelper() {
+  }
+	
+	private static Map<Type, GsonSerDerAdapter> registerAdapters() {
+    Map<Type, GsonSerDerAdapter> adapters = TUtil.newHashMap();
+    adapters.put(Datum.class, new DatumAdapter());
+
+    return adapters;
+	}
+
+	public static Gson getInstance() {
+	  if (gson == null ) {
+      GsonHelper helper = new GsonHelper(registerAdapters());
+      gson = helper.getGson();
+	  }
+	  return gson;
+	}
+
+  public static Gson getPrettyInstance() {
+    if (gsonPretty == null) {
+      GsonBuilder prettyBuilder = new GsonBuilder()
+          .setPrettyPrinting()
+          .excludeFieldsWithoutExposeAnnotation();
+      GsonHelper.registerAdapters(prettyBuilder, registerAdapters());
+      gsonPretty = prettyBuilder.create();
+    }
+
+    return gsonPretty;
+  }
+
+  public static String toJson(GsonObject object, Class<? extends GsonObject> clazz) {
+    return getInstance().toJson(object, clazz);
+  }
+
+  public static <T extends GsonObject> T fromJson(String json, Class<T> clazz) {
+    return getInstance().fromJson(json, clazz);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/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
new file mode 100644
index 0000000..3df6939
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/json/DataTypeAdapter.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.json;
+
+import com.google.gson.*;
+import org.apache.tajo.common.TajoDataTypes;
+import org.apache.tajo.common.TajoDataTypes.DataType;
+
+import java.lang.reflect.Type;
+
+
+public class DataTypeAdapter implements GsonSerDerAdapter<DataType> {
+
+  @Override
+  public DataType deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
+      throws JsonParseException {
+
+    JsonObject obj = (JsonObject) json;
+    DataType.Builder builder = DataType.newBuilder();
+    TajoDataTypes.Type type = Enum.valueOf(TajoDataTypes.Type.class, obj.get("type").getAsString());
+    builder.setType(type);
+
+    JsonElement len = obj.get("len");
+    if (len != null) {
+      builder.setLength(len.getAsInt());
+    }
+    JsonElement code = obj.get("code");
+    if (code != null) {
+      builder.setCode(code.getAsString());
+    }
+    return builder.build();
+  }
+
+  @Override
+  public JsonElement serialize(DataType src, Type typeOfSrc, JsonSerializationContext context) {
+    JsonObject json = new JsonObject();
+    json.addProperty("type", src.getType().name());
+    if (src.hasLength()) {
+      json.addProperty("len", src.getLength());
+    }
+    if (src.hasCode()) {
+      json.addProperty("code", src.getCode());
+    }
+
+    return json;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/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
new file mode 100644
index 0000000..8f9bb4e
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java
@@ -0,0 +1,54 @@
+/**
+ * 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 DatumAdapter 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/1c677cc5/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
new file mode 100644
index 0000000..70af19f
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/json/DatumTypeAdapter.java
@@ -0,0 +1,55 @@
+/**
+ * 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/1c677cc5/tajo-common/src/main/java/org/apache/tajo/json/GsonHelper.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/json/GsonHelper.java b/tajo-common/src/main/java/org/apache/tajo/json/GsonHelper.java
new file mode 100644
index 0000000..8c6d891
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/json/GsonHelper.java
@@ -0,0 +1,49 @@
+/**
+ * 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 java.lang.reflect.Type;
+import java.util.Map;
+
+public class GsonHelper {
+  private final GsonBuilder builder;
+  private final Gson gson;
+
+  public GsonHelper(Map<Type, GsonSerDerAdapter> adapters) {
+    builder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation();
+    registerAdapters(builder, adapters);
+    gson = builder.create();
+  }
+
+  public static void registerAdapters(GsonBuilder builder, Map<Type, GsonSerDerAdapter> adapters) {
+    for (Map.Entry<Type, GsonSerDerAdapter> entry : adapters.entrySet()) {
+      try {
+        builder.registerTypeAdapter(entry.getKey(), entry.getValue());
+      } catch (Exception e) {
+        e.printStackTrace();
+      }
+    }
+  }
+
+  public Gson getGson() {
+    return gson;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-common/src/main/java/org/apache/tajo/json/GsonObject.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/json/GsonObject.java b/tajo-common/src/main/java/org/apache/tajo/json/GsonObject.java
new file mode 100644
index 0000000..b7e69c1
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/json/GsonObject.java
@@ -0,0 +1,23 @@
+/**
+ * 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;
+
+public interface GsonObject {
+  String toJson();
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-common/src/main/java/org/apache/tajo/json/GsonSerDerAdapter.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/json/GsonSerDerAdapter.java b/tajo-common/src/main/java/org/apache/tajo/json/GsonSerDerAdapter.java
new file mode 100644
index 0000000..80a40f8
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/json/GsonSerDerAdapter.java
@@ -0,0 +1,25 @@
+/**
+ * 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.JsonDeserializer;
+import com.google.gson.JsonSerializer;
+
+public interface GsonSerDerAdapter<T> extends JsonSerializer<T>, JsonDeserializer<T> {
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-common/src/main/java/org/apache/tajo/json/PathDeserializer.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/json/PathDeserializer.java b/tajo-common/src/main/java/org/apache/tajo/json/PathDeserializer.java
new file mode 100644
index 0000000..739a28a
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/json/PathDeserializer.java
@@ -0,0 +1,40 @@
+/**
+ * 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.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParseException;
+import org.apache.hadoop.fs.Path;
+
+import java.lang.reflect.Type;
+
+public class PathDeserializer implements JsonDeserializer<Path> {
+
+	@Override
+	public Path deserialize(JsonElement arg0, Type arg1,
+			JsonDeserializationContext arg2) throws JsonParseException {
+		return new Path(arg0.getAsJsonPrimitive().getAsString());
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/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
new file mode 100644
index 0000000..3ee8e2b
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/json/PathSerializer.java
@@ -0,0 +1,42 @@
+/**
+ * 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.hadoop.fs.Path;
+
+import java.lang.reflect.Type;
+
+public class PathSerializer implements GsonSerDerAdapter<Path> {
+
+	@Override
+	public JsonElement serialize(Path arg0, Type arg1,
+			JsonSerializationContext arg2) {
+		return new JsonPrimitive(arg0.toString());
+	}
+
+  @Override
+  public Path deserialize(JsonElement arg0, Type arg1,
+                          JsonDeserializationContext arg2) throws JsonParseException {
+    return new Path(arg0.getAsJsonPrimitive().getAsString());
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-common/src/main/java/org/apache/tajo/util/TUtil.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/util/TUtil.java b/tajo-common/src/main/java/org/apache/tajo/util/TUtil.java
index f44062d..7eaade8 100644
--- a/tajo-common/src/main/java/org/apache/tajo/util/TUtil.java
+++ b/tajo-common/src/main/java/org/apache/tajo/util/TUtil.java
@@ -78,6 +78,14 @@ public class TUtil {
     return new HashSet<T>(Arrays.asList(items));
   }
 
+  public static <K,V> Map<K,V> newHashMap() {
+    return new HashMap<K, V>();
+  }
+
+  public static <K,V> Map<K,V> newHashMap(Map<K,V> map) {
+    return new HashMap<K, V>(map);
+  }
+
   public static <T> List<T> newList() {
     return new ArrayList<T>();
   }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-common/src/test/java/org/apache/tajo/datum/TestBoolDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/test/java/org/apache/tajo/datum/TestBoolDatum.java b/tajo-common/src/test/java/org/apache/tajo/datum/TestBoolDatum.java
index 399f615..3ae8522 100644
--- a/tajo-common/src/test/java/org/apache/tajo/datum/TestBoolDatum.java
+++ b/tajo-common/src/test/java/org/apache/tajo/datum/TestBoolDatum.java
@@ -18,8 +18,8 @@
 
 package org.apache.tajo.datum;
 
-import org.junit.Test;
 import org.apache.tajo.common.TajoDataTypes.Type;
+import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-common/src/test/java/org/apache/tajo/datum/TestBytesDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/test/java/org/apache/tajo/datum/TestBytesDatum.java b/tajo-common/src/test/java/org/apache/tajo/datum/TestBytesDatum.java
index fa4d4d6..94aafe8 100644
--- a/tajo-common/src/test/java/org/apache/tajo/datum/TestBytesDatum.java
+++ b/tajo-common/src/test/java/org/apache/tajo/datum/TestBytesDatum.java
@@ -18,9 +18,9 @@
 
 package org.apache.tajo.datum;
 
-import org.junit.Test;
 import org.apache.tajo.common.TajoDataTypes.Type;
-import org.apache.tajo.datum.json.GsonCreator;
+import org.apache.tajo.json.CommonGsonHelper;
+import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -48,8 +48,8 @@ public class TestBytesDatum {
   @Test
   public final void testJson() {
 	  Datum d = DatumFactory.createBlob("12345".getBytes());
-	  String json = d.toJSON();
-	  Datum fromJson = GsonCreator.getInstance().fromJson(json, Datum.class);
+	  String json = d.toJson();
+	  Datum fromJson = CommonGsonHelper.fromJson(json, Datum.class);
 	  assertTrue(d.equalsTo(fromJson).asBool());
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-common/src/test/java/org/apache/tajo/datum/TestInet4Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/test/java/org/apache/tajo/datum/TestInet4Datum.java b/tajo-common/src/test/java/org/apache/tajo/datum/TestInet4Datum.java
index 77b3363..2708386 100644
--- a/tajo-common/src/test/java/org/apache/tajo/datum/TestInet4Datum.java
+++ b/tajo-common/src/test/java/org/apache/tajo/datum/TestInet4Datum.java
@@ -18,9 +18,9 @@
 
 package org.apache.tajo.datum;
 
+import org.apache.tajo.json.CommonGsonHelper;
 import org.junit.Before;
 import org.junit.Test;
-import org.apache.tajo.datum.json.GsonCreator;
 
 import java.util.Arrays;
 
@@ -68,8 +68,8 @@ public class TestInet4Datum {
 	@Test
 	public final void testJson() {
 		Datum d = DatumFactory.createInet4("163.152.163.152");
-		String json = d.toJSON();
-		Datum fromJson = GsonCreator.getInstance().fromJson(json, Datum.class);
+		String json = d.toJson();
+		Datum fromJson = CommonGsonHelper.fromJson(json, Datum.class);
 		assertTrue(d.equalsTo(fromJson).asBool());
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/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 0e46c32..9aae34e 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
@@ -25,7 +25,6 @@ import org.apache.tajo.catalog.function.AggFunction;
 import org.apache.tajo.catalog.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.datum.Datum;
-import org.apache.tajo.engine.json.GsonCreator;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.storage.VTuple;
 
@@ -41,9 +40,7 @@ public class AggFuncCallEval extends FuncEval implements Cloneable {
 
   @Override
   public EvalContext newContext() {
-    AggFunctionCtx newCtx = new AggFunctionCtx(argEvals, instance.newContext());
-
-    return newCtx;
+    return new AggFunctionCtx(argEvals, instance.newContext());
   }
 
   @Override
@@ -87,13 +84,8 @@ public class AggFuncCallEval extends FuncEval implements Cloneable {
     }
   }
 
-  public String toJSON() {
-	  return GsonCreator.getInstance().toJson(this, EvalNode.class);
-  }
-
   public Object clone() throws CloneNotSupportedException {
-    AggFuncCallEval agg = (AggFuncCallEval) super.clone();
-    return agg;
+    return super.clone();
   }
 
   public void setFirstPhase() {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/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 a30e77c..2a95ddf 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
@@ -20,7 +20,6 @@ package org.apache.tajo.engine.eval;
 
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
-import com.google.gson.Gson;
 import com.google.gson.annotations.Expose;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
@@ -28,7 +27,6 @@ import org.apache.tajo.common.TajoDataTypes;
 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.GsonCreator;
 import org.apache.tajo.engine.utils.SchemaUtil;
 import org.apache.tajo.storage.Tuple;
 
@@ -202,11 +200,6 @@ public class BinaryEval extends EvalNode implements Cloneable {
 		return leftExpr +" "+type+" "+rightExpr;
 	}
 	
-	public String toJSON() {
-	  Gson gson = GsonCreator.getInstance();
-	  return gson.toJson(this, EvalNode.class);
-	}
-	
   @Override
   public boolean equals(Object obj) {
     if (obj instanceof BinaryEval) {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/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 4f385b0..4bbdcb8 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,17 +20,20 @@ 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;
 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.storage.Tuple;
+import org.apache.tajo.util.TUtil;
 
 import java.util.List;
 
-public class CaseWhenEval extends EvalNode {
+public class CaseWhenEval extends EvalNode implements GsonObject {
   @Expose private List<WhenEval> whens = Lists.newArrayList();
   @Expose private EvalNode elseResult;
 
@@ -87,6 +90,7 @@ public class CaseWhenEval extends EvalNode {
     }
   }
 
+  @Override
   public String toString() {
     StringBuilder sb = new StringBuilder("CASE\n");
     for (WhenEval when : whens) {
@@ -130,13 +134,13 @@ public class CaseWhenEval extends EvalNode {
           return false;
         }
       }
-      return elseResult.equals(other.elseResult);
+      return TUtil.checkEquals(elseResult, other.elseResult);
     } else {
       return false;
     }
   }
 
-  public static class WhenEval extends EvalNode {
+  public static class WhenEval extends EvalNode implements GsonObject {
     @Expose private EvalNode condition;
     @Expose private EvalNode result;
 
@@ -179,10 +183,27 @@ public class CaseWhenEval extends EvalNode {
       return this.result;
     }
 
+    @Override
+    public boolean equals(Object object) {
+      if (object instanceof WhenEval) {
+        WhenEval other = (WhenEval) object;
+        return condition.equals(other.condition) &&
+            result.equals(other.result);
+      } else {
+        return false;
+      }
+    }
+
+    @Override
     public String toString() {
       return "WHEN " + condition + " THEN " + result;
     }
 
+    @Override
+    public String toJson() {
+      return CoreGsonHelper.toJson(WhenEval.this, WhenEval.class);
+    }
+
     private class WhenContext implements EvalContext {
       EvalContext condCtx;
       EvalContext resultCtx;
@@ -210,17 +231,6 @@ public class CaseWhenEval extends EvalNode {
       result.postOrder(visitor);
       visitor.visit(this);
     }
-
-    @Override
-    public boolean equals(Object obj) {
-      if (obj instanceof WhenEval) {
-       WhenEval other = (WhenEval) obj;
-        return this.condition == other.condition
-            && this.result == other.result;
-      } else {
-        return false;
-      }
-    }
   }
 
   private class CaseContext implements EvalContext {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/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 7ab019f..069db2c 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
@@ -19,13 +19,11 @@
 package org.apache.tajo.engine.eval;
 
 import com.google.common.base.Objects;
-import com.google.gson.Gson;
 import com.google.gson.annotations.Expose;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.datum.Datum;
-import org.apache.tajo.engine.json.GsonCreator;
 
 public class ConstEval extends EvalNode implements Comparable<ConstEval>, Cloneable {
 	@Expose Datum datum = null;
@@ -53,11 +51,6 @@ public class ConstEval extends EvalNode implements Comparable<ConstEval>, Clonea
 	public String toString() {
 		return datum.toString();
 	}
-	
-	public String toJSON() {
-		Gson gson = GsonCreator.getInstance();
-		return gson.toJson(this, EvalNode.class);
-	}
 
   @Override
 	public DataType [] getValueType() {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/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 b6c7276..12e1cf8 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
@@ -18,21 +18,18 @@
 
 package org.apache.tajo.engine.eval;
 
-import com.google.gson.Gson;
 import com.google.gson.annotations.Expose;
+import org.apache.tajo.json.GsonObject;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.datum.Datum;
-import org.apache.tajo.engine.json.GsonCreator;
+import org.apache.tajo.engine.json.CoreGsonHelper;
 import org.apache.tajo.storage.Tuple;
 
-public abstract class EvalNode implements Cloneable {
-	@Expose
-	protected Type type;
-	@Expose
-	protected EvalNode leftExpr;
-	@Expose
-	protected EvalNode rightExpr;
+public abstract class EvalNode implements Cloneable, GsonObject {
+	@Expose protected Type type;
+	@Expose protected EvalNode leftExpr;
+	@Expose protected EvalNode rightExpr;
 	
 	public EvalNode(Type type) {
 		this.type = type;
@@ -83,10 +80,10 @@ public abstract class EvalNode implements Cloneable {
 	public String toString() {
 		return "("+this.type+"("+leftExpr.toString()+" "+rightExpr.toString()+"))";
 	}
-	
-	public String toJSON() {
-	  Gson gson = GsonCreator.getInstance();
-    return gson.toJson(this, EvalNode.class);
+
+  @Override
+	public String toJson() {
+    return CoreGsonHelper.toJson(this, EvalNode.class);
 	}
 	
 	public void eval(EvalContext ctx, Schema schema, Tuple tuple) {}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/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 75a6eb7..9282497 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
@@ -18,13 +18,11 @@
 
 package org.apache.tajo.engine.eval;
 
-import com.google.gson.Gson;
 import com.google.gson.annotations.Expose;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.datum.Datum;
-import org.apache.tajo.engine.json.GsonCreator;
 import org.apache.tajo.engine.utils.SchemaUtil;
 import org.apache.tajo.storage.Tuple;
 
@@ -130,11 +128,6 @@ public class FieldEval extends EvalNode implements Cloneable {
     
     return eval;
   }
-  
-  public String toJSON() {
-    Gson gson = GsonCreator.getInstance();
-    return gson.toJson(this, EvalNode.class);
-  }
 
   public void preOrder(EvalNodeVisitor visitor) {
     visitor.visit(this);

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/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 9787805..d44385e 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
@@ -19,13 +19,11 @@
 package org.apache.tajo.engine.eval;
 
 import com.google.common.base.Objects;
-import com.google.gson.Gson;
 import com.google.gson.annotations.Expose;
 import org.apache.tajo.catalog.FunctionDesc;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.function.GeneralFunction;
 import org.apache.tajo.datum.Datum;
-import org.apache.tajo.engine.json.GsonCreator;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.storage.VTuple;
 import org.apache.tajo.util.TUtil;
@@ -66,12 +64,6 @@ public class FuncCallEval extends FuncEval {
     }
     return instance.eval(params);
   }
-
-  @Override
-	public String toJSON() {
-	  Gson gson = GsonCreator.getInstance();
-    return gson.toJson(this, EvalNode.class);
-	}
 	
 	@Override
 	public boolean equals(Object obj) {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/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 350b761..2ff6d19 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
@@ -19,13 +19,11 @@
 package org.apache.tajo.engine.eval;
 
 import com.google.common.base.Objects;
-import com.google.gson.Gson;
 import com.google.gson.annotations.Expose;
 import org.apache.tajo.catalog.FunctionDesc;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.datum.Datum;
-import org.apache.tajo.engine.json.GsonCreator;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.util.TUtil;
 
@@ -77,12 +75,6 @@ public abstract class FuncEval extends EvalNode implements Cloneable {
 		}
 		return funcDesc.getSignature()+"("+sb+")";
 	}
-
-  @Override
-	public String toJSON() {
-	  Gson gson = GsonCreator.getInstance();
-    return gson.toJson(this, EvalNode.class);
-	}
 	
 	@Override
 	public boolean equals(Object obj) {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/CoreGsonHelper.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/CoreGsonHelper.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/CoreGsonHelper.java
new file mode 100644
index 0000000..a3b8ac6
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/CoreGsonHelper.java
@@ -0,0 +1,94 @@
+/**
+ * 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.Gson;
+import com.google.gson.GsonBuilder;
+import org.apache.hadoop.fs.Path;
+import org.apache.tajo.json.GsonObject;
+import org.apache.tajo.catalog.TableDesc;
+import org.apache.tajo.catalog.TableMeta;
+import org.apache.tajo.catalog.function.AggFunction;
+import org.apache.tajo.catalog.function.Function;
+import org.apache.tajo.catalog.function.GeneralFunction;
+import org.apache.tajo.catalog.json.FunctionAdapter;
+import org.apache.tajo.catalog.json.TableDescAdapter;
+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.planner.logical.LogicalNode;
+import org.apache.tajo.json.*;
+import org.apache.tajo.util.TUtil;
+
+import java.lang.reflect.Type;
+import java.util.Map;
+
+public class CoreGsonHelper {
+  private static Gson gson;
+  private static Gson gsonPretty;
+
+  private CoreGsonHelper() {
+  }
+	
+	private static Map<Type, GsonSerDerAdapter> registerAdapters() {
+    Map<Type, GsonSerDerAdapter> adapters = TUtil.newHashMap();
+    adapters.put(Path.class, new PathSerializer());
+    adapters.put(TableDesc.class, new TableDescAdapter());
+    adapters.put(Class.class, new ClassNameSerializer());
+    adapters.put(LogicalNode.class, new LogicalNodeAdapter());
+    adapters.put(EvalNode.class, new EvalNodeAdapter());
+    adapters.put(TableMeta.class, new TableMetaAdapter());
+    adapters.put(Function.class, new FunctionAdapter());
+    adapters.put(GeneralFunction.class, new FunctionAdapter());
+    adapters.put(AggFunction.class, new FunctionAdapter());
+    adapters.put(Datum.class, new DatumAdapter());
+    adapters.put(DataType.class, new DataTypeAdapter());
+
+    return adapters;
+	}
+
+	public static Gson getInstance() {
+	  if (gson == null ) {
+      GsonHelper helper = new GsonHelper(registerAdapters());
+      gson = helper.getGson();
+	  }
+	  return gson;
+	}
+
+  public static Gson getPrettyInstance() {
+    if (gsonPretty == null) {
+      GsonBuilder prettyBuilder = new GsonBuilder()
+          .setPrettyPrinting()
+          .excludeFieldsWithoutExposeAnnotation();
+      GsonHelper.registerAdapters(prettyBuilder, registerAdapters());
+      gsonPretty = prettyBuilder.create();
+    }
+
+    return gsonPretty;
+  }
+
+  public static String toJson(GsonObject object, Class<? extends GsonObject> clazz) {
+    return getInstance().toJson(object, clazz);
+  }
+
+  public static <T extends GsonObject> T fromJson(String json, Class<T> clazz) {
+    return getInstance().fromJson(json, clazz);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/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 49ea542..74c7305 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,10 +23,11 @@ package org.apache.tajo.engine.json;
 
 import com.google.gson.*;
 import org.apache.tajo.engine.eval.EvalNode;
+import org.apache.tajo.json.GsonSerDerAdapter;
 
 import java.lang.reflect.Type;
 
-public class EvalNodeAdapter implements JsonSerializer<EvalNode>, JsonDeserializer<EvalNode> {
+public class EvalNodeAdapter implements GsonSerDerAdapter<EvalNode> {
 
 	@Override
 	public EvalNode deserialize(JsonElement json, Type type,

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/FragmentDeserializer.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/FragmentDeserializer.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/FragmentDeserializer.java
index 41b2ef6..6231c03 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/FragmentDeserializer.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/FragmentDeserializer.java
@@ -36,11 +36,11 @@ public class FragmentDeserializer implements JsonDeserializer<Fragment> {
 	@Override
 	public Fragment deserialize(JsonElement json, Type type,
 			JsonDeserializationContext ctx) throws JsonParseException {
-		Gson gson = GsonCreator.getInstance();
+		Gson gson = CoreGsonHelper.getInstance();
 		JsonObject fragObj = json.getAsJsonObject();
 		JsonObject metaObj = fragObj.get("meta").getAsJsonObject();
 		TableMetaImpl meta = new TableMetaImpl(
-		    gson.fromJson(metaObj.get("schema"), Schema.class), 
+		    gson.fromJson(metaObj.get("schema"), Schema.class),
 				gson.fromJson(metaObj.get("storeType"), StoreType.class), 
 				gson.fromJson(metaObj.get("options"), Options.class));
 		Fragment fragment = new Fragment(fragObj.get("tabletId").getAsString(), 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/FromTableDeserializer.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/FromTableDeserializer.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/FromTableDeserializer.java
index 4a5b2ac..501ae0a 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/FromTableDeserializer.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/FromTableDeserializer.java
@@ -34,7 +34,7 @@ public class FromTableDeserializer implements JsonDeserializer<FromTable> {
 	@Override
 	public FromTable deserialize(JsonElement json, Type type,
 			JsonDeserializationContext ctx) throws JsonParseException {
-		Gson gson = GsonCreator.getInstance();
+		Gson gson = CoreGsonHelper.getInstance();
 		JsonObject fromTableObj = json.getAsJsonObject();
 		boolean isFragment = fromTableObj.get("isFragment").getAsBoolean();
 		TableDesc desc;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/GsonCreator.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/GsonCreator.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/GsonCreator.java
deleted file mode 100644
index 98e7f1f..0000000
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/json/GsonCreator.java
+++ /dev/null
@@ -1,81 +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.Gson;
-import com.google.gson.GsonBuilder;
-import org.apache.hadoop.fs.Path;
-import org.apache.tajo.catalog.TableDesc;
-import org.apache.tajo.catalog.TableMeta;
-import org.apache.tajo.catalog.function.AggFunction;
-import org.apache.tajo.catalog.function.Function;
-import org.apache.tajo.catalog.function.GeneralFunction;
-import org.apache.tajo.catalog.json.FunctionAdapter;
-import org.apache.tajo.catalog.json.TableDescAdapter;
-import org.apache.tajo.catalog.json.TableMetaAdapter;
-import org.apache.tajo.common.TajoDataTypes.DataType;
-import org.apache.tajo.datum.Datum;
-import org.apache.tajo.datum.json.DatumAdapter;
-import org.apache.tajo.engine.eval.EvalNode;
-import org.apache.tajo.engine.planner.logical.LogicalNode;
-import org.apache.tajo.gson.*;
-
-public class GsonCreator {
-	private static GsonBuilder builder;
-	private static Gson gson;
-	
-	private static void init() {
-		if (builder == null) {
-			builder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation();
-			builder.registerTypeAdapter(Path.class, new PathSerializer());
-			builder.registerTypeAdapter(Path.class, new PathDeserializer());
-			builder.registerTypeAdapter(TableDesc.class, new TableDescAdapter());
-			builder.registerTypeAdapter(Class.class, new ClassNameSerializer());
-			builder.registerTypeAdapter(Class.class, new ClassNameDeserializer());
-			builder.registerTypeAdapter(LogicalNode.class, new LogicalNodeAdapter());
-			builder.registerTypeAdapter(EvalNode.class, new EvalNodeAdapter());
-			builder.registerTypeAdapter(TableMeta.class, new TableMetaAdapter());
-			builder.registerTypeAdapter(Datum.class, new DatumTypeAdapter());
-			builder.registerTypeAdapter(Function.class, new FunctionAdapter());
-      builder.registerTypeAdapter(GeneralFunction.class, new FunctionAdapter());
-      builder.registerTypeAdapter(AggFunction.class, new FunctionAdapter());
-			builder.registerTypeAdapter(Datum.class, new DatumAdapter());
-      builder.registerTypeAdapter(DataType.class, new DataTypeAdapter());
-		}
-	}
-
-	public static Gson getInstance() {
-	  init();
-	  if (gson == null ) {
-	    gson = builder.create();
-	  }
-	  return gson;
-	}
-
-	public static Gson getPrettyInstance() {
-	  init();
-	  if (gson == null ) {
-	    gson = builder.setPrettyPrinting().create();
-	  }
-	  return gson;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/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 1716916..d98bd53 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,10 +23,11 @@ package org.apache.tajo.engine.json;
 
 import com.google.gson.*;
 import org.apache.tajo.engine.planner.logical.LogicalNode;
+import org.apache.tajo.json.GsonSerDerAdapter;
 
 import java.lang.reflect.Type;
 
-public class LogicalNodeAdapter implements JsonSerializer<LogicalNode>, JsonDeserializer<LogicalNode> {
+public class LogicalNodeAdapter implements GsonSerDerAdapter<LogicalNode> {
 
 	@Override
 	public LogicalNode deserialize(JsonElement json, Type type,

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/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 24161d4..04c1bb9 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
@@ -18,19 +18,17 @@
 
 package org.apache.tajo.engine.planner;
 
-import com.google.gson.Gson;
 import com.google.gson.annotations.Expose;
+import org.apache.tajo.json.GsonObject;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.TableDesc;
 import org.apache.tajo.catalog.proto.CatalogProtos;
-import org.apache.tajo.engine.json.GsonCreator;
+import org.apache.tajo.engine.json.CoreGsonHelper;
 import org.apache.tajo.util.TUtil;
 
-public class FromTable implements Cloneable {
-  @Expose
-  private TableDesc desc;
-  @Expose
-  private String alias = null;
+public class FromTable implements Cloneable, GsonObject {
+  @Expose private TableDesc desc;
+  @Expose private String alias = null;
 
   public FromTable() {}
 
@@ -97,9 +95,8 @@ public class FromTable implements Cloneable {
     return table;
   }
 
-  public String toJSON() {
-    desc.initFromProto();
-    Gson gson = GsonCreator.getInstance();
-    return gson.toJson(this, FromTable.class);
+  @Override
+  public String toJson() {
+    return CoreGsonHelper.toJson(this, FromTable.class);
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/Target.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/Target.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/Target.java
index b2651a1..3db4d94 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/Target.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/Target.java
@@ -19,17 +19,18 @@
 package org.apache.tajo.engine.planner;
 
 import com.google.gson.annotations.Expose;
+import org.apache.tajo.json.GsonObject;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.engine.eval.EvalNode;
-import org.apache.tajo.engine.json.GsonCreator;
+import org.apache.tajo.engine.json.CoreGsonHelper;
 import org.apache.tajo.util.TUtil;
 
 /**
  * A Target contains how to evaluate an expression and its alias name.
  */
-public class Target implements Cloneable {
+public class Target implements Cloneable, GsonObject {
   @Expose private EvalNode expr;
   @Expose private Column column;
   @Expose private String alias = null;
@@ -109,7 +110,7 @@ public class Target implements Cloneable {
     return target;
   }
 
-  public String toJSON() {
-    return GsonCreator.getInstance().toJson(this, Target.class);
+  public String toJson() {
+    return CoreGsonHelper.toJson(this, Target.class);
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/BinaryNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/BinaryNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/BinaryNode.java
index 061964d..1adddf3 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/BinaryNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/BinaryNode.java
@@ -22,13 +22,11 @@
 package org.apache.tajo.engine.planner.logical;
 
 import com.google.gson.annotations.Expose;
-import org.apache.tajo.engine.json.GsonCreator;
+import org.apache.tajo.json.GsonObject;
 
-public abstract class BinaryNode extends LogicalNode implements Cloneable {
-	@Expose
-	LogicalNode outer = null;
-	@Expose
-	LogicalNode inner = null;
+public abstract class BinaryNode extends LogicalNode implements Cloneable, GsonObject {
+	@Expose LogicalNode outer = null;
+	@Expose LogicalNode inner = null;
 	
 	public BinaryNode() {
 		super();
@@ -77,10 +75,4 @@ public abstract class BinaryNode extends LogicalNode implements Cloneable {
     inner.postOrder(visitor);
     visitor.visit(this);
   }
-
-  public String toJSON() {
-    outer.toJSON();
-    inner.toJSON();
-    return GsonCreator.getInstance().toJson(this, LogicalNode.class);
-  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/CreateTableNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/CreateTableNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/CreateTableNode.java
index c7a6ad2..a4d335b 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/CreateTableNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/CreateTableNode.java
@@ -24,7 +24,6 @@ import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Options;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.proto.CatalogProtos.StoreType;
-import org.apache.tajo.engine.json.GsonCreator;
 import org.apache.tajo.util.TUtil;
 
 public class CreateTableNode extends LogicalNode implements Cloneable {
@@ -143,10 +142,6 @@ public class CreateTableNode extends LogicalNode implements Cloneable {
     
     return sb.toString();
   }
-  
-  public String toJSON() {
-    return GsonCreator.getInstance().toJson(this, LogicalNode.class);
-  }
 
   @Override
   public void preOrder(LogicalNodeVisitor visitor) {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/DropTableNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/DropTableNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/DropTableNode.java
index 877b805..d586bf9 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/DropTableNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/DropTableNode.java
@@ -18,8 +18,6 @@
 
 package org.apache.tajo.engine.planner.logical;
 
-import org.apache.tajo.engine.json.GsonCreator;
-
 public class DropTableNode extends LogicalNode {
   private String tableName;
 
@@ -53,12 +51,6 @@ public class DropTableNode extends LogicalNode {
     return "DROP TABLE " + tableName;
   }
 
-
-  @Override
-  public String toJSON() {
-    return GsonCreator.getInstance().toJson(this, LogicalNode.class);
-  }
-
   @Override
   public void preOrder(LogicalNodeVisitor visitor) {
     visitor.visit(this);

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/EvalExprNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/EvalExprNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/EvalExprNode.java
index 7bcf168..2ac6b2b 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/EvalExprNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/EvalExprNode.java
@@ -21,10 +21,9 @@
  */
 package org.apache.tajo.engine.planner.logical;
 
-import com.google.gson.Gson;
 import com.google.gson.annotations.Expose;
-import org.apache.tajo.engine.json.GsonCreator;
 import org.apache.tajo.engine.planner.Target;
+import org.apache.tajo.util.TUtil;
 
 public class EvalExprNode extends LogicalNode implements Projectable {
   @Expose private Target[] exprs;
@@ -35,12 +34,6 @@ public class EvalExprNode extends LogicalNode implements Projectable {
   }
 
   @Override
-  public String toJSON() {
-    Gson gson = GsonCreator.getInstance();
-    return gson.toJson(this);
-  }
-
-  @Override
   public boolean hasTargets() {
     return true;
   }
@@ -77,6 +70,15 @@ public class EvalExprNode extends LogicalNode implements Projectable {
     sb.append("}");
     return sb.toString();
   }
+
+  public boolean equals(Object object) {
+    if (object instanceof EvalExprNode) {
+      EvalExprNode other = (EvalExprNode) object;
+      return TUtil.checkEquals(this.exprs, other.exprs);
+    } else {
+      return false;
+    }
+  }
   
   @Override
   public void preOrder(LogicalNodeVisitor visitor) {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ExceptNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ExceptNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ExceptNode.java
index 41e606f..379a83b 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ExceptNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ExceptNode.java
@@ -21,8 +21,6 @@
  */
 package org.apache.tajo.engine.planner.logical;
 
-import org.apache.tajo.engine.json.GsonCreator;
-
 public class ExceptNode extends BinaryNode {
 
   public ExceptNode() {
@@ -38,9 +36,4 @@ public class ExceptNode extends BinaryNode {
   public String toString() {
     return getOuterNode().toString() + "\n EXCEPT \n" + getInnerNode().toString();
   }
-
-  @Override
-  public String toJSON() {
-    return GsonCreator.getInstance().toJson(this, LogicalNode.class);
-  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/GroupbyNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/GroupbyNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/GroupbyNode.java
index 9c1c116..b35a291 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/GroupbyNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/GroupbyNode.java
@@ -21,19 +21,13 @@ package org.apache.tajo.engine.planner.logical;
 import com.google.gson.annotations.Expose;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.engine.eval.EvalNode;
-import org.apache.tajo.engine.json.GsonCreator;
 import org.apache.tajo.engine.planner.Target;
 import org.apache.tajo.util.TUtil;
 
-import java.util.Arrays;
-
 public class GroupbyNode extends UnaryNode implements Projectable, Cloneable {
-	@Expose
-	private Column[] columns;
-	@Expose
-	private EvalNode havingCondition = null;
-	@Expose
-	private Target[] targets;
+	@Expose private Column [] columns;
+	@Expose private EvalNode havingCondition = null;
+	@Expose private Target [] targets;
 	
 	public GroupbyNode() {
 		super();
@@ -118,11 +112,12 @@ public class GroupbyNode extends UnaryNode implements Projectable, Cloneable {
   public boolean equals(Object obj) {
     if (obj instanceof GroupbyNode) {
       GroupbyNode other = (GroupbyNode) obj;
-      return super.equals(other) 
-          && Arrays.equals(columns, other.columns)
-          && TUtil.checkEquals(havingCondition, other.havingCondition)
-          && TUtil.checkEquals(targets, other.targets)
-          && getSubNode().equals(other.getSubNode());
+      boolean eq = super.equals(other);
+      eq = eq && TUtil.checkEquals(columns, other.columns);
+      eq = eq && TUtil.checkEquals(havingCondition, other.havingCondition);
+      eq = eq && TUtil.checkEquals(targets, other.targets);
+      eq = eq && subExpr.equals(other.subExpr);
+      return eq;
     } else {
       return false;  
     }
@@ -148,8 +143,4 @@ public class GroupbyNode extends UnaryNode implements Projectable, Cloneable {
 
     return grp;
   }
-  
-  public String toJSON() {
-    return GsonCreator.getInstance().toJson(this, LogicalNode.class);
-  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/IndexScanNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/IndexScanNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/IndexScanNode.java
index af3b2c4..b14a54b 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/IndexScanNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/IndexScanNode.java
@@ -23,11 +23,10 @@ import com.google.gson.annotations.Expose;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.SortSpec;
 import org.apache.tajo.datum.Datum;
-import org.apache.tajo.engine.json.GsonCreator;
+import org.apache.tajo.engine.json.CoreGsonHelper;
 
 public class IndexScanNode extends ScanNode {
-  
-  @Expose private SortSpec[]sortKeys;
+  @Expose private SortSpec [] sortKeys;
   @Expose private Schema keySchema = null;
   @Expose private Datum[] datum = null;
   //TODO- @Expose private IndexType type;
@@ -66,15 +65,10 @@ public class IndexScanNode extends ScanNode {
   public void setKeySchema( Schema keySchema ) {
     this.keySchema = keySchema;
   }
-  
-  @Override
-  public String toJSON() {
-    GsonCreator.getInstance().toJson(this, LogicalNode.class);
-    return null;
-  }
+
   @Override
   public String toString() {
-    Gson gson = GsonCreator.getInstance();
+    Gson gson = CoreGsonHelper.getInstance();
     StringBuilder builder = new StringBuilder();
     builder.append("IndexScanNode : {\n");
     builder.append("  \"keySchema\" : \"" + gson.toJson(this.keySchema) + "\"\n");

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/IntersectNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/IntersectNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/IntersectNode.java
index aa90df9..1d00a56 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/IntersectNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/IntersectNode.java
@@ -21,8 +21,6 @@
  */
 package org.apache.tajo.engine.planner.logical;
 
-import org.apache.tajo.engine.json.GsonCreator;
-
 public class IntersectNode extends BinaryNode {
 
   public IntersectNode() {
@@ -38,9 +36,4 @@ public class IntersectNode extends BinaryNode {
   public String toString() {
     return getOuterNode().toString() + "\n INTERSECT \n" + getInnerNode().toString();
   }
-
-  @Override
-  public String toJSON() {
-    return GsonCreator.getInstance().toJson(this, LogicalNode.class);
-  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/JoinNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/JoinNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/JoinNode.java
index a5c288c..cd79e4d 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/JoinNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/JoinNode.java
@@ -24,7 +24,6 @@ package org.apache.tajo.engine.planner.logical;
 import com.google.gson.annotations.Expose;
 import org.apache.tajo.algebra.JoinType;
 import org.apache.tajo.engine.eval.EvalNode;
-import org.apache.tajo.engine.json.GsonCreator;
 import org.apache.tajo.engine.planner.Target;
 
 public class JoinNode extends BinaryNode implements Projectable, Cloneable {
@@ -122,8 +121,4 @@ public class JoinNode extends BinaryNode implements Projectable, Cloneable {
     sb.append("\n" + getOuterNode().toString()).append(" and ").append(getInnerNode());
     return sb.toString();
   }
-
-  public String toJSON() {
-    return GsonCreator.getInstance().toJson(this, LogicalNode.class);
-  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LimitNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LimitNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LimitNode.java
index ceef9d0..1d24941 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LimitNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LimitNode.java
@@ -19,11 +19,9 @@
 package org.apache.tajo.engine.planner.logical;
 
 import com.google.gson.annotations.Expose;
-import org.apache.tajo.engine.json.GsonCreator;
 
 public final class LimitNode extends UnaryNode implements Cloneable {
-	@Expose
-  private long fetchFirstNum;
+	@Expose private long fetchFirstNum;
 
 	public LimitNode() {
 		super();
@@ -66,8 +64,4 @@ public final class LimitNode extends UnaryNode implements Cloneable {
 
     return sb.toString();
   }
-  
-  public String toJSON() {
-    return GsonCreator.getInstance().toJson(this, LogicalNode.class);
-  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LogicalNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LogicalNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LogicalNode.java
index d47a84f..4891d82 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LogicalNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LogicalNode.java
@@ -22,9 +22,12 @@
 package org.apache.tajo.engine.planner.logical;
 
 import com.google.gson.annotations.Expose;
+import org.apache.tajo.json.GsonObject;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.engine.json.CoreGsonHelper;
+import org.apache.tajo.util.TUtil;
 
-public abstract class LogicalNode implements Cloneable {
+public abstract class LogicalNode implements Cloneable, GsonObject {
   @Expose private ExprType type;
 	@Expose private Schema inputSchema;
 	@Expose	private Schema outputSchema;
@@ -76,12 +79,12 @@ public abstract class LogicalNode implements Cloneable {
 	  if (obj instanceof LogicalNode) {
 	    LogicalNode other = (LogicalNode) obj;
 
-      boolean b1 = this.type == other.type;
-      boolean b2 = this.inputSchema.equals(other.inputSchema);
-      boolean b3 = this.outputSchema.equals(other.outputSchema);
-      boolean b4 = this.cost == other.cost;
+      boolean eq = this.type == other.type;
+      eq = eq && TUtil.checkEquals(this.inputSchema, other.inputSchema);
+      eq = eq && TUtil.checkEquals(this.outputSchema, other.outputSchema);
+      eq = eq && this.cost == other.cost;
       
-      return b1 && b2 && b3 && b4;
+      return eq;
 	  } else {
 	    return false;
 	  }
@@ -98,8 +101,11 @@ public abstract class LogicalNode implements Cloneable {
 	  
 	  return node;
 	}
-	
-	public abstract String toJSON();
+
+  @Override
+  public String toJson() {
+    return CoreGsonHelper.toJson(this, LogicalNode.class);
+  }
 
 	public abstract void preOrder(LogicalNodeVisitor visitor);
   public abstract void postOrder(LogicalNodeVisitor visitor);

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LogicalRootNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LogicalRootNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LogicalRootNode.java
index 154b931..8b2fa77 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LogicalRootNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LogicalRootNode.java
@@ -18,8 +18,6 @@
 
 package org.apache.tajo.engine.planner.logical;
 
-import org.apache.tajo.engine.json.GsonCreator;
-
 public class LogicalRootNode extends UnaryNode implements Cloneable {
   public LogicalRootNode() {
     super(ExprType.ROOT);
@@ -30,11 +28,6 @@ public class LogicalRootNode extends UnaryNode implements Cloneable {
   }
   
   @Override
-  public String toJSON() {
-    return GsonCreator.getInstance().toJson(this, LogicalNode.class);
-  }
-  
-  @Override
   public boolean equals(Object obj) {
     if (obj instanceof LogicalRootNode) {
       LogicalRootNode other = (LogicalRootNode) obj;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ProjectionNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ProjectionNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ProjectionNode.java
index 999b804..128bd43 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ProjectionNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ProjectionNode.java
@@ -19,7 +19,6 @@
 package org.apache.tajo.engine.planner.logical;
 
 import com.google.gson.annotations.Expose;
-import org.apache.tajo.engine.json.GsonCreator;
 import org.apache.tajo.engine.planner.Target;
 
 import java.util.Arrays;
@@ -109,8 +108,4 @@ public class ProjectionNode extends UnaryNode implements Projectable {
 	  
 	  return projNode;
 	}
-	
-	public String toJSON() {
-	  return GsonCreator.getInstance().toJson(this, LogicalNode.class);
-	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ScanNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ScanNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ScanNode.java
index 7c195dd..6b45e8a 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ScanNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ScanNode.java
@@ -22,7 +22,6 @@ import com.google.common.base.Objects;
 import com.google.gson.annotations.Expose;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.engine.eval.EvalNode;
-import org.apache.tajo.engine.json.GsonCreator;
 import org.apache.tajo.engine.planner.FromTable;
 import org.apache.tajo.engine.planner.Target;
 import org.apache.tajo.util.TUtil;
@@ -147,10 +146,6 @@ public class ScanNode extends LogicalNode implements Projectable {
 	  sb.append("\n  \"in schema\": ").append(getInSchema());
 	  return sb.toString();
 	}
-	
-	public String toJSON() {
-	  return GsonCreator.getInstance().toJson(this, LogicalNode.class);
-	}
 
   @Override
   public int hashCode() {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SelectionNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SelectionNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SelectionNode.java
index b822d8a..2bd1e81 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SelectionNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SelectionNode.java
@@ -20,12 +20,9 @@ package org.apache.tajo.engine.planner.logical;
 
 import com.google.gson.annotations.Expose;
 import org.apache.tajo.engine.eval.EvalNode;
-import org.apache.tajo.engine.json.GsonCreator;
 
 public class SelectionNode extends UnaryNode implements Cloneable {
-
-	@Expose
-	private EvalNode qual;
+	@Expose private EvalNode qual;
 	
 	public SelectionNode() {
 		super();
@@ -73,8 +70,4 @@ public class SelectionNode extends UnaryNode implements Cloneable {
     
     return selNode;
   }
-  
-  public String toJSON() {
-    return GsonCreator.getInstance().toJson(this, LogicalNode.class);
-  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SortNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SortNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SortNode.java
index 947553a..4efe842 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SortNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SortNode.java
@@ -22,12 +22,11 @@ import com.google.common.base.Preconditions;
 import com.google.gson.annotations.Expose;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.SortSpec;
-import org.apache.tajo.engine.json.GsonCreator;
 import org.apache.tajo.util.TUtil;
 
 public final class SortNode extends UnaryNode implements Cloneable {
 	@Expose
-  private SortSpec[] sortKeys;
+  private SortSpec [] sortKeys;
 	
 	public SortNode() {
 		super();
@@ -54,9 +53,10 @@ public final class SortNode extends UnaryNode implements Cloneable {
   public boolean equals(Object obj) {
     if (obj instanceof SortNode) {
       SortNode other = (SortNode) obj;
-      return super.equals(other)
-          && TUtil.checkEquals(sortKeys, other.sortKeys)
-          && subExpr.equals(other.subExpr);
+      boolean eq = super.equals(other);
+      eq = eq && TUtil.checkEquals(sortKeys, other.sortKeys);
+      eq = eq && subExpr.equals(other.subExpr);
+      return eq;
     } else {
       return false;
     }
@@ -86,12 +86,4 @@ public final class SortNode extends UnaryNode implements Cloneable {
     return sb.toString()+"\n"
         + getSubNode().toString();
   }
-
-  public String toJSON() {
-    subExpr.toJSON();
-    for (int i = 0; i < sortKeys.length; i++) {
-      sortKeys[i].toJSON();
-    }
-    return GsonCreator.getInstance().toJson(this, LogicalNode.class);
-  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/StoreTableNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/StoreTableNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/StoreTableNode.java
index c3d292f..ec7b1b7 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/StoreTableNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/StoreTableNode.java
@@ -115,13 +115,14 @@ public class StoreTableNode extends UnaryNode implements Cloneable {
   public boolean equals(Object obj) {
     if (obj instanceof StoreTableNode) {
       StoreTableNode other = (StoreTableNode) obj;
-      return super.equals(other)
-          && this.tableName.equals(other.tableName)
-          && this.storageType.equals(other.storageType)
-          && this.numPartitions == other.numPartitions
-          && TUtil.checkEquals(partitionKeys, other.partitionKeys)
-          && TUtil.checkEquals(options, other.options)
-          && subExpr.equals(other.subExpr);
+      boolean eq = super.equals(other);
+      eq = eq && this.tableName.equals(other.tableName);
+      eq = eq && this.storageType.equals(other.storageType);
+      eq = eq && this.numPartitions == other.numPartitions;
+      eq = eq && TUtil.checkEquals(partitionKeys, other.partitionKeys);
+      eq = eq &&  TUtil.checkEquals(options, other.options);
+      eq = eq && subExpr.equals(other.subExpr);
+      return eq;
     } else {
       return false;
     }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/UnaryNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/UnaryNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/UnaryNode.java
index b415442..cd3aa1c 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/UnaryNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/UnaryNode.java
@@ -22,12 +22,10 @@
 package org.apache.tajo.engine.planner.logical;
 
 import com.google.gson.annotations.Expose;
-import org.apache.tajo.engine.json.GsonCreator;
 
 
 public abstract class UnaryNode extends LogicalNode implements Cloneable {
-	@Expose
-	LogicalNode subExpr;
+	@Expose LogicalNode subExpr;
 	
 	public UnaryNode() {
 		super();
@@ -65,9 +63,4 @@ public abstract class UnaryNode extends LogicalNode implements Cloneable {
 	  subExpr.postOrder(visitor);	  
 	  visitor.visit(this);
 	}
-
-  public String toJSON() {
-    subExpr.toJSON();
-    return GsonCreator.getInstance().toJson(this, LogicalNode.class);
-  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/UnionNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/UnionNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/UnionNode.java
index e336549..d0ded08 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/UnionNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/UnionNode.java
@@ -21,8 +21,6 @@
  */
 package org.apache.tajo.engine.planner.logical;
 
-import org.apache.tajo.engine.json.GsonCreator;
-
 public class UnionNode extends BinaryNode {
 
   public UnionNode() {
@@ -38,9 +36,4 @@ public class UnionNode extends BinaryNode {
   public String toString() {
     return getOuterNode().toString() + "\n UNION \n" + getInnerNode().toString();
   }
-
-  @Override
-  public String toJSON() {
-    return GsonCreator.getInstance().toJson(this, LogicalNode.class);
-  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/ReceiveNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/ReceiveNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/ReceiveNode.java
index 2a6112e..94ecffe 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/ReceiveNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/ReceiveNode.java
@@ -25,9 +25,8 @@ import com.google.common.base.Objects;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
 import com.google.gson.annotations.Expose;
-import org.apache.tajo.engine.json.GsonCreator;
+import org.apache.tajo.engine.json.CoreGsonHelper;
 import org.apache.tajo.engine.planner.logical.ExprType;
 import org.apache.tajo.engine.planner.logical.LogicalNode;
 import org.apache.tajo.engine.planner.logical.LogicalNodeVisitor;
@@ -107,16 +106,11 @@ public final class ReceiveNode extends LogicalNode implements Cloneable {
 
   @Override
   public String toString() {
-    Gson gson = new GsonBuilder().setPrettyPrinting().create();
+    Gson gson = CoreGsonHelper.getPrettyInstance();
     return gson.toJson(this);
   }
 
   @Override
-  public String toJSON() {
-    return GsonCreator.getInstance().toJson(this, LogicalNode.class);
-  }
-
-  @Override
   public void preOrder(LogicalNodeVisitor visitor) {
     visitor.visit(this);
   }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1c677cc5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/SendNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/SendNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/SendNode.java
index a994c6c..8d9064e 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/SendNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/SendNode.java
@@ -25,12 +25,10 @@ import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Maps;
 import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
 import com.google.gson.annotations.Expose;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.engine.json.GsonCreator;
+import org.apache.tajo.engine.json.CoreGsonHelper;
 import org.apache.tajo.engine.planner.logical.ExprType;
-import org.apache.tajo.engine.planner.logical.LogicalNode;
 import org.apache.tajo.engine.planner.logical.UnaryNode;
 import org.apache.tajo.util.TUtil;
 
@@ -141,12 +139,7 @@ public class SendNode extends UnaryNode {
 
   @Override
   public String toString() {
-    Gson gson = new GsonBuilder().setPrettyPrinting().create();
+    Gson gson = CoreGsonHelper.getPrettyInstance();
     return gson.toJson(this);
   }
-
-  @Override
-  public String toJSON() {
-    return GsonCreator.getInstance().toJson(this, LogicalNode.class);
-  }
 }
\ No newline at end of file