METAMODEL-225: Fixed Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/c5a233a6 Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/c5a233a6 Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/c5a233a6
Branch: refs/heads/master Commit: c5a233a65ce67d782d281e7c7e57dc425c184a19 Parents: 6a669d7 Author: kaspersorensen <[email protected]> Authored: Thu Apr 21 10:00:37 2016 -0700 Committer: kaspersorensen <[email protected]> Committed: Thu Apr 21 10:00:37 2016 -0700 ---------------------------------------------------------------------- .../rest/JestElasticSearchUtils.java | 19 ++++-- .../rest/JestElasticSearchUtilsTest.java | 68 ++++++++++++++++++++ 2 files changed, 83 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/metamodel/blob/c5a233a6/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchUtils.java ---------------------------------------------------------------------- diff --git a/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchUtils.java b/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchUtils.java index 7448aa6..11a79b7 100644 --- a/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchUtils.java +++ b/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchUtils.java @@ -18,8 +18,10 @@ */ package org.apache.metamodel.elasticsearch.rest; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; +import java.util.Date; +import java.util.List; +import java.util.Map; + import org.apache.metamodel.data.DataSetHeader; import org.apache.metamodel.data.DefaultRow; import org.apache.metamodel.data.Row; @@ -29,7 +31,9 @@ import org.apache.metamodel.schema.Column; import org.apache.metamodel.schema.ColumnType; import org.apache.metamodel.util.NumberComparator; -import java.util.Date; +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; /** * Shared/common util functions for the ElasticSearch MetaModel module. @@ -58,6 +62,14 @@ final class JestElasticSearchUtils { if (field == null || field.isJsonNull()) { return null; } + + if (field.isJsonObject()) { + return new Gson().fromJson(field, Map.class); + } + if (field.isJsonArray()) { + return new Gson().fromJson(field, List.class); + } + if (type.isNumber()) { // Pretty terrible workaround to avoid LazilyParsedNumber // (which is happily output, but not recognized by Jest/GSON). @@ -75,5 +87,4 @@ final class JestElasticSearchUtils { return field.getAsString(); } } - } http://git-wip-us.apache.org/repos/asf/metamodel/blob/c5a233a6/elasticsearch/rest/src/test/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchUtilsTest.java ---------------------------------------------------------------------- diff --git a/elasticsearch/rest/src/test/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchUtilsTest.java b/elasticsearch/rest/src/test/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchUtilsTest.java index 9e2b42f..f114826 100644 --- a/elasticsearch/rest/src/test/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchUtilsTest.java +++ b/elasticsearch/rest/src/test/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchUtilsTest.java @@ -25,6 +25,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.List; +import java.util.Map; import org.apache.metamodel.data.DataSetHeader; import org.apache.metamodel.data.Row; @@ -35,7 +36,9 @@ import org.apache.metamodel.schema.ColumnType; import org.apache.metamodel.schema.MutableColumn; import org.junit.Test; +import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; public class JestElasticSearchUtilsTest { @@ -99,6 +102,71 @@ public class JestElasticSearchUtilsTest { } @Test + public void testCreateRowWithJsonObject() throws Exception { + final Column col1 = new MutableColumn("col1", ColumnType.MAP); + final DataSetHeader header = new SimpleDataSetHeader(new Column[] { col1 }); + final JsonObject source = new JsonObject(); + final JsonObject value = new JsonObject(); + value.addProperty("foo1", "bar"); + value.addProperty("foo2", 42); + source.add("col1", value); + final String documentId = "row1"; + + final Row row = JestElasticSearchUtils.createRow(source, documentId, header); + assertEquals("Row[values=[{foo1=bar, foo2=42.0}]]", row.toString()); + + final Map<?, ?> rowValue = (Map<?, ?>) row.getValue(col1); + assertEquals("bar", rowValue.get("foo1")); + } + + @Test + public void testCreateRowWithJsonArray() throws Exception { + final Column col1 = new MutableColumn("col1", ColumnType.LIST); + final DataSetHeader header = new SimpleDataSetHeader(new Column[] { col1 }); + final JsonObject source = new JsonObject(); + final JsonArray value = new JsonArray(); + value.add(new JsonPrimitive("foo")); + value.add(new JsonPrimitive("bar")); + source.add("col1", value); + final String documentId = "row1"; + + final Row row = JestElasticSearchUtils.createRow(source, documentId, header); + assertEquals("Row[values=[[foo, bar]]]", row.toString()); + + final List<?> rowValue = (List<?>) row.getValue(col1); + assertEquals("foo", rowValue.get(0)); + } + + @Test + public void testCreateRowWithDeepNesting() throws Exception { + final Column col1 = new MutableColumn("col1", ColumnType.LIST); + final DataSetHeader header = new SimpleDataSetHeader(new Column[] { col1 }); + final JsonObject source = new JsonObject(); + + final JsonObject obj2 = new JsonObject(); + obj2.addProperty("foo", 43); + + final JsonArray arr1 = new JsonArray(); + arr1.add(new JsonPrimitive("foo")); + arr1.add(new JsonPrimitive("bar")); + arr1.add(obj2); + + final JsonObject obj1 = new JsonObject(); + obj1.addProperty("mybool", true); + obj1.add("arr1", arr1); + source.add("col1", obj1); + final String documentId = "row1"; + + final Row row = JestElasticSearchUtils.createRow(source, documentId, header); + assertEquals("Row[values=[{mybool=true, arr1=[foo, bar, {foo=43.0}]}]]", row.toString()); + + final Map<?, ?> rowObj1 = (Map<?, ?>) row.getValue(col1); + final List<?> rowList = (List<?>) rowObj1.get("arr1"); + final Map<?, ?> rowObj2 = (Map<?, ?>) rowList.get(2); + assertEquals(43.0, rowObj2.get("foo")); + } + + @Test public void testCreateRowWithParseableDates() throws Exception { SelectItem item1 = new SelectItem(new MutableColumn("value1", ColumnType.STRING)); SelectItem item2 = new SelectItem(new MutableColumn("value2", ColumnType.DATE));
