METAMODEL-225: Fixed 95/head
authorkaspersorensen <i.am.kasper.sorensen@gmail.com>
Thu, 21 Apr 2016 17:00:37 +0000 (10:00 -0700)
committerkaspersorensen <i.am.kasper.sorensen@gmail.com>
Thu, 21 Apr 2016 17:00:37 +0000 (10:00 -0700)
elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchUtils.java
elasticsearch/rest/src/test/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchUtilsTest.java

index 7448aa6..11a79b7 100644 (file)
  */
 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();
         }
     }
-
 }
index 9e2b42f..f114826 100644 (file)
@@ -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));