summaryrefslogtreecommitdiffstats
path: root/config-model/src
diff options
context:
space:
mode:
authorArne H Juul <arnej@yahooinc.com>2022-03-10 14:07:39 +0000
committerArne H Juul <arnej@yahooinc.com>2022-03-10 14:07:39 +0000
commitacb8f13bf9a7716f1a0a50b7ba1c1e6112da3236 (patch)
tree9b4aa04dc6c0e26597bc580ce777e34bd9e30232 /config-model/src
parent15643ef4ca66e82c82c706d7e1942bab32922f26 (diff)
fill annotations in inheritance order
Diffstat (limited to 'config-model/src')
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertParsedFields.java9
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertParsedTypes.java95
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertSchemaCollection.java17
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedAnnotation.java10
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedDocument.java3
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(); }