summaryrefslogtreecommitdiffstats
path: root/config-model
diff options
context:
space:
mode:
authorArne H Juul <arnej@yahooinc.com>2022-06-17 06:52:03 +0000
committerArne H Juul <arnej@yahooinc.com>2022-06-17 06:57:45 +0000
commit2f87b5f065f79dc742f7221234b0081600aa97f1 (patch)
tree4f7ea3e469f3517b011e31d7e3c1ffb313a6419e /config-model
parenta90639a4c194cbf486d20eba8969340a4ce461ad (diff)
remove TemporarySDDocumentType
* track converted structs as we make them * inherit directly instead of by name * remove code to deal with the no-longer-needed temporaries
Diffstat (limited to 'config-model')
-rw-r--r--config-model/src/main/java/com/yahoo/schema/Application.java5
-rw-r--r--config-model/src/main/java/com/yahoo/schema/SDDocumentTypeOrderer.java136
-rw-r--r--config-model/src/main/java/com/yahoo/schema/TemporarySDTypeResolver.java79
-rw-r--r--config-model/src/main/java/com/yahoo/schema/document/SDDocumentType.java7
-rw-r--r--config-model/src/main/java/com/yahoo/schema/document/TemporarySDDocumentType.java13
-rw-r--r--config-model/src/main/java/com/yahoo/schema/parser/ConvertParsedFields.java10
-rw-r--r--config-model/src/main/java/com/yahoo/schema/parser/ConvertParsedSchemas.java3
-rw-r--r--config-model/src/main/java/com/yahoo/schema/parser/ParsedStruct.java9
-rwxr-xr-xconfig-model/src/test/java/com/yahoo/schema/SDDocumentTypeOrdererTestCase.java78
9 files changed, 17 insertions, 323 deletions
diff --git a/config-model/src/main/java/com/yahoo/schema/Application.java b/config-model/src/main/java/com/yahoo/schema/Application.java
index b147388747e..71c0e563c77 100644
--- a/config-model/src/main/java/com/yahoo/schema/Application.java
+++ b/config-model/src/main/java/com/yahoo/schema/Application.java
@@ -54,8 +54,6 @@ public class Application {
if (validate)
schemas.forEach(schema -> schema.validate(logger));
- new TemporarySDTypeResolver(schemas, logger).process();
-
List<SDDocumentType> sdocs = new ArrayList<>();
sdocs.add(SDDocumentType.VESPA_DOCUMENT);
for (Schema schema : schemas) {
@@ -64,9 +62,6 @@ public class Application {
}
}
- var orderer = new SDDocumentTypeOrderer(sdocs, logger);
- orderer.process();
-
var resolver = new DocumentReferenceResolver(schemas);
sdocs.forEach(resolver::resolveReferences);
sdocs.forEach(resolver::resolveInheritedReferences);
diff --git a/config-model/src/main/java/com/yahoo/schema/SDDocumentTypeOrderer.java b/config-model/src/main/java/com/yahoo/schema/SDDocumentTypeOrderer.java
deleted file mode 100644
index 64bca9367d8..00000000000
--- a/config-model/src/main/java/com/yahoo/schema/SDDocumentTypeOrderer.java
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.schema;
-
-import com.yahoo.config.application.api.DeployLogger;
-import com.yahoo.document.*;
-import com.yahoo.document.annotation.AnnotationReferenceDataType;
-import com.yahoo.documentmodel.NewDocumentReferenceDataType;
-import com.yahoo.documentmodel.NewDocumentType;
-import com.yahoo.schema.document.SDDocumentType;
-import com.yahoo.schema.document.TemporarySDDocumentType;
-
-import java.util.*;
-import java.util.logging.Level;
-
-/**
- * @author Einar M R Rosenvinge
- */
-public class SDDocumentTypeOrderer {
-
- private final Map<DataTypeName, SDDocumentType> createdSDTypes = new LinkedHashMap<>();
- private final Set<Object> seenTypes = Collections.newSetFromMap(new IdentityHashMap<>());
- List<SDDocumentType> processingOrder = new LinkedList<>();
- private final DeployLogger deployLogger;
-
- public SDDocumentTypeOrderer(List<SDDocumentType> sdTypes, DeployLogger deployLogger) {
- this.deployLogger = deployLogger;
- for (SDDocumentType type : sdTypes) {
- createdSDTypes.put(type.getDocumentName(), type);
- }
- }
-
- List<SDDocumentType> getOrdered() { return processingOrder; }
-
- public void process() {
- for (SDDocumentType type : createdSDTypes.values()) {
- process(type, type);
- }
- }
-
- private void process(SDDocumentType docOrStruct, SDDocumentType owningDocument) {
- resolveAndProcessInheritedTemporaryTypes(docOrStruct, owningDocument);
- if (seenTypes.contains(docOrStruct)) {
- return;
- }
- seenTypes.add(docOrStruct);
- for (Field field : docOrStruct.fieldSet()) {
- var type = field.getDataType();
- String typeName = type.getName();
- if (!seenTypes.contains(type)) {
- seenTypes.add(type);
- //we haven't seen this before, do it
- visit(type, owningDocument);
- }
- }
- processingOrder.add(docOrStruct);
- }
-
- private void resolveAndProcessInheritedTemporaryTypes(SDDocumentType type, SDDocumentType owningDocument) {
- List<DataTypeName> toReplace = new ArrayList<>();
- for (SDDocumentType sdoc : type.getInheritedTypes()) {
- if (sdoc instanceof TemporarySDDocumentType) {
- toReplace.add(sdoc.getDocumentName());
- }
- }
- for (DataTypeName name : toReplace) {
- SDDocumentType inherited;
- if (type.isStruct()) {
- inherited = owningDocument.allTypes().get(new NewDocumentType.Name(name.getName()));
- if (inherited == null) throw new IllegalArgumentException("Struct '" + name + "' not found in " + owningDocument);
- process(inherited, owningDocument);
- }
- else {
- inherited = createdSDTypes.get(name);
- if (inherited == null) {
- throw new IllegalArgumentException("document " + type.getName() +
- " inherits from unavailable document " + name);
- }
- process(inherited, inherited);
- }
- type.inherit(inherited);
- }
- }
-
- private SDDocumentType find(String name) {
- SDDocumentType sdDocType = createdSDTypes.get(new DataTypeName(name));
- if (sdDocType != null) {
- return sdDocType;
- }
- for(SDDocumentType sdoc : createdSDTypes.values()) {
- for (SDDocumentType stype : sdoc.getTypes()) {
- if (stype.getName().equals(name)) {
- return stype;
- }
- }
- }
- return null;
- }
-
- private void visit(DataType type, SDDocumentType owningDocument) {
- if (type instanceof StructuredDataType) {
- StructuredDataType structType = (StructuredDataType) type;
- SDDocumentType sdDocType = owningDocument.getType(structType.getName());
- if (sdDocType == null) {
- sdDocType = find(structType.getName());
- }
- if (sdDocType == null) {
- throw new IllegalArgumentException("Could not find struct '" + type.getName() + "'");
- }
- process(sdDocType, owningDocument);
- return;
- }
-
- if (type instanceof MapDataType) {
- MapDataType mType = (MapDataType) type;
- visit(mType.getValueType(), owningDocument);
- visit(mType.getKeyType(), owningDocument);
- } else if (type instanceof WeightedSetDataType) {
- WeightedSetDataType wType = (WeightedSetDataType) type;
- visit(wType.getNestedType(), owningDocument);
- } else if (type instanceof CollectionDataType) {
- CollectionDataType cType = (CollectionDataType) type;
- visit(cType.getNestedType(), owningDocument);
- } else if (type instanceof AnnotationReferenceDataType) {
- //do nothing
- } else if (type instanceof PrimitiveDataType) {
- //do nothing
- } else if (type instanceof TensorDataType) {
- //do nothing
- } else if (type instanceof NewDocumentReferenceDataType) {
- //do nothing
- } else {
- deployLogger.logApplicationPackage(Level.WARNING, "Unknown type : " + type);
- }
- }
-
-}
diff --git a/config-model/src/main/java/com/yahoo/schema/TemporarySDTypeResolver.java b/config-model/src/main/java/com/yahoo/schema/TemporarySDTypeResolver.java
deleted file mode 100644
index b1ce6f5eb4f..00000000000
--- a/config-model/src/main/java/com/yahoo/schema/TemporarySDTypeResolver.java
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.schema;
-
-import com.yahoo.config.application.api.DeployLogger;
-import com.yahoo.schema.document.SDDocumentType;
-import com.yahoo.schema.document.TemporarySDDocumentType;
-
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
-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());
- }
- }
- }
- }
- }
- }
-
-}
diff --git a/config-model/src/main/java/com/yahoo/schema/document/SDDocumentType.java b/config-model/src/main/java/com/yahoo/schema/document/SDDocumentType.java
index d19b62ce555..919a6023151 100644
--- a/config-model/src/main/java/com/yahoo/schema/document/SDDocumentType.java
+++ b/config-model/src/main/java/com/yahoo/schema/document/SDDocumentType.java
@@ -167,16 +167,11 @@ public class SDDocumentType implements Cloneable {
public DataTypeName getDocumentName() { return docType.getDataTypeName(); }
public DocumentType getDocumentType() { return docType; }
- public void inherit(DataTypeName name) {
- inherit(new TemporarySDDocumentType(name));
- }
-
public void inherit(SDDocumentType type) {
if (type == null) return;
if (type.getName().equals(this.getName()))
throw new IllegalArgumentException("Document type '" + getName() + "' cannot inherit itself");
- if ( ! inheritedTypes.containsKey(type.getDocumentName()) ||
- (inheritedTypes.get(type.getDocumentName()) instanceof TemporarySDDocumentType)) {
+ if (! inheritedTypes.containsKey(type.getDocumentName())) {
inheritedTypes.put(type.getDocumentName(), type);
}
}
diff --git a/config-model/src/main/java/com/yahoo/schema/document/TemporarySDDocumentType.java b/config-model/src/main/java/com/yahoo/schema/document/TemporarySDDocumentType.java
deleted file mode 100644
index 3194a14a143..00000000000
--- a/config-model/src/main/java/com/yahoo/schema/document/TemporarySDDocumentType.java
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.schema.document;
-
-import com.yahoo.document.DataTypeName;
-
-/**
- * @author baldersheim
- */
-public class TemporarySDDocumentType extends SDDocumentType {
- public TemporarySDDocumentType(DataTypeName name) {
- super(name);
- }
-}
diff --git a/config-model/src/main/java/com/yahoo/schema/parser/ConvertParsedFields.java b/config-model/src/main/java/com/yahoo/schema/parser/ConvertParsedFields.java
index 3008dac4f29..443dfb1602d 100644
--- a/config-model/src/main/java/com/yahoo/schema/parser/ConvertParsedFields.java
+++ b/config-model/src/main/java/com/yahoo/schema/parser/ConvertParsedFields.java
@@ -20,6 +20,7 @@ import com.yahoo.vespa.documentmodel.SummaryField;
import com.yahoo.vespa.documentmodel.SummaryTransform;
import java.util.Locale;
+import java.util.Map;
/**
* Helper for converting ParsedField etc to SDField with settings
@@ -29,9 +30,11 @@ import java.util.Locale;
public class ConvertParsedFields {
private final TypeResolver context;
+ private final Map<String, SDDocumentType> structProxies;
- ConvertParsedFields(TypeResolver context) {
+ ConvertParsedFields(TypeResolver context, Map<String, SDDocumentType> structProxies) {
this.context = context;
+ this.structProxies = structProxies;
}
static void convertMatchSettings(SDField field, ParsedMatchSettings parsed) {
@@ -309,10 +312,11 @@ public class ConvertParsedFields {
structProxy.setFieldId(field, parsedField.idOverride());
}
}
- for (String inherit : parsed.getInherited()) {
- structProxy.inherit(new DataTypeName(inherit));
+ for (var inherit: parsed.getResolvedInherits()) {
+ structProxy.inherit(structProxies.get(inherit.getFullName()));
}
structProxy.setStruct(context.resolveStruct(parsed));
+ structProxies.put(parsed.getFullName(), structProxy);
return structProxy;
}
diff --git a/config-model/src/main/java/com/yahoo/schema/parser/ConvertParsedSchemas.java b/config-model/src/main/java/com/yahoo/schema/parser/ConvertParsedSchemas.java
index f3289621ce1..0abcc9e890a 100644
--- a/config-model/src/main/java/com/yahoo/schema/parser/ConvertParsedSchemas.java
+++ b/config-model/src/main/java/com/yahoo/schema/parser/ConvertParsedSchemas.java
@@ -80,6 +80,7 @@ public class ConvertParsedSchemas {
}
private final Map<String, SDDocumentType> convertedDocuments = new LinkedHashMap<>();
+ private final Map<String, SDDocumentType> convertedStructs = new LinkedHashMap<>();
public List<Schema> convertToSchemas() {
typeConverter.convert(false);
@@ -187,7 +188,7 @@ public class ConvertParsedSchemas {
}
parsed.getRawAsBase64().ifPresent(value -> schema.enableRawAsBase64(value));
var typeContext = typeConverter.makeContext(parsed.getDocument());
- var fieldConverter = new ConvertParsedFields(typeContext);
+ var fieldConverter = new ConvertParsedFields(typeContext, convertedStructs);
convertDocument(schema, parsed.getDocument(), fieldConverter);
for (var field : parsed.getFields()) {
fieldConverter.convertExtraField(schema, field);
diff --git a/config-model/src/main/java/com/yahoo/schema/parser/ParsedStruct.java b/config-model/src/main/java/com/yahoo/schema/parser/ParsedStruct.java
index abe14b3689f..02d10bcb487 100644
--- a/config-model/src/main/java/com/yahoo/schema/parser/ParsedStruct.java
+++ b/config-model/src/main/java/com/yahoo/schema/parser/ParsedStruct.java
@@ -27,8 +27,13 @@ public class ParsedStruct extends ParsedBlock {
List<ParsedField> getFields() { return List.copyOf(fields.values()); }
List<String> getInherited() { return List.copyOf(inherited); }
- ParsedDocument getOwnerDoc() { return ownedBy; }
- String getOwnerName() { return ownedBy.name(); }
+ ParsedDocument getOwnerDoc() {
+ verifyThat(ownedBy != null, "not owned by any document");
+ return ownedBy;
+ }
+ String getOwnerName() { return getOwnerDoc().name(); }
+ String getFullName() { return name() + " @ " + getOwnerName(); }
+
List<ParsedStruct> getResolvedInherits() {
assert(inherited.size() == resolvedInherits.size());
return List.copyOf(resolvedInherits);
diff --git a/config-model/src/test/java/com/yahoo/schema/SDDocumentTypeOrdererTestCase.java b/config-model/src/test/java/com/yahoo/schema/SDDocumentTypeOrdererTestCase.java
deleted file mode 100755
index 45780d39021..00000000000
--- a/config-model/src/test/java/com/yahoo/schema/SDDocumentTypeOrdererTestCase.java
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.schema;
-
-import com.yahoo.config.model.application.provider.BaseDeployLogger;
-import com.yahoo.document.DataType;
-import com.yahoo.document.DataTypeName;
-import com.yahoo.schema.document.SDDocumentType;
-import com.yahoo.schema.document.SDField;
-import com.yahoo.schema.document.TemporarySDDocumentType;
-import com.yahoo.schema.document.TemporarySDField;
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * @author Einar M R Rosenvinge
- */
-public class SDDocumentTypeOrdererTestCase {
-
- @Test
- public void testOrder() {
- List<SDDocumentType> types = new ArrayList<>();
-
- SDDocumentType a = new SDDocumentType("a");
- SDDocumentType b = new SDDocumentType("b");
- SDDocumentType c = new SDDocumentType("c");
- SDDocumentType d = new SDDocumentType("d");
- SDDocumentType e = new SDDocumentType("e");
- SDDocumentType f = new SDDocumentType("f");
- SDDocumentType g = new SDDocumentType("g");
- b.inherit(new TemporarySDDocumentType(new DataTypeName("a")));
- c.inherit(new TemporarySDDocumentType(new DataTypeName("b")));
- d.inherit(new TemporarySDDocumentType(new DataTypeName("e")));
- g.inherit(new TemporarySDDocumentType(new DataTypeName("e")));
- g.inherit(new TemporarySDDocumentType(new DataTypeName("c")));
-
- SDField aFieldTypeB = new TemporarySDField(a, "atypeb", DataType.STRING);
- a.addField(aFieldTypeB);
-
- SDField bFieldTypeC = new TemporarySDField(b, "btypec", DataType.STRING);
- b.addField(bFieldTypeC);
-
- SDField cFieldTypeG = new TemporarySDField(c, "ctypeg", DataType.STRING);
- c.addField(cFieldTypeG);
-
- SDField gFieldTypeF = new TemporarySDField(g, "gtypef", DataType.STRING);
- g.addField(gFieldTypeF);
-
- SDField fFieldTypeC = new TemporarySDField(f, "ftypec", DataType.STRING);
- f.addField(fFieldTypeC);
-
- SDField dFieldTypeE = new TemporarySDField(d, "dtypee", DataType.STRING);
- d.addField(dFieldTypeE);
-
- types.add(a);
- types.add(b);
- types.add(c);
- types.add(d);
- types.add(e);
- types.add(f);
- types.add(g);
-
- SDDocumentTypeOrderer app = new SDDocumentTypeOrderer(types, new BaseDeployLogger());
- app.process();
- assertEquals(7, app.processingOrder.size());
- assertEquals(a, app.processingOrder.get(0));
- assertEquals(b, app.processingOrder.get(1));
- assertEquals(c, app.processingOrder.get(2));
- assertEquals(e, app.processingOrder.get(3));
- assertEquals(d, app.processingOrder.get(4));
- assertEquals(f, app.processingOrder.get(5));
- assertEquals(g, app.processingOrder.get(6));
- }
-
-}