summaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'container-search/src/main/java/com')
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/fastsearch/XMLField.java6
-rw-r--r--container-search/src/main/java/com/yahoo/search/result/PositionsData.java48
2 files changed, 31 insertions, 23 deletions
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 cb115502468..d768dda2657 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
@@ -31,10 +31,10 @@ 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.
+ * positions data. This will change in next version to sending an object
+ * or an array of objects instead, suitable for the PositionsData class.
*/
- if (value.type() == Type.ARRAY) {
+ if (value.type() == Type.OBJECT || 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
index a07eaa2438d..483849a5435 100644
--- a/container-search/src/main/java/com/yahoo/search/result/PositionsData.java
+++ b/container-search/src/main/java/com/yahoo/search/result/PositionsData.java
@@ -17,8 +17,8 @@ public class PositionsData implements Inspectable, JsonProducer, XmlProducer {
public PositionsData(Inspector value) {
this.value = value;
- if (value.type() != Type.ARRAY) {
- throw new IllegalArgumentException("PositionsData expects an array of positions, got: "+value);
+ if (value.type() != Type.OBJECT && value.type() != Type.ARRAY) {
+ throw new IllegalArgumentException("PositionsData expects a position or an array of positions, got: "+value);
}
}
@@ -38,27 +38,35 @@ public class PositionsData implements Inspectable, JsonProducer, XmlProducer {
@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("\" ");
- }
+ if (value.type() == Type.OBJECT) {
+ writeXML(value.inspect(), target);
+ } else {
+ for (int i = 0; i < value.entryCount(); i++) {
+ Inspector pos = value.entry(i);
+ writeXML(pos, target);
}
- target.append("/>");
}
return target;
}
+ private static void writeXML(Inspector pos, StringBuilder target) {
+ 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("/>");
+ }
+
}