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 2014/05/20 20:46:37 UTC

[39/48] git commit: TAJO-494: Extend TajoClient to run a query with a plan context serialized as the JSON form. (jihoon)

TAJO-494: Extend TajoClient to run a query with a plan context serialized as the JSON form. (jihoon)


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

Branch: refs/heads/window_function
Commit: 9bbf87e3a4396d90346fa41a0aef036f0e4f6a9f
Parents: ad53ffe
Author: Jihoon Son <ji...@apache.org>
Authored: Mon May 12 14:12:41 2014 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Mon May 12 14:12:41 2014 +0900

----------------------------------------------------------------------
 CHANGES                                         |   3 +
 pom.xml                                         |   1 +
 .../org/apache/tajo/algebra/Aggregation.java    |   6 +
 .../org/apache/tajo/algebra/AlterTable.java     |   8 +
 .../apache/tajo/algebra/AlterTablespace.java    |   5 +
 .../apache/tajo/algebra/BetweenPredicate.java   |   8 +-
 .../org/apache/tajo/algebra/BinaryOperator.java |   4 +
 .../apache/tajo/algebra/CaseWhenPredicate.java  |   6 +
 .../java/org/apache/tajo/algebra/CastExpr.java  |   3 +
 .../apache/tajo/algebra/ColumnDefinition.java   |   4 +
 .../tajo/algebra/ColumnReferenceExpr.java       |   4 +
 .../org/apache/tajo/algebra/CreateDatabase.java |  21 ++
 .../org/apache/tajo/algebra/CreateTable.java    |  65 ++++++
 .../org/apache/tajo/algebra/DataTypeExpr.java   |   5 +
 .../org/apache/tajo/algebra/DateLiteral.java    |   3 +
 .../java/org/apache/tajo/algebra/DateValue.java |   5 +
 .../org/apache/tajo/algebra/DropDatabase.java   |   7 +-
 .../java/org/apache/tajo/algebra/DropTable.java |   5 +
 .../apache/tajo/algebra/ExistsPredicate.java    |   3 +
 .../main/java/org/apache/tajo/algebra/Expr.java |  20 +-
 .../org/apache/tajo/algebra/FunctionExpr.java   |   8 +-
 .../tajo/algebra/GeneralSetFunctionExpr.java    |   3 +
 .../java/org/apache/tajo/algebra/Having.java    |   3 +
 .../org/apache/tajo/algebra/InPredicate.java    |   4 +
 .../java/org/apache/tajo/algebra/Insert.java    |   9 +
 .../apache/tajo/algebra/IntervalLiteral.java    |   4 +
 .../apache/tajo/algebra/IsNullPredicate.java    |   3 +
 .../main/java/org/apache/tajo/algebra/Join.java |   6 +
 .../org/apache/tajo/algebra/JsonHelper.java     |   5 +-
 .../java/org/apache/tajo/algebra/Limit.java     |   3 +
 .../org/apache/tajo/algebra/LiteralValue.java   |  26 ++-
 .../java/org/apache/tajo/algebra/NamedExpr.java |   3 +
 .../tajo/algebra/PatternMatchPredicate.java     |   4 +
 .../org/apache/tajo/algebra/Projection.java     |   5 +-
 .../tajo/algebra/QualifiedAsteriskExpr.java     |   3 +
 .../java/org/apache/tajo/algebra/Relation.java  |   4 +
 .../org/apache/tajo/algebra/RelationList.java   |   3 +
 .../org/apache/tajo/algebra/ScalarSubQuery.java |   4 -
 .../java/org/apache/tajo/algebra/Selection.java |   3 +
 .../org/apache/tajo/algebra/SetOperation.java   |   3 +
 .../org/apache/tajo/algebra/SignedExpr.java     |   3 +
 .../tajo/algebra/SimpleTableSubQuery.java       |   4 -
 .../main/java/org/apache/tajo/algebra/Sort.java |   6 +
 .../tajo/algebra/TablePrimarySubQuery.java      |   4 +
 .../org/apache/tajo/algebra/TimeLiteral.java    |   3 +
 .../java/org/apache/tajo/algebra/TimeValue.java |   6 +
 .../apache/tajo/algebra/TimestampLiteral.java   |   4 +
 .../org/apache/tajo/algebra/UnaryOperator.java  |   3 +
 .../org/apache/tajo/algebra/ValueListExpr.java  |   3 +
 .../java/org/apache/tajo/algebra/TestExpr.java  |  43 ++++
 .../main/java/org/apache/tajo/cli/TajoCli.java  |  39 +++-
 .../java/org/apache/tajo/client/TajoClient.java |  70 +++++-
 tajo-client/src/main/proto/ClientProtos.proto   |   1 +
 .../org/apache/tajo/master/GlobalEngine.java    |  68 ++++--
 .../tajo/master/TajoMasterClientService.java    |   6 +-
 .../tajo/master/event/QueryStartEvent.java      |  10 +-
 .../master/querymaster/QueryInProgress.java     |  23 +-
 .../tajo/master/querymaster/QueryInfo.java      |  10 +-
 .../master/querymaster/QueryJobManager.java     |   6 +-
 .../tajo/master/querymaster/QueryMaster.java    |   2 +-
 .../querymaster/QueryMasterManagerService.java  |   2 +-
 .../master/querymaster/QueryMasterTask.java     |  22 +-
 .../src/main/proto/TajoWorkerProtocol.proto     |   4 +-
 .../java/org/apache/tajo/QueryTestCaseBase.java |  14 ++
 .../tajo/engine/query/TestGroupByQuery.java     |   9 +
 .../apache/tajo/engine/query/TestJoinQuery.java |  41 +++-
 .../tajo/engine/query/TestSelectQuery.java      |   7 +
 .../apache/tajo/engine/query/TestSortQuery.java |  16 ++
 .../tajo/engine/query/TestTableSubQuery.java    |  21 ++
 .../TestGroupByQuery/testGroupbyWithJson.json   |  98 +++++++++
 .../testJoinOnMultipleDatabasesWithJson.json    | 210 ++++++++++++++++++
 .../queries/TestJoinQuery/testJoinWithJson.json |  84 +++++++
 .../TestJoinQuery/testJoinWithJson2.json        | 219 +++++++++++++++++++
 .../TestSelectQuery/testSelectWithJson.json     |  74 +++++++
 .../queries/TestSortQuery/testSortWithJson.json |  65 ++++++
 .../queries/TestSortQuery/testTopkWithJson.json |  51 +++++
 .../testGroupbySubqueryWithJson.json            |  59 +++++
 .../testJoinSubqueryWithJson.json               | 108 +++++++++
 .../TestGroupByQuery/testGroupbyWithJson.result |   5 +
 .../testJoinOnMultipleDatabasesWithJson.result  |   5 +
 .../TestJoinQuery/testJoinWithJson.result       |  27 +++
 .../TestJoinQuery/testJoinWithJson2.result      |   5 +
 .../TestSelectQuery/testSelectWithJson.result   |   7 +
 .../TestSortQuery/testSortWithJson.result       |   5 +
 .../TestSortQuery/testTopkWithJson.result       |   5 +
 .../testGroupbySubqueryWithJson.result          |   3 +
 .../testJoinSubqueryWithJson.result             |   4 +
 87 files changed, 1671 insertions(+), 105 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index a830776..17af7bc 100644
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,9 @@ Release 0.9.0 - unreleased
 
   NEW FEATURES
 
