diff options
author | Arne Juul <arnej@yahoo-inc.com> | 2018-06-15 11:14:01 +0200 |
---|---|---|
committer | Arne Juul <arnej@yahoo-inc.com> | 2018-06-15 11:37:16 +0200 |
commit | b8449b4afd95adaadd04349cb7d0d69b6c95a193 (patch) | |
tree | d531457e2ed4056b114a810069deed5a591d8f02 /container-search | |
parent | a156ca38d3abf599a56d187238422820500902b5 (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.java | 55 |
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 { |