summaryrefslogtreecommitdiffstats
path: root/config-model/src/main/java/com/yahoo/searchdefinition/TemporarySDTypeResolver.java
diff options
context:
space:
mode:
authorArne H Juul <arnej@yahooinc.com>2021-12-13 10:00:31 +0000
committerArne H Juul <arnej@yahooinc.com>2021-12-13 13:12:21 +0000
commite10e86fd2dbfb9a38c71e82a84ac10fed31bac3d (patch)
treef04d31e0840e96b5c6f145b9e76db96862a862dd /config-model/src/main/java/com/yahoo/searchdefinition/TemporarySDTypeResolver.java
parent7187dafb2b9fadc11f49844b637723df36aa3e3e (diff)
try harder to get multi-level inheritance working
Diffstat (limited to 'config-model/src/main/java/com/yahoo/searchdefinition/TemporarySDTypeResolver.java')
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/TemporarySDTypeResolver.java77
1 files changed, 77 insertions, 0 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/TemporarySDTypeResolver.java b/config-model/src/main/java/com/yahoo/searchdefinition/TemporarySDTypeResolver.java
new file mode 100644
index 00000000000..71a1859e195
--- /dev/null
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/TemporarySDTypeResolver.java
@@ -0,0 +1,77 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.searchdefinition;
+
+import com.yahoo.config.application.api.DeployLogger;
+import com.yahoo.searchdefinition.document.SDDocumentType;
+import com.yahoo.searchdefinition.document.TemporarySDDocumentType;
+
+import java.util.*;
+import java.util.logging.Level;
+
+/**
+ * @author arnej
+ */
+public class TemporarySDTypeResolver {
+
+ private final DeployLogger deployLogger;
+ private final Collection<Schema> toProcess;
+ private final List<SDDocumentType> docTypes = new LinkedList<>();
+
+ public TemporarySDTypeResolver(Collection<Schema> schemas, DeployLogger deployLogger) {
+ this.deployLogger = deployLogger;
+ this.toProcess = schemas;
+ }
+
+ private SDDocumentType findDocType(String name) {
+ assert(name != null);
+ for (var doc : docTypes) {
+ if (doc.getName().equals(name)) {
+ return doc;
+ }
+ }
+ deployLogger.logApplicationPackage(Level.WARNING, "No document type in application matching name: "+name);
+ return null;
+ }
+
+ public void process() {
+ docTypes.add(SDDocumentType.VESPA_DOCUMENT);
+ for (Schema schema : toProcess) {
+ if (schema.hasDocument()) {
+ docTypes.add(schema.getDocument());
+ }
+ }
+ // first, fix inheritance
+ for (SDDocumentType doc : docTypes) {
+ for (SDDocumentType inherited : doc.getInheritedTypes()) {
+ if (inherited instanceof TemporarySDDocumentType) {
+ var actual = findDocType(inherited.getName());
+ if (actual != null) {
+ doc.inherit(actual);
+ } else {
+ deployLogger.logApplicationPackage(Level.WARNING, "Unresolved inherit '"+inherited.getName() +"' for document "+doc.getName());
+ }
+ }
+ }
+ }
+ // next, check owned types (structs only?)
+ for (SDDocumentType doc : docTypes) {
+ for (SDDocumentType owned : doc.getTypes()) {
+ if (owned instanceof TemporarySDDocumentType) {
+ deployLogger.logApplicationPackage(Level.WARNING, "Schema '"+doc.getName()+"' owned type '"+owned.getName()+"' is temporary, should not happen");
+ continue;
+ }
+ for (SDDocumentType inherited : owned.getInheritedTypes()) {
+ if (inherited instanceof TemporarySDDocumentType) {
+ var actual = doc.getType(inherited.getName());
+ if (actual != null) {
+ owned.inherit(actual);
+ } else {
+ deployLogger.logApplicationPackage(Level.WARNING, "Unresolved inherit '"+inherited.getName() +"' for type '"+owned.getName()+"' in document "+doc.getName());
+ }
+ }
+ }
+ }
+ }
+ }
+
+}