summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@oath.com>2018-12-17 09:46:01 +0100
committerGitHub <noreply@github.com>2018-12-17 09:46:01 +0100
commitffffe2f773f3c6ab82823f41e349033356e45bc7 (patch)
tree7db7a6248270202e5b06df5cf6de8f65169f7914
parentb435eb84efa3b47e43e4865637532938e26e1e3f (diff)
parenta33276d70dbdaa571cbefea7a112203fc23b8b64 (diff)
Merge pull request #7941 from vespa-engine/arnej/add-position-data
Arnej/add position data
-rw-r--r--container-search/src/main/java/com/yahoo/data/JsonProducer.java6
-rw-r--r--container-search/src/main/java/com/yahoo/data/XmlProducer.java7
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/fastsearch/XMLField.java21
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/hitfield/XMLString.java16
-rw-r--r--container-search/src/main/java/com/yahoo/search/rendering/DefaultRenderer.java3
-rw-r--r--container-search/src/main/java/com/yahoo/search/rendering/XmlRenderer.java3
-rw-r--r--container-search/src/main/java/com/yahoo/search/result/PositionsData.java64
-rw-r--r--container-search/src/main/java/com/yahoo/search/result/StructuredData.java5
-rw-r--r--container-search/src/test/java/com/yahoo/search/result/PositionsDataTestCase.java55
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);
+ }
+
+}