summaryrefslogtreecommitdiffstats
path: root/docproc
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@verizonmedia.com>2019-06-28 08:56:48 -0500
committerJon Bratseth <bratseth@verizonmedia.com>2019-06-28 08:56:48 -0500
commit781d6dfd8afdcb1da0ce29ef37ccbc0c45dc155d (patch)
tree18846b64a9ea079196591f93bd2856a8b5459b4d /docproc
parent38be09692fbc8e286ed1b669771e1c2d66e1db6c (diff)
parent4f9ad5d65f0e7fac3796830b90c2f8b9128523ce (diff)
Merge with master
Diffstat (limited to 'docproc')
-rw-r--r--docproc/abi-spec.json3
-rw-r--r--docproc/src/main/java/com/yahoo/docproc/AbstractConcreteDocumentFactory.java42
2 files changed, 41 insertions, 4 deletions
diff --git a/docproc/abi-spec.json b/docproc/abi-spec.json
index 65ca886efaf..dee2d2172e4 100644
--- a/docproc/abi-spec.json
+++ b/docproc/abi-spec.json
@@ -11,7 +11,8 @@
"public abstract java.util.Map documentTypes()",
"public abstract java.util.Map structTypes()",
"public abstract java.util.Map annotationTypes()",
- "public abstract com.yahoo.document.Document getDocumentCopy(java.lang.String, com.yahoo.document.datatypes.StructuredFieldValue, com.yahoo.document.DocumentId)"
+ "public abstract com.yahoo.document.Document getDocumentCopy(java.lang.String, com.yahoo.document.datatypes.StructuredFieldValue, com.yahoo.document.DocumentId)",
+ "public com.yahoo.document.datatypes.FieldValue optionallyUpgrade(com.yahoo.document.Field, com.yahoo.document.datatypes.FieldValue)"
],
"fields": []
},
diff --git a/docproc/src/main/java/com/yahoo/docproc/AbstractConcreteDocumentFactory.java b/docproc/src/main/java/com/yahoo/docproc/AbstractConcreteDocumentFactory.java
index e9a821c66ac..f23e1f33d8f 100644
--- a/docproc/src/main/java/com/yahoo/docproc/AbstractConcreteDocumentFactory.java
+++ b/docproc/src/main/java/com/yahoo/docproc/AbstractConcreteDocumentFactory.java
@@ -2,9 +2,16 @@
package com.yahoo.docproc;
import java.util.Map;
+
+import com.yahoo.document.DataType;
import com.yahoo.document.Document;
+import com.yahoo.document.DocumentId;
+import com.yahoo.document.Field;
import com.yahoo.document.annotation.Annotation;
+import com.yahoo.document.datatypes.Array;
+import com.yahoo.document.datatypes.FieldValue;
import com.yahoo.document.datatypes.Struct;
+import com.yahoo.document.datatypes.StructuredFieldValue;
/**
* Subtyped by factory classes for concrete document types. The factory classes are auto-generated
@@ -23,8 +30,37 @@ public abstract class AbstractConcreteDocumentFactory extends com.yahoo.componen
*
* @return a concrete document instance
*/
- public abstract com.yahoo.document.Document getDocumentCopy(java.lang.String type,
- com.yahoo.document.datatypes.StructuredFieldValue src,
- com.yahoo.document.DocumentId id);
+ public abstract Document getDocumentCopy(java.lang.String type, StructuredFieldValue src, DocumentId id);
+
+ /**
+ * If the FieldValue is a StructuredFieldValue it will upgrade to the concrete type
+ * @param field
+ * @param fv
+ * @return fv or upgraded fv
+ */
+ public FieldValue optionallyUpgrade(Field field, FieldValue fv) {
+ return optionallyUpgrade(field.getDataType(), fv);
+ }
+
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ private FieldValue optionallyUpgrade(DataType dataType, FieldValue fv) {
+ if (fv instanceof StructuredFieldValue) {
+ try {
+ return structTypes().get(dataType.getName())
+ .getConstructor(StructuredFieldValue.class)
+ .newInstance(fv);
+ } catch (java.lang.Exception ex) {
+ throw new RuntimeException(ex);
+ }
+ } else if (fv instanceof Array) {
+ Array<FieldValue> array = (Array<FieldValue>) fv;
+ DataType nestedType = array.getDataType().getNestedType();
+ for (int i=0; i < array.size(); i++) {
+ array.set(i, optionallyUpgrade(nestedType, array.get(i)));
+ }
+ }
+ // TODO We also need special handling for weighted set/map. Limiting to array until verified.
+ return fv;
+ }
}