diff options
Diffstat (limited to 'config-model')
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)); - } - -} |