aboutsummaryrefslogtreecommitdiffstats
path: root/container-search
diff options
context:
space:
mode:
authorArne Juul <arnej@yahoo-inc.com>2018-06-15 11:14:01 +0200
committerArne Juul <arnej@yahoo-inc.com>2018-06-15 11:37:16 +0200
commitb8449b4afd95adaadd04349cb7d0d69b6c95a193 (patch)
treed531457e2ed4056b114a810069deed5a591d8f02 /container-search
parenta156ca38d3abf599a56d187238422820500902b5 (diff)
wrap map in object instead of rendering to intermediate string
Diffstat (limited to 'container-search')
-rw-r--r--container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java55
1 files changed, 23 insertions, 32 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java b/container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java
index f8750e984a6..ecd78380475 100644
--- a/container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java
+++ b/container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java
@@ -12,6 +12,7 @@ import com.yahoo.data.access.Inspectable;
import com.yahoo.data.access.Inspector;
import com.yahoo.data.access.Type;
import com.yahoo.data.access.simple.JsonRender;
+import com.yahoo.data.access.simple.Value;
import com.yahoo.document.datatypes.FieldValue;
import com.yahoo.document.datatypes.StringFieldValue;
import com.yahoo.document.datatypes.TensorFieldValue;
@@ -47,7 +48,6 @@ import com.yahoo.yolean.trace.TraceVisitor;
import org.json.JSONArray;
import org.json.JSONObject;
-import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
@@ -316,32 +316,6 @@ public class JsonRenderer extends AsynchronousSectionedRenderer<Result> {
generator.writeFieldName(ROOT);
}
- public String renderAsMap(Inspector data) throws IOException {
- if (data.type() != Type.ARRAY) return null;
- if (data.entryCount() == 0) return null;
- ByteArrayOutputStream subStream = new ByteArrayOutputStream();
- JsonGenerator subGenerator = generatorFactory.createGenerator(subStream, JsonEncoding.UTF8);
- subGenerator.writeStartObject();
- for (int i = 0; i < data.entryCount(); i++) {
- Inspector obj = data.entry(i);
- if (obj.type() != Type.OBJECT) return null;
- if (obj.fieldCount() != 2) return null;
- Inspector keyObj = obj.field("key");
- if (keyObj.type() != Type.STRING) return null;
-
- subGenerator.writeFieldName(keyObj.asString());
-
- Inspector valueObj = obj.field("value");
- if (! valueObj.valid()) return null;
- StringBuilder intermediate = new StringBuilder();
- JsonRender.render(valueObj, intermediate, true);
- subGenerator.writeRawValue(intermediate.toString());
- }
- subGenerator.writeEndObject();
- subGenerator.close();
- return subStream.toString("UTF-8");
- }
-
private void renderTiming() throws IOException {
if (!getResult().getQuery().getPresentation().getTiming()) return;
@@ -691,7 +665,7 @@ public class JsonRenderer extends AsynchronousSectionedRenderer<Result> {
* This instance is reused for all hits of a Result since we are in a single-threaded context
* and want to limit object creation.
*/
- private class FieldConsumer implements Hit.RawUtf8Consumer {
+ private static class FieldConsumer implements Hit.RawUtf8Consumer {
private final JsonGenerator generator;
private final boolean debugRendering;
@@ -770,15 +744,32 @@ public class JsonRenderer extends AsynchronousSectionedRenderer<Result> {
return true;
}
+ private static Inspector wrapAsMap(Inspector data) {
+ if (data.type() != Type.ARRAY) return null;
+ if (data.entryCount() == 0) return null;
+ Value.ObjectValue map = new Value.ObjectValue();
+ for (int i = 0; i < data.entryCount(); i++) {
+ Inspector obj = data.entry(i);
+ if (obj.type() != Type.OBJECT) return null;
+ if (obj.fieldCount() != 2) return null;
+ Inspector key = obj.field("key");
+ Inspector value = obj.field("value");
+ if (key.type() != Type.STRING) return null;
+ if (! value.valid()) return null;
+ map.put(key.asString(), value);
+ }
+ return map;
+ }
+
private void renderInspector(Inspector data) throws IOException {
- String asMap = renderAsMap(data);
+ StringBuilder intermediate = new StringBuilder();
+ Inspector asMap = wrapAsMap(data);
if (asMap != null) {
- generator.writeRawValue(asMap);
+ JsonRender.render(asMap, intermediate, true);
} else {
- StringBuilder intermediate = new StringBuilder();
JsonRender.render(data, intermediate, true);
- generator.writeRawValue(intermediate.toString());
}
+ generator.writeRawValue(intermediate.toString());
}
private void renderFieldContents(Object field) throws IOException {