Repository: tajo
Updated Branches:
  refs/heads/index_support 1071e614b -> 935b94456


TAJO-1178: Some error messages for wrong JSON queries are not so much helpful. 
(Jaewoong Jung via jihoon)


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

Branch: refs/heads/index_support
Commit: 8f38cc7b7fff0f49c8a2ad5a2cafab783ea66347
Parents: 491395a
Author: Jihoon Son <[email protected]>
Authored: Tue Nov 18 16:55:46 2014 +0900
Committer: Jihoon Son <[email protected]>
Committed: Tue Nov 18 16:59:27 2014 +0900

----------------------------------------------------------------------
 CHANGES                                         |  6 +++++
 .../org/apache/tajo/algebra/CreateTable.java    |  4 +++-
 .../main/java/org/apache/tajo/algebra/Expr.java |  5 ++--
 .../tajo/catalog/json/FunctionAdapter.java      |  5 ++--
 .../tajo/catalog/json/TableMetaAdapter.java     | 12 ++++------
 .../org/apache/tajo/json/CommonGsonHelper.java  | 24 +++++++++++++++++++-
 .../org/apache/tajo/json/DataTypeAdapter.java   |  2 +-
 .../java/org/apache/tajo/json/DatumAdapter.java | 14 ++++++------
 .../tajo/plan/serder/EvalNodeAdapter.java       |  3 ++-
 .../tajo/plan/serder/LogicalNodeAdapter.java    |  3 ++-
 10 files changed, 54 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/8f38cc7b/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 53ab183..01ffbb2 100644
--- a/CHANGES
+++ b/CHANGES
@@ -14,6 +14,9 @@ Release 0.9.1 - unreleased
   IMPROVEMENT
 
     TAJO-1184: Upgrade netty-buffer to 4.0.24.Final. (jinho)
+
+    TAJO-1156: Improve the comparison of timestamp and date types. 
+    (Jihun Kang via jihoon)
    
     TAJO-1109: Separate SQL Statements from Catalog Stores.
     (Jihun Kang via hyunsik)
@@ -56,6 +59,9 @@ Release 0.9.1 - unreleased
     (DaeMyung Kang via hyunsik)
 
   BUG FIXES
+
+    TAJO-1178: Some error messages for wrong JSON queries are not so 
+    much helpful. (Jaewoong Jung via jihoon)
     
     TAJO-1162: to_char() returns "-00" second. (Hyoungjun Kim)
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8f38cc7b/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 bd04a91..4056ed3 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
@@ -22,6 +22,7 @@ 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.json.CommonGsonHelper;
 import org.apache.tajo.util.TUtil;
 
 import java.util.ArrayList;
