summaryrefslogtreecommitdiffstats
path: root/config-model/src/main
diff options
context:
space:
mode:
authorGeir Storli <geirst@verizonmedia.com>2020-07-13 16:18:55 +0200
committerGitHub <noreply@github.com>2020-07-13 16:18:55 +0200
commitab161b70981a13b14ee2b28fa99b6d0e1535d6d1 (patch)
tree2f1a5fe420f511fa77a352dff87ccc9c366f6693 /config-model/src/main
parent23feea0cec0613fa5dc0229247c63d1317c793c6 (diff)
parent2cba25966414410b4ccf7e37f1748d3f573f85f7 (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')
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/DocumentReferenceResolver.java17
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/DocumentReferences.java4
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/SearchBuilder.java1
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);