diff options
author | Jon Bratseth <bratseth@oath.com> | 2018-12-17 09:46:01 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-17 09:46:01 +0100 |
commit | ffffe2f773f3c6ab82823f41e349033356e45bc7 (patch) | |
tree | 7db7a6248270202e5b06df5cf6de8f65169f7914 | |
parent | b435eb84efa3b47e43e4865637532938e26e1e3f (diff) | |
parent | a33276d70dbdaa571cbefea7a112203fc23b8b64 (diff) |
Merge pull request #7941 from vespa-engine/arnej/add-position-data
Arnej/add position data
9 files changed, 159 insertions, 21 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(); + } } - 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/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 <a href="mailto:steinar@yahoo-inc.com">Steinar Knutsen</a> + * @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; + } + } 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<Result> 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<Result> { 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/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("<position "); + for (java.util.Map.Entry<String, Inspector> 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/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 @@ -29,11 +29,6 @@ public class StructuredData implements Inspectable, JsonProducer, XmlProducer { } @Override - public String toXML() { - return writeXML(new StringBuilder()).toString(); - } - - @Override public StringBuilder writeXML(StringBuilder target) { return XmlRenderer.render(target, value); } 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 = "<position x=\"-122057174\" y=\"37374821\" latlong=\"N37.374821;W122.057174\" />"; + 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 = "<position x=\"-122057174\" y=\"37374821\" latlong=\"N37.374821;W122.057174\" />" + + "<position x=\"3\" y=\"-7\" latlong=\"S0.000007;E0.000003\" />"; + 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); + } + +} |