@@ -234,7 +235,8 @@ public class CreateTable extends Expr {
       public PartitionMethodDescExpr deserialize(JsonElement json, Type 
typeOfT, JsonDeserializationContext context)
           throws JsonParseException {
         JsonObject jsonObject = json.getAsJsonObject();
-        PartitionType type = 
PartitionType.valueOf(jsonObject.get("PartitionType").getAsString());
+        PartitionType type = PartitionType.valueOf(
+            CommonGsonHelper.getOrDie(jsonObject, 
"PartitionType").getAsString());
         switch (type) {
           case RANGE:
             return context.deserialize(json, RangePartition.class);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8f38cc7b/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 76af393..b53a6db 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
@@ -22,6 +22,7 @@ import com.google.gson.*;
 import com.google.gson.annotations.Expose;
 import com.google.gson.annotations.SerializedName;
 import org.apache.tajo.algebra.LiteralValue.LiteralType;
+import org.apache.tajo.json.CommonGsonHelper;
 
 import java.lang.reflect.Type;
 
@@ -124,9 +125,9 @@ public abstract class Expr implements JsonSerializable, 
Cloneable {
                                     JsonDeserializationContext context)
         throws JsonParseException {
       JsonObject jsonObject = json.getAsJsonObject();
-      String opType = jsonObject.get(SERIALIZED_NAME_OF_OP_TYPE).getAsString();
+      String opType = CommonGsonHelper.getOrDie(jsonObject, 
SERIALIZED_NAME_OF_OP_TYPE).getAsString();
       if (OpType.valueOf(opType).equals(OpType.Literal)) {
-        String value = jsonObject.get("Value").getAsString();
+        String value = CommonGsonHelper.getOrDie(jsonObject, 
"Value").getAsString();
         JsonElement valueTypeElem = jsonObject.get("ValueType");
         if (valueTypeElem != null) {
           return new LiteralValue(value, 
LiteralType.valueOf(valueTypeElem.getAsString()));

http://git-wip-us.apache.org/repos/asf/tajo/blob/8f38cc7b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/FunctionAdapter.java
----------------------------------------------------------------------
diff --git 
a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/FunctionAdapter.java
 
b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/FunctionAdapter.java
index 46ddd18..14722c3 100644
--- 
a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/FunctionAdapter.java
+++ 
b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/FunctionAdapter.java
@@ -20,6 +20,7 @@ package org.apache.tajo.catalog.json;
 
 import com.google.gson.*;
 import org.apache.tajo.function.Function;
+import org.apache.tajo.json.CommonGsonHelper;
 import org.apache.tajo.json.GsonSerDerAdapter;
 
 import java.lang.reflect.Type;
@@ -41,7 +42,7 @@ public class FunctionAdapter implements 
GsonSerDerAdapter<Function> {
   public Function deserialize(JsonElement json, Type typeOfT,
       JsonDeserializationContext context) throws JsonParseException {
     JsonObject jsonObject = json.getAsJsonObject();
-    String className = 
jsonObject.get("class").getAsJsonPrimitive().getAsString();
+    String className = CommonGsonHelper.getOrDie(jsonObject, 
"class").getAsJsonPrimitive().getAsString();
     
     Class clazz;
     try {
@@ -50,6 +51,6 @@ public class FunctionAdapter implements 
GsonSerDerAdapter<Function> {
       e.printStackTrace();
       throw new JsonParseException(e);
     }
-    return context.deserialize(jsonObject.get("body"), clazz);
+    return context.deserialize(CommonGsonHelper.getOrDie(jsonObject, "body"), 
clazz);
   }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8f38cc7b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/TableMetaAdapter.java
----------------------------------------------------------------------
diff --git 
a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/TableMetaAdapter.java
 
b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/TableMetaAdapter.java
index adad473..3f4304a 100644
--- 
a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/TableMetaAdapter.java
+++ 
b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/TableMetaAdapter.java
@@ -20,6 +20,7 @@ package org.apache.tajo.catalog.json;
 
 import com.google.common.base.Preconditions;
 import com.google.gson.*;
+import org.apache.tajo.json.CommonGsonHelper;
 import org.apache.tajo.util.KeyValueSet;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.catalog.proto.CatalogProtos;
@@ -35,15 +36,10 @@ public class TableMetaAdapter implements 
GsonSerDerAdapter<TableMeta> {
     Preconditions.checkNotNull(json);
                JsonObject jsonObject = json.getAsJsonObject();
 
-    CatalogProtos.StoreType type = 
CatalogProtos.StoreType.valueOf(jsonObject.get("store").getAsString());
+    CatalogProtos.StoreType type = CatalogProtos.StoreType.valueOf(
+                               CommonGsonHelper.getOrDie(jsonObject, 
"store").getAsString());
 
-    KeyValueSet keyValueSet = null;
-    if (jsonObject.get("options") != null) {
-      keyValueSet = context.deserialize(jsonObject.get("options"), 
KeyValueSet.class);
-    } else {
-      throw new JsonParseException("Options not found in json");
-
-    }
+    KeyValueSet keyValueSet = 
context.deserialize(CommonGsonHelper.getOrDie(jsonObject, "options"), 
KeyValueSet.class);
                return new TableMeta(type, keyValueSet);
        }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8f38cc7b/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
index 3badbc0..8994b11 100644
--- a/tajo-common/src/main/java/org/apache/tajo/json/CommonGsonHelper.java
+++ b/tajo-common/src/main/java/org/apache/tajo/json/CommonGsonHelper.java
@@ -20,6 +20,10 @@ package org.apache.tajo.json;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonNull;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.util.TUtil;
 
@@ -32,7 +36,7 @@ public class CommonGsonHelper {
 
   private CommonGsonHelper() {
   }
-       
+
        private static Map<Type, GsonSerDerAdapter> registerAdapters() {
     Map<Type, GsonSerDerAdapter> adapters = TUtil.newHashMap();
     adapters.put(Datum.class, new DatumAdapter());
@@ -67,4 +71,22 @@ public class CommonGsonHelper {
   public static <T extends GsonObject> T fromJson(String json, Class<T> clazz) 
{
     return getInstance().fromJson(json, clazz);
   }
+
+  /**
+   * A helper method that gets a JSON object member value after making sure it 
exists and has a valid value. Useful when
+   * a member value should present to proceed.
+   * @param object A JSON object to get a member value from
+   * @param memberName The name of a member to get value of
+   * @return {@link JsonElement} value read from the given member
+   * @throws JsonParseException When the specified member does not exist or 
have a value.
+   */
+  public static JsonElement getOrDie(JsonObject object, String memberName) 
throws JsonParseException {
+    if (object.has(memberName)) {
+      JsonElement element = object.get(memberName);
+      if (!JsonNull.INSTANCE.equals(element)) {
+        return element;
+      }
+    }
+    throw new JsonParseException("Field '" + memberName + "' not found in JSON 
object '" + object + "'");
+  }
 }

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

http://git-wip-us.apache.org/repos/asf/tajo/blob/8f38cc7b/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java 
b/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java
index 9e88acb..d65559d 100644
--- a/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java
+++ b/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java
@@ -30,21 +30,21 @@ public class DatumAdapter implements 
GsonSerDerAdapter<Datum> {
        public Datum deserialize(JsonElement json, Type typeOfT,
                        JsonDeserializationContext context) throws 
JsonParseException {
                JsonObject jsonObject = json.getAsJsonObject();
-               String typeName = jsonObject.get("type").getAsString();
-    TajoDataTypes.Type type = 
TajoDataTypes.Type.valueOf(jsonObject.get("type").getAsString());
+               String typeName = CommonGsonHelper.getOrDie(jsonObject, 
"type").getAsString();
+    TajoDataTypes.Type type = TajoDataTypes.Type.valueOf(typeName);
     switch (type) {
     case DATE:
-      return new DateDatum(jsonObject.get("value").getAsInt());
+      return new DateDatum(CommonGsonHelper.getOrDie(jsonObject, 
"value").getAsInt());
     case TIME:
-      return new TimeDatum(jsonObject.get("value").getAsLong());
+      return new TimeDatum(CommonGsonHelper.getOrDie(jsonObject, 
"value").getAsLong());
     case TIMESTAMP:
-      return new TimestampDatum(jsonObject.get("value").getAsLong());
+      return new TimestampDatum(CommonGsonHelper.getOrDie(jsonObject, 
"value").getAsLong());
     case INTERVAL:
-      String[] values = jsonObject.get("value").getAsString().split(",");
+      String[] values = CommonGsonHelper.getOrDie(jsonObject, 
"value").getAsString().split(",");
 
       return new IntervalDatum(Integer.parseInt(values[0]), 
Long.parseLong(values[1]));
     default:
-      return context.deserialize(jsonObject.get("body"),
+      return context.deserialize(CommonGsonHelper.getOrDie(jsonObject, "body"),
           DatumFactory.getDatumClass(TajoDataTypes.Type.valueOf(typeName)));
     }
        }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8f38cc7b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeAdapter.java
----------------------------------------------------------------------
diff --git 
a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeAdapter.java 
b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeAdapter.java
index 7a3238c..5a75e58 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeAdapter.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeAdapter.java
@@ -22,6 +22,7 @@
 package org.apache.tajo.plan.serder;
 
 import com.google.gson.*;
+import org.apache.tajo.json.CommonGsonHelper;
 import org.apache.tajo.json.GsonSerDerAdapter;
 import org.apache.tajo.plan.expr.EvalNode;
 import org.apache.tajo.plan.expr.EvalType;
@@ -34,7 +35,7 @@ public class EvalNodeAdapter implements 
GsonSerDerAdapter<EvalNode> {
   public EvalNode deserialize(JsonElement json, Type type,
                               JsonDeserializationContext ctx) throws 
JsonParseException {
     JsonObject jsonObject = json.getAsJsonObject();
-    String nodeName = jsonObject.get("type").getAsString();
+    String nodeName = CommonGsonHelper.getOrDie(jsonObject, 
"type").getAsString();
     Class clazz = EvalType.valueOf(nodeName).getBaseClass();
     return ctx.deserialize(jsonObject.get("body"), clazz);
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8f38cc7b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeAdapter.java
----------------------------------------------------------------------
diff --git 
a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeAdapter.java 
b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeAdapter.java
index 30ff053..f86ba5f 100644
--- 
a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeAdapter.java
+++ 
b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeAdapter.java
@@ -22,6 +22,7 @@
 package org.apache.tajo.plan.serder;
 
 import com.google.gson.*;
+import org.apache.tajo.json.CommonGsonHelper;
 import org.apache.tajo.plan.logical.LogicalNode;
 import org.apache.tajo.plan.logical.NodeType;
 import org.apache.tajo.json.GsonSerDerAdapter;
@@ -34,7 +35,7 @@ public class LogicalNodeAdapter implements 
GsonSerDerAdapter<LogicalNode> {
   public LogicalNode deserialize(JsonElement src, Type type,
                                  JsonDeserializationContext ctx) throws 
JsonParseException {
     JsonObject jsonObject = src.getAsJsonObject();
-    String nodeName = jsonObject.get("type").getAsString();
+    String nodeName = CommonGsonHelper.getOrDie(jsonObject, 
"type").getAsString();
     Class clazz = NodeType.valueOf(nodeName).getBaseClass();
     return ctx.deserialize(jsonObject.get("body"), clazz);
   }

Reply via email to