diff options
Diffstat (limited to 'config-model/src/main/java/com/yahoo/searchdefinition/parser/InheritanceResolver.java')
-rw-r--r-- | config-model/src/main/java/com/yahoo/searchdefinition/parser/InheritanceResolver.java | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/parser/InheritanceResolver.java b/config-model/src/main/java/com/yahoo/searchdefinition/parser/InheritanceResolver.java index d9132d3aa24..4d011c1b596 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/parser/InheritanceResolver.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/parser/InheritanceResolver.java @@ -15,6 +15,7 @@ public class InheritanceResolver { private final Map<String, ParsedSchema> parsedSchemas; private final Map<String, ParsedDocument> parsedDocs = new HashMap<>(); + private final Map<String, ParsedSchema> schemaForDocs = new HashMap<>(); public InheritanceResolver(Map<String, ParsedSchema> parsedSchemas) { this.parsedSchemas = parsedSchemas; @@ -24,7 +25,7 @@ public class InheritanceResolver { String name = schema.name(); if (seen.contains(name)) { seen.add(name); - throw new IllegalArgumentException("Inheritance cycle for schemas: " + + throw new IllegalArgumentException("Inheritance/reference cycle for schemas: " + String.join(" -> ", seen)); } seen.add(name); @@ -64,9 +65,13 @@ public class InheritanceResolver { if (old != null) { throw new IllegalArgumentException("duplicate document declaration for " + doc.name()); } + schemaForDocs.put(doc.name(), schema); for (String docInherit : doc.getInherited()) { schema.inheritByDocument(docInherit); } + for (String docReferenced : doc.getReferencedDocuments()) { + schema.inheritByDocument(docReferenced); + } } for (ParsedDocument doc : parsedDocs.values()) { for (String inherit : doc.getInherited()) { @@ -76,13 +81,20 @@ public class InheritanceResolver { } doc.resolveInherit(inherit, parentDoc); } + for (String docRefName : doc.getReferencedDocuments()) { + var refDoc = parsedDocs.get(docRefName); + if (refDoc == null) { + throw new IllegalArgumentException("document " + doc.name() + " references unavailable document " + docRefName); + } + doc.resolveReferenced(refDoc); + } } for (ParsedSchema schema : parsedSchemas.values()) { - for (String inherit : schema.getInheritedByDocument()) { - var parent = parsedSchemas.get(inherit); + for (String docName : schema.getInheritedByDocument()) { + var parent = schemaForDocs.get(docName); assert(parent.hasDocument()); - assert(parent.getDocument().name().equals(inherit)); - schema.resolveInheritByDocument(inherit, parent); + assert(parent.getDocument().name().equals(docName)); + schema.resolveInheritByDocument(docName, parent); } } } @@ -91,7 +103,7 @@ public class InheritanceResolver { String name = document.name(); if (seen.contains(name)) { seen.add(name); - throw new IllegalArgumentException("Inheritance cycle for documents: " + + throw new IllegalArgumentException("Inheritance/reference cycle for documents: " + String.join(" -> ", seen)); } seen.add(name); |