diff options
author | Geir Storli <geirst@verizonmedia.com> | 2020-07-13 16:18:55 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-13 16:18:55 +0200 |
commit | ab161b70981a13b14ee2b28fa99b6d0e1535d6d1 (patch) | |
tree | 2f1a5fe420f511fa77a352dff87ccc9c366f6693 /config-model/src/main | |
parent | 23feea0cec0613fa5dc0229247c63d1317c793c6 (diff) | |
parent | 2cba25966414410b4ccf7e37f1748d3f573f85f7 (diff) |
Merge pull request #13875 from vespa-engine/geirst/inherited-reference-fields
Ensure that reference fields can be inherited from super document types.
Diffstat (limited to 'config-model/src/main')
3 files changed, 21 insertions, 1 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/DocumentReferenceResolver.java b/config-model/src/main/java/com/yahoo/searchdefinition/DocumentReferenceResolver.java index 0d0da71bd0f..7f1a9933188 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/DocumentReferenceResolver.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/DocumentReferenceResolver.java @@ -6,6 +6,7 @@ import com.yahoo.document.ReferenceDataType; import com.yahoo.searchdefinition.document.SDDocumentType; import com.yahoo.searchdefinition.document.SDField; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.stream.Stream; @@ -30,10 +31,24 @@ public class DocumentReferenceResolver { } public void resolveReferences(SDDocumentType documentType) { - DocumentReferences references = new DocumentReferences(createFieldToDocumentReferenceMapping(documentType)); + var references = new DocumentReferences(createFieldToDocumentReferenceMapping(documentType)); documentType.setDocumentReferences(references); } + public void resolveInheritedReferences(SDDocumentType documentType) { + resolveInheritedReferencesRecursive(documentType, documentType.getInheritedTypes()); + } + + private void resolveInheritedReferencesRecursive(SDDocumentType documentType, + Collection<SDDocumentType> inheritedTypes) { + for (var inheritedType : inheritedTypes) { + documentType.getDocumentReferences().get().mergeFrom(inheritedType.getDocumentReferences().get()); + } + for (var inheritedType : inheritedTypes) { + resolveInheritedReferencesRecursive(documentType, inheritedType.getInheritedTypes()); + } + } + private Map<String, DocumentReference> createFieldToDocumentReferenceMapping(SDDocumentType documentType) { return fieldStream(documentType) .filter(field -> field.getDataType() instanceof ReferenceDataType) diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/DocumentReferences.java b/config-model/src/main/java/com/yahoo/searchdefinition/DocumentReferences.java index 37f5ab1bbde..4a3995b2d40 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/DocumentReferences.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/DocumentReferences.java @@ -18,6 +18,10 @@ public class DocumentReferences implements Iterable<Map.Entry<String, DocumentRe this.references = references; } + public void mergeFrom(DocumentReferences other) { + references.putAll(other.references); + } + @Override public Iterator<Map.Entry<String, DocumentReference>> iterator() { return Collections.unmodifiableSet(references.entrySet()).iterator(); diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/SearchBuilder.java b/config-model/src/main/java/com/yahoo/searchdefinition/SearchBuilder.java index eb68e6af203..1fab30f9ea4 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/SearchBuilder.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/SearchBuilder.java @@ -239,6 +239,7 @@ public class SearchBuilder { var resolver = new DocumentReferenceResolver(searchList); sdocs.forEach(resolver::resolveReferences); + sdocs.forEach(resolver::resolveInheritedReferences); var importedFieldsEnumerator = new ImportedFieldsEnumerator(searchList); sdocs.forEach(importedFieldsEnumerator::enumerateImportedFields); |