diff options
author | Jon Bratseth <bratseth@verizonmedia.com> | 2019-06-28 08:56:48 -0500 |
---|---|---|
committer | Jon Bratseth <bratseth@verizonmedia.com> | 2019-06-28 08:56:48 -0500 |
commit | 781d6dfd8afdcb1da0ce29ef37ccbc0c45dc155d (patch) | |
tree | 18846b64a9ea079196591f93bd2856a8b5459b4d /docproc | |
parent | 38be09692fbc8e286ed1b669771e1c2d66e1db6c (diff) | |
parent | 4f9ad5d65f0e7fac3796830b90c2f8b9128523ce (diff) |
Merge with master
Diffstat (limited to 'docproc')
-rw-r--r-- | docproc/abi-spec.json | 3 | ||||
-rw-r--r-- | docproc/src/main/java/com/yahoo/docproc/AbstractConcreteDocumentFactory.java | 42 |
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; + } } |