From 544a950d185427f960d187aa74a0261e492e03ef Mon Sep 17 00:00:00 2001 From: Arne Juul Date: Mon, 17 Dec 2018 07:06:08 +0000 Subject: add default implementation of convenience method --- container-search/src/main/java/com/yahoo/data/JsonProducer.java | 6 ++++-- container-search/src/main/java/com/yahoo/data/XmlProducer.java | 7 ++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/container-search/src/main/java/com/yahoo/data/JsonProducer.java b/container-search/src/main/java/com/yahoo/data/JsonProducer.java index dbc652d2d7d..6d925b41379 100644 --- a/container-search/src/main/java/com/yahoo/data/JsonProducer.java +++ b/container-search/src/main/java/com/yahoo/data/JsonProducer.java @@ -19,9 +19,11 @@ public interface JsonProducer { /** * Convenience method equivalent to: - * makeJson(new StringBuilder()).toString() + * writeJson(new StringBuilder()).toString() * @return String containing JSON representation of this object's data. */ - String toJson(); + default String toJson() { + return writeJson(new StringBuilder()).toString(); + } } diff --git a/container-search/src/main/java/com/yahoo/data/XmlProducer.java b/container-search/src/main/java/com/yahoo/data/XmlProducer.java index 93b0e8d296c..cdbfa61d2c2 100644 --- a/container-search/src/main/java/com/yahoo/data/XmlProducer.java +++ b/container-search/src/main/java/com/yahoo/data/XmlProducer.java @@ -15,10 +15,11 @@ public interface XmlProducer { /** * Convenience method equivalent to: - * makeXML(new StringBuilder()).toString() + * writeXML(new StringBuilder()).toString() * @return String containing XML representation of this object's data. */ - String toXML(); + default String toXML() { + return writeXML(new StringBuilder()).toString(); + } } - -- cgit v1.2.3 From 5c87b09ff2f9820f572357340903c26bf37611d9 Mon Sep 17 00:00:00 2001 From: Arne Juul Date: Mon, 17 Dec 2018 07:07:30 +0000 Subject: implement XmlProducer --- .../main/java/com/yahoo/prelude/hitfield/XMLString.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/container-search/src/main/java/com/yahoo/prelude/hitfield/XMLString.java b/container-search/src/main/java/com/yahoo/prelude/hitfield/XMLString.java index b728d8802e3..5aa7c62279b 100644 --- a/container-search/src/main/java/com/yahoo/prelude/hitfield/XMLString.java +++ b/container-search/src/main/java/com/yahoo/prelude/hitfield/XMLString.java @@ -1,12 +1,14 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.prelude.hitfield; +import com.yahoo.data.XmlProducer; + /** * A representation of an XML chunk. * - * @author Steinar Knutsen + * @author Steinar Knutsen */ -public class XMLString { +public class XMLString implements XmlProducer { private final String content; @@ -18,4 +20,14 @@ public class XMLString { return content; } + public StringBuilder writeXML(StringBuilder target) { + target.append(content); + return target; + } + + @Override + public String toXML() { + return content; + } + } -- cgit v1.2.3 From 93e7f97fbbbeffa3d17e80ba91c197ccf3516a61 Mon Sep 17 00:00:00 2001 From: Arne Juul Date: Mon, 17 Dec 2018 07:11:47 +0000 Subject: handle any type of XmlProducer --- .../src/main/java/com/yahoo/search/rendering/DefaultRenderer.java | 3 +++ .../src/main/java/com/yahoo/search/rendering/XmlRenderer.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/container-search/src/main/java/com/yahoo/search/rendering/DefaultRenderer.java b/container-search/src/main/java/com/yahoo/search/rendering/DefaultRenderer.java index 3562a1a9572..30695338741 100644 --- a/container-search/src/main/java/com/yahoo/search/rendering/DefaultRenderer.java +++ b/container-search/src/main/java/com/yahoo/search/rendering/DefaultRenderer.java @@ -2,6 +2,7 @@ package com.yahoo.search.rendering; import com.yahoo.concurrent.CopyOnWriteHashMap; +import com.yahoo.data.XmlProducer; import com.yahoo.io.ByteWriter; import com.yahoo.net.URI; import com.yahoo.prelude.fastsearch.GroupingListHit; @@ -198,6 +199,8 @@ public final class DefaultRenderer extends AsynchronousSectionedRenderer private String asXML(Object value) { if (value == null) return "(null)"; + else if (value instanceof XmlProducer) + return ((XmlProducer)value).toXML(); else if (value instanceof HitField) return ((HitField)value).quotedContent(false); else if (value instanceof StructuredData || value instanceof XMLString || value instanceof JSONString) diff --git a/container-search/src/main/java/com/yahoo/search/rendering/XmlRenderer.java b/container-search/src/main/java/com/yahoo/search/rendering/XmlRenderer.java index 2a822f89352..5f99c531c95 100644 --- a/container-search/src/main/java/com/yahoo/search/rendering/XmlRenderer.java +++ b/container-search/src/main/java/com/yahoo/search/rendering/XmlRenderer.java @@ -2,6 +2,7 @@ package com.yahoo.search.rendering; import com.yahoo.concurrent.CopyOnWriteHashMap; +import com.yahoo.data.XmlProducer; import com.yahoo.io.ByteWriter; import com.yahoo.net.URI; import com.yahoo.prelude.fastsearch.GroupingListHit; @@ -195,6 +196,8 @@ public final class XmlRenderer extends AsynchronousSectionedRenderer { private String asXML(Object value) { if (value == null) return "(null)"; + else if (value instanceof XmlProducer) + return ((XmlProducer)value).toXML(); else if (value instanceof HitField) return ((HitField)value).quotedContent(false); else if (value instanceof StructuredData || value instanceof XMLString || value instanceof JSONString) -- cgit v1.2.3 From 7d83540a036a3280671fa7186ba223b8b471a018 Mon Sep 17 00:00:00 2001 From: Arne Juul Date: Mon, 17 Dec 2018 07:13:11 +0000 Subject: use deafult toXML implementation --- .../src/main/java/com/yahoo/search/result/StructuredData.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/container-search/src/main/java/com/yahoo/search/result/StructuredData.java b/container-search/src/main/java/com/yahoo/search/result/StructuredData.java index 1cee997e67f..8640180fad4 100644 --- a/container-search/src/main/java/com/yahoo/search/result/StructuredData.java +++ b/container-search/src/main/java/com/yahoo/search/result/StructuredData.java @@ -28,11 +28,6 @@ public class StructuredData implements Inspectable, JsonProducer, XmlProducer { return toXML(); } - @Override - public String toXML() { - return writeXML(new StringBuilder()).toString(); - } - @Override public StringBuilder writeXML(StringBuilder target) { return XmlRenderer.render(target, value); -- cgit v1.2.3 From a33276d70dbdaa571cbefea7a112203fc23b8b64 Mon Sep 17 00:00:00 2001 From: Arne Juul Date: Mon, 17 Dec 2018 08:00:27 +0000 Subject: handle array of position objects if we get it --- .../com/yahoo/prelude/fastsearch/XMLField.java | 21 ++++--- .../com/yahoo/search/result/PositionsData.java | 64 ++++++++++++++++++++++ .../yahoo/search/result/PositionsDataTestCase.java | 55 +++++++++++++++++++ 3 files changed, 131 insertions(+), 9 deletions(-) create mode 100644 container-search/src/main/java/com/yahoo/search/result/PositionsData.java create mode 100644 container-search/src/test/java/com/yahoo/search/result/PositionsDataTestCase.java diff --git a/container-search/src/main/java/com/yahoo/prelude/fastsearch/XMLField.java b/container-search/src/main/java/com/yahoo/prelude/fastsearch/XMLField.java index 5c85c3641cf..cb115502468 100644 --- a/container-search/src/main/java/com/yahoo/prelude/fastsearch/XMLField.java +++ b/container-search/src/main/java/com/yahoo/prelude/fastsearch/XMLField.java @@ -1,18 +1,14 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. /** - * Class representing a string field in the result set - * + * Class converting data (historically XML-encoded) from a document summary field. + * This has only been used to represent geographical positions. */ package com.yahoo.prelude.fastsearch; - -import java.nio.ByteBuffer; - -import com.yahoo.io.SlowInflate; -import com.yahoo.prelude.hitfield.XMLString; -import com.yahoo.text.Utf8; import com.yahoo.data.access.Inspector; - +import com.yahoo.data.access.Type; +import com.yahoo.prelude.hitfield.XMLString; +import com.yahoo.search.result.PositionsData; /** * @author Steinar Knutsen @@ -34,6 +30,13 @@ public class XMLField extends DocsumField { @Override public Object convert(Inspector value) { + /* In Vespa 6 the backend will send an XML-formatted string to represent + * positions data. This will change in next version to sending an array + * of objects instead, suitable for the PositionsData class. + */ + if (value.type() == Type.ARRAY) { + return new PositionsData(value); + } return convert(value.asString("")); } diff --git a/container-search/src/main/java/com/yahoo/search/result/PositionsData.java b/container-search/src/main/java/com/yahoo/search/result/PositionsData.java new file mode 100644 index 00000000000..a07eaa2438d --- /dev/null +++ b/container-search/src/main/java/com/yahoo/search/result/PositionsData.java @@ -0,0 +1,64 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.search.result; + +import com.yahoo.data.access.Inspector; +import com.yahoo.data.access.Inspectable; +import com.yahoo.data.access.Type; +import com.yahoo.data.JsonProducer; +import com.yahoo.data.XmlProducer; +import com.yahoo.data.access.simple.JsonRender; + +/** + * A wrapper for structured data representing an array of position values. + **/ +public class PositionsData implements Inspectable, JsonProducer, XmlProducer { + + private final Inspector value; + + public PositionsData(Inspector value) { + this.value = value; + if (value.type() != Type.ARRAY) { + throw new IllegalArgumentException("PositionsData expects an array of positions, got: "+value); + } + } + + @Override + public Inspector inspect() { + return value; + } + + public String toString() { + return toJson(); + } + + @Override + public StringBuilder writeJson(StringBuilder target) { + return JsonRender.render(value, target, true); + } + + @Override + public StringBuilder writeXML(StringBuilder target) { + for (int i = 0; i < value.entryCount(); i++) { + Inspector pos = value.entry(i); + target.append(" entry : pos.fields()) { + Inspector v = entry.getValue(); + if (v.type() == Type.STRING) { + target.append(entry.getKey()); + target.append("=\""); + target.append(entry.getValue().asString()); + target.append("\" "); + } + if (v.type() == Type.LONG) { + target.append(entry.getKey()); + target.append("=\""); + target.append(entry.getValue().asLong()); + target.append("\" "); + } + } + target.append("/>"); + } + return target; + } + +} diff --git a/container-search/src/test/java/com/yahoo/search/result/PositionsDataTestCase.java b/container-search/src/test/java/com/yahoo/search/result/PositionsDataTestCase.java new file mode 100644 index 00000000000..c77ff2eca3c --- /dev/null +++ b/container-search/src/test/java/com/yahoo/search/result/PositionsDataTestCase.java @@ -0,0 +1,55 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.search.result; + +import com.yahoo.data.access.simple.Value; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * @author Arne Juul + */ +public class PositionsDataTestCase { + + @Test + public void testRendering() { + Value.ArrayValue arr = new Value.ArrayValue(); + Value.ObjectValue p1 = new Value.ObjectValue(); + p1.put("x", new Value.LongValue(-122057174)); + p1.put("y", new Value.LongValue(37374821)); + p1.put("latlong", new Value.StringValue("N37.374821;W122.057174")); + arr.add(p1); + + PositionsData pd = new PositionsData(arr.inspect()); + + String rendered = pd.toXML(); + String correct = ""; + assertEquals(correct, rendered); + + rendered = pd.toJson(); + correct = "[{\"x\":-122057174,\"y\":37374821,\"latlong\":\"N37.374821;W122.057174\"}]"; + assertEquals(correct, rendered); + + Value.ObjectValue p2 = new Value.ObjectValue(); + p2.put("x", new Value.LongValue(3)); + p2.put("y", new Value.LongValue(-7)); + p2.put("latlong", new Value.StringValue("S0.000007;E0.000003")); + arr.add(p2); + + pd = new PositionsData(arr.inspect()); + + rendered = pd.toXML(); + correct = "" + + ""; + assertEquals(correct, rendered); + + rendered = pd.toJson(); + correct = "[{\"x\":-122057174,\"y\":37374821,\"latlong\":\"N37.374821;W122.057174\"}," + + "{\"x\":3,\"y\":-7,\"latlong\":\"S0.000007;E0.000003\"}]"; + assertEquals(correct, rendered); + } + +} -- cgit v1.2.3