summaryrefslogtreecommitdiffstats
path: root/config-model/src/main/java/com/yahoo/vespa/configmodel/producers/DocumentTypes.java
diff options
context:
space:
mode:
Diffstat (limited to 'config-model/src/main/java/com/yahoo/vespa/configmodel/producers/DocumentTypes.java')
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/configmodel/producers/DocumentTypes.java216
1 files changed, 213 insertions, 3 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/configmodel/producers/DocumentTypes.java b/config-model/src/main/java/com/yahoo/vespa/configmodel/producers/DocumentTypes.java
index ba41fa0f5b3..630e9f0c097 100644
--- a/config-model/src/main/java/com/yahoo/vespa/configmodel/producers/DocumentTypes.java
+++ b/config-model/src/main/java/com/yahoo/vespa/configmodel/producers/DocumentTypes.java
@@ -27,16 +27,29 @@ public class DocumentTypes {
}
public DocumenttypesConfig.Builder produce(DocumentModel model, DocumenttypesConfig.Builder builder) {
+ /* later:
+ if (some flag) {
+ return produceDocTypes(model, builder);
+ }
+ */
builder.usev8geopositions(this.useV8GeoPositions);
Map<NewDocumentType.Name, NewDocumentType> produced = new HashMap<>();
- var indexMap = new IdxMap();
for (NewDocumentType documentType : model.getDocumentManager().getTypes()) {
- docTypeInheritOrder(documentType, builder, produced, indexMap);
+ produceInheritOrder(documentType, builder, produced);
}
- indexMap.verifyAllDone();
return builder;
}
+ private void produceInheritOrder(NewDocumentType documentType, DocumenttypesConfig.Builder builder, Map<NewDocumentType.Name, NewDocumentType> produced) {
+ if (!produced.containsKey(documentType.getFullName())) {
+ for (NewDocumentType inherited : documentType.getInherited()) {
+ produceInheritOrder(inherited, builder, produced);
+ }
+ buildConfig(documentType, builder);
+ produced.put(documentType.getFullName(), documentType);
+ }
+ }
+
static private <T> List<T> sortedList(Collection<T> unsorted, Comparator<T> cmp) {
var list = new ArrayList<T>();
list.addAll(unsorted);
@@ -44,6 +57,203 @@ public class DocumentTypes {
return list;
}
+ private void buildConfig(NewDocumentType documentType, DocumenttypesConfig.Builder builder) {
+ if (documentType == VespaDocumentType.INSTANCE) {
+ return;
+ }
+ DocumenttypesConfig.Documenttype.Builder db = new DocumenttypesConfig.Documenttype.Builder();
+ db.
+ id(documentType.getId()).
+ name(documentType.getName()).
+ headerstruct(documentType.getContentStruct().getId());
+ Set<Integer> built = new HashSet<>();
+ for (NewDocumentType inherited : documentType.getInherited()) {
+ db.inherits(new DocumenttypesConfig.Documenttype.Inherits.Builder().id(inherited.getId()));
+ markAsBuilt(built, inherited.getAllTypes());
+ }
+ for (DataType dt : sortedList(documentType.getTypes(), (a,b) -> a.getName().compareTo(b.getName()))) {
+ buildConfig(dt, db, built);
+ }
+ for (AnnotationType annotation : sortedList(documentType.getAnnotations(), (a,b) -> a.getName().compareTo(b.getName()))) {
+ DocumenttypesConfig.Documenttype.Annotationtype.Builder atb = new DocumenttypesConfig.Documenttype.Annotationtype.Builder();
+ db.annotationtype(atb);
+ buildConfig(annotation, atb);
+ }
+ buildConfig(documentType.getFieldSets(), db);
+ buildImportedFieldsConfig(documentType.getImportedFieldNames(), db);
+ builder.documenttype(db);
+ }
+
+ private void buildConfig(Set<FieldSet> fieldSets, DocumenttypesConfig.Documenttype.Builder db) {
+ for (FieldSet fs : fieldSets) {
+ buildConfig(fs, db);
+ }
+ }
+
+ private void buildConfig(FieldSet fs, DocumenttypesConfig.Documenttype.Builder db) {
+ db.fieldsets(fs.getName(), new DocumenttypesConfig.Documenttype.Fieldsets.Builder().fields(fs.getFieldNames()));
+ }
+
+ private void markAsBuilt(Set<Integer> built, DataTypeCollection typeCollection) {
+ for (DataType type : typeCollection.getTypes()) {
+ built.add(type.getId());
+ }
+ }
+
+ private void buildConfig(AnnotationType annotation, DocumenttypesConfig.Documenttype.Annotationtype.Builder builder) {
+ builder.
+ id(annotation.getId()).
+ name(annotation.getName());
+ DataType dt = annotation.getDataType();
+ if (dt != null) {
+ builder.datatype(dt.getId());
+ }
+ for (AnnotationType inherited : annotation.getInheritedTypes()) {
+ builder.inherits(new DocumenttypesConfig.Documenttype.Annotationtype.Inherits.Builder().id(inherited.getId()));
+ }
+ }
+
+ private void buildConfig(DataType type, DocumenttypesConfig.Documenttype.Builder documentBuilder, Set<Integer> built) {
+ if ((VespaDocumentType.INSTANCE.getDataType(type.getId()) == null) && !built.contains(type.getId())) {
+ built.add(type.getId());
+ DocumenttypesConfig.Documenttype.Datatype.Builder dataTypeBuilder = new DocumenttypesConfig.Documenttype.Datatype.Builder();
+ dataTypeBuilder.id(type.getId());
+ if (type instanceof TemporaryUnknownType) {
+ throw new IllegalArgumentException("Can not create config for temporary data type: " + type.getName());
+ }
+ if (type instanceof OwnedTemporaryType) {
+ throw new IllegalArgumentException("Can not create config for temporary data type: " + type.getName());
+ }
+ if (type instanceof StructDataType) {
+ buildConfig((StructDataType) type, dataTypeBuilder, documentBuilder, built);
+ } else if (type instanceof ArrayDataType) {
+ buildConfig((ArrayDataType) type, dataTypeBuilder, documentBuilder, built);
+ } else if (type instanceof WeightedSetDataType) {
+ buildConfig((WeightedSetDataType) type, dataTypeBuilder, documentBuilder, built);
+ } else if (type instanceof MapDataType) {
+ buildConfig((MapDataType) type, dataTypeBuilder, documentBuilder, built);
+ } else if (type instanceof AnnotationReferenceDataType) {
+ buildConfig((AnnotationReferenceDataType) type, dataTypeBuilder);
+ } else if (type instanceof TensorDataType) {
+ // The type of the tensor is not stored here but instead in each field as detailed type information
+ // to provide better compatibility. A tensor field can have its tensorType changed (in compatible ways)
+ // without changing the field type and thus requiring data refeed
+ return;
+ } else if (type instanceof NewDocumentReferenceDataType) {
+ var refType = (NewDocumentReferenceDataType) type;
+ if (refType.isTemporary()) {
+ throw new IllegalArgumentException("Still temporary: " + refType);
+ }
+ buildConfig(refType, documentBuilder);
+ return;
+ } else {
+ return;
+ }
+ documentBuilder.datatype(dataTypeBuilder);
+ }
+ }
+
+ private void buildImportedFieldsConfig(Collection<String> fieldNames, DocumenttypesConfig.Documenttype.Builder builder) {
+ for (String fieldName : fieldNames) {
+ var ib = new DocumenttypesConfig.Documenttype.Importedfield.Builder();
+ ib.name(fieldName);
+ builder.importedfield(ib);
+ }
+ }
+
+ private void buildConfig(StructDataType type,
+ DocumenttypesConfig.Documenttype.Datatype.Builder dataTypeBuilder,
+ DocumenttypesConfig.Documenttype.Builder documentBuilder,
+ Set<Integer> built) {
+ dataTypeBuilder.type(DocumenttypesConfig.Documenttype.Datatype.Type.Enum.STRUCT);
+ DocumenttypesConfig.Documenttype.Datatype.Sstruct.Builder structBuilder = new DocumenttypesConfig.Documenttype.Datatype.Sstruct.Builder();
+ dataTypeBuilder.sstruct(structBuilder);
+ structBuilder.name(type.getName());
+ for (com.yahoo.document.Field field : type.getFields()) {
+ DocumenttypesConfig.Documenttype.Datatype.Sstruct.Field.Builder builder =
+ new DocumenttypesConfig.Documenttype.Datatype.Sstruct.Field.Builder();
+ builder.name(field.getName()).
+ id(field.getId()).
+ datatype(field.getDataType().getId());
+ if (field.getDataType() instanceof TensorDataType) {
+ builder.detailedtype(((TensorDataType) field.getDataType()).getTensorType().toString());
+ }
+ structBuilder.field(builder);
+ buildConfig(field.getDataType(), documentBuilder, built);
+ }
+ }
+
+ private void buildConfig(ArrayDataType type,
+ DocumenttypesConfig.Documenttype.Datatype.Builder dataTypeBuilder,
+ DocumenttypesConfig.Documenttype.Builder documentBuilder,
+ Set<Integer> built) {
+ dataTypeBuilder.
+ type(DocumenttypesConfig.Documenttype.Datatype.Type.Enum.ARRAY).
+ array(new DocumenttypesConfig.Documenttype.Datatype.Array.Builder().
+ element(new DocumenttypesConfig.Documenttype.Datatype.Array.Element.Builder().id(type.getNestedType().getId())));
+ buildConfig(type.getNestedType(), documentBuilder, built);
+ }
+
+ private void buildConfig(WeightedSetDataType type,
+ DocumenttypesConfig.Documenttype.Datatype.Builder dataTypeBuilder,
+ DocumenttypesConfig.Documenttype.Builder documentBuilder,
+ Set<Integer> built) {
+ dataTypeBuilder.type(DocumenttypesConfig.Documenttype.Datatype.Type.Enum.WSET).
+ wset(new DocumenttypesConfig.Documenttype.Datatype.Wset.Builder().
+ key(new DocumenttypesConfig.Documenttype.Datatype.Wset.Key.Builder().
+ id(type.getNestedType().getId())).
+ createifnonexistent(type.createIfNonExistent()).
+ removeifzero(type.removeIfZero()));
+ buildConfig(type.getNestedType(), documentBuilder, built);
+ }
+
+ private void buildConfig(MapDataType type,
+ DocumenttypesConfig.Documenttype.Datatype.Builder dataTypeBuilder,
+ DocumenttypesConfig.Documenttype.Builder documentBuilder,
+ Set<Integer> built) {
+ dataTypeBuilder.
+ type(DocumenttypesConfig.Documenttype.Datatype.Type.Enum.MAP).
+ map(new DocumenttypesConfig.Documenttype.Datatype.Map.Builder().
+ key(new DocumenttypesConfig.Documenttype.Datatype.Map.Key.Builder().
+ id(type.getKeyType().getId())).
+ value(new DocumenttypesConfig.Documenttype.Datatype.Map.Value.Builder().
+ id(type.getValueType().getId())));
+ buildConfig(type.getKeyType(), documentBuilder, built);
+ buildConfig(type.getValueType(), documentBuilder, built);
+ }
+
+ private void buildConfig(AnnotationReferenceDataType type,
+ DocumenttypesConfig.Documenttype.Datatype.Builder dataTypeBuilder) {
+ dataTypeBuilder.
+ type(DocumenttypesConfig.Documenttype.Datatype.Type.Enum.ANNOTATIONREF).
+ annotationref(new DocumenttypesConfig.Documenttype.Datatype.Annotationref.Builder().
+ annotation(new DocumenttypesConfig.Documenttype.Datatype.Annotationref.Annotation.Builder().
+ id(type.getAnnotationType().getId())));
+ }
+
+ private void buildConfig(NewDocumentReferenceDataType type,
+ DocumenttypesConfig.Documenttype.Builder documentBuilder) {
+ NewDocumentReferenceDataType refType = type;
+ DocumenttypesConfig.Documenttype.Referencetype.Builder refBuilder =
+ new DocumenttypesConfig.Documenttype.Referencetype.Builder();
+ refBuilder.id(refType.getId());
+ refBuilder.target_type_id(type.getTargetTypeId());
+ documentBuilder.referencetype(refBuilder);
+ }
+
+ // Alternate (new) way to build config:
+
+ private DocumenttypesConfig.Builder produceDocTypes(DocumentModel model, DocumenttypesConfig.Builder builder) {
+ builder.usev8geopositions(this.useV8GeoPositions);
+ Map<NewDocumentType.Name, NewDocumentType> produced = new HashMap<>();
+ var indexMap = new IdxMap();
+ for (NewDocumentType documentType : model.getDocumentManager().getTypes()) {
+ docTypeInheritOrder(documentType, builder, produced, indexMap);
+ }
+ indexMap.verifyAllDone();
+ return builder;
+ }
+
private void docTypeInheritOrder(NewDocumentType documentType,
DocumenttypesConfig.Builder builder,
Map<NewDocumentType.Name, NewDocumentType> produced,