+    TAJO-494: Extend TajoClient to run a query with a plan context serialized as the 
+    JSON form. (jihoon)
+
     TAJO-761: Implements INTERVAL type. (Hyoungjun Kim via hyunsik)
 
     TAJO-790: Implements ADD_MONTHS() function. (Hyoungjun Kim via hyunsik)

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 47643e4..bf33c69 100644
--- a/pom.xml
+++ b/pom.xml
@@ -358,6 +358,7 @@
             <exclude>**/*.tbl</exclude>
             <exclude>**/*.js</exclude>
             <exclude>**/*.result</exclude>
+            <exclude>**/*.json</exclude>
             <exclude>**/*.avsc</exclude>
             <!-- generated content -->
             <exclude>**/target/**</exclude>

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java
index d1a6bd3..bf95e89 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java
@@ -19,10 +19,14 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 import org.apache.tajo.util.TUtil;
 
 public class Aggregation extends UnaryOperator {
+  @Expose @SerializedName("Targets")
   private NamedExpr[] namedExprs;
+  @Expose @SerializedName("Groups")
   private GroupElement [] groups;
 
   public Aggregation() {
@@ -64,7 +68,9 @@ public class Aggregation extends UnaryOperator {
   }
 
   public static class GroupElement implements JsonSerializable {
+    @Expose @SerializedName("GroupType")
     private GroupType group_type;
+    @Expose @SerializedName("Dimensions")
     private Expr [] grouping_sets;
 
     public GroupElement(GroupType groupType, Expr[] grouping_sets) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/AlterTable.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/AlterTable.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/AlterTable.java
index 4bb0ed2..0f56bc2 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/AlterTable.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/AlterTable.java
@@ -20,15 +20,23 @@ package org.apache.tajo.algebra;
 
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 import org.apache.tajo.util.TUtil;
 
 public class AlterTable extends Expr {
 
+  @Expose @SerializedName("OldTableName")
   private String tableName;
+  @Expose @SerializedName("NewTableName")
   private String newTableName;
+  @Expose @SerializedName("OldColumnName")
   private String columnName;
+  @Expose @SerializedName("NewColumnName")
   private String newColumnName;
+  @Expose @SerializedName("NewColumnDef")
   private ColumnDefinition addNewColumn;
+  @Expose @SerializedName("AlterTableType")
   private AlterTableOpType alterTableOpType;
 
   public AlterTable(final String tableName) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/AlterTablespace.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/AlterTablespace.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/AlterTablespace.java
index ceec08b..b9cb0c7 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/AlterTablespace.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/AlterTablespace.java
@@ -20,13 +20,18 @@ package org.apache.tajo.algebra;
 
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 import org.apache.tajo.util.TUtil;
 
 public class AlterTablespace extends Expr {
 
+  @Expose @SerializedName("TablespaceName")
   private String tablespaceName;
+  @Expose @SerializedName("AlterTablespaceType")
   private AlterTablespaceSetType setType;
 
+  @Expose @SerializedName("URI")
   private String uri;
 
   public AlterTablespace(final String tablespaceName) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/BetweenPredicate.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/BetweenPredicate.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/BetweenPredicate.java
index 4409f4e..4d4f09e 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/BetweenPredicate.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/BetweenPredicate.java
@@ -19,16 +19,22 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 
 public class BetweenPredicate extends Expr {
+  @Expose @SerializedName("IsNot")
   private boolean not;
   // if symmetric is not set, asymmetric is implicit.
+  @Expose @SerializedName("IsSymmetric")
   private boolean symmetric = false;
+  @Expose @SerializedName("Predicand")
   private Expr predicand;
+  @Expose @SerializedName("Begin")
   private Expr begin;
+  @Expose @SerializedName("End")
   private Expr end;
 
-
   public BetweenPredicate(boolean not, boolean symmetric, Expr predicand, Expr begin, Expr end) {
     super(OpType.Between);
     this.not = not;

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/BinaryOperator.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/BinaryOperator.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/BinaryOperator.java
index fa53067..0cc6376 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/BinaryOperator.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/BinaryOperator.java
@@ -19,9 +19,13 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 
 public class BinaryOperator extends Expr {
+  @Expose @SerializedName("LeftExpr")
   protected Expr left;
+  @Expose @SerializedName("RightExpr")
   protected Expr right;
 
   BinaryOperator(OpType opType) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/CaseWhenPredicate.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CaseWhenPredicate.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CaseWhenPredicate.java
index 6af1fb2..41eba6e 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CaseWhenPredicate.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CaseWhenPredicate.java
@@ -19,6 +19,8 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 import org.apache.tajo.util.TUtil;
 
 import java.util.ArrayList;
@@ -26,7 +28,9 @@ import java.util.Collection;
 import java.util.List;
 
 public class CaseWhenPredicate extends Expr {
+  @Expose @SerializedName("WhenExprs")
   private List<WhenExpr> whens = new ArrayList<WhenExpr>();
+  @Expose @SerializedName("ElseExpr")
   private Expr elseResult;
 
   public CaseWhenPredicate() {
@@ -70,7 +74,9 @@ public class CaseWhenPredicate extends Expr {
   }
 
   public static class WhenExpr {
+    @Expose @SerializedName("Condition")
     Expr condition;
+    @Expose @SerializedName("Result")
     Expr result;
 
     public WhenExpr(Expr condition, Expr result) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/CastExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CastExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CastExpr.java
index 24f6415..5e0c5f0 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CastExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CastExpr.java
@@ -19,8 +19,11 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 
 public class CastExpr extends UnaryOperator {
+  @Expose @SerializedName("CastType")
   private DataTypeExpr target;
 
   public CastExpr(Expr operand, DataTypeExpr target) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/ColumnDefinition.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ColumnDefinition.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ColumnDefinition.java
index ce935dd..c20d409 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ColumnDefinition.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ColumnDefinition.java
@@ -17,7 +17,11 @@
  */
 package org.apache.tajo.algebra;
 
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
+
 public  class ColumnDefinition extends DataTypeExpr {
+  @Expose @SerializedName("ColumnDefName")
   String col_name;
 
   public ColumnDefinition(String columnName, String dataType) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/ColumnReferenceExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ColumnReferenceExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ColumnReferenceExpr.java
index 58f7b81..97bf332 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ColumnReferenceExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ColumnReferenceExpr.java
@@ -19,10 +19,14 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 import org.apache.tajo.util.TUtil;
 
 public class ColumnReferenceExpr extends Expr {
+  @Expose @SerializedName("Qualifier")
   private String qualifier;
+  @Expose @SerializedName("ColumnName")
   private String name;
 
   public ColumnReferenceExpr(String referenceName) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateDatabase.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateDatabase.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateDatabase.java
index a4ebc84..2ff0ce7 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateDatabase.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateDatabase.java
@@ -19,12 +19,21 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 import org.apache.tajo.util.TUtil;
 
+import java.util.Map;
+
 public class CreateDatabase extends Expr {
+  @Expose @SerializedName("DatabaseName")
   private String databaseName;
+  @Expose @SerializedName("TablespaceName")
   private String tablespaceName;
+  @Expose @SerializedName("IfNotExists")
   private boolean ifNotExists;
+  @Expose @SerializedName("DatabaseProperties")
+  private Map<String, String> params;
 
   public CreateDatabase(final String databaseName, final String tablespaceName, final boolean ifNotExists) {
     super(OpType.CreateDatabase);
@@ -49,6 +58,18 @@ public class CreateDatabase extends Expr {
     return ifNotExists;
   }
 
+  public boolean hasParams() {
+    return params != null;
+  }
+
+  public void setParams(Map<String, String> params) {
+    this.params = params;
+  }
+
+  public Map<String, String> getParams() {
+    return params;
+  }
+
   @Override
   public int hashCode() {
     return Objects.hashCode(databaseName, tablespaceName, ifNotExists);

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateTable.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateTable.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateTable.java
index 63ca364..f60b571 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateTable.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateTable.java
@@ -19,20 +19,33 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.*;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 import org.apache.tajo.util.TUtil;
 
+import java.lang.reflect.Type;
 import java.util.List;
 import java.util.Map;
 
 public class CreateTable extends Expr {
+  @Expose @SerializedName("IsExternal")
   private boolean external = false;
+  @Expose @SerializedName("TableName")
   private String tableName;
+  @Expose @SerializedName("Attributes")
   private ColumnDefinition [] tableElements;
+  @Expose @SerializedName("StorageType")
   private String storageType;
+  @Expose @SerializedName("Location")
   private String location;
+  @Expose @SerializedName("SubPlan")
   private Expr subquery;
+  @Expose @SerializedName("TableProperties")
   private Map<String, String> params;
+  @Expose @SerializedName("PartitionMethodDesc")
   private PartitionMethodDescExpr partition;
+  @Expose @SerializedName("IfNotExists")
   private boolean ifNotExists;
 
   public CreateTable(final String tableName, boolean ifNotExists) {
@@ -163,6 +176,7 @@ public class CreateTable extends Expr {
   }
 
   public static abstract class PartitionMethodDescExpr {
+    @Expose @SerializedName("PartitionType")
     PartitionType type;
 
     public PartitionMethodDescExpr(PartitionType type) {
@@ -172,10 +186,50 @@ public class CreateTable extends Expr {
     public PartitionType getPartitionType() {
       return type;
     }
+
+    static class JsonSerDer implements JsonSerializer<PartitionMethodDescExpr>,
+        JsonDeserializer<PartitionMethodDescExpr> {
+
+      @Override
+      public PartitionMethodDescExpr deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
+          throws JsonParseException {
+        JsonObject jsonObject = json.getAsJsonObject();
+        PartitionType type = PartitionType.valueOf(jsonObject.get("PartitionType").getAsString());
+        switch (type) {
+          case RANGE:
+            return context.deserialize(json, RangePartition.class);
+          case HASH:
+            return context.deserialize(json, HashPartition.class);
+          case LIST:
+            return context.deserialize(json, ListPartition.class);
+          case COLUMN:
+            return context.deserialize(json, ColumnPartition.class);
+        }
+        return null;
+      }
+
+      @Override
+      public JsonElement serialize(PartitionMethodDescExpr src, Type typeOfSrc, JsonSerializationContext context) {
+        switch (src.getPartitionType()) {
+          case RANGE:
+            return context.serialize(src, RangePartition.class);
+          case HASH:
+            return context.serialize(src, HashPartition.class);
+          case LIST:
+            return context.serialize(src, ListPartition.class);
+          case COLUMN:
+            return context.serialize(src, ColumnPartition.class);
+          default:
+            return null;
+        }
+      }
+    }
   }
 
   public static class RangePartition extends PartitionMethodDescExpr {
+    @Expose @SerializedName("Columns")
     ColumnReferenceExpr [] columns;
+    @Expose @SerializedName("Specifiers")
     List<RangePartitionSpecifier> specifiers;
 
     public RangePartition(ColumnReferenceExpr [] columns, List<RangePartitionSpecifier> specifiers) {
@@ -208,8 +262,11 @@ public class CreateTable extends Expr {
   }
 
   public static class HashPartition extends PartitionMethodDescExpr {
+    @Expose @SerializedName("Columns")
     ColumnReferenceExpr [] columns;
+    @Expose @SerializedName("Quantity")
     Expr quantity;
+    @Expose @SerializedName("Specifiers")
     List<PartitionSpecifier> specifiers;
 
     public HashPartition(ColumnReferenceExpr [] columns, Expr quantity) {
@@ -260,7 +317,9 @@ public class CreateTable extends Expr {
   }
 
   public static class ListPartition extends PartitionMethodDescExpr {
+    @Expose @SerializedName("Columns")
     ColumnReferenceExpr [] columns;
+    @Expose @SerializedName("Specifiers")
     List<ListPartitionSpecifier> specifiers;
 
     public ListPartition(ColumnReferenceExpr [] columns, List<ListPartitionSpecifier> specifers) {
@@ -293,7 +352,9 @@ public class CreateTable extends Expr {
   }
 
   public static class ColumnPartition extends PartitionMethodDescExpr {
+    @Expose @SerializedName("Columns")
     private ColumnDefinition [] columns;
+    @Expose @SerializedName("IsOmitValues")
     private boolean isOmitValues;
 
     public ColumnPartition(ColumnDefinition [] columns, boolean isOmitValues) {
@@ -325,7 +386,9 @@ public class CreateTable extends Expr {
   }
 
   public static class RangePartitionSpecifier extends PartitionSpecifier {
+    @Expose @SerializedName("End")
     Expr end;
+    @Expose @SerializedName("IsMaxValue")
     boolean maxValue;
 
     public RangePartitionSpecifier(String name, Expr end) {
@@ -365,6 +428,7 @@ public class CreateTable extends Expr {
   }
 
   public static class ListPartitionSpecifier extends PartitionSpecifier {
+    @Expose @SerializedName("ValueList")
     ValueListExpr valueList;
 
     public ListPartitionSpecifier(String name, ValueListExpr valueList) {
@@ -393,6 +457,7 @@ public class CreateTable extends Expr {
   }
 
   public static class PartitionSpecifier {
+    @Expose @SerializedName("PartitionSpecName")
     private String name;
 
     public PartitionSpecifier(String name) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/DataTypeExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DataTypeExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/DataTypeExpr.java
index 044a372..6978b84 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DataTypeExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/DataTypeExpr.java
@@ -19,11 +19,16 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 import org.apache.tajo.util.TUtil;
 
 public class DataTypeExpr extends Expr {
+  @Expose @SerializedName("DataTypeName")
   String typeName;
+  @Expose @SerializedName("LengthOrPrecision")
   Integer lengthOrPrecision;
+  @Expose @SerializedName("Scale")
   Integer scale;
 
   public DataTypeExpr(String typeName) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/DateLiteral.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DateLiteral.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/DateLiteral.java
index 54b2b20..fafa8f8 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DateLiteral.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/DateLiteral.java
@@ -19,8 +19,11 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 
 public class DateLiteral extends Expr {
+  @Expose @SerializedName("Date")
   private DateValue date;
 
   public DateLiteral(DateValue date) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/DateValue.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DateValue.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/DateValue.java
index ad9d575..8424ab4 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DateValue.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/DateValue.java
@@ -19,10 +19,15 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 
 public class DateValue {
+  @Expose @SerializedName("Year")
   private String years;
+  @Expose @SerializedName("Month")
   private String months;
+  @Expose @SerializedName("Day")
   private String days;
 
   public DateValue(String years, String months, String days) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/DropDatabase.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DropDatabase.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/DropDatabase.java
index 88e799c..fc949fd 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DropDatabase.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/DropDatabase.java
@@ -20,10 +20,13 @@ package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
 import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 
 public class DropDatabase extends Expr {
-  @Expose private String databaseName;
-  @Expose private boolean ifExists;
+  @Expose @SerializedName("DatabaseName")
+  private String databaseName;
+  @Expose @SerializedName("IfExists")
+  private boolean ifExists;
 
   public DropDatabase(final String databaseName, final boolean ifExists) {
     super(OpType.DropDatabase);

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/DropTable.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DropTable.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/DropTable.java
index cb0bbf4..c6e69dc 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DropTable.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/DropTable.java
@@ -19,10 +19,15 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 
 public class DropTable extends Expr {
+  @Expose @SerializedName("TableName")
   private final String tableName;
+  @Expose @SerializedName("IfExists")
   private final boolean ifExists;
+  @Expose @SerializedName("IsPurge")
   private final boolean purge;
 
   public DropTable(String tableName, boolean ifExists, boolean purge) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/ExistsPredicate.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ExistsPredicate.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ExistsPredicate.java
index fcb8531..6bf2ddd 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ExistsPredicate.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ExistsPredicate.java
@@ -19,8 +19,11 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 
 public class ExistsPredicate extends UnaryOperator {
+  @Expose @SerializedName("IsNot")
   private boolean not;
 
   public ExistsPredicate(SimpleTableSubQuery simpleTableSubQuery, boolean not) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/Expr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Expr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Expr.java
index 1ca42d7..daf59b6 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Expr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Expr.java
@@ -19,10 +19,16 @@
 package org.apache.tajo.algebra;
 
 import com.google.gson.*;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
+import org.apache.tajo.algebra.LiteralValue.LiteralType;
 
 import java.lang.reflect.Type;
 
 public abstract class Expr implements JsonSerializable {
+  private static final String SERIALIZED_NAME_OF_OP_TYPE = "OpType";
+
+  @Expose @SerializedName(SERIALIZED_NAME_OF_OP_TYPE)
   protected OpType opType;
 
 	public Expr(OpType opType) {
@@ -111,8 +117,18 @@ public abstract class Expr implements JsonSerializable {
                                     JsonDeserializationContext context)
         throws JsonParseException {
       JsonObject jsonObject = json.getAsJsonObject();
-      String operator = jsonObject.get("type").getAsString();
-      return context.deserialize(json, OpType.valueOf(operator).getBaseClass());
+      String opType = jsonObject.get(SERIALIZED_NAME_OF_OP_TYPE).getAsString();
+      if (OpType.valueOf(opType).equals(OpType.Literal)) {
+        String value = jsonObject.get("Value").getAsString();
+        JsonElement valueTypeElem = jsonObject.get("ValueType");
+        if (valueTypeElem != null) {
+          return new LiteralValue(value, LiteralType.valueOf(valueTypeElem.getAsString()));
+        } else {
+          return new LiteralValue(value, LiteralValue.getLiteralType(value));
+        }
+      } else {
+        return context.deserialize(json, OpType.valueOf(opType).getBaseClass());
+      }
     }
 
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/FunctionExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/FunctionExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/FunctionExpr.java
index 91517e7..b776cd2 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/FunctionExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/FunctionExpr.java
@@ -19,10 +19,14 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 import org.apache.tajo.util.TUtil;
 
 public class FunctionExpr extends Expr {
+  @Expose @SerializedName("Signature")
   private String signature;
+  @Expose @SerializedName("FuncParams")
   private Expr[] params;
 
   public FunctionExpr(String signature) {
@@ -78,8 +82,4 @@ public class FunctionExpr extends Expr {
     return signature.equals(another.signature) &&
         TUtil.checkEquals(params, another.params);
   }
-
-  public String toJson() {
-    return JsonHelper.toJson(this);
-  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/GeneralSetFunctionExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/GeneralSetFunctionExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/GeneralSetFunctionExpr.java
index d7eb4ed..fcb48df 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/GeneralSetFunctionExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/GeneralSetFunctionExpr.java
@@ -15,11 +15,14 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Preconditions;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 
 /**
  * Describes SQL Standard set function (e.g., sum, min, max, avg, and count)
  */
 public class GeneralSetFunctionExpr extends FunctionExpr {
+  @Expose @SerializedName("IsDistinct")
   private boolean distinct = false;
 
   /**

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/Having.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Having.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Having.java
index 53bd9ba..dbe6f21 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Having.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Having.java
@@ -19,9 +19,12 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 import org.apache.tajo.util.TUtil;
 
 public class Having extends UnaryOperator implements JsonSerializable {
+  @Expose @SerializedName("HavingCondition")
   private Expr qual;
 
   public Having(Expr qual) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/InPredicate.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/InPredicate.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/InPredicate.java
index 4eafe6e..52eb92a 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/InPredicate.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/InPredicate.java
@@ -18,7 +18,11 @@
 
 package org.apache.tajo.algebra;
 
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
+
 public class InPredicate extends BinaryOperator {
+  @Expose @SerializedName("IsNot")
   private boolean not;
 
   public InPredicate(Expr predicand, Expr in_values, boolean not) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/Insert.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Insert.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Insert.java
index c427a39..3f15957 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Insert.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Insert.java
@@ -19,17 +19,26 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 import org.apache.tajo.util.TUtil;
 
 import java.util.Map;
 
 public class Insert extends Expr {
+  @Expose @SerializedName("IsOverwrite")
   private boolean overwrite = false;
+  @Expose @SerializedName("TableName")
   private String tableName;
+  @Expose @SerializedName("TargetColumns")
   private String [] targetColumns;
+  @Expose @SerializedName("StorageType")
   private String storageType;
+  @Expose @SerializedName("Location")
   private String location;
+  @Expose @SerializedName("SubPlan")
   private Expr subquery;
+  @Expose @SerializedName("InsertParams")
   private Map<String, String> params;
 
   public Insert() {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/IntervalLiteral.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/IntervalLiteral.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/IntervalLiteral.java
index 6e0f2d0..f947d4f 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/IntervalLiteral.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/IntervalLiteral.java
@@ -18,7 +18,11 @@
 
 package org.apache.tajo.algebra;
 
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
+
 public class IntervalLiteral extends Expr {
+  @Expose @SerializedName("LiteralExpr")
   private String exprStr;
 
   public IntervalLiteral(String str) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/IsNullPredicate.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/IsNullPredicate.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/IsNullPredicate.java
index 40f5dd2..f9f6e11 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/IsNullPredicate.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/IsNullPredicate.java
@@ -19,8 +19,11 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 
 public class IsNullPredicate extends UnaryOperator {
+  @Expose @SerializedName("IsNot")
   private final boolean not;
 
   public IsNullPredicate(boolean not, Expr column) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/Join.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Join.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Join.java
index 258f750..2acdde3 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Join.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Join.java
@@ -19,12 +19,18 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 import org.apache.tajo.util.TUtil;
 
 public class Join extends BinaryOperator {
+  @Expose @SerializedName("JoinType")
   private JoinType joinType;
+  @Expose @SerializedName("JoinCondition")
   private Expr joinQual;
+  @Expose @SerializedName("JoinColumns")
   private ColumnReferenceExpr[] joinColumns;
+  @Expose @SerializedName("IsNatural")
   private boolean natural = false;
 
   public Join(JoinType joinType) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/JsonHelper.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/JsonHelper.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/JsonHelper.java
index f05a4ea..7d853d6 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/JsonHelper.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/JsonHelper.java
@@ -20,6 +20,7 @@ package org.apache.tajo.algebra;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
+import org.apache.tajo.algebra.CreateTable.PartitionMethodDescExpr;
 
 public class JsonHelper {
   private static JsonHelper instance;
@@ -37,9 +38,11 @@ public class JsonHelper {
   }
 
   private void initBuilder() {
-    builder = new GsonBuilder().setPrettyPrinting();
+    builder = new GsonBuilder().setPrettyPrinting().
+        excludeFieldsWithoutExposeAnnotation();
     builder.registerTypeAdapter(OpType.class, new OpType.JsonSerDer());
     builder.registerTypeAdapter(Expr.class, new Expr.JsonSerDer());
+    builder.registerTypeAdapter(PartitionMethodDescExpr.class, new PartitionMethodDescExpr.JsonSerDer());
   }
 
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/Limit.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Limit.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Limit.java
index a217c5e..20dad6b 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Limit.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Limit.java
@@ -20,8 +20,11 @@ package org.apache.tajo.algebra;
 
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 
 public class Limit extends UnaryOperator {
+  @Expose @SerializedName("Num")
   private Expr fetchFirstNum;
 
   public Limit(Expr fetchFirstNum) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/LiteralValue.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/LiteralValue.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/LiteralValue.java
index 2978c06..7747ff9 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/LiteralValue.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/LiteralValue.java
@@ -19,10 +19,14 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 
 public class LiteralValue extends Expr {
-  protected LiteralType valueType;
+  @Expose @SerializedName("Value")
   protected String value;
+  @Expose @SerializedName("ValueType")
+  protected LiteralType valueType;
 
   public static enum LiteralType {
     Boolean,
@@ -63,4 +67,24 @@ public class LiteralValue extends Expr {
     sb.append("(").append(valueType).append(")");
     return sb.toString();
   }
+
+  public static LiteralType getLiteralType(String value) {
+    if (value.equals("TRUE") || value.equals("FALSE")) {
+      return LiteralType.Boolean;
+    } else {
+      try {
+        Long.parseLong(value);
+        return LiteralType.Unsigned_Integer;
+      } catch (NumberFormatException e) {}
+
+      try {
+        Double.parseDouble(value);
+        return LiteralType.Unsigned_Float;
+      } catch (NumberFormatException e) {}
+
+      // TODO: handle unsigned_large_integer
+
+      return LiteralType.String;
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/NamedExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/NamedExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/NamedExpr.java
index bd73481..31e835f 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/NamedExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/NamedExpr.java
@@ -19,6 +19,8 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 import org.apache.tajo.util.TUtil;
 
 /**
@@ -35,6 +37,7 @@ import org.apache.tajo.util.TUtil;
  * Each expression can be explicitly aliased as an given name.
  */
 public class NamedExpr extends UnaryOperator {
+  @Expose @SerializedName("AliasName")
   private String alias;
 
   public NamedExpr(Expr expr) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/PatternMatchPredicate.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/PatternMatchPredicate.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/PatternMatchPredicate.java
index 6f5ab68..2399e03 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/PatternMatchPredicate.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/PatternMatchPredicate.java
@@ -19,9 +19,13 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Preconditions;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 
 public class PatternMatchPredicate extends BinaryOperator {
+  @Expose @SerializedName("IsNot")
   private boolean not;
+  @Expose @SerializedName("IsCaseInsensitive")
   private boolean caseInsensitive;
 
   public PatternMatchPredicate(OpType opType, boolean not, Expr predicand, Expr pattern,

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/Projection.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Projection.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Projection.java
index 0e8ed46..6ffc502 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Projection.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Projection.java
@@ -19,11 +19,14 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 import org.apache.tajo.util.TUtil;
 
 public class Projection extends UnaryOperator implements Cloneable {
+  @Expose @SerializedName("IsDistinct")
   private boolean distinct = false;
-
+  @Expose @SerializedName("Projections")
   private NamedExpr[] targets;
 
   public Projection() {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/QualifiedAsteriskExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/QualifiedAsteriskExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/QualifiedAsteriskExpr.java
index d26deb9..f067e59 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/QualifiedAsteriskExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/QualifiedAsteriskExpr.java
@@ -19,10 +19,13 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 import org.apache.tajo.util.TUtil;
 
 public class QualifiedAsteriskExpr extends Expr {
   private final static String ASTERISK = "*";
+  @Expose @SerializedName("Qualifier")
   private String qualifier;
 
   public QualifiedAsteriskExpr() {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/Relation.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Relation.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Relation.java
index 406794a..c865454 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Relation.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Relation.java
@@ -19,10 +19,14 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 import org.apache.tajo.util.TUtil;
 
 public class Relation extends Expr {
+  @Expose @SerializedName("TableName")
   private String tableName;
+  @Expose @SerializedName("TableAlias")
   private String alias;
 
   protected Relation(OpType type, String relationName) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/RelationList.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/RelationList.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/RelationList.java
index 18c4ce9..fdf6c94 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/RelationList.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/RelationList.java
@@ -16,11 +16,14 @@ package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 import org.apache.tajo.util.TUtil;
 
 import java.util.Set;
 
 public class RelationList extends Expr {
+  @Expose @SerializedName("Relations")
   private Expr[] relations;
 
   public RelationList(Expr[] relations) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/ScalarSubQuery.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ScalarSubQuery.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ScalarSubQuery.java
index 425c08f..b37b149 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ScalarSubQuery.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ScalarSubQuery.java
@@ -33,8 +33,4 @@ public class ScalarSubQuery extends UnaryOperator {
   boolean equalsTo(Expr expr) {
     return true;
   }
-
-  public String toJson() {
-    return JsonHelper.toJson(this);
-  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/Selection.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Selection.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Selection.java
index 364e1b7..9cc245e 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Selection.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Selection.java
@@ -19,9 +19,12 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 import org.apache.tajo.util.TUtil;
 
 public class Selection extends UnaryOperator implements JsonSerializable {
+  @Expose @SerializedName("SelectCondition")
   private Expr qual;
 
   public Selection(Expr qual) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/SetOperation.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SetOperation.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/SetOperation.java
index 08ebd6a..c20bf06 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SetOperation.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/SetOperation.java
@@ -21,8 +21,11 @@ package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 
 public class SetOperation extends BinaryOperator {
+  @Expose @SerializedName("IsDistinct")
   private boolean distinct = true;
 
   public SetOperation(OpType type, Expr left, Expr right, boolean distinct) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/SignedExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SignedExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/SignedExpr.java
index 7b3438c..0c04341 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SignedExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/SignedExpr.java
@@ -19,8 +19,11 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 
 public class SignedExpr extends UnaryOperator {
+  @Expose @SerializedName("IsNegative")
   private boolean negative;
 
   public SignedExpr(boolean negative, Expr operand) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/SimpleTableSubQuery.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SimpleTableSubQuery.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/SimpleTableSubQuery.java
index 7bd3b78..2332be1 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SimpleTableSubQuery.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/SimpleTableSubQuery.java
@@ -33,8 +33,4 @@ public class SimpleTableSubQuery extends UnaryOperator {
   boolean equalsTo(Expr expr) {
     return true;
   }
-
-  public String toJson() {
-    return JsonHelper.toJson(this);
-  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/Sort.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Sort.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Sort.java
index c047c54..0632b2e 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Sort.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Sort.java
@@ -19,9 +19,12 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 import org.apache.tajo.util.TUtil;
 
 public class Sort extends UnaryOperator {
+  @Expose @SerializedName("SortSpecs")
   private SortSpec [] sortSpecs;
 
   public Sort(final SortSpec [] sortSpecs) {
@@ -54,8 +57,11 @@ public class Sort extends UnaryOperator {
   }
 
   public static class SortSpec {
+    @Expose @SerializedName("SortKey")
     private Expr key;
+    @Expose @SerializedName("IsAsc")
     private boolean asc = true;
+    @Expose @SerializedName("IsNullFirst")
     private boolean nullFirst = false;
 
     public SortSpec(final Expr key) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/TablePrimarySubQuery.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/TablePrimarySubQuery.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/TablePrimarySubQuery.java
index 953c080..5c55164 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/TablePrimarySubQuery.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/TablePrimarySubQuery.java
@@ -19,10 +19,14 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 import org.apache.tajo.util.TUtil;
 
 public class TablePrimarySubQuery extends Relation {
+  @Expose @SerializedName("SubPlan")
   private Expr subquery;
+  @Expose @SerializedName("ColumnNames")
   private String [] columnNames;
 
   public TablePrimarySubQuery(String relName, Expr subquery) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/TimeLiteral.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/TimeLiteral.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/TimeLiteral.java
index e939128..7baccd8 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/TimeLiteral.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/TimeLiteral.java
@@ -19,8 +19,11 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 
 public class TimeLiteral extends Expr {
+  @Expose @SerializedName("Time")
   private TimeValue time;
 
   public TimeLiteral(TimeValue time) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/TimeValue.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/TimeValue.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/TimeValue.java
index b41b644..6ad75bc 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/TimeValue.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/TimeValue.java
@@ -19,12 +19,18 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 import org.apache.commons.lang.StringUtils;
 
 public class TimeValue {
+  @Expose @SerializedName("Hour")
   private String hours;
+  @Expose @SerializedName("Minute")
   private String minutes;
+  @Expose @SerializedName("Second")
   private String seconds;
+  @Expose @SerializedName("SecondFrac")
   private String secondsFraction; // optional
 
   public TimeValue(String hours, String minutes, String seconds) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/TimestampLiteral.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/TimestampLiteral.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/TimestampLiteral.java
index cb6f5a1..5ee20d3 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/TimestampLiteral.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/TimestampLiteral.java
@@ -19,9 +19,13 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 
 public class TimestampLiteral extends Expr {
+  @Expose @SerializedName("Date")
   private DateValue date;
+  @Expose @SerializedName("Time")
   private TimeValue time;
 
   public TimestampLiteral(DateValue date, TimeValue time) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/UnaryOperator.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/UnaryOperator.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/UnaryOperator.java
index 2a1e730..e266393 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/UnaryOperator.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/UnaryOperator.java
@@ -19,8 +19,11 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 
 public abstract class UnaryOperator extends Expr {
+  @Expose @SerializedName("Expr")
   private Expr child;
 
   public UnaryOperator(OpType type) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/main/java/org/apache/tajo/algebra/ValueListExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ValueListExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ValueListExpr.java
index 8d51a95..c5eafb6 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ValueListExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ValueListExpr.java
@@ -19,9 +19,12 @@
 package org.apache.tajo.algebra;
 
 import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
 import org.apache.tajo.util.TUtil;
 
 public class ValueListExpr extends Expr {
+  @Expose @SerializedName("Values")
   private Expr[] values;
 
   public ValueListExpr(Expr[] values) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-algebra/src/test/java/org/apache/tajo/algebra/TestExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/test/java/org/apache/tajo/algebra/TestExpr.java b/tajo-algebra/src/test/java/org/apache/tajo/algebra/TestExpr.java
index f327739..513b66a 100644
--- a/tajo-algebra/src/test/java/org/apache/tajo/algebra/TestExpr.java
+++ b/tajo-algebra/src/test/java/org/apache/tajo/algebra/TestExpr.java
@@ -142,4 +142,47 @@ public class TestExpr {
 
     return sort;
   }
+
+  @Test
+  public void testJson() {
+    Expr left1 = new BinaryOperator(OpType.Plus,
+        new LiteralValue("1", LiteralType.Unsigned_Integer),
+        new LiteralValue("2", LiteralType.Unsigned_Integer));
+
+    Expr right1 = new BinaryOperator(OpType.Multiply,
+        new LiteralValue("2", LiteralType.Unsigned_Integer),
+        new LiteralValue("3", LiteralType.Unsigned_Integer));
+
+    Expr origin = new BinaryOperator(OpType.Plus, left1, right1);
+    String json = origin.toJson();
+    Expr fromJson = JsonHelper.fromJson(json, Expr.class);
+    assertEquals(origin, fromJson);
+  }
+
+  @Test
+  public void testJson2() {
+    Expr expr = new BinaryOperator(OpType.LessThan,
+        new LiteralValue("1", LiteralType.Unsigned_Integer),
+        new LiteralValue("2", LiteralType.Unsigned_Integer));
+
+    Relation relation = new Relation("employee");
+    Selection selection = new Selection(expr);
+    selection.setChild(relation);
+
+    Aggregation aggregation = new Aggregation();
+    aggregation.setTargets(new NamedExpr[]{
+            new NamedExpr(new ColumnReferenceExpr("col1"))
+        }
+    );
+
+    aggregation.setChild(selection);
+
+    Sort.SortSpec spec = new Sort.SortSpec(new ColumnReferenceExpr("col2"));
+    Sort sort = new Sort(new Sort.SortSpec[]{spec});
+    sort.setChild(aggregation);
+
+    String json = sort.toJson();
+    Expr fromJson = JsonHelper.fromJson(json, Expr.class);
+    assertEquals(sort, fromJson);
+  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-client/src/main/java/org/apache/tajo/cli/TajoCli.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/cli/TajoCli.java b/tajo-client/src/main/java/org/apache/tajo/cli/TajoCli.java
index 7489351..c7368c9 100644
--- a/tajo-client/src/main/java/org/apache/tajo/cli/TajoCli.java
+++ b/tajo-client/src/main/java/org/apache/tajo/cli/TajoCli.java
@@ -301,15 +301,19 @@ public class TajoCli {
         continue;
       }
 
-      List<ParsedResult> parsedResults = parser.parseLines(line);
+      if (line.startsWith("{")) {
+        executeJsonQuery(line);
+      } else {
+        List<ParsedResult> parsedResults = parser.parseLines(line);
 
-      if (parsedResults.size() > 0) {
-        for (ParsedResult parsed : parsedResults) {
-          history.addStatement(parsed.getHistoryStatement() + (parsed.getType() == STATEMENT ? ";":""));
+        if (parsedResults.size() > 0) {
+          for (ParsedResult parsed : parsedResults) {
+            history.addStatement(parsed.getHistoryStatement() + (parsed.getType() == STATEMENT ? ";" : ""));
+          }
+          executeParsedResults(parsedResults);
+          currentPrompt = updatePrompt(parser.getState());
         }
       }
-      executeParsedResults(parsedResults);
-      currentPrompt = updatePrompt(parser.getState());
     }
     return code;
   }
@@ -351,6 +355,29 @@ public class TajoCli {
     return 0;
   }
 
+  private void executeJsonQuery(String json) throws ServiceException {
+    long startTime = System.currentTimeMillis();
+    ClientProtos.SubmitQueryResponse response = client.executeQueryWithJson(json);
+    if (response == null) {
+      outputFormatter.printErrorMessage(sout, "response is null");
+    } else if (response.getResultCode() == ClientProtos.ResultCode.OK) {
+      if (response.getIsForwarded()) {
+        QueryId queryId = new QueryId(response.getQueryId());
+        waitForQueryCompleted(queryId);
+      } else {
+        if (!response.hasTableDesc() && !response.hasResultSet()) {
+          outputFormatter.printMessage(sout, "OK");
+        } else {
+          localQueryCompleted(response, startTime);
+        }
+      }
+    } else {
+      if (response.hasErrorMessage()) {
+        outputFormatter.printErrorMessage(sout, response.getErrorMessage());
+      }
+    }
+  }
+
   private void executeQuery(String statement) throws ServiceException {
     long startTime = System.currentTimeMillis();
     ClientProtos.SubmitQueryResponse response = client.executeQuery(statement);

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-client/src/main/java/org/apache/tajo/client/TajoClient.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/client/TajoClient.java b/tajo-client/src/main/java/org/apache/tajo/client/TajoClient.java
index d981917..9e45bf0 100644
--- a/tajo-client/src/main/java/org/apache/tajo/client/TajoClient.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/TajoClient.java
@@ -311,6 +311,23 @@ public class TajoClient implements Closeable {
         final QueryRequest.Builder builder = QueryRequest.newBuilder();
         builder.setSessionId(sessionId);
         builder.setQuery(sql);
+        builder.setIsJson(false);
+        TajoMasterClientProtocolService.BlockingInterface tajoMasterService = client.getStub();
+        return tajoMasterService.submitQuery(null, builder.build());
+      }
+    }.withRetries();
+  }
+
+  public SubmitQueryResponse executeQueryWithJson(final String json) throws ServiceException {
+    return new ServerCallable<SubmitQueryResponse>(connPool, tajoMasterAddr,
+        TajoMasterClientProtocol.class, false, true) {
+      public SubmitQueryResponse call(NettyClientBase client) throws ServiceException {
+        checkSessionAndGet(client);
+
+        final QueryRequest.Builder builder = QueryRequest.newBuilder();
+        builder.setSessionId(sessionId);
+        builder.setQuery(json);
+        builder.setIsJson(true);
         TajoMasterClientProtocolService.BlockingInterface tajoMasterService = client.getStub();
         return tajoMasterService.submitQuery(null, builder.build());
       }
@@ -327,18 +344,26 @@ public class TajoClient implements Closeable {
    */
   public ResultSet executeQueryAndGetResult(final String sql)
       throws ServiceException, IOException {
-    SubmitQueryResponse response = new ServerCallable<SubmitQueryResponse>(connPool, tajoMasterAddr,
-        TajoMasterClientProtocol.class, false, true) {
-      public SubmitQueryResponse call(NettyClientBase client) throws ServiceException {
-        checkSessionAndGet(client);
+    SubmitQueryResponse response = executeQuery(sql);
 
-        final QueryRequest.Builder builder = QueryRequest.newBuilder();
-        builder.setSessionId(sessionId);
-        builder.setQuery(sql);
-        TajoMasterClientProtocolService.BlockingInterface tajoMasterService = client.getStub();
-        return tajoMasterService.submitQuery(null, builder.build());
+    QueryId queryId = new QueryId(response.getQueryId());
+    if (response.getIsForwarded()) {
+      if (queryId.equals(QueryIdFactory.NULL_QUERY_ID)) {
+        return this.createNullResultSet(queryId);
+      } else {
+        return this.getQueryResultAndWait(queryId);
       }
-    }.withRetries();
+    } else {
+      if (response.hasResultSet() || response.hasTableDesc()) {
+        return createResultSet(this, response);
+      } else {
+        return this.createNullResultSet(queryId);
+      }
+    }
+  }
+
+  public ResultSet executeJsonQueryAndGetResult(final String json) throws ServiceException, IOException {
+    SubmitQueryResponse response = executeQueryWithJson(json);
 
     QueryId queryId = new QueryId(response.getQueryId());
     if (response.getIsForwarded()) {
@@ -536,6 +561,31 @@ public class TajoClient implements Closeable {
         QueryRequest.Builder builder = QueryRequest.newBuilder();
         builder.setSessionId(sessionId);
         builder.setQuery(sql);
+        builder.setIsJson(false);
+        TajoMasterClientProtocolService.BlockingInterface tajoMasterService = client.getStub();
+        UpdateQueryResponse response = tajoMasterService.updateQuery(null, builder.build());
+        if (response.getResultCode() == ResultCode.OK) {
+          return true;
+        } else {
+          if (response.hasErrorMessage()) {
+            System.err.println("ERROR: " + response.getErrorMessage());
+          }
+          return false;
+        }
+      }
+    }.withRetries();
+  }
+
+  public boolean updateQueryWithJson(final String json) throws ServiceException {
+    return new ServerCallable<Boolean>(connPool, tajoMasterAddr,
+        TajoMasterClientProtocol.class, false, true) {
+      public Boolean call(NettyClientBase client) throws ServiceException {
+        checkSessionAndGet(client);
+
+        QueryRequest.Builder builder = QueryRequest.newBuilder();
+        builder.setSessionId(sessionId);
+        builder.setQuery(json);
+        builder.setIsJson(true);
         TajoMasterClientProtocolService.BlockingInterface tajoMasterService = client.getStub();
         UpdateQueryResponse response = tajoMasterService.updateQuery(null, builder.build());
         if (response.getResultCode() == ResultCode.OK) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-client/src/main/proto/ClientProtos.proto
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/proto/ClientProtos.proto b/tajo-client/src/main/proto/ClientProtos.proto
index bdc271e..c66b228 100644
--- a/tajo-client/src/main/proto/ClientProtos.proto
+++ b/tajo-client/src/main/proto/ClientProtos.proto
@@ -67,6 +67,7 @@ message QueryRequest {
   optional SessionIdProto sessionId = 1;
   required string query = 2;
   repeated KeyValueProto setVariables = 3;
+  required bool isJson = 4;
 }
 
 message UpdateQueryResponse {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java b/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
index 4155609..6caf031 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
@@ -30,6 +30,7 @@ import org.apache.tajo.QueryId;
 import org.apache.tajo.QueryIdFactory;
 import org.apache.tajo.algebra.AlterTablespaceSetType;
 import org.apache.tajo.algebra.Expr;
+import org.apache.tajo.algebra.JsonHelper;
 import org.apache.tajo.annotation.Nullable;
 import org.apache.tajo.catalog.*;
 import org.apache.tajo.catalog.exception.*;
@@ -109,16 +110,18 @@ public class GlobalEngine extends AbstractService {
     super.stop();
   }
 
-  public SubmitQueryResponse executeQuery(Session session, String sql)
-      throws InterruptedException, IOException, IllegalQueryStatusException {
-
-    LOG.info("SQL: " + sql);
+  public SubmitQueryResponse executeQuery(Session session, String query, boolean isJson) {
+    LOG.info("Query: " + query);
     QueryContext queryContext = new QueryContext();
+    Expr planningContext;
 
     try {
-      // setting environment variables
-      String [] cmds = sql.split(" ");
-      if(cmds != null) {
+      if (isJson) {
+        planningContext = buildExpressionFromJson(query);
+      } else {
+        // setting environment variables
+        String [] cmds = query.split(" ");
+        if(cmds != null) {
           if(cmds[0].equalsIgnoreCase("set")) {
             String[] params = cmds[1].split("=");
             context.getConf().set(params[0], params[1]);
@@ -128,21 +131,14 @@ public class GlobalEngine extends AbstractService {
             responseBuilder.setResultCode(ClientProtos.ResultCode.OK);
             return responseBuilder.build();
           }
-      }
-
-      final boolean hiveQueryMode = context.getConf().getBoolVar(TajoConf.ConfVars.HIVE_QUERY_MODE);
-      LOG.info("hive.query.mode:" + hiveQueryMode);
+        }
 
-      if (hiveQueryMode) {
-        context.getSystemMetrics().counter("Query", "numHiveMode").inc();
-        queryContext.setHiveQueryMode();
+        planningContext = buildExpressionFromSql(queryContext, query);
       }
 
-      context.getSystemMetrics().counter("Query", "totalQuery").inc();
-
-      Expr planningContext = hiveQueryMode ? converter.parse(sql) : analyzer.parse(sql);
+      String jsonExpr = planningContext.toJson();
       LogicalPlan plan = createLogicalPlan(session, planningContext);
-      SubmitQueryResponse response = executeQueryInternal(queryContext, session, plan, sql);
+      SubmitQueryResponse response = executeQueryInternal(queryContext, session, plan, query, jsonExpr);
       return response;
     } catch (Throwable t) {
       context.getSystemMetrics().counter("Query", "errorQuery").inc();
@@ -162,10 +158,30 @@ public class GlobalEngine extends AbstractService {
     }
   }
 
+  public Expr buildExpressionFromJson(String json) {
+    return JsonHelper.fromJson(json, Expr.class);
+  }
+
+  public Expr buildExpressionFromSql(QueryContext queryContext, String sql)
+      throws InterruptedException, IOException, IllegalQueryStatusException {
+    final boolean hiveQueryMode = context.getConf().getBoolVar(TajoConf.ConfVars.HIVE_QUERY_MODE);
+    LOG.info("hive.query.mode:" + hiveQueryMode);
+
+    if (hiveQueryMode) {
+      context.getSystemMetrics().counter("Query", "numHiveMode").inc();
+      queryContext.setHiveQueryMode();
+    }
+
+    context.getSystemMetrics().counter("Query", "totalQuery").inc();
+
+    return hiveQueryMode ? converter.parse(sql) : analyzer.parse(sql);
+  }
+
   private SubmitQueryResponse executeQueryInternal(QueryContext queryContext,
                                                       Session session,
                                                       LogicalPlan plan,
-                                                      String sql) throws Exception {
+                                                      String sql,
+                                                      String jsonExpr) throws Exception {
 
     LogicalRootNode rootNode = plan.getRootBlock().getRoot();
 
@@ -252,7 +268,7 @@ public class GlobalEngine extends AbstractService {
       QueryJobManager queryJobManager = this.context.getQueryJobManager();
       QueryInfo queryInfo;
 
-      queryInfo = queryJobManager.createNewQueryJob(session, queryContext, sql, rootNode);
+      queryInfo = queryJobManager.createNewQueryJob(session, queryContext, sql, jsonExpr, rootNode);
 
       if(queryInfo == null) {
         responseBuilder.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto());
@@ -273,11 +289,17 @@ public class GlobalEngine extends AbstractService {
     return response;
   }
 
-  public QueryId updateQuery(Session session, String sql) throws IOException, SQLException, PlanningException {
+  public QueryId updateQuery(Session session, String sql, boolean isJson) throws IOException, SQLException, PlanningException {
     try {
       LOG.info("SQL: " + sql);
-      // parse the query
-      Expr expr = analyzer.parse(sql);
+
+      Expr expr;
+      if (isJson) {
+        expr = JsonHelper.fromJson(sql, Expr.class);
+      } else {
+        // parse the query
+        expr = analyzer.parse(sql);
+      }
 
       LogicalPlan plan = createLogicalPlan(session, expr);
       LogicalRootNode rootNode = plan.getRootBlock().getRoot();

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java b/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
index 8c16879..f6ad085 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
@@ -252,15 +252,13 @@ public class TajoMasterClientService extends AbstractService {
 
     @Override
     public SubmitQueryResponse submitQuery(RpcController controller, QueryRequest request) throws ServiceException {
-
-
       try {
         Session session = context.getSessionManager().getSession(request.getSessionId().getId());
 
         if(LOG.isDebugEnabled()) {
           LOG.debug("Query [" + request.getQuery() + "] is submitted");
         }
-        return context.getGlobalEngine().executeQuery(session, request.getQuery());
+        return context.getGlobalEngine().executeQuery(session, request.getQuery(), request.getIsJson());
       } catch (Exception e) {
         LOG.error(e.getMessage(), e);
         SubmitQueryResponse.Builder responseBuilder = ClientProtos.SubmitQueryResponse.newBuilder();
@@ -282,7 +280,7 @@ public class TajoMasterClientService extends AbstractService {
         Session session = context.getSessionManager().getSession(request.getSessionId().getId());
         UpdateQueryResponse.Builder builder = UpdateQueryResponse.newBuilder();
         try {
-          context.getGlobalEngine().updateQuery(session, request.getQuery());
+          context.getGlobalEngine().updateQuery(session, request.getQuery(), request.getIsJson());
           builder.setResultCode(ResultCode.OK);
           return builder.build();
         } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-core/src/main/java/org/apache/tajo/master/event/QueryStartEvent.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/event/QueryStartEvent.java b/tajo-core/src/main/java/org/apache/tajo/master/event/QueryStartEvent.java
index dd996e6..623576a 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/event/QueryStartEvent.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/event/QueryStartEvent.java
@@ -34,16 +34,16 @@ public class QueryStartEvent extends AbstractEvent {
   private final QueryId queryId;
   private final Session session;
   private final QueryContext queryContext;
-  private final String sql;
+  private final String jsonExpr;
   private final String logicalPlanJson;
 
-  public QueryStartEvent(QueryId queryId, Session session, QueryContext queryContext, String sql,
+  public QueryStartEvent(QueryId queryId, Session session, QueryContext queryContext, String jsonExpr,
                          String logicalPlanJson) {
     super(EventType.QUERY_START);
     this.queryId = queryId;
     this.session = session;
     this.queryContext = queryContext;
-    this.sql = sql;
+    this.jsonExpr = jsonExpr;
     this.logicalPlanJson = logicalPlanJson;
   }
 
@@ -59,8 +59,8 @@ public class QueryStartEvent extends AbstractEvent {
     return this.queryContext;
   }
 
-  public String getSql() {
-    return this.sql;
+  public String getJsonExpr() {
+    return this.jsonExpr;
   }
 
   public String getLogicalPlanJson() {

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-core/src/main/java/org/apache/tajo/master/querymaster/QueryInProgress.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/querymaster/QueryInProgress.java b/tajo-core/src/main/java/org/apache/tajo/master/querymaster/QueryInProgress.java
index de323cd..dac2d4c 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/querymaster/QueryInProgress.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/querymaster/QueryInProgress.java
@@ -34,6 +34,7 @@ import org.apache.tajo.engine.query.QueryContext;
 import org.apache.tajo.ipc.QueryMasterProtocol;
 import org.apache.tajo.ipc.QueryMasterProtocol.QueryMasterProtocolService;
 import org.apache.tajo.ipc.TajoWorkerProtocol;
+import org.apache.tajo.ipc.TajoWorkerProtocol.QueryExecutionRequestProto;
 import org.apache.tajo.master.TajoAsyncDispatcher;
 import org.apache.tajo.master.TajoMaster;
 import org.apache.tajo.master.rm.WorkerResourceManager;
@@ -79,7 +80,7 @@ public class QueryInProgress extends CompositeService {
       TajoMaster.MasterContext masterContext,
       Session session,
       QueryContext queryContext,
-      QueryId queryId, String sql, LogicalRootNode plan) {
+      QueryId queryId, String sql, String jsonExpr, LogicalRootNode plan) {
     super(QueryInProgress.class.getName());
     this.masterContext = masterContext;
     this.session = session;
@@ -87,7 +88,7 @@ public class QueryInProgress extends CompositeService {
     this.queryId = queryId;
     this.plan = plan;
 
-    queryInfo = new QueryInfo(queryId, sql);
+    queryInfo = new QueryInfo(queryId, sql, jsonExpr);
     queryInfo.setStartTime(System.currentTimeMillis());
   }
 
@@ -230,15 +231,15 @@ public class QueryInProgress extends CompositeService {
       }
       LOG.info("Call executeQuery to :" +
           queryInfo.getQueryMasterHost() + ":" + queryInfo.getQueryMasterPort() + "," + queryId);
-      queryMasterRpcClient.executeQuery(
-          null,
-          TajoWorkerProtocol.QueryExecutionRequestProto.newBuilder()
-              .setQueryId(queryId.getProto())
-              .setSession(session.getProto())
-              .setQueryContext(queryContext.getProto())
-              .setSql(PrimitiveProtos.StringProto.newBuilder().setValue(queryInfo.getSql()))
-              .setLogicalPlanJson(PrimitiveProtos.StringProto.newBuilder().setValue(plan.toJson()).build())
-              .build(), NullCallback.get());
+
+      QueryExecutionRequestProto.Builder builder = TajoWorkerProtocol.QueryExecutionRequestProto.newBuilder();
+      builder.setQueryId(queryId.getProto())
+          .setSession(session.getProto())
+          .setQueryContext(queryContext.getProto())
+          .setExprInJson(PrimitiveProtos.StringProto.newBuilder().setValue(queryInfo.getJsonExpr()))
+          .setLogicalPlanJson(PrimitiveProtos.StringProto.newBuilder().setValue(plan.toJson()).build());
+
+      queryMasterRpcClient.executeQuery(null, builder.build(), NullCallback.get());
       querySubmitted.set(true);
     } catch (Exception e) {
       LOG.error(e.getMessage(), e);

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-core/src/main/java/org/apache/tajo/master/querymaster/QueryInfo.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/querymaster/QueryInfo.java b/tajo-core/src/main/java/org/apache/tajo/master/querymaster/QueryInfo.java
index 9e455ae..955c5b3 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/querymaster/QueryInfo.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/querymaster/QueryInfo.java
@@ -25,6 +25,7 @@ import org.apache.tajo.TajoProtos;
 public class QueryInfo {
   private QueryId queryId;
   private String sql;
+  private String jsonExpr;
   private TajoProtos.QueryState queryState;
   private float progress;
   private long startTime;
@@ -35,12 +36,13 @@ public class QueryInfo {
   private int queryMasterClientPort;
 
   public QueryInfo(QueryId queryId) {
-    this(queryId, null);
+    this(queryId, null, null);
   }
 
-  public QueryInfo(QueryId queryId, String sql) {
+  public QueryInfo(QueryId queryId, String sql, String jsonExpr) {
     this.queryId = queryId;
     this.sql = sql;
+    this.jsonExpr = jsonExpr;
     this.queryState = TajoProtos.QueryState.QUERY_MASTER_INIT;
   }
 
@@ -122,4 +124,8 @@ public class QueryInfo {
     return queryId.toString() + ",state=" + queryState +",progress=" + progress + ", queryMaster="
         + getQueryMasterHost();
   }
+
+  public String getJsonExpr() {
+    return jsonExpr;
+  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-core/src/main/java/org/apache/tajo/master/querymaster/QueryJobManager.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/querymaster/QueryJobManager.java b/tajo-core/src/main/java/org/apache/tajo/master/querymaster/QueryJobManager.java
index ca45534..bc5fcad 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/querymaster/QueryJobManager.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/querymaster/QueryJobManager.java
@@ -95,10 +95,12 @@ public class QueryJobManager extends CompositeService {
     return Collections.unmodifiableCollection(finishedQueries.values());
   }
 
-  public QueryInfo createNewQueryJob(Session session, QueryContext queryContext, String sql, LogicalRootNode plan)
+  public QueryInfo createNewQueryJob(Session session, QueryContext queryContext, String sql,
+                                     String jsonExpr, LogicalRootNode plan)
       throws Exception {
     QueryId queryId = QueryIdFactory.newQueryId(masterContext.getResourceManager().getSeedQueryId());
-    QueryInProgress queryInProgress = new QueryInProgress(masterContext, session, queryContext, queryId, sql, plan);
+    QueryInProgress queryInProgress = new QueryInProgress(masterContext, session, queryContext, queryId, sql,
+        jsonExpr, plan);
 
     synchronized(runningQueries) {
       runningQueries.put(queryId, queryInProgress);

http://git-wip-us.apache.org/repos/asf/tajo/blob/9bbf87e3/tajo-core/src/main/java/org/apache/tajo/master/querymaster/QueryMaster.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/querymaster/QueryMaster.java b/tajo-core/src/main/java/org/apache/tajo/master/querymaster/QueryMaster.java
index 523f5ba..a8c6014 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/querymaster/QueryMaster.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/querymaster/QueryMaster.java
@@ -374,7 +374,7 @@ public class QueryMaster extends CompositeService implements EventHandler {
     public void handle(QueryStartEvent event) {
       LOG.info("Start QueryStartEventHandler:" + event.getQueryId());
       QueryMasterTask queryMasterTask = new QueryMasterTask(queryMasterContext,
-          event.getQueryId(), event.getSession(), event.getQueryContext(), event.getSql(), event.getLogicalPlanJson());
+          event.getQueryId(), event.getSession(), event.getQueryContext(), event.getJsonExpr(), event.getLogicalPlanJson());
 
       queryMasterTask.init(systemConf);
       if (!queryMasterTask.isInitError()) {