diff options
author | Arne H Juul <arnej@yahooinc.com> | 2022-03-10 14:07:39 +0000 |
---|---|---|
committer | Arne H Juul <arnej@yahooinc.com> | 2022-03-10 14:07:39 +0000 |
commit | acb8f13bf9a7716f1a0a50b7ba1c1e6112da3236 (patch) | |
tree | 9b4aa04dc6c0e26597bc580ce777e34bd9e30232 /config-model/src | |
parent | 15643ef4ca66e82c82c706d7e1942bab32922f26 (diff) |
fill annotations in inheritance order
Diffstat (limited to 'config-model/src')
5 files changed, 82 insertions, 52 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertParsedFields.java b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertParsedFields.java index 3cf5628d282..36c11b33b23 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertParsedFields.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertParsedFields.java @@ -310,4 +310,13 @@ public class ConvertParsedFields { return structProxy; } + void convertAnnotation(Schema schema, SDDocumentType document, ParsedAnnotation parsed) { + var annType = context.resolveAnnotation(parsed.name()); + var payload = parsed.getStruct(); + if (payload.isPresent()) { + var structProxy = convertStructDeclaration(schema, payload.get()); + document.addType(structProxy); + } + document.addAnnotation(annType); + } } diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertParsedTypes.java b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertParsedTypes.java index e0a3192c302..b22c33c527d 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertParsedTypes.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertParsedTypes.java @@ -10,6 +10,7 @@ import com.yahoo.document.PositionDataType; import com.yahoo.document.WeightedSetDataType; import com.yahoo.document.annotation.AnnotationReferenceDataType; import com.yahoo.document.annotation.AnnotationType; +import com.yahoo.searchdefinition.document.annotation.SDAnnotationType; import java.util.ArrayList; import java.util.Collection; @@ -63,22 +64,64 @@ public class ConvertParsedTypes { } for (var annotation : doc.getAnnotations()) { String annId = doc.name() + "->" + annotation.name(); - var at = new AnnotationType(annotation.name()); + var at = new SDAnnotationType(annotation.name()); annotationsFromSchemas.put(annId, at); - var withStruct = annotation.getStruct(); - if (withStruct.isPresent()) { - var sn = withStruct.get().name(); - var dt = new StructDataType(sn); - String structId = doc.name() + "->" + sn; - structsFromSchemas.put(structId, dt); - } } } } + Map<ParsedAnnotation, ParsedStruct> filledAnnotations = new HashMap<>(); + + ParsedStruct fillAnnotationStruct(ParsedAnnotation annotation) { + if (filledAnnotations.containsKey(annotation)) { + return filledAnnotations.get(annotation); + } + var doc = annotation.getOwnerDoc(); + for (String inherit : annotation.getInherited()) { + var parent = findParsedAnnotation(doc, inherit); + var parentStruct = fillAnnotationStruct(parent); + if (parentStruct == null) { + continue; + } + var myStruct = annotation.getStruct().orElse + (new ParsedStruct("annotation." + annotation.name())); + myStruct.inherit(parentStruct.name()); + annotation.setStruct(myStruct); + } + var withStruct = annotation.getStruct(); + if (withStruct.isPresent()) { + ParsedStruct struct = withStruct.get(); + String structId = doc.name() + "->" + struct.name(); + var toFill = structsFromSchemas.computeIfAbsent(structId, k -> new StructDataType(struct.name())); + for (ParsedField field : struct.getFields()) { + var t = resolveFromContext(field.getType(), doc); + var f = field.hasIdOverride() + ? new com.yahoo.document.Field(field.name(), field.idOverride(), t) + : new com.yahoo.document.Field(field.name(), t); + toFill.addField(f); + } + var at = findAnnotationFromParsed(annotation); + at.setDataType(toFill); + filledAnnotations.put(annotation, struct); + } else { + filledAnnotations.put(annotation, null); + } + return withStruct.orElse(null); + } + private void fillDataTypes() { for (var schema : orderedInput) { var doc = schema.getDocument(); + for (var annotation : doc.getAnnotations()) { + var at = findAnnotationFromParsed(annotation); + for (String inherit : annotation.getInherited()) { + var parent = findAnnotationFromSchemas(inherit, doc); + at.inherit(parent); + } + } + for (var annotation : doc.getAnnotations()) { + fillAnnotationStruct(annotation); + } for (var struct : doc.getStructs()) { String structId = doc.name() + "->" + struct.name(); var toFill = structsFromSchemas.get(structId); @@ -115,28 +158,6 @@ public class ConvertParsedTypes { toFill.inherit(parent); } } - for (var annotation : doc.getAnnotations()) { - String annId = doc.name() + "->" + annotation.name(); - var at = annotationsFromSchemas.get(annId); - var withStruct = annotation.getStruct(); - if (withStruct.isPresent()) { - ParsedStruct struct = withStruct.get(); - String structId = doc.name() + "->" + struct.name(); - var toFill = structsFromSchemas.get(structId); - for (ParsedField field : struct.getFields()) { - var t = resolveFromContext(field.getType(), doc); - var f = field.hasIdOverride() - ? new com.yahoo.document.Field(field.name(), field.idOverride(), t) - : new com.yahoo.document.Field(field.name(), t); - toFill.addField(f); - } - at.setDataType(toFill); - } - for (String inherit : annotation.getInherited()) { - var parent = findAnnotationFromSchemas(inherit, doc); - at.inherit(parent); - } - } var docToFill = documentsFromSchemas.get(doc.name()); Map<String, Collection<String>> fieldSets = new HashMap<>(); List<String> inDocFields = new ArrayList<>(); @@ -181,7 +202,7 @@ public class ConvertParsedTypes { private AnnotationType findAnnotationFromSchemas(String name, ParsedDocument context) { var resolved = findParsedAnnotation(context, name); - String annotationId = resolved.getOwner() + "->" + resolved.name(); + String annotationId = resolved.getOwnerName() + "->" + resolved.name(); var annotation = annotationsFromSchemas.get(annotationId); if (annotation == null) { throw new IllegalArgumentException("no annotation named " + name + " in context " + context); @@ -189,6 +210,15 @@ public class ConvertParsedTypes { return annotation; } + private AnnotationType findAnnotationFromParsed(ParsedAnnotation resolved) { + String annotationId = resolved.getOwnerName() + "->" + resolved.name(); + var annotation = annotationsFromSchemas.get(annotationId); + if (annotation == null) { + throw new IllegalArgumentException("no annotation " + resolved.name() + " in " + resolved.getOwnerName()); + } + return annotation; + } + private ParsedStruct findParsedStruct(ParsedDocument doc, String name) { ParsedStruct found = doc.getStruct(name); if (found != null) return found; @@ -313,6 +343,9 @@ public class ConvertParsedTypes { } return r; } + public AnnotationType resolveAnnotation(String name) { + return findAnnotationFromSchemas(name, context); + } TypeResolver(ParsedDocument context) { this.context = context; } diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertSchemaCollection.java b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertSchemaCollection.java index 21a68744c19..d32fae99f5a 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertSchemaCollection.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertSchemaCollection.java @@ -145,21 +145,6 @@ public class ConvertSchemaCollection { return resultList; } - private void convertAnnotation(Schema schema, SDDocumentType document, ParsedAnnotation parsed, ConvertParsedFields fieldConverter) { - var type = new SDAnnotationType(parsed.name()); - for (String inherit : parsed.getInherited()) { - type.inherit(inherit); - } - var payload = parsed.getStruct(); - if (payload.isPresent()) { - var struct = fieldConverter.convertStructDeclaration(schema, payload.get()); - type = new SDAnnotationType(parsed.name(), struct, type.getInherits()); - // WTF? - struct.setStruct(null); - } - document.addAnnotation(type); - } - private void convertDocument(Schema schema, ParsedDocument parsed, ConvertParsedFields fieldConverter) { @@ -172,7 +157,7 @@ public class ConvertSchemaCollection { document.addType(structProxy); } for (var annotation : parsed.getAnnotations()) { - convertAnnotation(schema, document, annotation, fieldConverter); + fieldConverter.convertAnnotation(schema, document, annotation); } for (var field : parsed.getFields()) { var sdf = fieldConverter.convertDocumentField(schema, document, field); diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedAnnotation.java b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedAnnotation.java index f22d370b1d8..096effa6810 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedAnnotation.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedAnnotation.java @@ -14,7 +14,7 @@ class ParsedAnnotation extends ParsedBlock { private ParsedStruct wrappedStruct = null; private final List<String> inherited = new ArrayList<>(); - private String ownedBy = null; + private ParsedDocument ownedBy = null; ParsedAnnotation(String name) { super(name, "annotation"); @@ -22,12 +22,16 @@ class ParsedAnnotation extends ParsedBlock { public List<String> getInherited() { return List.copyOf(inherited); } public Optional<ParsedStruct> getStruct() { return Optional.ofNullable(wrappedStruct); } - public String getOwner() { return ownedBy; } + public ParsedDocument getOwnerDoc() { return ownedBy; } + public String getOwnerName() { return ownedBy.name(); } void setStruct(ParsedStruct struct) { this.wrappedStruct = struct; } + void inherit(String other) { inherited.add(other); } - void tagOwner(String owner) { + + void tagOwner(ParsedDocument owner) { verifyThat(ownedBy == null, "already owned by", ownedBy); this.ownedBy = owner; + getStruct().ifPresent(s -> s.tagOwner(owner.name())); } } diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedDocument.java b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedDocument.java index ed975238067..679ed72c6f2 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedDocument.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedDocument.java @@ -65,8 +65,7 @@ public class ParsedDocument extends ParsedBlock { String annName = annotation.name(); verifyThat(! docAnnotations.containsKey(annName), "already has annotation", annName); docAnnotations.put(annName, annotation); - annotation.tagOwner(name()); - annotation.getStruct().ifPresent(s -> s.tagOwner(name())); + annotation.tagOwner(this); } public String toString() { return "document " + name(); } |