You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by ji...@apache.org on 2014/11/18 09:00:54 UTC
tajo git commit: TAJO-1178: Some error messages for wrong JSON
queries are not so much helpful. (Jaewoong Jung via jihoon)
Repository: tajo
Updated Branches:
refs/heads/master 491395a62 -> 8f38cc7b7
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/master
Commit: 8f38cc7b7fff0f49c8a2ad5a2cafab783ea66347
Parents: 491395a
Author: Jihoon Son <ji...@apache.org>
Authored: Tue Nov 18 16:55:46 2014 +0900
Committer: Jihoon Son <ji...@apache.org>
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);
}