summaryrefslogtreecommitdiffstats
path: root/config-model/src/main/java/com/yahoo/searchdefinition/parser/InheritanceResolver.java
diff options
context:
space:
mode:
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.java28
1 files changed, 24 insertions, 4 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 488464ccd1f..edcbf85b5dc 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
@@ -28,7 +28,7 @@ public class InheritanceResolver {
String.join(" -> ", seen));
}
seen.add(name);
- for (ParsedSchema parent : schema.getResolvedInherits()) {
+ for (ParsedSchema parent : schema.getAllResolvedInherits()) {
inheritanceCycleCheck(parent, seen);
}
seen.remove(name);
@@ -57,11 +57,23 @@ public class InheritanceResolver {
for (ParsedSchema schema : parsedSchemas.values()) {
if (! schema.hasDocument()) {
// TODO: is schema without a document even valid?
- continue;
+ // could make sense for schemas with just rank-profile functions
+ // it makes life easier to behave as if there was en empty
+ // document block here.
+ var doc = new ParsedDocument(schema.name());
+ for (String inherit : schema.getInherited()) {
+ doc.inherit(inherit);
+ }
+ schema.addDocument(doc);
}
ParsedDocument doc = schema.getDocument();
var old = parsedDocs.put(doc.name(), doc);
- assert(old == null);
+ if (old != null) {
+ throw new IllegalArgumentException("duplicate document declaration for " + doc.name());
+ }
+ for (String docInherit : doc.getInherited()) {
+ schema.inheritByDocument(docInherit);
+ }
}
for (ParsedDocument doc : parsedDocs.values()) {
for (String inherit : doc.getInherited()) {
@@ -72,6 +84,14 @@ public class InheritanceResolver {
doc.resolveInherit(inherit, parentDoc);
}
}
+ for (ParsedSchema schema : parsedSchemas.values()) {
+ for (String inherit : schema.getInheritedByDocument()) {
+ var parent = parsedSchemas.get(inherit);
+ assert(parent.hasDocument());
+ assert(parent.getDocument().name().equals(inherit));
+ schema.resolveInheritByDocument(inherit, parent);
+ }
+ }
}
private void inheritanceCycleCheck(ParsedDocument document, List<String> seen) {
@@ -98,8 +118,8 @@ public class InheritanceResolver {
public void resolveInheritance() {
resolveSchemaInheritance();
resolveDocumentInheritance();
- checkSchemaCycles();
checkDocumentCycles();
+ checkSchemaCycles();
}
}