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); }
