summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--application-preprocessor/src/test/java/com/yahoo/application/preprocessor/ApplicationPreprocessorTest.java10
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/configmodel/producers/DocumentTypes.java216
-rw-r--r--config-model/src/test/configmodel/types/documenttypes.cfg895
-rw-r--r--config-model/src/test/configmodel/types/documenttypes_with_doc_field.cfg110
-rw-r--r--config-model/src/test/configmodel/types/references/documenttypes_multiple_imported_fields.cfg191
-rw-r--r--config-model/src/test/configmodel/types/references/documenttypes_refs_to_other_types.cfg158
-rw-r--r--config-model/src/test/configmodel/types/references/documenttypes_refs_to_same_type.cfg124
-rw-r--r--config-model/src/test/derived/duplicate_struct/documenttypes.cfg184
-rw-r--r--config-model/src/test/derived/imported_fields_inherited_reference/documenttypes.cfg205
-rw-r--r--config-model/src/test/derived/inheritfromparent/documenttypes.cfg155
-rw-r--r--config-model/src/test/derived/multi_struct/documenttypes.cfg318
-rw-r--r--config-model/src/test/derived/structinheritance/documenttypes.cfg179
-rw-r--r--config-model/src/test/derived/tensor/documenttypes.cfg136
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/application/CompressedApplicationInputStreamTest.java25
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandlerTest.java10
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/Bill.java9
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/PlanRegistryMock.java3
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/CostInfo.java9
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/MeteringClient.java2
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceAllocation.java16
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceDatabaseClient.java2
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceDatabaseClientMock.java16
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceSnapshot.java13
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceUsage.java8
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/stubs/MockMeteringClient.java11
-rw-r--r--controller-server/pom.xml2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java45
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/metric/CostCalculator.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java63
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/MultipartParser.java54
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/controller/MeteringResponse.java1
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/CostReportMaintainerTest.java3
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainerTest.java12
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java22
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/MultipartParserTest.java47
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/ControllerApiTest.java5
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/responses/metering.json6
37 files changed, 1400 insertions, 1867 deletions
diff --git a/application-preprocessor/src/test/java/com/yahoo/application/preprocessor/ApplicationPreprocessorTest.java b/application-preprocessor/src/test/java/com/yahoo/application/preprocessor/ApplicationPreprocessorTest.java
index 1fc4d08b405..5039b05b393 100644
--- a/application-preprocessor/src/test/java/com/yahoo/application/preprocessor/ApplicationPreprocessorTest.java
+++ b/application-preprocessor/src/test/java/com/yahoo/application/preprocessor/ApplicationPreprocessorTest.java
@@ -2,17 +2,15 @@
package com.yahoo.application.preprocessor;
import org.junit.Rule;
-import org.junit.rules.TemporaryFolder;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Optional;
-
import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
import org.xml.sax.SAXException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
+import java.io.File;
+import java.io.IOException;
+import java.util.Optional;
public class ApplicationPreprocessorTest {
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 630e9f0c097..ba41fa0f5b3 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,29 +27,16 @@ 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()) {
- produceInheritOrder(documentType, builder, produced);
+ docTypeInheritOrder(documentType, builder, produced, indexMap);
}
+ 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);
@@ -57,203 +44,6 @@ 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,
diff --git a/config-model/src/test/configmodel/types/documenttypes.cfg b/config-model/src/test/configmodel/types/documenttypes.cfg
index 0501aa58784..7ea2fa42a2a 100644
--- a/config-model/src/test/configmodel/types/documenttypes.cfg
+++ b/config-model/src/test/configmodel/types/documenttypes.cfg
@@ -1,577 +1,322 @@
enablecompression false
usev8geopositions false
-documenttype[0].id -853072901
-documenttype[0].name "types"
-documenttype[0].version 0
-documenttype[0].headerstruct 1328581348
-documenttype[0].bodystruct 0
-documenttype[0].inherits[0].id 8
-documenttype[0].datatype[0].id -1486737430
-documenttype[0].datatype[0].type ARRAY
-documenttype[0].datatype[0].array.element.id 2
-documenttype[0].datatype[0].map.key.id 0
-documenttype[0].datatype[0].map.value.id 0
-documenttype[0].datatype[0].wset.key.id 0
-documenttype[0].datatype[0].wset.createifnonexistent false
-documenttype[0].datatype[0].wset.removeifzero false
-documenttype[0].datatype[0].annotationref.annotation.id 0
-documenttype[0].datatype[0].sstruct.name ""
-documenttype[0].datatype[0].sstruct.version 0
-documenttype[0].datatype[0].sstruct.compression.type NONE
-documenttype[0].datatype[0].sstruct.compression.level 0
-documenttype[0].datatype[0].sstruct.compression.threshold 95
-documenttype[0].datatype[0].sstruct.compression.minsize 200
-documenttype[0].datatype[1].id 1707615575
-documenttype[0].datatype[1].type ARRAY
-documenttype[0].datatype[1].array.element.id -1486737430
-documenttype[0].datatype[1].map.key.id 0
-documenttype[0].datatype[1].map.value.id 0
-documenttype[0].datatype[1].wset.key.id 0
-documenttype[0].datatype[1].wset.createifnonexistent false
-documenttype[0].datatype[1].wset.removeifzero false
-documenttype[0].datatype[1].annotationref.annotation.id 0
-documenttype[0].datatype[1].sstruct.name ""
-documenttype[0].datatype[1].sstruct.version 0
-documenttype[0].datatype[1].sstruct.compression.type NONE
-documenttype[0].datatype[1].sstruct.compression.level 0
-documenttype[0].datatype[1].sstruct.compression.threshold 95
-documenttype[0].datatype[1].sstruct.compression.minsize 200
-documenttype[0].datatype[2].id -794985308
-documenttype[0].datatype[2].type ARRAY
-documenttype[0].datatype[2].array.element.id 1707615575
-documenttype[0].datatype[2].map.key.id 0
-documenttype[0].datatype[2].map.value.id 0
-documenttype[0].datatype[2].wset.key.id 0
-documenttype[0].datatype[2].wset.createifnonexistent false
-documenttype[0].datatype[2].wset.removeifzero false
-documenttype[0].datatype[2].annotationref.annotation.id 0
-documenttype[0].datatype[2].sstruct.name ""
-documenttype[0].datatype[2].sstruct.version 0
-documenttype[0].datatype[2].sstruct.compression.type NONE
-documenttype[0].datatype[2].sstruct.compression.level 0
-documenttype[0].datatype[2].sstruct.compression.threshold 95
-documenttype[0].datatype[2].sstruct.compression.minsize 200
-documenttype[0].datatype[3].id -372512406
-documenttype[0].datatype[3].type MAP
-documenttype[0].datatype[3].array.element.id 0
-documenttype[0].datatype[3].map.key.id 0
-documenttype[0].datatype[3].map.value.id 1707615575
-documenttype[0].datatype[3].wset.key.id 0
-documenttype[0].datatype[3].wset.createifnonexistent false
-documenttype[0].datatype[3].wset.removeifzero false
-documenttype[0].datatype[3].annotationref.annotation.id 0
-documenttype[0].datatype[3].sstruct.name ""
-documenttype[0].datatype[3].sstruct.version 0
-documenttype[0].datatype[3].sstruct.compression.type NONE
-documenttype[0].datatype[3].sstruct.compression.level 0
-documenttype[0].datatype[3].sstruct.compression.threshold 95
-documenttype[0].datatype[3].sstruct.compression.minsize 200
-documenttype[0].datatype[4].id 1416345047
-documenttype[0].datatype[4].type ARRAY
-documenttype[0].datatype[4].array.element.id -372512406
-documenttype[0].datatype[4].map.key.id 0
-documenttype[0].datatype[4].map.value.id 0
-documenttype[0].datatype[4].wset.key.id 0
-documenttype[0].datatype[4].wset.createifnonexistent false
-documenttype[0].datatype[4].wset.removeifzero false
-documenttype[0].datatype[4].annotationref.annotation.id 0
-documenttype[0].datatype[4].sstruct.name ""
-documenttype[0].datatype[4].sstruct.version 0
-documenttype[0].datatype[4].sstruct.compression.type NONE
-documenttype[0].datatype[4].sstruct.compression.level 0
-documenttype[0].datatype[4].sstruct.compression.threshold 95
-documenttype[0].datatype[4].sstruct.compression.minsize 200
-documenttype[0].datatype[5].id 339965458
-documenttype[0].datatype[5].type MAP
-documenttype[0].datatype[5].array.element.id 0
-documenttype[0].datatype[5].map.key.id 2
-documenttype[0].datatype[5].map.value.id 2
-documenttype[0].datatype[5].wset.key.id 0
-documenttype[0].datatype[5].wset.createifnonexistent false
-documenttype[0].datatype[5].wset.removeifzero false
-documenttype[0].datatype[5].annotationref.annotation.id 0
-documenttype[0].datatype[5].sstruct.name ""
-documenttype[0].datatype[5].sstruct.version 0
-documenttype[0].datatype[5].sstruct.compression.type NONE
-documenttype[0].datatype[5].sstruct.compression.level 0
-documenttype[0].datatype[5].sstruct.compression.threshold 95
-documenttype[0].datatype[5].sstruct.compression.minsize 200
-documenttype[0].datatype[6].id 69621385
-documenttype[0].datatype[6].type ARRAY
-documenttype[0].datatype[6].array.element.id 339965458
-documenttype[0].datatype[6].map.key.id 0
-documenttype[0].datatype[6].map.value.id 0
-documenttype[0].datatype[6].wset.key.id 0
-documenttype[0].datatype[6].wset.createifnonexistent false
-documenttype[0].datatype[6].wset.removeifzero false
-documenttype[0].datatype[6].annotationref.annotation.id 0
-documenttype[0].datatype[6].sstruct.name ""
-documenttype[0].datatype[6].sstruct.version 0
-documenttype[0].datatype[6].sstruct.compression.type NONE
-documenttype[0].datatype[6].sstruct.compression.level 0
-documenttype[0].datatype[6].sstruct.compression.threshold 95
-documenttype[0].datatype[6].sstruct.compression.minsize 200
-documenttype[0].datatype[7].id 49942803
-documenttype[0].datatype[7].type ARRAY
-documenttype[0].datatype[7].array.element.id 16
-documenttype[0].datatype[7].map.key.id 0
-documenttype[0].datatype[7].map.value.id 0
-documenttype[0].datatype[7].wset.key.id 0
-documenttype[0].datatype[7].wset.createifnonexistent false
-documenttype[0].datatype[7].wset.removeifzero false
-documenttype[0].datatype[7].annotationref.annotation.id 0
-documenttype[0].datatype[7].sstruct.name ""
-documenttype[0].datatype[7].sstruct.version 0
-documenttype[0].datatype[7].sstruct.compression.type NONE
-documenttype[0].datatype[7].sstruct.compression.level 0
-documenttype[0].datatype[7].sstruct.compression.threshold 95
-documenttype[0].datatype[7].sstruct.compression.minsize 200
-documenttype[0].datatype[8].id -1245117006
-documenttype[0].datatype[8].type ARRAY
-documenttype[0].datatype[8].array.element.id 0
-documenttype[0].datatype[8].map.key.id 0
-documenttype[0].datatype[8].map.value.id 0
-documenttype[0].datatype[8].wset.key.id 0
-documenttype[0].datatype[8].wset.createifnonexistent false
-documenttype[0].datatype[8].wset.removeifzero false
-documenttype[0].datatype[8].annotationref.annotation.id 0
-documenttype[0].datatype[8].sstruct.name ""
-documenttype[0].datatype[8].sstruct.version 0
-documenttype[0].datatype[8].sstruct.compression.type NONE
-documenttype[0].datatype[8].sstruct.compression.level 0
-documenttype[0].datatype[8].sstruct.compression.threshold 95
-documenttype[0].datatype[8].sstruct.compression.minsize 200
-documenttype[0].datatype[9].id -2092985853
-documenttype[0].datatype[9].type STRUCT
-documenttype[0].datatype[9].array.element.id 0
-documenttype[0].datatype[9].map.key.id 0
-documenttype[0].datatype[9].map.value.id 0
-documenttype[0].datatype[9].wset.key.id 0
-documenttype[0].datatype[9].wset.createifnonexistent false
-documenttype[0].datatype[9].wset.removeifzero false
-documenttype[0].datatype[9].annotationref.annotation.id 0
-documenttype[0].datatype[9].sstruct.name "mystruct"
-documenttype[0].datatype[9].sstruct.version 0
-documenttype[0].datatype[9].sstruct.compression.type NONE
-documenttype[0].datatype[9].sstruct.compression.level 0
-documenttype[0].datatype[9].sstruct.compression.threshold 95
-documenttype[0].datatype[9].sstruct.compression.minsize 200
-documenttype[0].datatype[9].sstruct.field[0].name "bytearr"
-documenttype[0].datatype[9].sstruct.field[0].id 1079701754
-documenttype[0].datatype[9].sstruct.field[0].datatype 49942803
-documenttype[0].datatype[9].sstruct.field[0].detailedtype ""
-documenttype[0].datatype[9].sstruct.field[1].name "mymap"
-documenttype[0].datatype[9].sstruct.field[1].id 1954178122
-documenttype[0].datatype[9].sstruct.field[1].datatype 339965458
-documenttype[0].datatype[9].sstruct.field[1].detailedtype ""
-documenttype[0].datatype[9].sstruct.field[2].name "title"
-documenttype[0].datatype[9].sstruct.field[2].id 567626448
-documenttype[0].datatype[9].sstruct.field[2].datatype 2
-documenttype[0].datatype[9].sstruct.field[2].detailedtype ""
-documenttype[0].datatype[9].sstruct.field[3].name "structfield"
-documenttype[0].datatype[9].sstruct.field[3].id 1726890940
-documenttype[0].datatype[9].sstruct.field[3].datatype 2
-documenttype[0].datatype[9].sstruct.field[3].detailedtype ""
-documenttype[0].datatype[10].id 759956026
-documenttype[0].datatype[10].type ARRAY
-documenttype[0].datatype[10].array.element.id -2092985853
-documenttype[0].datatype[10].map.key.id 0
-documenttype[0].datatype[10].map.value.id 0
-documenttype[0].datatype[10].wset.key.id 0
-documenttype[0].datatype[10].wset.createifnonexistent false
-documenttype[0].datatype[10].wset.removeifzero false
-documenttype[0].datatype[10].annotationref.annotation.id 0
-documenttype[0].datatype[10].sstruct.name ""
-documenttype[0].datatype[10].sstruct.version 0
-documenttype[0].datatype[10].sstruct.compression.type NONE
-documenttype[0].datatype[10].sstruct.compression.level 0
-documenttype[0].datatype[10].sstruct.compression.threshold 95
-documenttype[0].datatype[10].sstruct.compression.minsize 200
-documenttype[0].datatype[11].id 109267174
-documenttype[0].datatype[11].type STRUCT
-documenttype[0].datatype[11].array.element.id 0
-documenttype[0].datatype[11].map.key.id 0
-documenttype[0].datatype[11].map.value.id 0
-documenttype[0].datatype[11].wset.key.id 0
-documenttype[0].datatype[11].wset.createifnonexistent false
-documenttype[0].datatype[11].wset.removeifzero false
-documenttype[0].datatype[11].annotationref.annotation.id 0
-documenttype[0].datatype[11].sstruct.name "sct"
-documenttype[0].datatype[11].sstruct.version 0
-documenttype[0].datatype[11].sstruct.compression.type NONE
-documenttype[0].datatype[11].sstruct.compression.level 0
-documenttype[0].datatype[11].sstruct.compression.threshold 95
-documenttype[0].datatype[11].sstruct.compression.minsize 200
-documenttype[0].datatype[11].sstruct.field[0].name "s1"
-documenttype[0].datatype[11].sstruct.field[0].id 2146820765
-documenttype[0].datatype[11].sstruct.field[0].datatype 2
-documenttype[0].datatype[11].sstruct.field[0].detailedtype ""
-documenttype[0].datatype[11].sstruct.field[1].name "s2"
-documenttype[0].datatype[11].sstruct.field[1].id 45366795
-documenttype[0].datatype[11].sstruct.field[1].datatype 2
-documenttype[0].datatype[11].sstruct.field[1].detailedtype ""
-documenttype[0].datatype[12].id -1244829667
-documenttype[0].datatype[12].type ARRAY
-documenttype[0].datatype[12].array.element.id 109267174
-documenttype[0].datatype[12].map.key.id 0
-documenttype[0].datatype[12].map.value.id 0
-documenttype[0].datatype[12].wset.key.id 0
-documenttype[0].datatype[12].wset.createifnonexistent false
-documenttype[0].datatype[12].wset.removeifzero false
-documenttype[0].datatype[12].annotationref.annotation.id 0
-documenttype[0].datatype[12].sstruct.name ""
-documenttype[0].datatype[12].sstruct.version 0
-documenttype[0].datatype[12].sstruct.compression.type NONE
-documenttype[0].datatype[12].sstruct.compression.level 0
-documenttype[0].datatype[12].sstruct.compression.threshold 95
-documenttype[0].datatype[12].sstruct.compression.minsize 200
-documenttype[0].datatype[13].id 2138385264
-documenttype[0].datatype[13].type MAP
-documenttype[0].datatype[13].array.element.id 0
-documenttype[0].datatype[13].map.key.id 0
-documenttype[0].datatype[13].map.value.id 5
-documenttype[0].datatype[13].wset.key.id 0
-documenttype[0].datatype[13].wset.createifnonexistent false
-documenttype[0].datatype[13].wset.removeifzero false
-documenttype[0].datatype[13].annotationref.annotation.id 0
-documenttype[0].datatype[13].sstruct.name ""
-documenttype[0].datatype[13].sstruct.version 0
-documenttype[0].datatype[13].sstruct.compression.type NONE
-documenttype[0].datatype[13].sstruct.compression.level 0
-documenttype[0].datatype[13].sstruct.compression.threshold 95
-documenttype[0].datatype[13].sstruct.compression.minsize 200
-documenttype[0].datatype[14].id -1865479609
-documenttype[0].datatype[14].type MAP
-documenttype[0].datatype[14].array.element.id 0
-documenttype[0].datatype[14].map.key.id 2
-documenttype[0].datatype[14].map.value.id 4
-documenttype[0].datatype[14].wset.key.id 0
-documenttype[0].datatype[14].wset.createifnonexistent false
-documenttype[0].datatype[14].wset.removeifzero false
-documenttype[0].datatype[14].annotationref.annotation.id 0
-documenttype[0].datatype[14].sstruct.name ""
-documenttype[0].datatype[14].sstruct.version 0
-documenttype[0].datatype[14].sstruct.compression.type NONE
-documenttype[0].datatype[14].sstruct.compression.level 0
-documenttype[0].datatype[14].sstruct.compression.threshold 95
-documenttype[0].datatype[14].sstruct.compression.minsize 200
-documenttype[0].datatype[15].id 294108848
-documenttype[0].datatype[15].type STRUCT
-documenttype[0].datatype[15].array.element.id 0
-documenttype[0].datatype[15].map.key.id 0
-documenttype[0].datatype[15].map.value.id 0
-documenttype[0].datatype[15].wset.key.id 0
-documenttype[0].datatype[15].wset.createifnonexistent false
-documenttype[0].datatype[15].wset.removeifzero false
-documenttype[0].datatype[15].annotationref.annotation.id 0
-documenttype[0].datatype[15].sstruct.name "folder"
-documenttype[0].datatype[15].sstruct.version 0
-documenttype[0].datatype[15].sstruct.compression.type NONE
-documenttype[0].datatype[15].sstruct.compression.level 0
-documenttype[0].datatype[15].sstruct.compression.threshold 95
-documenttype[0].datatype[15].sstruct.compression.minsize 200
-documenttype[0].datatype[15].sstruct.field[0].name "Version"
-documenttype[0].datatype[15].sstruct.field[0].id 64430502
-documenttype[0].datatype[15].sstruct.field[0].datatype 0
-documenttype[0].datatype[15].sstruct.field[0].detailedtype ""
-documenttype[0].datatype[15].sstruct.field[1].name "Name"
-documenttype[0].datatype[15].sstruct.field[1].id 2002760220
-documenttype[0].datatype[15].sstruct.field[1].datatype 2
-documenttype[0].datatype[15].sstruct.field[1].detailedtype ""
-documenttype[0].datatype[15].sstruct.field[2].name "FlagsCounter"
-documenttype[0].datatype[15].sstruct.field[2].id 1741227606
-documenttype[0].datatype[15].sstruct.field[2].datatype -1865479609
-documenttype[0].datatype[15].sstruct.field[2].detailedtype ""
-documenttype[0].datatype[15].sstruct.field[3].name "anotherfolder"
-documenttype[0].datatype[15].sstruct.field[3].id 1582421848
-documenttype[0].datatype[15].sstruct.field[3].datatype 294108848
-documenttype[0].datatype[15].sstruct.field[3].detailedtype ""
-documenttype[0].datatype[16].id -389833101
-documenttype[0].datatype[16].type MAP
-documenttype[0].datatype[16].array.element.id 0
-documenttype[0].datatype[16].map.key.id 0
-documenttype[0].datatype[16].map.value.id 294108848
-documenttype[0].datatype[16].wset.key.id 0
-documenttype[0].datatype[16].wset.createifnonexistent false
-documenttype[0].datatype[16].wset.removeifzero false
-documenttype[0].datatype[16].annotationref.annotation.id 0
-documenttype[0].datatype[16].sstruct.name ""
-documenttype[0].datatype[16].sstruct.version 0
-documenttype[0].datatype[16].sstruct.compression.type NONE
-documenttype[0].datatype[16].sstruct.compression.level 0
-documenttype[0].datatype[16].sstruct.compression.threshold 95
-documenttype[0].datatype[16].sstruct.compression.minsize 200
-documenttype[0].datatype[17].id -1715531035
-documenttype[0].datatype[17].type MAP
-documenttype[0].datatype[17].array.element.id 0
-documenttype[0].datatype[17].map.key.id 0
-documenttype[0].datatype[17].map.value.id 4
-documenttype[0].datatype[17].wset.key.id 0
-documenttype[0].datatype[17].wset.createifnonexistent false
-documenttype[0].datatype[17].wset.removeifzero false
-documenttype[0].datatype[17].annotationref.annotation.id 0
-documenttype[0].datatype[17].sstruct.name ""
-documenttype[0].datatype[17].sstruct.version 0
-documenttype[0].datatype[17].sstruct.compression.type NONE
-documenttype[0].datatype[17].sstruct.compression.level 0
-documenttype[0].datatype[17].sstruct.compression.threshold 95
-documenttype[0].datatype[17].sstruct.compression.minsize 200
-documenttype[0].datatype[18].id 1901258752
-documenttype[0].datatype[18].type MAP
-documenttype[0].datatype[18].array.element.id 0
-documenttype[0].datatype[18].map.key.id 0
-documenttype[0].datatype[18].map.value.id -2092985853
-documenttype[0].datatype[18].wset.key.id 0
-documenttype[0].datatype[18].wset.createifnonexistent false
-documenttype[0].datatype[18].wset.removeifzero false
-documenttype[0].datatype[18].annotationref.annotation.id 0
-documenttype[0].datatype[18].sstruct.name ""
-documenttype[0].datatype[18].sstruct.version 0
-documenttype[0].datatype[18].sstruct.compression.type NONE
-documenttype[0].datatype[18].sstruct.compression.level 0
-documenttype[0].datatype[18].sstruct.compression.threshold 95
-documenttype[0].datatype[18].sstruct.compression.minsize 200
-documenttype[0].datatype[19].id 435886609
-documenttype[0].datatype[19].type MAP
-documenttype[0].datatype[19].array.element.id 0
-documenttype[0].datatype[19].map.key.id 2
-documenttype[0].datatype[19].map.value.id -1245117006
-documenttype[0].datatype[19].wset.key.id 0
-documenttype[0].datatype[19].wset.createifnonexistent false
-documenttype[0].datatype[19].wset.removeifzero false
-documenttype[0].datatype[19].annotationref.annotation.id 0
-documenttype[0].datatype[19].sstruct.name ""
-documenttype[0].datatype[19].sstruct.version 0
-documenttype[0].datatype[19].sstruct.compression.type NONE
-documenttype[0].datatype[19].sstruct.compression.level 0
-documenttype[0].datatype[19].sstruct.compression.threshold 95
-documenttype[0].datatype[19].sstruct.compression.minsize 200
-documenttype[0].datatype[20].id 2125154557
-documenttype[0].datatype[20].type MAP
-documenttype[0].datatype[20].array.element.id 0
-documenttype[0].datatype[20].map.key.id 2
-documenttype[0].datatype[20].map.value.id 1
-documenttype[0].datatype[20].wset.key.id 0
-documenttype[0].datatype[20].wset.createifnonexistent false
-documenttype[0].datatype[20].wset.removeifzero false
-documenttype[0].datatype[20].annotationref.annotation.id 0
-documenttype[0].datatype[20].sstruct.name ""
-documenttype[0].datatype[20].sstruct.version 0
-documenttype[0].datatype[20].sstruct.compression.type NONE
-documenttype[0].datatype[20].sstruct.compression.level 0
-documenttype[0].datatype[20].sstruct.compression.threshold 95
-documenttype[0].datatype[20].sstruct.compression.minsize 200
-documenttype[0].datatype[21].id -1584287606
-documenttype[0].datatype[21].type MAP
-documenttype[0].datatype[21].array.element.id 0
-documenttype[0].datatype[21].map.key.id 2
-documenttype[0].datatype[21].map.value.id 0
-documenttype[0].datatype[21].wset.key.id 0
-documenttype[0].datatype[21].wset.createifnonexistent false
-documenttype[0].datatype[21].wset.removeifzero false
-documenttype[0].datatype[21].annotationref.annotation.id 0
-documenttype[0].datatype[21].sstruct.name ""
-documenttype[0].datatype[21].sstruct.version 0
-documenttype[0].datatype[21].sstruct.compression.type NONE
-documenttype[0].datatype[21].sstruct.compression.level 0
-documenttype[0].datatype[21].sstruct.compression.threshold 95
-documenttype[0].datatype[21].sstruct.compression.minsize 200
-documenttype[0].datatype[22].id 1328286588
-documenttype[0].datatype[22].type WSET
-documenttype[0].datatype[22].array.element.id 0
-documenttype[0].datatype[22].map.key.id 0
-documenttype[0].datatype[22].map.value.id 0
-documenttype[0].datatype[22].wset.key.id 2
-documenttype[0].datatype[22].wset.createifnonexistent false
-documenttype[0].datatype[22].wset.removeifzero false
-documenttype[0].datatype[22].annotationref.annotation.id 0
-documenttype[0].datatype[22].sstruct.name ""
-documenttype[0].datatype[22].sstruct.version 0
-documenttype[0].datatype[22].sstruct.compression.type NONE
-documenttype[0].datatype[22].sstruct.compression.level 0
-documenttype[0].datatype[22].sstruct.compression.threshold 95
-documenttype[0].datatype[22].sstruct.compression.minsize 200
-documenttype[0].datatype[23].id 2065577986
-documenttype[0].datatype[23].type WSET
-documenttype[0].datatype[23].array.element.id 0
-documenttype[0].datatype[23].map.key.id 0
-documenttype[0].datatype[23].map.value.id 0
-documenttype[0].datatype[23].wset.key.id 2
-documenttype[0].datatype[23].wset.createifnonexistent true
-documenttype[0].datatype[23].wset.removeifzero false
-documenttype[0].datatype[23].annotationref.annotation.id 0
-documenttype[0].datatype[23].sstruct.name ""
-documenttype[0].datatype[23].sstruct.version 0
-documenttype[0].datatype[23].sstruct.compression.type NONE
-documenttype[0].datatype[23].sstruct.compression.level 0
-documenttype[0].datatype[23].sstruct.compression.threshold 95
-documenttype[0].datatype[23].sstruct.compression.minsize 200
-documenttype[0].datatype[24].id 2125328771
-documenttype[0].datatype[24].type WSET
-documenttype[0].datatype[24].array.element.id 0
-documenttype[0].datatype[24].map.key.id 0
-documenttype[0].datatype[24].map.value.id 0
-documenttype[0].datatype[24].wset.key.id 2
-documenttype[0].datatype[24].wset.createifnonexistent false
-documenttype[0].datatype[24].wset.removeifzero true
-documenttype[0].datatype[24].annotationref.annotation.id 0
-documenttype[0].datatype[24].sstruct.name ""
-documenttype[0].datatype[24].sstruct.version 0
-documenttype[0].datatype[24].sstruct.compression.type NONE
-documenttype[0].datatype[24].sstruct.compression.level 0
-documenttype[0].datatype[24].sstruct.compression.threshold 95
-documenttype[0].datatype[24].sstruct.compression.minsize 200
-documenttype[0].datatype[25].id 1328581348
-documenttype[0].datatype[25].type STRUCT
-documenttype[0].datatype[25].array.element.id 0
-documenttype[0].datatype[25].map.key.id 0
-documenttype[0].datatype[25].map.value.id 0
-documenttype[0].datatype[25].wset.key.id 0
-documenttype[0].datatype[25].wset.createifnonexistent false
-documenttype[0].datatype[25].wset.removeifzero false
-documenttype[0].datatype[25].annotationref.annotation.id 0
-documenttype[0].datatype[25].sstruct.name "types.header"
-documenttype[0].datatype[25].sstruct.version 0
-documenttype[0].datatype[25].sstruct.compression.type NONE
-documenttype[0].datatype[25].sstruct.compression.level 0
-documenttype[0].datatype[25].sstruct.compression.threshold 95
-documenttype[0].datatype[25].sstruct.compression.minsize 200
-documenttype[0].datatype[25].sstruct.field[0].name "abyte"
-documenttype[0].datatype[25].sstruct.field[0].id 110138156
-documenttype[0].datatype[25].sstruct.field[0].datatype 16
-documenttype[0].datatype[25].sstruct.field[0].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[1].name "along"
-documenttype[0].datatype[25].sstruct.field[1].id 1206464520
-documenttype[0].datatype[25].sstruct.field[1].datatype 4
-documenttype[0].datatype[25].sstruct.field[1].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[2].name "arrayfield"
-documenttype[0].datatype[25].sstruct.field[2].id 965790107
-documenttype[0].datatype[25].sstruct.field[2].datatype -1245117006
-documenttype[0].datatype[25].sstruct.field[2].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[3].name "setfield"
-documenttype[0].datatype[25].sstruct.field[3].id 761581914
-documenttype[0].datatype[25].sstruct.field[3].datatype 1328286588
-documenttype[0].datatype[25].sstruct.field[3].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[4].name "pos"
-documenttype[0].datatype[25].sstruct.field[4].id 1041567475
-documenttype[0].datatype[25].sstruct.field[4].datatype 1381038251
-documenttype[0].datatype[25].sstruct.field[4].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[5].name "setfield2"
-documenttype[0].datatype[25].sstruct.field[5].id 1066659198
-documenttype[0].datatype[25].sstruct.field[5].datatype 18
-documenttype[0].datatype[25].sstruct.field[5].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[6].name "setfield3"
-documenttype[0].datatype[25].sstruct.field[6].id 1180155772
-documenttype[0].datatype[25].sstruct.field[6].datatype 2125328771
-documenttype[0].datatype[25].sstruct.field[6].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[7].name "setfield4"
-documenttype[0].datatype[25].sstruct.field[7].id 1254131631
-documenttype[0].datatype[25].sstruct.field[7].datatype 2065577986
-documenttype[0].datatype[25].sstruct.field[7].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[8].name "tagfield"
-documenttype[0].datatype[25].sstruct.field[8].id 1653562069
-documenttype[0].datatype[25].sstruct.field[8].datatype 18
-documenttype[0].datatype[25].sstruct.field[8].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[9].name "structfield"
-documenttype[0].datatype[25].sstruct.field[9].id 486207386
-documenttype[0].datatype[25].sstruct.field[9].datatype 109267174
-documenttype[0].datatype[25].sstruct.field[9].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[10].name "structarrayfield"
-documenttype[0].datatype[25].sstruct.field[10].id 335048518
-documenttype[0].datatype[25].sstruct.field[10].datatype -1244829667
-documenttype[0].datatype[25].sstruct.field[10].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[11].name "stringmapfield"
-documenttype[0].datatype[25].sstruct.field[11].id 117465687
-documenttype[0].datatype[25].sstruct.field[11].datatype 339965458
-documenttype[0].datatype[25].sstruct.field[11].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[12].name "intmapfield"
-documenttype[0].datatype[25].sstruct.field[12].id 121004462
-documenttype[0].datatype[25].sstruct.field[12].datatype -1584287606
-documenttype[0].datatype[25].sstruct.field[12].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[13].name "floatmapfield"
-documenttype[0].datatype[25].sstruct.field[13].id 1239120925
-documenttype[0].datatype[25].sstruct.field[13].datatype 2125154557
-documenttype[0].datatype[25].sstruct.field[13].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[14].name "longmapfield"
-documenttype[0].datatype[25].sstruct.field[14].id 477718745
-documenttype[0].datatype[25].sstruct.field[14].datatype -1715531035
-documenttype[0].datatype[25].sstruct.field[14].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[15].name "doublemapfield"
-documenttype[0].datatype[25].sstruct.field[15].id 877047192
-documenttype[0].datatype[25].sstruct.field[15].datatype 2138385264
-documenttype[0].datatype[25].sstruct.field[15].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[16].name "arraymapfield"
-documenttype[0].datatype[25].sstruct.field[16].id 1670805928
-documenttype[0].datatype[25].sstruct.field[16].datatype 435886609
-documenttype[0].datatype[25].sstruct.field[16].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[17].name "arrarr"
-documenttype[0].datatype[25].sstruct.field[17].id 1962567166
-documenttype[0].datatype[25].sstruct.field[17].datatype -794985308
-documenttype[0].datatype[25].sstruct.field[17].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[18].name "maparr"
-documenttype[0].datatype[25].sstruct.field[18].id 904375219
-documenttype[0].datatype[25].sstruct.field[18].datatype 69621385
-documenttype[0].datatype[25].sstruct.field[18].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[19].name "complexarray"
-documenttype[0].datatype[25].sstruct.field[19].id 795629533
-documenttype[0].datatype[25].sstruct.field[19].datatype 1416345047
-documenttype[0].datatype[25].sstruct.field[19].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[20].name "mystructfield"
-documenttype[0].datatype[25].sstruct.field[20].id 1348513378
-documenttype[0].datatype[25].sstruct.field[20].datatype -2092985853
-documenttype[0].datatype[25].sstruct.field[20].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[21].name "mystructmap"
-documenttype[0].datatype[25].sstruct.field[21].id 1511423250
-documenttype[0].datatype[25].sstruct.field[21].datatype 1901258752
-documenttype[0].datatype[25].sstruct.field[21].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[22].name "mystructarr"
-documenttype[0].datatype[25].sstruct.field[22].id 595856991
-documenttype[0].datatype[25].sstruct.field[22].datatype 759956026
-documenttype[0].datatype[25].sstruct.field[22].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[23].name "Folders"
-documenttype[0].datatype[25].sstruct.field[23].id 34575524
-documenttype[0].datatype[25].sstruct.field[23].datatype -389833101
-documenttype[0].datatype[25].sstruct.field[23].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[24].name "juletre"
-documenttype[0].datatype[25].sstruct.field[24].id 1039981530
-documenttype[0].datatype[25].sstruct.field[24].datatype 4
-documenttype[0].datatype[25].sstruct.field[24].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[25].name "album0"
-documenttype[0].datatype[25].sstruct.field[25].id 764312262
-documenttype[0].datatype[25].sstruct.field[25].datatype 18
-documenttype[0].datatype[25].sstruct.field[25].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[26].name "album1"
-documenttype[0].datatype[25].sstruct.field[26].id 1967160809
-documenttype[0].datatype[25].sstruct.field[26].datatype 18
-documenttype[0].datatype[25].sstruct.field[26].detailedtype ""
-documenttype[0].datatype[25].sstruct.field[27].name "other"
-documenttype[0].datatype[25].sstruct.field[27].id 2443357
-documenttype[0].datatype[25].sstruct.field[27].datatype 4
-documenttype[0].datatype[25].sstruct.field[27].detailedtype ""
-documenttype[0].fieldsets{[document]}.fields[0] "Folders"
-documenttype[0].fieldsets{[document]}.fields[1] "abyte"
-documenttype[0].fieldsets{[document]}.fields[2] "album0"
-documenttype[0].fieldsets{[document]}.fields[3] "album1"
-documenttype[0].fieldsets{[document]}.fields[4] "along"
-documenttype[0].fieldsets{[document]}.fields[5] "arrarr"
-documenttype[0].fieldsets{[document]}.fields[6] "arrayfield"
-documenttype[0].fieldsets{[document]}.fields[7] "arraymapfield"
-documenttype[0].fieldsets{[document]}.fields[8] "complexarray"
-documenttype[0].fieldsets{[document]}.fields[9] "doublemapfield"
-documenttype[0].fieldsets{[document]}.fields[10] "floatmapfield"
-documenttype[0].fieldsets{[document]}.fields[11] "intmapfield"
-documenttype[0].fieldsets{[document]}.fields[12] "juletre"
-documenttype[0].fieldsets{[document]}.fields[13] "longmapfield"
-documenttype[0].fieldsets{[document]}.fields[14] "maparr"
-documenttype[0].fieldsets{[document]}.fields[15] "mystructarr"
-documenttype[0].fieldsets{[document]}.fields[16] "mystructfield"
-documenttype[0].fieldsets{[document]}.fields[17] "mystructmap"
-documenttype[0].fieldsets{[document]}.fields[18] "pos"
-documenttype[0].fieldsets{[document]}.fields[19] "setfield"
-documenttype[0].fieldsets{[document]}.fields[20] "setfield2"
-documenttype[0].fieldsets{[document]}.fields[21] "setfield3"
-documenttype[0].fieldsets{[document]}.fields[22] "setfield4"
-documenttype[0].fieldsets{[document]}.fields[23] "stringmapfield"
-documenttype[0].fieldsets{[document]}.fields[24] "structarrayfield"
-documenttype[0].fieldsets{[document]}.fields[25] "structfield"
-documenttype[0].fieldsets{[document]}.fields[26] "tagfield"
+doctype[0].name "document"
+doctype[0].idx 10000
+doctype[0].internalid 8
+doctype[0].contentstruct 10001
+doctype[0].primitivetype[0].idx 10002
+doctype[0].primitivetype[0].name "bool"
+doctype[0].primitivetype[1].idx 10003
+doctype[0].primitivetype[1].name "byte"
+doctype[0].primitivetype[2].idx 10004
+doctype[0].primitivetype[2].name "double"
+doctype[0].primitivetype[3].idx 10005
+doctype[0].primitivetype[3].name "float"
+doctype[0].primitivetype[4].idx 10006
+doctype[0].primitivetype[4].name "float16"
+doctype[0].primitivetype[5].idx 10007
+doctype[0].primitivetype[5].name "int"
+doctype[0].primitivetype[6].idx 10008
+doctype[0].primitivetype[6].name "long"
+doctype[0].primitivetype[7].idx 10010
+doctype[0].primitivetype[7].name "predicate"
+doctype[0].primitivetype[8].idx 10011
+doctype[0].primitivetype[8].name "raw"
+doctype[0].primitivetype[9].idx 10012
+doctype[0].primitivetype[9].name "string"
+doctype[0].primitivetype[10].idx 10014
+doctype[0].primitivetype[10].name "uri"
+doctype[0].wsettype[0].idx 10013
+doctype[0].wsettype[0].elementtype 10012
+doctype[0].wsettype[0].createifnonexistent true
+doctype[0].wsettype[0].removeifzero true
+doctype[0].wsettype[0].internalid 18
+doctype[0].structtype[0].idx 10001
+doctype[0].structtype[0].name "document.header"
+doctype[0].structtype[0].internalid -284186494
+doctype[0].structtype[1].idx 10009
+doctype[0].structtype[1].name "position"
+doctype[0].structtype[1].field[0].name "x"
+doctype[0].structtype[1].field[0].internalid 914677694
+doctype[0].structtype[1].field[0].type 10007
+doctype[0].structtype[1].field[1].name "y"
+doctype[0].structtype[1].field[1].internalid 900009410
+doctype[0].structtype[1].field[1].type 10007
+doctype[0].structtype[1].internalid 1381038251
+doctype[1].name "types"
+doctype[1].idx 10015
+doctype[1].internalid -853072901
+doctype[1].inherits[0].idx 10000
+doctype[1].contentstruct 10016
+doctype[1].fieldsets{[document]}.fields[0] "Folders"
+doctype[1].fieldsets{[document]}.fields[1] "abyte"
+doctype[1].fieldsets{[document]}.fields[2] "album0"
+doctype[1].fieldsets{[document]}.fields[3] "album1"
+doctype[1].fieldsets{[document]}.fields[4] "along"
+doctype[1].fieldsets{[document]}.fields[5] "arrarr"
+doctype[1].fieldsets{[document]}.fields[6] "arrayfield"
+doctype[1].fieldsets{[document]}.fields[7] "arraymapfield"
+doctype[1].fieldsets{[document]}.fields[8] "complexarray"
+doctype[1].fieldsets{[document]}.fields[9] "doublemapfield"
+doctype[1].fieldsets{[document]}.fields[10] "floatmapfield"
+doctype[1].fieldsets{[document]}.fields[11] "intmapfield"
+doctype[1].fieldsets{[document]}.fields[12] "juletre"
+doctype[1].fieldsets{[document]}.fields[13] "longmapfield"
+doctype[1].fieldsets{[document]}.fields[14] "maparr"
+doctype[1].fieldsets{[document]}.fields[15] "mystructarr"
+doctype[1].fieldsets{[document]}.fields[16] "mystructfield"
+doctype[1].fieldsets{[document]}.fields[17] "mystructmap"
+doctype[1].fieldsets{[document]}.fields[18] "pos"
+doctype[1].fieldsets{[document]}.fields[19] "setfield"
+doctype[1].fieldsets{[document]}.fields[20] "setfield2"
+doctype[1].fieldsets{[document]}.fields[21] "setfield3"
+doctype[1].fieldsets{[document]}.fields[22] "setfield4"
+doctype[1].fieldsets{[document]}.fields[23] "stringmapfield"
+doctype[1].fieldsets{[document]}.fields[24] "structarrayfield"
+doctype[1].fieldsets{[document]}.fields[25] "structfield"
+doctype[1].fieldsets{[document]}.fields[26] "tagfield"
+doctype[1].arraytype[0].idx 10017
+doctype[1].arraytype[0].elementtype 10007
+doctype[1].arraytype[0].internalid -1245117006
+doctype[1].arraytype[1].idx 10024
+doctype[1].arraytype[1].elementtype 10023
+doctype[1].arraytype[1].internalid -1244829667
+doctype[1].arraytype[2].idx 10031
+doctype[1].arraytype[2].elementtype 10007
+doctype[1].arraytype[2].internalid -1245117006
+doctype[1].arraytype[3].idx 10032
+doctype[1].arraytype[3].elementtype 10033
+doctype[1].arraytype[3].internalid -794985308
+doctype[1].arraytype[4].idx 10033
+doctype[1].arraytype[4].elementtype 10034
+doctype[1].arraytype[4].internalid 1707615575
+doctype[1].arraytype[5].idx 10034
+doctype[1].arraytype[5].elementtype 10012
+doctype[1].arraytype[5].internalid -1486737430
+doctype[1].arraytype[6].idx 10035
+doctype[1].arraytype[6].elementtype 10036
+doctype[1].arraytype[6].internalid 69621385
+doctype[1].arraytype[7].idx 10037
+doctype[1].arraytype[7].elementtype 10038
+doctype[1].arraytype[7].internalid 1416345047
+doctype[1].arraytype[8].idx 10039
+doctype[1].arraytype[8].elementtype 10040
+doctype[1].arraytype[8].internalid 1707615575
+doctype[1].arraytype[9].idx 10040
+doctype[1].arraytype[9].elementtype 10012
+doctype[1].arraytype[9].internalid -1486737430
+doctype[1].arraytype[10].idx 10042
+doctype[1].arraytype[10].elementtype 10003
+doctype[1].arraytype[10].internalid 49942803
+doctype[1].arraytype[11].idx 10045
+doctype[1].arraytype[11].elementtype 10041
+doctype[1].arraytype[11].internalid 759956026
+doctype[1].maptype[0].idx 10025
+doctype[1].maptype[0].keytype 10012
+doctype[1].maptype[0].valuetype 10012
+doctype[1].maptype[0].internalid 339965458
+doctype[1].maptype[1].idx 10026
+doctype[1].maptype[1].keytype 10012
+doctype[1].maptype[1].valuetype 10007
+doctype[1].maptype[1].internalid -1584287606
+doctype[1].maptype[2].idx 10027
+doctype[1].maptype[2].keytype 10012
+doctype[1].maptype[2].valuetype 10005
+doctype[1].maptype[2].internalid 2125154557
+doctype[1].maptype[3].idx 10028
+doctype[1].maptype[3].keytype 10007
+doctype[1].maptype[3].valuetype 10008
+doctype[1].maptype[3].internalid -1715531035
+doctype[1].maptype[4].idx 10029
+doctype[1].maptype[4].keytype 10007
+doctype[1].maptype[4].valuetype 10004
+doctype[1].maptype[4].internalid 2138385264
+doctype[1].maptype[5].idx 10030
+doctype[1].maptype[5].keytype 10012
+doctype[1].maptype[5].valuetype 10031
+doctype[1].maptype[5].internalid 435886609
+doctype[1].maptype[6].idx 10036
+doctype[1].maptype[6].keytype 10012
+doctype[1].maptype[6].valuetype 10012
+doctype[1].maptype[6].internalid 339965458
+doctype[1].maptype[7].idx 10038
+doctype[1].maptype[7].keytype 10007
+doctype[1].maptype[7].valuetype 10039
+doctype[1].maptype[7].internalid -372512406
+doctype[1].maptype[8].idx 10043
+doctype[1].maptype[8].keytype 10012
+doctype[1].maptype[8].valuetype 10012
+doctype[1].maptype[8].internalid 339965458
+doctype[1].maptype[9].idx 10044
+doctype[1].maptype[9].keytype 10007
+doctype[1].maptype[9].valuetype 10041
+doctype[1].maptype[9].internalid 1901258752
+doctype[1].maptype[10].idx 10046
+doctype[1].maptype[10].keytype 10007
+doctype[1].maptype[10].valuetype 10047
+doctype[1].maptype[10].internalid -389833101
+doctype[1].maptype[11].idx 10048
+doctype[1].maptype[11].keytype 10012
+doctype[1].maptype[11].valuetype 10008
+doctype[1].maptype[11].internalid -1865479609
+doctype[1].wsettype[0].idx 10018
+doctype[1].wsettype[0].elementtype 10012
+doctype[1].wsettype[0].createifnonexistent false
+doctype[1].wsettype[0].removeifzero false
+doctype[1].wsettype[0].internalid 1328286588
+doctype[1].wsettype[1].idx 10019
+doctype[1].wsettype[1].elementtype 10012
+doctype[1].wsettype[1].createifnonexistent true
+doctype[1].wsettype[1].removeifzero true
+doctype[1].wsettype[1].internalid 18
+doctype[1].wsettype[2].idx 10020
+doctype[1].wsettype[2].elementtype 10012
+doctype[1].wsettype[2].createifnonexistent false
+doctype[1].wsettype[2].removeifzero true
+doctype[1].wsettype[2].internalid 2125328771
+doctype[1].wsettype[3].idx 10021
+doctype[1].wsettype[3].elementtype 10012
+doctype[1].wsettype[3].createifnonexistent true
+doctype[1].wsettype[3].removeifzero false
+doctype[1].wsettype[3].internalid 2065577986
+doctype[1].wsettype[4].idx 10022
+doctype[1].wsettype[4].elementtype 10012
+doctype[1].wsettype[4].createifnonexistent true
+doctype[1].wsettype[4].removeifzero true
+doctype[1].wsettype[4].internalid 18
+doctype[1].wsettype[5].idx 10049
+doctype[1].wsettype[5].elementtype 10012
+doctype[1].wsettype[5].createifnonexistent true
+doctype[1].wsettype[5].removeifzero true
+doctype[1].wsettype[5].internalid 18
+doctype[1].wsettype[6].idx 10050
+doctype[1].wsettype[6].elementtype 10012
+doctype[1].wsettype[6].createifnonexistent true
+doctype[1].wsettype[6].removeifzero true
+doctype[1].wsettype[6].internalid 18
+doctype[1].structtype[0].idx 10023
+doctype[1].structtype[0].name "sct"
+doctype[1].structtype[0].field[0].name "s1"
+doctype[1].structtype[0].field[0].internalid 2146820765
+doctype[1].structtype[0].field[0].type 10012
+doctype[1].structtype[0].field[1].name "s2"
+doctype[1].structtype[0].field[1].internalid 45366795
+doctype[1].structtype[0].field[1].type 10012
+doctype[1].structtype[0].internalid 109267174
+doctype[1].structtype[1].idx 10041
+doctype[1].structtype[1].name "mystruct"
+doctype[1].structtype[1].field[0].name "bytearr"
+doctype[1].structtype[1].field[0].internalid 1079701754
+doctype[1].structtype[1].field[0].type 10042
+doctype[1].structtype[1].field[1].name "mymap"
+doctype[1].structtype[1].field[1].internalid 1954178122
+doctype[1].structtype[1].field[1].type 10043
+doctype[1].structtype[1].field[2].name "title"
+doctype[1].structtype[1].field[2].internalid 567626448
+doctype[1].structtype[1].field[2].type 10012
+doctype[1].structtype[1].field[3].name "structfield"
+doctype[1].structtype[1].field[3].internalid 1726890940
+doctype[1].structtype[1].field[3].type 10012
+doctype[1].structtype[1].internalid -2092985853
+doctype[1].structtype[2].idx 10047
+doctype[1].structtype[2].name "folder"
+doctype[1].structtype[2].field[0].name "Version"
+doctype[1].structtype[2].field[0].internalid 64430502
+doctype[1].structtype[2].field[0].type 10007
+doctype[1].structtype[2].field[1].name "Name"
+doctype[1].structtype[2].field[1].internalid 2002760220
+doctype[1].structtype[2].field[1].type 10012
+doctype[1].structtype[2].field[2].name "FlagsCounter"
+doctype[1].structtype[2].field[2].internalid 1741227606
+doctype[1].structtype[2].field[2].type 10048
+doctype[1].structtype[2].field[3].name "anotherfolder"
+doctype[1].structtype[2].field[3].internalid 1582421848
+doctype[1].structtype[2].field[3].type 10047
+doctype[1].structtype[2].internalid 294108848
+doctype[1].structtype[3].idx 10016
+doctype[1].structtype[3].name "types.header"
+doctype[1].structtype[3].field[0].name "abyte"
+doctype[1].structtype[3].field[0].internalid 110138156
+doctype[1].structtype[3].field[0].type 10003
+doctype[1].structtype[3].field[1].name "along"
+doctype[1].structtype[3].field[1].internalid 1206464520
+doctype[1].structtype[3].field[1].type 10008
+doctype[1].structtype[3].field[2].name "arrayfield"
+doctype[1].structtype[3].field[2].internalid 965790107
+doctype[1].structtype[3].field[2].type 10017
+doctype[1].structtype[3].field[3].name "setfield"
+doctype[1].structtype[3].field[3].internalid 761581914
+doctype[1].structtype[3].field[3].type 10018
+doctype[1].structtype[3].field[4].name "pos"
+doctype[1].structtype[3].field[4].internalid 1041567475
+doctype[1].structtype[3].field[4].type 10009
+doctype[1].structtype[3].field[5].name "setfield2"
+doctype[1].structtype[3].field[5].internalid 1066659198
+doctype[1].structtype[3].field[5].type 10019
+doctype[1].structtype[3].field[6].name "setfield3"
+doctype[1].structtype[3].field[6].internalid 1180155772
+doctype[1].structtype[3].field[6].type 10020
+doctype[1].structtype[3].field[7].name "setfield4"
+doctype[1].structtype[3].field[7].internalid 1254131631
+doctype[1].structtype[3].field[7].type 10021
+doctype[1].structtype[3].field[8].name "tagfield"
+doctype[1].structtype[3].field[8].internalid 1653562069
+doctype[1].structtype[3].field[8].type 10022
+doctype[1].structtype[3].field[9].name "structfield"
+doctype[1].structtype[3].field[9].internalid 486207386
+doctype[1].structtype[3].field[9].type 10023
+doctype[1].structtype[3].field[10].name "structarrayfield"
+doctype[1].structtype[3].field[10].internalid 335048518
+doctype[1].structtype[3].field[10].type 10024
+doctype[1].structtype[3].field[11].name "stringmapfield"
+doctype[1].structtype[3].field[11].internalid 117465687
+doctype[1].structtype[3].field[11].type 10025
+doctype[1].structtype[3].field[12].name "intmapfield"
+doctype[1].structtype[3].field[12].internalid 121004462
+doctype[1].structtype[3].field[12].type 10026
+doctype[1].structtype[3].field[13].name "floatmapfield"
+doctype[1].structtype[3].field[13].internalid 1239120925
+doctype[1].structtype[3].field[13].type 10027
+doctype[1].structtype[3].field[14].name "longmapfield"
+doctype[1].structtype[3].field[14].internalid 477718745
+doctype[1].structtype[3].field[14].type 10028
+doctype[1].structtype[3].field[15].name "doublemapfield"
+doctype[1].structtype[3].field[15].internalid 877047192
+doctype[1].structtype[3].field[15].type 10029
+doctype[1].structtype[3].field[16].name "arraymapfield"
+doctype[1].structtype[3].field[16].internalid 1670805928
+doctype[1].structtype[3].field[16].type 10030
+doctype[1].structtype[3].field[17].name "arrarr"
+doctype[1].structtype[3].field[17].internalid 1962567166
+doctype[1].structtype[3].field[17].type 10032
+doctype[1].structtype[3].field[18].name "maparr"
+doctype[1].structtype[3].field[18].internalid 904375219
+doctype[1].structtype[3].field[18].type 10035
+doctype[1].structtype[3].field[19].name "complexarray"
+doctype[1].structtype[3].field[19].internalid 795629533
+doctype[1].structtype[3].field[19].type 10037
+doctype[1].structtype[3].field[20].name "mystructfield"
+doctype[1].structtype[3].field[20].internalid 1348513378
+doctype[1].structtype[3].field[20].type 10041
+doctype[1].structtype[3].field[21].name "mystructmap"
+doctype[1].structtype[3].field[21].internalid 1511423250
+doctype[1].structtype[3].field[21].type 10044
+doctype[1].structtype[3].field[22].name "mystructarr"
+doctype[1].structtype[3].field[22].internalid 595856991
+doctype[1].structtype[3].field[22].type 10045
+doctype[1].structtype[3].field[23].name "Folders"
+doctype[1].structtype[3].field[23].internalid 34575524
+doctype[1].structtype[3].field[23].type 10046
+doctype[1].structtype[3].field[24].name "juletre"
+doctype[1].structtype[3].field[24].internalid 1039981530
+doctype[1].structtype[3].field[24].type 10008
+doctype[1].structtype[3].field[25].name "album0"
+doctype[1].structtype[3].field[25].internalid 764312262
+doctype[1].structtype[3].field[25].type 10049
+doctype[1].structtype[3].field[26].name "album1"
+doctype[1].structtype[3].field[26].internalid 1967160809
+doctype[1].structtype[3].field[26].type 10050
+doctype[1].structtype[3].field[27].name "other"
+doctype[1].structtype[3].field[27].internalid 2443357
+doctype[1].structtype[3].field[27].type 10008
+doctype[1].structtype[3].internalid 1328581348
diff --git a/config-model/src/test/configmodel/types/documenttypes_with_doc_field.cfg b/config-model/src/test/configmodel/types/documenttypes_with_doc_field.cfg
index 61c92eee8d1..15430101553 100644
--- a/config-model/src/test/configmodel/types/documenttypes_with_doc_field.cfg
+++ b/config-model/src/test/configmodel/types/documenttypes_with_doc_field.cfg
@@ -1,49 +1,65 @@
enablecompression false
usev8geopositions false
-documenttype[0].id -1368624373
-documenttype[0].name "other_doc"
-documenttype[0].version 0
-documenttype[0].headerstruct 1631005140
-documenttype[0].bodystruct 0
-documenttype[0].inherits[0].id 8
-documenttype[0].datatype[0].id 1631005140
-documenttype[0].datatype[0].type STRUCT
-documenttype[0].datatype[0].array.element.id 0
-documenttype[0].datatype[0].map.key.id 0
-documenttype[0].datatype[0].map.value.id 0
-documenttype[0].datatype[0].wset.key.id 0
-documenttype[0].datatype[0].wset.createifnonexistent false
-documenttype[0].datatype[0].wset.removeifzero false
-documenttype[0].datatype[0].annotationref.annotation.id 0
-documenttype[0].datatype[0].sstruct.name "other_doc.header"
-documenttype[0].datatype[0].sstruct.version 0
-documenttype[0].datatype[0].sstruct.compression.type NONE
-documenttype[0].datatype[0].sstruct.compression.level 0
-documenttype[0].datatype[0].sstruct.compression.threshold 95
-documenttype[0].datatype[0].sstruct.compression.minsize 200
-documenttype[1].id -853072901
-documenttype[1].name "types"
-documenttype[1].version 0
-documenttype[1].headerstruct 1328581348
-documenttype[1].bodystruct 0
-documenttype[1].inherits[0].id 8
-documenttype[1].datatype[0].id 1328581348
-documenttype[1].datatype[0].type STRUCT
-documenttype[1].datatype[0].array.element.id 0
-documenttype[1].datatype[0].map.key.id 0
-documenttype[1].datatype[0].map.value.id 0
-documenttype[1].datatype[0].wset.key.id 0
-documenttype[1].datatype[0].wset.createifnonexistent false
-documenttype[1].datatype[0].wset.removeifzero false
-documenttype[1].datatype[0].annotationref.annotation.id 0
-documenttype[1].datatype[0].sstruct.name "types.header"
-documenttype[1].datatype[0].sstruct.version 0
-documenttype[1].datatype[0].sstruct.compression.type NONE
-documenttype[1].datatype[0].sstruct.compression.level 0
-documenttype[1].datatype[0].sstruct.compression.threshold 95
-documenttype[1].datatype[0].sstruct.compression.minsize 200
-documenttype[1].datatype[0].sstruct.field[0].name "doc_field"
-documenttype[1].datatype[0].sstruct.field[0].id 819293364
-documenttype[1].datatype[0].sstruct.field[0].datatype -1368624373
-documenttype[1].datatype[0].sstruct.field[0].detailedtype ""
-documenttype[1].fieldsets{[document]}.fields[0] "doc_field"
+doctype[0].name "document"
+doctype[0].idx 10000
+doctype[0].internalid 8
+doctype[0].contentstruct 10001
+doctype[0].primitivetype[0].idx 10002
+doctype[0].primitivetype[0].name "bool"
+doctype[0].primitivetype[1].idx 10003
+doctype[0].primitivetype[1].name "byte"
+doctype[0].primitivetype[2].idx 10004
+doctype[0].primitivetype[2].name "double"
+doctype[0].primitivetype[3].idx 10005
+doctype[0].primitivetype[3].name "float"
+doctype[0].primitivetype[4].idx 10006
+doctype[0].primitivetype[4].name "float16"
+doctype[0].primitivetype[5].idx 10007
+doctype[0].primitivetype[5].name "int"
+doctype[0].primitivetype[6].idx 10008
+doctype[0].primitivetype[6].name "long"
+doctype[0].primitivetype[7].idx 10010
+doctype[0].primitivetype[7].name "predicate"
+doctype[0].primitivetype[8].idx 10011
+doctype[0].primitivetype[8].name "raw"
+doctype[0].primitivetype[9].idx 10012
+doctype[0].primitivetype[9].name "string"
+doctype[0].primitivetype[10].idx 10014
+doctype[0].primitivetype[10].name "uri"
+doctype[0].wsettype[0].idx 10013
+doctype[0].wsettype[0].elementtype 10012
+doctype[0].wsettype[0].createifnonexistent true
+doctype[0].wsettype[0].removeifzero true
+doctype[0].wsettype[0].internalid 18
+doctype[0].structtype[0].idx 10001
+doctype[0].structtype[0].name "document.header"
+doctype[0].structtype[0].internalid -284186494
+doctype[0].structtype[1].idx 10009
+doctype[0].structtype[1].name "position"
+doctype[0].structtype[1].field[0].name "x"
+doctype[0].structtype[1].field[0].internalid 914677694
+doctype[0].structtype[1].field[0].type 10007
+doctype[0].structtype[1].field[1].name "y"
+doctype[0].structtype[1].field[1].internalid 900009410
+doctype[0].structtype[1].field[1].type 10007
+doctype[0].structtype[1].internalid 1381038251
+doctype[1].name "other_doc"
+doctype[1].idx 10015
+doctype[1].internalid -1368624373
+doctype[1].inherits[0].idx 10000
+doctype[1].contentstruct 10016
+doctype[1].structtype[0].idx 10016
+doctype[1].structtype[0].name "other_doc.header"
+doctype[1].structtype[0].internalid 1631005140
+doctype[2].name "types"
+doctype[2].idx 10017
+doctype[2].internalid -853072901
+doctype[2].inherits[0].idx 10000
+doctype[2].contentstruct 10018
+doctype[2].fieldsets{[document]}.fields[0] "doc_field"
+doctype[2].structtype[0].idx 10018
+doctype[2].structtype[0].name "types.header"
+doctype[2].structtype[0].field[0].name "doc_field"
+doctype[2].structtype[0].field[0].internalid 819293364
+doctype[2].structtype[0].field[0].type 10015
+doctype[2].structtype[0].internalid 1328581348
diff --git a/config-model/src/test/configmodel/types/references/documenttypes_multiple_imported_fields.cfg b/config-model/src/test/configmodel/types/references/documenttypes_multiple_imported_fields.cfg
index d992839d5d9..1b5817e6f39 100644
--- a/config-model/src/test/configmodel/types/references/documenttypes_multiple_imported_fields.cfg
+++ b/config-model/src/test/configmodel/types/references/documenttypes_multiple_imported_fields.cfg
@@ -1,97 +1,98 @@
enablecompression false
usev8geopositions false
-documenttype[0].id 2987301
-documenttype[0].name "ad"
-documenttype[0].version 0
-documenttype[0].headerstruct 959075962
-documenttype[0].bodystruct 0
-documenttype[0].inherits[0].id 8
-documenttype[0].datatype[0].id 959075962
-documenttype[0].datatype[0].type STRUCT
-documenttype[0].datatype[0].array.element.id 0
-documenttype[0].datatype[0].map.key.id 0
-documenttype[0].datatype[0].map.value.id 0
-documenttype[0].datatype[0].wset.key.id 0
-documenttype[0].datatype[0].wset.createifnonexistent false
-documenttype[0].datatype[0].wset.removeifzero false
-documenttype[0].datatype[0].annotationref.annotation.id 0
-documenttype[0].datatype[0].sstruct.name "ad.header"
-documenttype[0].datatype[0].sstruct.version 0
-documenttype[0].datatype[0].sstruct.compression.type NONE
-documenttype[0].datatype[0].sstruct.compression.level 0
-documenttype[0].datatype[0].sstruct.compression.threshold 95
-documenttype[0].datatype[0].sstruct.compression.minsize 200
-documenttype[0].datatype[0].sstruct.field[0].name "campaign_ref"
-documenttype[0].datatype[0].sstruct.field[0].id 23963250
-documenttype[0].datatype[0].sstruct.field[0].datatype 595216861
-documenttype[0].datatype[0].sstruct.field[0].detailedtype ""
-documenttype[0].datatype[0].sstruct.field[1].name "person_ref"
-documenttype[0].datatype[0].sstruct.field[1].id 100779805
-documenttype[0].datatype[0].sstruct.field[1].datatype 542332920
-documenttype[0].datatype[0].sstruct.field[1].detailedtype ""
-documenttype[0].fieldsets{[document]}.fields[0] "campaign_ref"
-documenttype[0].fieldsets{[document]}.fields[1] "person_ref"
-documenttype[0].referencetype[0].id 595216861
-documenttype[0].referencetype[0].target_type_id -1318255918
-documenttype[0].referencetype[1].id 542332920
-documenttype[0].referencetype[1].target_type_id 443162583
-documenttype[0].importedfield[0].name "my_cool_field"
-documenttype[0].importedfield[1].name "my_swag_field"
-documenttype[0].importedfield[2].name "my_name"
-documenttype[1].id -1318255918
-documenttype[1].name "campaign"
-documenttype[1].version 0
-documenttype[1].headerstruct -2041471955
-documenttype[1].bodystruct 0
-documenttype[1].inherits[0].id 8
-documenttype[1].datatype[0].id -2041471955
-documenttype[1].datatype[0].type STRUCT
-documenttype[1].datatype[0].array.element.id 0
-documenttype[1].datatype[0].map.key.id 0
-documenttype[1].datatype[0].map.value.id 0
-documenttype[1].datatype[0].wset.key.id 0
-documenttype[1].datatype[0].wset.createifnonexistent false
-documenttype[1].datatype[0].wset.removeifzero false
-documenttype[1].datatype[0].annotationref.annotation.id 0
-documenttype[1].datatype[0].sstruct.name "campaign.header"
-documenttype[1].datatype[0].sstruct.version 0
-documenttype[1].datatype[0].sstruct.compression.type NONE
-documenttype[1].datatype[0].sstruct.compression.level 0
-documenttype[1].datatype[0].sstruct.compression.threshold 95
-documenttype[1].datatype[0].sstruct.compression.minsize 200
-documenttype[1].datatype[0].sstruct.field[0].name "cool_field"
-documenttype[1].datatype[0].sstruct.field[0].id 1588702436
-documenttype[1].datatype[0].sstruct.field[0].datatype 2
-documenttype[1].datatype[0].sstruct.field[0].detailedtype ""
-documenttype[1].datatype[0].sstruct.field[1].name "swag_field"
-documenttype[1].datatype[0].sstruct.field[1].id 1691224741
-documenttype[1].datatype[0].sstruct.field[1].datatype 4
-documenttype[1].datatype[0].sstruct.field[1].detailedtype ""
-documenttype[1].fieldsets{[document]}.fields[0] "cool_field"
-documenttype[1].fieldsets{[document]}.fields[1] "swag_field"
-documenttype[2].id 443162583
-documenttype[2].name "person"
-documenttype[2].version 0
-documenttype[2].headerstruct 3129224
-documenttype[2].bodystruct 0
-documenttype[2].inherits[0].id 8
-documenttype[2].datatype[0].id 3129224
-documenttype[2].datatype[0].type STRUCT
-documenttype[2].datatype[0].array.element.id 0
-documenttype[2].datatype[0].map.key.id 0
-documenttype[2].datatype[0].map.value.id 0
-documenttype[2].datatype[0].wset.key.id 0
-documenttype[2].datatype[0].wset.createifnonexistent false
-documenttype[2].datatype[0].wset.removeifzero false
-documenttype[2].datatype[0].annotationref.annotation.id 0
-documenttype[2].datatype[0].sstruct.name "person.header"
-documenttype[2].datatype[0].sstruct.version 0
-documenttype[2].datatype[0].sstruct.compression.type NONE
-documenttype[2].datatype[0].sstruct.compression.level 0
-documenttype[2].datatype[0].sstruct.compression.threshold 95
-documenttype[2].datatype[0].sstruct.compression.minsize 200
-documenttype[2].datatype[0].sstruct.field[0].name "name"
-documenttype[2].datatype[0].sstruct.field[0].id 1160796772
-documenttype[2].datatype[0].sstruct.field[0].datatype 2
-documenttype[2].datatype[0].sstruct.field[0].detailedtype ""
-documenttype[2].fieldsets{[document]}.fields[0] "name"
+doctype[0].name "document"
+doctype[0].idx 10000
+doctype[0].internalid 8
+doctype[0].contentstruct 10001
+doctype[0].primitivetype[0].idx 10002
+doctype[0].primitivetype[0].name "bool"
+doctype[0].primitivetype[1].idx 10003
+doctype[0].primitivetype[1].name "byte"
+doctype[0].primitivetype[2].idx 10004
+doctype[0].primitivetype[2].name "double"
+doctype[0].primitivetype[3].idx 10005
+doctype[0].primitivetype[3].name "float"
+doctype[0].primitivetype[4].idx 10006
+doctype[0].primitivetype[4].name "float16"
+doctype[0].primitivetype[5].idx 10007
+doctype[0].primitivetype[5].name "int"
+doctype[0].primitivetype[6].idx 10008
+doctype[0].primitivetype[6].name "long"
+doctype[0].primitivetype[7].idx 10010
+doctype[0].primitivetype[7].name "predicate"
+doctype[0].primitivetype[8].idx 10011
+doctype[0].primitivetype[8].name "raw"
+doctype[0].primitivetype[9].idx 10012
+doctype[0].primitivetype[9].name "string"
+doctype[0].primitivetype[10].idx 10014
+doctype[0].primitivetype[10].name "uri"
+doctype[0].wsettype[0].idx 10013
+doctype[0].wsettype[0].elementtype 10012
+doctype[0].wsettype[0].createifnonexistent true
+doctype[0].wsettype[0].removeifzero true
+doctype[0].wsettype[0].internalid 18
+doctype[0].structtype[0].idx 10001
+doctype[0].structtype[0].name "document.header"
+doctype[0].structtype[0].internalid -284186494
+doctype[0].structtype[1].idx 10009
+doctype[0].structtype[1].name "position"
+doctype[0].structtype[1].field[0].name "x"
+doctype[0].structtype[1].field[0].internalid 914677694
+doctype[0].structtype[1].field[0].type 10007
+doctype[0].structtype[1].field[1].name "y"
+doctype[0].structtype[1].field[1].internalid 900009410
+doctype[0].structtype[1].field[1].type 10007
+doctype[0].structtype[1].internalid 1381038251
+doctype[1].name "ad"
+doctype[1].idx 10015
+doctype[1].internalid 2987301
+doctype[1].inherits[0].idx 10000
+doctype[1].contentstruct 10016
+doctype[1].fieldsets{[document]}.fields[0] "campaign_ref"
+doctype[1].fieldsets{[document]}.fields[1] "person_ref"
+doctype[1].importedfield[0].name "my_cool_field"
+doctype[1].importedfield[1].name "my_swag_field"
+doctype[1].importedfield[2].name "my_name"
+doctype[1].documentref[0].idx 10017
+doctype[1].documentref[0].targettype 10018
+doctype[1].documentref[0].internalid 595216861
+doctype[1].documentref[1].idx 10019
+doctype[1].documentref[1].targettype 10020
+doctype[1].documentref[1].internalid 542332920
+doctype[1].structtype[0].idx 10016
+doctype[1].structtype[0].name "ad.header"
+doctype[1].structtype[0].field[0].name "campaign_ref"
+doctype[1].structtype[0].field[0].internalid 23963250
+doctype[1].structtype[0].field[0].type 10017
+doctype[1].structtype[0].field[1].name "person_ref"
+doctype[1].structtype[0].field[1].internalid 100779805
+doctype[1].structtype[0].field[1].type 10019
+doctype[1].structtype[0].internalid 959075962
+doctype[2].name "campaign"
+doctype[2].idx 10018
+doctype[2].internalid -1318255918
+doctype[2].inherits[0].idx 10000
+doctype[2].contentstruct 10021
+doctype[2].fieldsets{[document]}.fields[0] "cool_field"
+doctype[2].fieldsets{[document]}.fields[1] "swag_field"
+doctype[2].structtype[0].idx 10021
+doctype[2].structtype[0].name "campaign.header"
+doctype[2].structtype[0].field[0].name "cool_field"
+doctype[2].structtype[0].field[0].internalid 1588702436
+doctype[2].structtype[0].field[0].type 10012
+doctype[2].structtype[0].field[1].name "swag_field"
+doctype[2].structtype[0].field[1].internalid 1691224741
+doctype[2].structtype[0].field[1].type 10008
+doctype[2].structtype[0].internalid -2041471955
+doctype[3].name "person"
+doctype[3].idx 10020
+doctype[3].internalid 443162583
+doctype[3].inherits[0].idx 10000
+doctype[3].contentstruct 10022
+doctype[3].fieldsets{[document]}.fields[0] "name"
+doctype[3].structtype[0].idx 10022
+doctype[3].structtype[0].name "person.header"
+doctype[3].structtype[0].field[0].name "name"
+doctype[3].structtype[0].field[0].internalid 1160796772
+doctype[3].structtype[0].field[0].type 10012
+doctype[3].structtype[0].internalid 3129224
diff --git a/config-model/src/test/configmodel/types/references/documenttypes_refs_to_other_types.cfg b/config-model/src/test/configmodel/types/references/documenttypes_refs_to_other_types.cfg
index 68ed924615f..1c5d4d41819 100644
--- a/config-model/src/test/configmodel/types/references/documenttypes_refs_to_other_types.cfg
+++ b/config-model/src/test/configmodel/types/references/documenttypes_refs_to_other_types.cfg
@@ -1,79 +1,83 @@
enablecompression false
usev8geopositions false
-documenttype[0].id 2987301
-documenttype[0].name "ad"
-documenttype[0].version 0
-documenttype[0].headerstruct 959075962
-documenttype[0].bodystruct 0
-documenttype[0].inherits[0].id 8
-documenttype[0].datatype[0].id 959075962
-documenttype[0].datatype[0].type STRUCT
-documenttype[0].datatype[0].array.element.id 0
-documenttype[0].datatype[0].map.key.id 0
-documenttype[0].datatype[0].map.value.id 0
-documenttype[0].datatype[0].wset.key.id 0
-documenttype[0].datatype[0].wset.createifnonexistent false
-documenttype[0].datatype[0].wset.removeifzero false
-documenttype[0].datatype[0].annotationref.annotation.id 0
-documenttype[0].datatype[0].sstruct.name "ad.header"
-documenttype[0].datatype[0].sstruct.version 0
-documenttype[0].datatype[0].sstruct.compression.type NONE
-documenttype[0].datatype[0].sstruct.compression.level 0
-documenttype[0].datatype[0].sstruct.compression.threshold 95
-documenttype[0].datatype[0].sstruct.compression.minsize 200
-documenttype[0].datatype[0].sstruct.field[0].name "campaign_ref"
-documenttype[0].datatype[0].sstruct.field[0].id 23963250
-documenttype[0].datatype[0].sstruct.field[0].datatype 595216861
-documenttype[0].datatype[0].sstruct.field[0].detailedtype ""
-documenttype[0].datatype[0].sstruct.field[1].name "person_ref"
-documenttype[0].datatype[0].sstruct.field[1].id 100779805
-documenttype[0].datatype[0].sstruct.field[1].datatype 542332920
-documenttype[0].datatype[0].sstruct.field[1].detailedtype ""
-documenttype[0].fieldsets{[document]}.fields[0] "campaign_ref"
-documenttype[0].fieldsets{[document]}.fields[1] "person_ref"
-documenttype[0].referencetype[0].id 595216861
-documenttype[0].referencetype[0].target_type_id -1318255918
-documenttype[0].referencetype[1].id 542332920
-documenttype[0].referencetype[1].target_type_id 443162583
-documenttype[1].id -1318255918
-documenttype[1].name "campaign"
-documenttype[1].version 0
-documenttype[1].headerstruct -2041471955
-documenttype[1].bodystruct 0
-documenttype[1].inherits[0].id 8
-documenttype[1].datatype[0].id -2041471955
-documenttype[1].datatype[0].type STRUCT
-documenttype[1].datatype[0].array.element.id 0
-documenttype[1].datatype[0].map.key.id 0
-documenttype[1].datatype[0].map.value.id 0
-documenttype[1].datatype[0].wset.key.id 0
-documenttype[1].datatype[0].wset.createifnonexistent false
-documenttype[1].datatype[0].wset.removeifzero false
-documenttype[1].datatype[0].annotationref.annotation.id 0
-documenttype[1].datatype[0].sstruct.name "campaign.header"
-documenttype[1].datatype[0].sstruct.version 0
-documenttype[1].datatype[0].sstruct.compression.type NONE
-documenttype[1].datatype[0].sstruct.compression.level 0
-documenttype[1].datatype[0].sstruct.compression.threshold 95
-documenttype[1].datatype[0].sstruct.compression.minsize 200
-documenttype[2].id 443162583
-documenttype[2].name "person"
-documenttype[2].version 0
-documenttype[2].headerstruct 3129224
-documenttype[2].bodystruct 0
-documenttype[2].inherits[0].id 8
-documenttype[2].datatype[0].id 3129224
-documenttype[2].datatype[0].type STRUCT
-documenttype[2].datatype[0].array.element.id 0
-documenttype[2].datatype[0].map.key.id 0
-documenttype[2].datatype[0].map.value.id 0
-documenttype[2].datatype[0].wset.key.id 0
-documenttype[2].datatype[0].wset.createifnonexistent false
-documenttype[2].datatype[0].wset.removeifzero false
-documenttype[2].datatype[0].annotationref.annotation.id 0
-documenttype[2].datatype[0].sstruct.name "person.header"
-documenttype[2].datatype[0].sstruct.version 0
-documenttype[2].datatype[0].sstruct.compression.type NONE
-documenttype[2].datatype[0].sstruct.compression.level 0
-documenttype[2].datatype[0].sstruct.compression.threshold 95
-documenttype[2].datatype[0].sstruct.compression.minsize 200
+doctype[0].name "document"
+doctype[0].idx 10000
+doctype[0].internalid 8
+doctype[0].contentstruct 10001
+doctype[0].primitivetype[0].idx 10002
+doctype[0].primitivetype[0].name "bool"
+doctype[0].primitivetype[1].idx 10003
+doctype[0].primitivetype[1].name "byte"
+doctype[0].primitivetype[2].idx 10004
+doctype[0].primitivetype[2].name "double"
+doctype[0].primitivetype[3].idx 10005
+doctype[0].primitivetype[3].name "float"
+doctype[0].primitivetype[4].idx 10006
+doctype[0].primitivetype[4].name "float16"
+doctype[0].primitivetype[5].idx 10007
+doctype[0].primitivetype[5].name "int"
+doctype[0].primitivetype[6].idx 10008
+doctype[0].primitivetype[6].name "long"
+doctype[0].primitivetype[7].idx 10010
+doctype[0].primitivetype[7].name "predicate"
+doctype[0].primitivetype[8].idx 10011
+doctype[0].primitivetype[8].name "raw"
+doctype[0].primitivetype[9].idx 10012
+doctype[0].primitivetype[9].name "string"
+doctype[0].primitivetype[10].idx 10014
+doctype[0].primitivetype[10].name "uri"
+doctype[0].wsettype[0].idx 10013
+doctype[0].wsettype[0].elementtype 10012
+doctype[0].wsettype[0].createifnonexistent true
+doctype[0].wsettype[0].removeifzero true
+doctype[0].wsettype[0].internalid 18
+doctype[0].structtype[0].idx 10001
+doctype[0].structtype[0].name "document.header"
+doctype[0].structtype[0].internalid -284186494
+doctype[0].structtype[1].idx 10009
+doctype[0].structtype[1].name "position"
+doctype[0].structtype[1].field[0].name "x"
+doctype[0].structtype[1].field[0].internalid 914677694
+doctype[0].structtype[1].field[0].type 10007
+doctype[0].structtype[1].field[1].name "y"
+doctype[0].structtype[1].field[1].internalid 900009410
+doctype[0].structtype[1].field[1].type 10007
+doctype[0].structtype[1].internalid 1381038251
+doctype[1].name "ad"
+doctype[1].idx 10015
+doctype[1].internalid 2987301
+doctype[1].inherits[0].idx 10000
+doctype[1].contentstruct 10016
+doctype[1].fieldsets{[document]}.fields[0] "campaign_ref"
+doctype[1].fieldsets{[document]}.fields[1] "person_ref"
+doctype[1].documentref[0].idx 10017
+doctype[1].documentref[0].targettype 10018
+doctype[1].documentref[0].internalid 595216861
+doctype[1].documentref[1].idx 10019
+doctype[1].documentref[1].targettype 10020
+doctype[1].documentref[1].internalid 542332920
+doctype[1].structtype[0].idx 10016
+doctype[1].structtype[0].name "ad.header"
+doctype[1].structtype[0].field[0].name "campaign_ref"
+doctype[1].structtype[0].field[0].internalid 23963250
+doctype[1].structtype[0].field[0].type 10017
+doctype[1].structtype[0].field[1].name "person_ref"
+doctype[1].structtype[0].field[1].internalid 100779805
+doctype[1].structtype[0].field[1].type 10019
+doctype[1].structtype[0].internalid 959075962
+doctype[2].name "campaign"
+doctype[2].idx 10018
+doctype[2].internalid -1318255918
+doctype[2].inherits[0].idx 10000
+doctype[2].contentstruct 10021
+doctype[2].structtype[0].idx 10021
+doctype[2].structtype[0].name "campaign.header"
+doctype[2].structtype[0].internalid -2041471955
+doctype[3].name "person"
+doctype[3].idx 10020
+doctype[3].internalid 443162583
+doctype[3].inherits[0].idx 10000
+doctype[3].contentstruct 10022
+doctype[3].structtype[0].idx 10022
+doctype[3].structtype[0].name "person.header"
+doctype[3].structtype[0].internalid 3129224
diff --git a/config-model/src/test/configmodel/types/references/documenttypes_refs_to_same_type.cfg b/config-model/src/test/configmodel/types/references/documenttypes_refs_to_same_type.cfg
index 6415e62cd7e..2f178c55bfd 100644
--- a/config-model/src/test/configmodel/types/references/documenttypes_refs_to_same_type.cfg
+++ b/config-model/src/test/configmodel/types/references/documenttypes_refs_to_same_type.cfg
@@ -1,56 +1,72 @@
enablecompression false
usev8geopositions false
-documenttype[0].id 2987301
-documenttype[0].name "ad"
-documenttype[0].version 0
-documenttype[0].headerstruct 959075962
-documenttype[0].bodystruct 0
-documenttype[0].inherits[0].id 8
-documenttype[0].datatype[0].id 959075962
-documenttype[0].datatype[0].type STRUCT
-documenttype[0].datatype[0].array.element.id 0
-documenttype[0].datatype[0].map.key.id 0
-documenttype[0].datatype[0].map.value.id 0
-documenttype[0].datatype[0].wset.key.id 0
-documenttype[0].datatype[0].wset.createifnonexistent false
-documenttype[0].datatype[0].wset.removeifzero false
-documenttype[0].datatype[0].annotationref.annotation.id 0
-documenttype[0].datatype[0].sstruct.name "ad.header"
-documenttype[0].datatype[0].sstruct.version 0
-documenttype[0].datatype[0].sstruct.compression.type NONE
-documenttype[0].datatype[0].sstruct.compression.level 0
-documenttype[0].datatype[0].sstruct.compression.threshold 95
-documenttype[0].datatype[0].sstruct.compression.minsize 200
-documenttype[0].datatype[0].sstruct.field[0].name "campaign_ref"
-documenttype[0].datatype[0].sstruct.field[0].id 23963250
-documenttype[0].datatype[0].sstruct.field[0].datatype 595216861
-documenttype[0].datatype[0].sstruct.field[0].detailedtype ""
-documenttype[0].datatype[0].sstruct.field[1].name "other_campaign_ref"
-documenttype[0].datatype[0].sstruct.field[1].id 874751172
-documenttype[0].datatype[0].sstruct.field[1].datatype 595216861
-documenttype[0].datatype[0].sstruct.field[1].detailedtype ""
-documenttype[0].fieldsets{[document]}.fields[0] "campaign_ref"
-documenttype[0].fieldsets{[document]}.fields[1] "other_campaign_ref"
-documenttype[0].referencetype[0].id 595216861
-documenttype[0].referencetype[0].target_type_id -1318255918
-documenttype[1].id -1318255918
-documenttype[1].name "campaign"
-documenttype[1].version 0
-documenttype[1].headerstruct -2041471955
-documenttype[1].bodystruct 0
-documenttype[1].inherits[0].id 8
-documenttype[1].datatype[0].id -2041471955
-documenttype[1].datatype[0].type STRUCT
-documenttype[1].datatype[0].array.element.id 0
-documenttype[1].datatype[0].map.key.id 0
-documenttype[1].datatype[0].map.value.id 0
-documenttype[1].datatype[0].wset.key.id 0
-documenttype[1].datatype[0].wset.createifnonexistent false
-documenttype[1].datatype[0].wset.removeifzero false
-documenttype[1].datatype[0].annotationref.annotation.id 0
-documenttype[1].datatype[0].sstruct.name "campaign.header"
-documenttype[1].datatype[0].sstruct.version 0
-documenttype[1].datatype[0].sstruct.compression.type NONE
-documenttype[1].datatype[0].sstruct.compression.level 0
-documenttype[1].datatype[0].sstruct.compression.threshold 95
-documenttype[1].datatype[0].sstruct.compression.minsize 200
+doctype[0].name "document"
+doctype[0].idx 10000
+doctype[0].internalid 8
+doctype[0].contentstruct 10001
+doctype[0].primitivetype[0].idx 10002
+doctype[0].primitivetype[0].name "bool"
+doctype[0].primitivetype[1].idx 10003
+doctype[0].primitivetype[1].name "byte"
+doctype[0].primitivetype[2].idx 10004
+doctype[0].primitivetype[2].name "double"
+doctype[0].primitivetype[3].idx 10005
+doctype[0].primitivetype[3].name "float"
+doctype[0].primitivetype[4].idx 10006
+doctype[0].primitivetype[4].name "float16"
+doctype[0].primitivetype[5].idx 10007
+doctype[0].primitivetype[5].name "int"
+doctype[0].primitivetype[6].idx 10008
+doctype[0].primitivetype[6].name "long"
+doctype[0].primitivetype[7].idx 10010
+doctype[0].primitivetype[7].name "predicate"
+doctype[0].primitivetype[8].idx 10011
+doctype[0].primitivetype[8].name "raw"
+doctype[0].primitivetype[9].idx 10012
+doctype[0].primitivetype[9].name "string"
+doctype[0].primitivetype[10].idx 10014
+doctype[0].primitivetype[10].name "uri"
+doctype[0].wsettype[0].idx 10013
+doctype[0].wsettype[0].elementtype 10012
+doctype[0].wsettype[0].createifnonexistent true
+doctype[0].wsettype[0].removeifzero true
+doctype[0].wsettype[0].internalid 18
+doctype[0].structtype[0].idx 10001
+doctype[0].structtype[0].name "document.header"
+doctype[0].structtype[0].internalid -284186494
+doctype[0].structtype[1].idx 10009
+doctype[0].structtype[1].name "position"
+doctype[0].structtype[1].field[0].name "x"
+doctype[0].structtype[1].field[0].internalid 914677694
+doctype[0].structtype[1].field[0].type 10007
+doctype[0].structtype[1].field[1].name "y"
+doctype[0].structtype[1].field[1].internalid 900009410
+doctype[0].structtype[1].field[1].type 10007
+doctype[0].structtype[1].internalid 1381038251
+doctype[1].name "ad"
+doctype[1].idx 10015
+doctype[1].internalid 2987301
+doctype[1].inherits[0].idx 10000
+doctype[1].contentstruct 10016
+doctype[1].fieldsets{[document]}.fields[0] "campaign_ref"
+doctype[1].fieldsets{[document]}.fields[1] "other_campaign_ref"
+doctype[1].documentref[0].idx 10017
+doctype[1].documentref[0].targettype 10018
+doctype[1].documentref[0].internalid 595216861
+doctype[1].structtype[0].idx 10016
+doctype[1].structtype[0].name "ad.header"
+doctype[1].structtype[0].field[0].name "campaign_ref"
+doctype[1].structtype[0].field[0].internalid 23963250
+doctype[1].structtype[0].field[0].type 10017
+doctype[1].structtype[0].field[1].name "other_campaign_ref"
+doctype[1].structtype[0].field[1].internalid 874751172
+doctype[1].structtype[0].field[1].type 10017
+doctype[1].structtype[0].internalid 959075962
+doctype[2].name "campaign"
+doctype[2].idx 10018
+doctype[2].internalid -1318255918
+doctype[2].inherits[0].idx 10000
+doctype[2].contentstruct 10019
+doctype[2].structtype[0].idx 10019
+doctype[2].structtype[0].name "campaign.header"
+doctype[2].structtype[0].internalid -2041471955
diff --git a/config-model/src/test/derived/duplicate_struct/documenttypes.cfg b/config-model/src/test/derived/duplicate_struct/documenttypes.cfg
index 1b897214d73..867e1e70e7a 100644
--- a/config-model/src/test/derived/duplicate_struct/documenttypes.cfg
+++ b/config-model/src/test/derived/duplicate_struct/documenttypes.cfg
@@ -1,100 +1,88 @@
enablecompression false
usev8geopositions false
-documenttype[].id 97614088
-documenttype[].name "foo"
-documenttype[].version 0
-documenttype[].headerstruct -308552393
-documenttype[].bodystruct 0
-documenttype[].inherits[].id 8
-documenttype[].datatype[].id -2092985853
-documenttype[].datatype[].type STRUCT
-documenttype[].datatype[].array.element.id 0
-documenttype[].datatype[].map.key.id 0
-documenttype[].datatype[].map.value.id 0
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name "mystruct"
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].datatype[].sstruct.field[].name "name"
-documenttype[].datatype[].sstruct.field[].id 1160796772
-documenttype[].datatype[].sstruct.field[].datatype 2
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].datatype[].sstruct.field[].name "company"
-documenttype[].datatype[].sstruct.field[].id 2010814026
-documenttype[].datatype[].sstruct.field[].datatype 2
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].datatype[].id 759956026
-documenttype[].datatype[].type ARRAY
-documenttype[].datatype[].array.element.id -2092985853
-documenttype[].datatype[].map.key.id 0
-documenttype[].datatype[].map.value.id 0
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name ""
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].datatype[].id -308552393
-documenttype[].datatype[].type STRUCT
-documenttype[].datatype[].array.element.id 0
-documenttype[].datatype[].map.key.id 0
-documenttype[].datatype[].map.value.id 0
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name "foo.header"
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].datatype[].sstruct.field[].name "timestamp"
-documenttype[].datatype[].sstruct.field[].id 808678733
-documenttype[].datatype[].sstruct.field[].datatype 4
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].datatype[].sstruct.field[].name "mystuff"
-documenttype[].datatype[].sstruct.field[].id 885106505
-documenttype[].datatype[].sstruct.field[].datatype 759956026
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].fieldsets{[document]}.fields[] "mystuff"
-documenttype[].fieldsets{[document]}.fields[] "timestamp"
-documenttype[].id 378030095
-documenttype[].name "foobar"
-documenttype[].version 0
-documenttype[].headerstruct -1365874608
-documenttype[].bodystruct 0
-documenttype[].inherits[].id 8
-documenttype[].inherits[].id 97614088
-documenttype[].datatype[].id -1365874608
-documenttype[].datatype[].type STRUCT
-documenttype[].datatype[].array.element.id 0
-documenttype[].datatype[].map.key.id 0
-documenttype[].datatype[].map.value.id 0
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name "foobar.header"
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].datatype[].sstruct.field[].name "title"
-documenttype[].datatype[].sstruct.field[].id 567626448
-documenttype[].datatype[].sstruct.field[].datatype 2
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].fieldsets{[document]}.fields[] "mystuff"
-documenttype[].fieldsets{[document]}.fields[] "timestamp"
-documenttype[].fieldsets{[document]}.fields[] "title"
+doctype[].name "document"
+doctype[].idx 10000
+doctype[].internalid 8
+doctype[].contentstruct 10001
+doctype[].primitivetype[].idx 10002
+doctype[].primitivetype[].name "bool"
+doctype[].primitivetype[].idx 10003
+doctype[].primitivetype[].name "byte"
+doctype[].primitivetype[].idx 10004
+doctype[].primitivetype[].name "double"
+doctype[].primitivetype[].idx 10005
+doctype[].primitivetype[].name "float"
+doctype[].primitivetype[].idx 10006
+doctype[].primitivetype[].name "float16"
+doctype[].primitivetype[].idx 10007
+doctype[].primitivetype[].name "int"
+doctype[].primitivetype[].idx 10008
+doctype[].primitivetype[].name "long"
+doctype[].primitivetype[].idx 10010
+doctype[].primitivetype[].name "predicate"
+doctype[].primitivetype[].idx 10011
+doctype[].primitivetype[].name "raw"
+doctype[].primitivetype[].idx 10012
+doctype[].primitivetype[].name "string"
+doctype[].primitivetype[].idx 10014
+doctype[].primitivetype[].name "uri"
+doctype[].wsettype[].idx 10013
+doctype[].wsettype[].elementtype 10012
+doctype[].wsettype[].createifnonexistent true
+doctype[].wsettype[].removeifzero true
+doctype[].wsettype[].internalid 18
+doctype[].structtype[].idx 10001
+doctype[].structtype[].name "document.header"
+doctype[].structtype[].internalid -284186494
+doctype[].structtype[].idx 10009
+doctype[].structtype[].name "position"
+doctype[].structtype[].field[].name "x"
+doctype[].structtype[].field[].internalid 914677694
+doctype[].structtype[].field[].type 10007
+doctype[].structtype[].field[].name "y"
+doctype[].structtype[].field[].internalid 900009410
+doctype[].structtype[].field[].type 10007
+doctype[].structtype[].internalid 1381038251
+doctype[].name "foo"
+doctype[].idx 10015
+doctype[].internalid 97614088
+doctype[].inherits[].idx 10000
+doctype[].contentstruct 10016
+doctype[].fieldsets{[document]}.fields[] "mystuff"
+doctype[].fieldsets{[document]}.fields[] "timestamp"
+doctype[].arraytype[].idx 10017
+doctype[].arraytype[].elementtype 10018
+doctype[].arraytype[].internalid 759956026
+doctype[].structtype[].idx 10018
+doctype[].structtype[].name "mystruct"
+doctype[].structtype[].field[].name "name"
+doctype[].structtype[].field[].internalid 1160796772
+doctype[].structtype[].field[].type 10012
+doctype[].structtype[].field[].name "company"
+doctype[].structtype[].field[].internalid 2010814026
+doctype[].structtype[].field[].type 10012
+doctype[].structtype[].internalid -2092985853
+doctype[].structtype[].idx 10016
+doctype[].structtype[].name "foo.header"
+doctype[].structtype[].field[].name "timestamp"
+doctype[].structtype[].field[].internalid 808678733
+doctype[].structtype[].field[].type 10008
+doctype[].structtype[].field[].name "mystuff"
+doctype[].structtype[].field[].internalid 885106505
+doctype[].structtype[].field[].type 10017
+doctype[].structtype[].internalid -308552393
+doctype[].name "foobar"
+doctype[].idx 10019
+doctype[].internalid 378030095
+doctype[].inherits[].idx 10000
+doctype[].inherits[].idx 10015
+doctype[].contentstruct 10020
+doctype[].fieldsets{[document]}.fields[] "mystuff"
+doctype[].fieldsets{[document]}.fields[] "timestamp"
+doctype[].fieldsets{[document]}.fields[] "title"
+doctype[].structtype[].idx 10020
+doctype[].structtype[].name "foobar.header"
+doctype[].structtype[].field[].name "title"
+doctype[].structtype[].field[].internalid 567626448
+doctype[].structtype[].field[].type 10012
+doctype[].structtype[].internalid -1365874608
diff --git a/config-model/src/test/derived/imported_fields_inherited_reference/documenttypes.cfg b/config-model/src/test/derived/imported_fields_inherited_reference/documenttypes.cfg
index c3ea1318d33..7a67640adfe 100644
--- a/config-model/src/test/derived/imported_fields_inherited_reference/documenttypes.cfg
+++ b/config-model/src/test/derived/imported_fields_inherited_reference/documenttypes.cfg
@@ -1,110 +1,99 @@
enablecompression false
usev8geopositions false
-documenttype[].id -94853056
-documenttype[].name "child_a"
-documenttype[].version 0
-documenttype[].headerstruct 867409663
-documenttype[].bodystruct 0
-documenttype[].inherits[].id 8
-documenttype[].datatype[].id 867409663
-documenttype[].datatype[].type STRUCT
-documenttype[].datatype[].array.element.id 0
-documenttype[].datatype[].map.key.id 0
-documenttype[].datatype[].map.value.id 0
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name "child_a.header"
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].datatype[].sstruct.field[].name "ref_from_a"
-documenttype[].datatype[].sstruct.field[].id 300427062
-documenttype[].datatype[].sstruct.field[].datatype 427398467
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].fieldsets{[document]}.fields[] "ref_from_a"
-documenttype[].referencetype[].id 427398467
-documenttype[].referencetype[].target_type_id 1175161836
-documenttype[].id -94852095
-documenttype[].name "child_b"
-documenttype[].version 0
-documenttype[].headerstruct 670896158
-documenttype[].bodystruct 0
-documenttype[].inherits[].id 8
-documenttype[].inherits[].id -94853056
-documenttype[].datatype[].id 670896158
-documenttype[].datatype[].type STRUCT
-documenttype[].datatype[].array.element.id 0
-documenttype[].datatype[].map.key.id 0
-documenttype[].datatype[].map.value.id 0
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name "child_b.header"
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].datatype[].sstruct.field[].name "ref_from_b"
-documenttype[].datatype[].sstruct.field[].id 185778735
-documenttype[].datatype[].sstruct.field[].datatype 427398467
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].fieldsets{[document]}.fields[] "ref_from_a"
-documenttype[].fieldsets{[document]}.fields[] "ref_from_b"
-documenttype[].id -94851134
-documenttype[].name "child_c"
-documenttype[].version 0
-documenttype[].headerstruct 474382653
-documenttype[].bodystruct 0
-documenttype[].inherits[].id 8
-documenttype[].inherits[].id -94852095
-documenttype[].datatype[].id 474382653
-documenttype[].datatype[].type STRUCT
-documenttype[].datatype[].array.element.id 0
-documenttype[].datatype[].map.key.id 0
-documenttype[].datatype[].map.value.id 0
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name "child_c.header"
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].fieldsets{[document]}.fields[] "ref_from_a"
-documenttype[].fieldsets{[document]}.fields[] "ref_from_b"
-documenttype[].importedfield[].name "from_a_int_field"
-documenttype[].importedfield[].name "from_b_int_field"
-documenttype[].id 1175161836
-documenttype[].name "parent"
-documenttype[].version 0
-documenttype[].headerstruct 836075987
-documenttype[].bodystruct 0
-documenttype[].inherits[].id 8
-documenttype[].datatype[].id 836075987
-documenttype[].datatype[].type STRUCT
-documenttype[].datatype[].array.element.id 0
-documenttype[].datatype[].map.key.id 0
-documenttype[].datatype[].map.value.id 0
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name "parent.header"
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].datatype[].sstruct.field[].name "int_field"
-documenttype[].datatype[].sstruct.field[].id 2128822283
-documenttype[].datatype[].sstruct.field[].datatype 0
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].fieldsets{[document]}.fields[] "int_field"
+doctype[].name "document"
+doctype[].idx 10000
+doctype[].internalid 8
+doctype[].contentstruct 10001
+doctype[].primitivetype[].idx 10002
+doctype[].primitivetype[].name "bool"
+doctype[].primitivetype[].idx 10003
+doctype[].primitivetype[].name "byte"
+doctype[].primitivetype[].idx 10004
+doctype[].primitivetype[].name "double"
+doctype[].primitivetype[].idx 10005
+doctype[].primitivetype[].name "float"
+doctype[].primitivetype[].idx 10006
+doctype[].primitivetype[].name "float16"
+doctype[].primitivetype[].idx 10007
+doctype[].primitivetype[].name "int"
+doctype[].primitivetype[].idx 10008
+doctype[].primitivetype[].name "long"
+doctype[].primitivetype[].idx 10010
+doctype[].primitivetype[].name "predicate"
+doctype[].primitivetype[].idx 10011
+doctype[].primitivetype[].name "raw"
+doctype[].primitivetype[].idx 10012
+doctype[].primitivetype[].name "string"
+doctype[].primitivetype[].idx 10014
+doctype[].primitivetype[].name "uri"
+doctype[].wsettype[].idx 10013
+doctype[].wsettype[].elementtype 10012
+doctype[].wsettype[].createifnonexistent true
+doctype[].wsettype[].removeifzero true
+doctype[].wsettype[].internalid 18
+doctype[].structtype[].idx 10001
+doctype[].structtype[].name "document.header"
+doctype[].structtype[].internalid -284186494
+doctype[].structtype[].idx 10009
+doctype[].structtype[].name "position"
+doctype[].structtype[].field[].name "x"
+doctype[].structtype[].field[].internalid 914677694
+doctype[].structtype[].field[].type 10007
+doctype[].structtype[].field[].name "y"
+doctype[].structtype[].field[].internalid 900009410
+doctype[].structtype[].field[].type 10007
+doctype[].structtype[].internalid 1381038251
+doctype[].name "child_a"
+doctype[].idx 10015
+doctype[].internalid -94853056
+doctype[].inherits[].idx 10000
+doctype[].contentstruct 10016
+doctype[].fieldsets{[document]}.fields[] "ref_from_a"
+doctype[].documentref[].idx 10017
+doctype[].documentref[].targettype 10018
+doctype[].documentref[].internalid 427398467
+doctype[].structtype[].idx 10016
+doctype[].structtype[].name "child_a.header"
+doctype[].structtype[].field[].name "ref_from_a"
+doctype[].structtype[].field[].internalid 300427062
+doctype[].structtype[].field[].type 10017
+doctype[].structtype[].internalid 867409663
+doctype[].name "child_b"
+doctype[].idx 10019
+doctype[].internalid -94852095
+doctype[].inherits[].idx 10000
+doctype[].inherits[].idx 10015
+doctype[].contentstruct 10020
+doctype[].fieldsets{[document]}.fields[] "ref_from_a"
+doctype[].fieldsets{[document]}.fields[] "ref_from_b"
+doctype[].structtype[].idx 10020
+doctype[].structtype[].name "child_b.header"
+doctype[].structtype[].field[].name "ref_from_b"
+doctype[].structtype[].field[].internalid 185778735
+doctype[].structtype[].field[].type 10017
+doctype[].structtype[].internalid 670896158
+doctype[].name "child_c"
+doctype[].idx 10021
+doctype[].internalid -94851134
+doctype[].inherits[].idx 10000
+doctype[].inherits[].idx 10019
+doctype[].contentstruct 10022
+doctype[].fieldsets{[document]}.fields[] "ref_from_a"
+doctype[].fieldsets{[document]}.fields[] "ref_from_b"
+doctype[].importedfield[].name "from_a_int_field"
+doctype[].importedfield[].name "from_b_int_field"
+doctype[].structtype[].idx 10022
+doctype[].structtype[].name "child_c.header"
+doctype[].structtype[].internalid 474382653
+doctype[].name "parent"
+doctype[].idx 10018
+doctype[].internalid 1175161836
+doctype[].inherits[].idx 10000
+doctype[].contentstruct 10023
+doctype[].fieldsets{[document]}.fields[] "int_field"
+doctype[].structtype[].idx 10023
+doctype[].structtype[].name "parent.header"
+doctype[].structtype[].field[].name "int_field"
+doctype[].structtype[].field[].internalid 2128822283
+doctype[].structtype[].field[].type 10007
+doctype[].structtype[].internalid 836075987
diff --git a/config-model/src/test/derived/inheritfromparent/documenttypes.cfg b/config-model/src/test/derived/inheritfromparent/documenttypes.cfg
index da65510ee5a..e8fd97671ff 100644
--- a/config-model/src/test/derived/inheritfromparent/documenttypes.cfg
+++ b/config-model/src/test/derived/inheritfromparent/documenttypes.cfg
@@ -1,79 +1,80 @@
enablecompression false
usev8geopositions false
-documenttype[].id 1175161836
-documenttype[].name "parent"
-documenttype[].version 0
-documenttype[].headerstruct 836075987
-documenttype[].bodystruct 0
-documenttype[].inherits[].id 8
-documenttype[].datatype[].id 836075987
-documenttype[].datatype[].type STRUCT
-documenttype[].datatype[].array.element.id 0
-documenttype[].datatype[].map.key.id 0
-documenttype[].datatype[].map.value.id 0
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name "parent.header"
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].datatype[].sstruct.field[].name "weight_src"
-documenttype[].datatype[].sstruct.field[].id 1225660233
-documenttype[].datatype[].sstruct.field[].datatype 1
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].datatype[].sstruct.field[].name "weight"
-documenttype[].datatype[].sstruct.field[].id 1001392207
-documenttype[].datatype[].sstruct.field[].datatype 1
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].datatype[].id 1091188812
-documenttype[].datatype[].type STRUCT
-documenttype[].datatype[].array.element.id 0
-documenttype[].datatype[].map.key.id 0
-documenttype[].datatype[].map.value.id 0
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name "parent_struct"
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].datatype[].sstruct.field[].name "parent_field"
-documenttype[].datatype[].sstruct.field[].id 933533022
-documenttype[].datatype[].sstruct.field[].datatype 2
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].fieldsets{[document]}.fields[] "weight_src"
-documenttype[].id 746267614
-documenttype[].name "child"
-documenttype[].version 0
-documenttype[].headerstruct 81425825
-documenttype[].bodystruct 0
-documenttype[].inherits[].id 8
-documenttype[].inherits[].id 1175161836
-documenttype[].datatype[].id 81425825
-documenttype[].datatype[].type STRUCT
-documenttype[].datatype[].array.element.id 0
-documenttype[].datatype[].map.key.id 0
-documenttype[].datatype[].map.value.id 0
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name "child.header"
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].datatype[].sstruct.field[].name "child_field"
-documenttype[].datatype[].sstruct.field[].id 1814271363
-documenttype[].datatype[].sstruct.field[].datatype 1091188812
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].fieldsets{[document]}.fields[] "child_field"
-documenttype[].fieldsets{[document]}.fields[] "weight_src"
+doctype[].name "document"
+doctype[].idx 10000
+doctype[].internalid 8
+doctype[].contentstruct 10001
+doctype[].primitivetype[].idx 10002
+doctype[].primitivetype[].name "bool"
+doctype[].primitivetype[].idx 10003
+doctype[].primitivetype[].name "byte"
+doctype[].primitivetype[].idx 10004
+doctype[].primitivetype[].name "double"
+doctype[].primitivetype[].idx 10005
+doctype[].primitivetype[].name "float"
+doctype[].primitivetype[].idx 10006
+doctype[].primitivetype[].name "float16"
+doctype[].primitivetype[].idx 10007
+doctype[].primitivetype[].name "int"
+doctype[].primitivetype[].idx 10008
+doctype[].primitivetype[].name "long"
+doctype[].primitivetype[].idx 10010
+doctype[].primitivetype[].name "predicate"
+doctype[].primitivetype[].idx 10011
+doctype[].primitivetype[].name "raw"
+doctype[].primitivetype[].idx 10012
+doctype[].primitivetype[].name "string"
+doctype[].primitivetype[].idx 10014
+doctype[].primitivetype[].name "uri"
+doctype[].wsettype[].idx 10013
+doctype[].wsettype[].elementtype 10012
+doctype[].wsettype[].createifnonexistent true
+doctype[].wsettype[].removeifzero true
+doctype[].wsettype[].internalid 18
+doctype[].structtype[].idx 10001
+doctype[].structtype[].name "document.header"
+doctype[].structtype[].internalid -284186494
+doctype[].structtype[].idx 10009
+doctype[].structtype[].name "position"
+doctype[].structtype[].field[].name "x"
+doctype[].structtype[].field[].internalid 914677694
+doctype[].structtype[].field[].type 10007
+doctype[].structtype[].field[].name "y"
+doctype[].structtype[].field[].internalid 900009410
+doctype[].structtype[].field[].type 10007
+doctype[].structtype[].internalid 1381038251
+doctype[].name "parent"
+doctype[].idx 10015
+doctype[].internalid 1175161836
+doctype[].inherits[].idx 10000
+doctype[].contentstruct 10016
+doctype[].fieldsets{[document]}.fields[] "weight_src"
+doctype[].structtype[].idx 10016
+doctype[].structtype[].name "parent.header"
+doctype[].structtype[].field[].name "weight_src"
+doctype[].structtype[].field[].internalid 1225660233
+doctype[].structtype[].field[].type 10005
+doctype[].structtype[].field[].name "weight"
+doctype[].structtype[].field[].internalid 1001392207
+doctype[].structtype[].field[].type 10005
+doctype[].structtype[].internalid 836075987
+doctype[].structtype[].idx 10017
+doctype[].structtype[].name "parent_struct"
+doctype[].structtype[].field[].name "parent_field"
+doctype[].structtype[].field[].internalid 933533022
+doctype[].structtype[].field[].type 10012
+doctype[].structtype[].internalid 1091188812
+doctype[].name "child"
+doctype[].idx 10018
+doctype[].internalid 746267614
+doctype[].inherits[].idx 10000
+doctype[].inherits[].idx 10015
+doctype[].contentstruct 10019
+doctype[].fieldsets{[document]}.fields[] "child_field"
+doctype[].fieldsets{[document]}.fields[] "weight_src"
+doctype[].structtype[].idx 10019
+doctype[].structtype[].name "child.header"
+doctype[].structtype[].field[].name "child_field"
+doctype[].structtype[].field[].internalid 1814271363
+doctype[].structtype[].field[].type 10017
+doctype[].structtype[].internalid 81425825
diff --git a/config-model/src/test/derived/multi_struct/documenttypes.cfg b/config-model/src/test/derived/multi_struct/documenttypes.cfg
index c358b2854ee..9ce19079177 100644
--- a/config-model/src/test/derived/multi_struct/documenttypes.cfg
+++ b/config-model/src/test/derived/multi_struct/documenttypes.cfg
@@ -1,194 +1,128 @@
enablecompression false
usev8geopositions false
-documenttype[].id 2987301
-documenttype[].name "ad"
-documenttype[].version 0
-documenttype[].headerstruct 959075962
-documenttype[].bodystruct 0
-documenttype[].inherits[].id 8
-documenttype[].datatype[].id 959075962
-documenttype[].datatype[].type STRUCT
-documenttype[].datatype[].array.element.id 0
-documenttype[].datatype[].map.key.id 0
-documenttype[].datatype[].map.value.id 0
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name "ad.header"
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].datatype[].sstruct.field[].name "e"
-documenttype[].datatype[].sstruct.field[].id 970377814
-documenttype[].datatype[].sstruct.field[].datatype 2
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].fieldsets{[document]}.fields[] "e"
-documenttype[].id -1051831567
-documenttype[].name "product"
-documenttype[].version 0
-documenttype[].headerstruct -107300050
-documenttype[].bodystruct 0
-documenttype[].inherits[].id 8
-documenttype[].datatype[].id -2092985853
-documenttype[].datatype[].type STRUCT
-documenttype[].datatype[].array.element.id 0
-documenttype[].datatype[].map.key.id 0
-documenttype[].datatype[].map.value.id 0
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name "mystruct"
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].datatype[].sstruct.field[].name "zero"
-documenttype[].datatype[].sstruct.field[].id 2128579715
-documenttype[].datatype[].sstruct.field[].datatype 2
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].datatype[].sstruct.field[].name "one"
-documenttype[].datatype[].sstruct.field[].id 997119011
-documenttype[].datatype[].sstruct.field[].datatype 2
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].datatype[].sstruct.field[].name "two"
-documenttype[].datatype[].sstruct.field[].id 2054688289
-documenttype[].datatype[].sstruct.field[].datatype 2
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].datatype[].sstruct.field[].name "three"
-documenttype[].datatype[].sstruct.field[].id 814368361
-documenttype[].datatype[].sstruct.field[].datatype 2
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].datatype[].id -420192670
-documenttype[].datatype[].type MAP
-documenttype[].datatype[].array.element.id 0
-documenttype[].datatype[].map.key.id 2
-documenttype[].datatype[].map.value.id -2092985853
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name ""
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].datatype[].id -107300050
-documenttype[].datatype[].type STRUCT
-documenttype[].datatype[].array.element.id 0
-documenttype[].datatype[].map.key.id 0
-documenttype[].datatype[].map.value.id 0
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name "product.header"
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].datatype[].sstruct.field[].name "more_stuff"
-documenttype[].datatype[].sstruct.field[].id 278342855
-documenttype[].datatype[].sstruct.field[].datatype -420192670
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].fieldsets{[document]}.fields[] "more_stuff"
-documenttype[].id -903152840
-documenttype[].name "shop"
-documenttype[].version 0
-documenttype[].headerstruct 371492103
-documenttype[].bodystruct 0
-documenttype[].inherits[].id 8
-documenttype[].datatype[].id -2092985853
-documenttype[].datatype[].type STRUCT
-documenttype[].datatype[].array.element.id 0
-documenttype[].datatype[].map.key.id 0
-documenttype[].datatype[].map.value.id 0
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name "mystruct"
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].datatype[].sstruct.field[].name "one"
-documenttype[].datatype[].sstruct.field[].id 997119011
-documenttype[].datatype[].sstruct.field[].datatype 2
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].datatype[].sstruct.field[].name "two"
-documenttype[].datatype[].sstruct.field[].id 2054688289
-documenttype[].datatype[].sstruct.field[].datatype 2
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].datatype[].sstruct.field[].name "three"
-documenttype[].datatype[].sstruct.field[].id 814368361
-documenttype[].datatype[].sstruct.field[].datatype 2
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].datatype[].id -420192670
-documenttype[].datatype[].type MAP
-documenttype[].datatype[].array.element.id 0
-documenttype[].datatype[].map.key.id 2
-documenttype[].datatype[].map.value.id -2092985853
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name ""
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].datatype[].id 371492103
-documenttype[].datatype[].type STRUCT
-documenttype[].datatype[].array.element.id 0
-documenttype[].datatype[].map.key.id 0
-documenttype[].datatype[].map.value.id 0
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name "shop.header"
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].datatype[].sstruct.field[].name "some_stuff"
-documenttype[].datatype[].sstruct.field[].id 1543312381
-documenttype[].datatype[].sstruct.field[].datatype -420192670
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].fieldsets{[document]}.fields[] "some_stuff"
-documenttype[].id -836031795
-documenttype[].name "user"
-documenttype[].version 0
-documenttype[].headerstruct 1601213394
-documenttype[].bodystruct 0
-documenttype[].inherits[].id 8
-documenttype[].datatype[].id 1601213394
-documenttype[].datatype[].type STRUCT
-documenttype[].datatype[].array.element.id 0
-documenttype[].datatype[].map.key.id 0
-documenttype[].datatype[].map.value.id 0
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name "user.header"
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].datatype[].sstruct.field[].name "a"
-documenttype[].datatype[].sstruct.field[].id 493339625
-documenttype[].datatype[].sstruct.field[].datatype 2
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].fieldsets{[document]}.fields[] "a"
+doctype[].name "document"
+doctype[].idx 10000
+doctype[].internalid 8
+doctype[].contentstruct 10001
+doctype[].primitivetype[].idx 10002
+doctype[].primitivetype[].name "bool"
+doctype[].primitivetype[].idx 10003
+doctype[].primitivetype[].name "byte"
+doctype[].primitivetype[].idx 10004
+doctype[].primitivetype[].name "double"
+doctype[].primitivetype[].idx 10005
+doctype[].primitivetype[].name "float"
+doctype[].primitivetype[].idx 10006
+doctype[].primitivetype[].name "float16"
+doctype[].primitivetype[].idx 10007
+doctype[].primitivetype[].name "int"
+doctype[].primitivetype[].idx 10008
+doctype[].primitivetype[].name "long"
+doctype[].primitivetype[].idx 10010
+doctype[].primitivetype[].name "predicate"
+doctype[].primitivetype[].idx 10011
+doctype[].primitivetype[].name "raw"
+doctype[].primitivetype[].idx 10012
+doctype[].primitivetype[].name "string"
+doctype[].primitivetype[].idx 10014
+doctype[].primitivetype[].name "uri"
+doctype[].wsettype[].idx 10013
+doctype[].wsettype[].elementtype 10012
+doctype[].wsettype[].createifnonexistent true
+doctype[].wsettype[].removeifzero true
+doctype[].wsettype[].internalid 18
+doctype[].structtype[].idx 10001
+doctype[].structtype[].name "document.header"
+doctype[].structtype[].internalid -284186494
+doctype[].structtype[].idx 10009
+doctype[].structtype[].name "position"
+doctype[].structtype[].field[].name "x"
+doctype[].structtype[].field[].internalid 914677694
+doctype[].structtype[].field[].type 10007
+doctype[].structtype[].field[].name "y"
+doctype[].structtype[].field[].internalid 900009410
+doctype[].structtype[].field[].type 10007
+doctype[].structtype[].internalid 1381038251
+doctype[].name "ad"
+doctype[].idx 10015
+doctype[].internalid 2987301
+doctype[].inherits[].idx 10000
+doctype[].contentstruct 10016
+doctype[].fieldsets{[document]}.fields[] "e"
+doctype[].structtype[].idx 10016
+doctype[].structtype[].name "ad.header"
+doctype[].structtype[].field[].name "e"
+doctype[].structtype[].field[].internalid 970377814
+doctype[].structtype[].field[].type 10012
+doctype[].structtype[].internalid 959075962
+doctype[].name "product"
+doctype[].idx 10017
+doctype[].internalid -1051831567
+doctype[].inherits[].idx 10000
+doctype[].contentstruct 10018
+doctype[].fieldsets{[document]}.fields[] "more_stuff"
+doctype[].maptype[].idx 10019
+doctype[].maptype[].keytype 10012
+doctype[].maptype[].valuetype 10020
+doctype[].maptype[].internalid -420192670
+doctype[].structtype[].idx 10020
+doctype[].structtype[].name "mystruct"
+doctype[].structtype[].field[].name "zero"
+doctype[].structtype[].field[].internalid 2128579715
+doctype[].structtype[].field[].type 10012
+doctype[].structtype[].field[].name "one"
+doctype[].structtype[].field[].internalid 997119011
+doctype[].structtype[].field[].type 10012
+doctype[].structtype[].field[].name "two"
+doctype[].structtype[].field[].internalid 2054688289
+doctype[].structtype[].field[].type 10012
+doctype[].structtype[].field[].name "three"
+doctype[].structtype[].field[].internalid 814368361
+doctype[].structtype[].field[].type 10012
+doctype[].structtype[].internalid -2092985853
+doctype[].structtype[].idx 10018
+doctype[].structtype[].name "product.header"
+doctype[].structtype[].field[].name "more_stuff"
+doctype[].structtype[].field[].internalid 278342855
+doctype[].structtype[].field[].type 10019
+doctype[].structtype[].internalid -107300050
+doctype[].name "shop"
+doctype[].idx 10021
+doctype[].internalid -903152840
+doctype[].inherits[].idx 10000
+doctype[].contentstruct 10022
+doctype[].fieldsets{[document]}.fields[] "some_stuff"
+doctype[].maptype[].idx 10023
+doctype[].maptype[].keytype 10012
+doctype[].maptype[].valuetype 10024
+doctype[].maptype[].internalid -420192670
+doctype[].structtype[].idx 10024
+doctype[].structtype[].name "mystruct"
+doctype[].structtype[].field[].name "one"
+doctype[].structtype[].field[].internalid 997119011
+doctype[].structtype[].field[].type 10012
+doctype[].structtype[].field[].name "two"
+doctype[].structtype[].field[].internalid 2054688289
+doctype[].structtype[].field[].type 10012
+doctype[].structtype[].field[].name "three"
+doctype[].structtype[].field[].internalid 814368361
+doctype[].structtype[].field[].type 10012
+doctype[].structtype[].internalid -2092985853
+doctype[].structtype[].idx 10022
+doctype[].structtype[].name "shop.header"
+doctype[].structtype[].field[].name "some_stuff"
+doctype[].structtype[].field[].internalid 1543312381
+doctype[].structtype[].field[].type 10023
+doctype[].structtype[].internalid 371492103
+doctype[].name "user"
+doctype[].idx 10025
+doctype[].internalid -836031795
+doctype[].inherits[].idx 10000
+doctype[].contentstruct 10026
+doctype[].fieldsets{[document]}.fields[] "a"
+doctype[].structtype[].idx 10026
+doctype[].structtype[].name "user.header"
+doctype[].structtype[].field[].name "a"
+doctype[].structtype[].field[].internalid 493339625
+doctype[].structtype[].field[].type 10012
+doctype[].structtype[].internalid 1601213394
diff --git a/config-model/src/test/derived/structinheritance/documenttypes.cfg b/config-model/src/test/derived/structinheritance/documenttypes.cfg
index cf4bc89866f..8b343665289 100644
--- a/config-model/src/test/derived/structinheritance/documenttypes.cfg
+++ b/config-model/src/test/derived/structinheritance/documenttypes.cfg
@@ -1,102 +1,81 @@
enablecompression false
usev8geopositions false
-documenttype[].id 485659380
-documenttype[].name "simple"
-documenttype[].version 0
-documenttype[].headerstruct -2142109237
-documenttype[].bodystruct 0
-documenttype[].inherits[].id 8
-documenttype[].datatype[].id -1396204461
-documenttype[].datatype[].type STRUCT
-documenttype[].datatype[].array.element.id 0
-documenttype[].datatype[].map.key.id 0
-documenttype[].datatype[].map.value.id 0
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name "base"
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].datatype[].sstruct.field[].name "name"
-documenttype[].datatype[].sstruct.field[].id 1160796772
-documenttype[].datatype[].sstruct.field[].datatype 2
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].datatype[].id 746267614
-documenttype[].datatype[].type STRUCT
-documenttype[].datatype[].array.element.id 0
-documenttype[].datatype[].map.key.id 0
-documenttype[].datatype[].map.value.id 0
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name "child"
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].datatype[].sstruct.field[].name "age"
-documenttype[].datatype[].sstruct.field[].id 1862473705
-documenttype[].datatype[].sstruct.field[].datatype 0
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].datatype[].sstruct.field[].name "name"
-documenttype[].datatype[].sstruct.field[].id 1160796772
-documenttype[].datatype[].sstruct.field[].datatype 2
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].datatype[].id 1811766610
-documenttype[].datatype[].type STRUCT
-documenttype[].datatype[].array.element.id 0
-documenttype[].datatype[].map.key.id 0
-documenttype[].datatype[].map.value.id 0
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name "grandchild"
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].datatype[].sstruct.field[].name "toy"
-documenttype[].datatype[].sstruct.field[].id 536645790
-documenttype[].datatype[].sstruct.field[].datatype 2
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].datatype[].sstruct.field[].name "age"
-documenttype[].datatype[].sstruct.field[].id 1862473705
-documenttype[].datatype[].sstruct.field[].datatype 0
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].datatype[].sstruct.field[].name "name"
-documenttype[].datatype[].sstruct.field[].id 1160796772
-documenttype[].datatype[].sstruct.field[].datatype 2
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].datatype[].id -2142109237
-documenttype[].datatype[].type STRUCT
-documenttype[].datatype[].array.element.id 0
-documenttype[].datatype[].map.key.id 0
-documenttype[].datatype[].map.value.id 0
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name "simple.header"
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].datatype[].sstruct.field[].name "f1"
-documenttype[].datatype[].sstruct.field[].id 750623154
-documenttype[].datatype[].sstruct.field[].datatype 746267614
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].datatype[].sstruct.field[].name "f2"
-documenttype[].datatype[].sstruct.field[].id 1523850983
-documenttype[].datatype[].sstruct.field[].datatype 1811766610
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].fieldsets{[document]}.fields[] "f1"
-documenttype[].fieldsets{[document]}.fields[] "f2"
+doctype[].name "document"
+doctype[].idx 10000
+doctype[].internalid 8
+doctype[].contentstruct 10001
+doctype[].primitivetype[].idx 10002
+doctype[].primitivetype[].name "bool"
+doctype[].primitivetype[].idx 10003
+doctype[].primitivetype[].name "byte"
+doctype[].primitivetype[].idx 10004
+doctype[].primitivetype[].name "double"
+doctype[].primitivetype[].idx 10005
+doctype[].primitivetype[].name "float"
+doctype[].primitivetype[].idx 10006
+doctype[].primitivetype[].name "float16"
+doctype[].primitivetype[].idx 10007
+doctype[].primitivetype[].name "int"
+doctype[].primitivetype[].idx 10008
+doctype[].primitivetype[].name "long"
+doctype[].primitivetype[].idx 10010
+doctype[].primitivetype[].name "predicate"
+doctype[].primitivetype[].idx 10011
+doctype[].primitivetype[].name "raw"
+doctype[].primitivetype[].idx 10012
+doctype[].primitivetype[].name "string"
+doctype[].primitivetype[].idx 10014
+doctype[].primitivetype[].name "uri"
+doctype[].wsettype[].idx 10013
+doctype[].wsettype[].elementtype 10012
+doctype[].wsettype[].createifnonexistent true
+doctype[].wsettype[].removeifzero true
+doctype[].wsettype[].internalid 18
+doctype[].structtype[].idx 10001
+doctype[].structtype[].name "document.header"
+doctype[].structtype[].internalid -284186494
+doctype[].structtype[].idx 10009
+doctype[].structtype[].name "position"
+doctype[].structtype[].field[].name "x"
+doctype[].structtype[].field[].internalid 914677694
+doctype[].structtype[].field[].type 10007
+doctype[].structtype[].field[].name "y"
+doctype[].structtype[].field[].internalid 900009410
+doctype[].structtype[].field[].type 10007
+doctype[].structtype[].internalid 1381038251
+doctype[].name "simple"
+doctype[].idx 10015
+doctype[].internalid 485659380
+doctype[].inherits[].idx 10000
+doctype[].contentstruct 10016
+doctype[].fieldsets{[document]}.fields[] "f1"
+doctype[].fieldsets{[document]}.fields[] "f2"
+doctype[].structtype[].idx 10018
+doctype[].structtype[].name "base"
+doctype[].structtype[].field[].name "name"
+doctype[].structtype[].field[].internalid 1160796772
+doctype[].structtype[].field[].type 10012
+doctype[].structtype[].internalid -1396204461
+doctype[].structtype[].idx 10017
+doctype[].structtype[].name "child"
+doctype[].structtype[].inherits[].type 10018
+doctype[].structtype[].field[].name "age"
+doctype[].structtype[].field[].internalid 1862473705
+doctype[].structtype[].field[].type 10007
+doctype[].structtype[].internalid 746267614
+doctype[].structtype[].idx 10019
+doctype[].structtype[].name "grandchild"
+doctype[].structtype[].inherits[].type 10017
+doctype[].structtype[].field[].name "toy"
+doctype[].structtype[].field[].internalid 536645790
+doctype[].structtype[].field[].type 10012
+doctype[].structtype[].internalid 1811766610
+doctype[].structtype[].idx 10016
+doctype[].structtype[].name "simple.header"
+doctype[].structtype[].field[].name "f1"
+doctype[].structtype[].field[].internalid 750623154
+doctype[].structtype[].field[].type 10017
+doctype[].structtype[].field[].name "f2"
+doctype[].structtype[].field[].internalid 1523850983
+doctype[].structtype[].field[].type 10019
+doctype[].structtype[].internalid -2142109237
diff --git a/config-model/src/test/derived/tensor/documenttypes.cfg b/config-model/src/test/derived/tensor/documenttypes.cfg
index 879b455a711..9ee6a82245f 100644
--- a/config-model/src/test/derived/tensor/documenttypes.cfg
+++ b/config-model/src/test/derived/tensor/documenttypes.cfg
@@ -1,53 +1,87 @@
enablecompression false
usev8geopositions false
-documenttype[].id -1290043429
-documenttype[].name "tensor"
-documenttype[].version 0
-documenttype[].headerstruct 2125927172
-documenttype[].bodystruct 0
-documenttype[].inherits[].id 8
-documenttype[].datatype[].id 2125927172
-documenttype[].datatype[].type STRUCT
-documenttype[].datatype[].array.element.id 0
-documenttype[].datatype[].map.key.id 0
-documenttype[].datatype[].map.value.id 0
-documenttype[].datatype[].wset.key.id 0
-documenttype[].datatype[].wset.createifnonexistent false
-documenttype[].datatype[].wset.removeifzero false
-documenttype[].datatype[].annotationref.annotation.id 0
-documenttype[].datatype[].sstruct.name "tensor.header"
-documenttype[].datatype[].sstruct.version 0
-documenttype[].datatype[].sstruct.compression.type NONE
-documenttype[].datatype[].sstruct.compression.level 0
-documenttype[].datatype[].sstruct.compression.threshold 95
-documenttype[].datatype[].sstruct.compression.minsize 200
-documenttype[].datatype[].sstruct.field[].name "f1"
-documenttype[].datatype[].sstruct.field[].id 26661415
-documenttype[].datatype[].sstruct.field[].datatype 21
-documenttype[].datatype[].sstruct.field[].detailedtype "tensor(x[3])"
-documenttype[].datatype[].sstruct.field[].name "f2"
-documenttype[].datatype[].sstruct.field[].id 2080644671
-documenttype[].datatype[].sstruct.field[].datatype 21
-documenttype[].datatype[].sstruct.field[].detailedtype "tensor<float>(x[2],y[1])"
-documenttype[].datatype[].sstruct.field[].name "f3"
-documenttype[].datatype[].sstruct.field[].id 1295091863
-documenttype[].datatype[].sstruct.field[].datatype 21
-documenttype[].datatype[].sstruct.field[].detailedtype "tensor(x{})"
-documenttype[].datatype[].sstruct.field[].name "f4"
-documenttype[].datatype[].sstruct.field[].id 1224191509
-documenttype[].datatype[].sstruct.field[].datatype 21
-documenttype[].datatype[].sstruct.field[].detailedtype "tensor(x[10],y[10])"
-documenttype[].datatype[].sstruct.field[].name "f5"
-documenttype[].datatype[].sstruct.field[].id 329055840
-documenttype[].datatype[].sstruct.field[].datatype 21
-documenttype[].datatype[].sstruct.field[].detailedtype "tensor<float>(x[10])"
-documenttype[].datatype[].sstruct.field[].name "f6"
-documenttype[].datatype[].sstruct.field[].id 596352344
-documenttype[].datatype[].sstruct.field[].datatype 1
-documenttype[].datatype[].sstruct.field[].detailedtype ""
-documenttype[].fieldsets{[document]}.fields[] "f1"
-documenttype[].fieldsets{[document]}.fields[] "f2"
-documenttype[].fieldsets{[document]}.fields[] "f3"
-documenttype[].fieldsets{[document]}.fields[] "f4"
-documenttype[].fieldsets{[document]}.fields[] "f5"
-documenttype[].fieldsets{[document]}.fields[] "f6"
+doctype[].name "document"
+doctype[].idx 10000
+doctype[].internalid 8
+doctype[].contentstruct 10001
+doctype[].primitivetype[].idx 10002
+doctype[].primitivetype[].name "bool"
+doctype[].primitivetype[].idx 10003
+doctype[].primitivetype[].name "byte"
+doctype[].primitivetype[].idx 10004
+doctype[].primitivetype[].name "double"
+doctype[].primitivetype[].idx 10005
+doctype[].primitivetype[].name "float"
+doctype[].primitivetype[].idx 10006
+doctype[].primitivetype[].name "float16"
+doctype[].primitivetype[].idx 10007
+doctype[].primitivetype[].name "int"
+doctype[].primitivetype[].idx 10008
+doctype[].primitivetype[].name "long"
+doctype[].primitivetype[].idx 10010
+doctype[].primitivetype[].name "predicate"
+doctype[].primitivetype[].idx 10011
+doctype[].primitivetype[].name "raw"
+doctype[].primitivetype[].idx 10012
+doctype[].primitivetype[].name "string"
+doctype[].primitivetype[].idx 10014
+doctype[].primitivetype[].name "uri"
+doctype[].wsettype[].idx 10013
+doctype[].wsettype[].elementtype 10012
+doctype[].wsettype[].createifnonexistent true
+doctype[].wsettype[].removeifzero true
+doctype[].wsettype[].internalid 18
+doctype[].structtype[].idx 10001
+doctype[].structtype[].name "document.header"
+doctype[].structtype[].internalid -284186494
+doctype[].structtype[].idx 10009
+doctype[].structtype[].name "position"
+doctype[].structtype[].field[].name "x"
+doctype[].structtype[].field[].internalid 914677694
+doctype[].structtype[].field[].type 10007
+doctype[].structtype[].field[].name "y"
+doctype[].structtype[].field[].internalid 900009410
+doctype[].structtype[].field[].type 10007
+doctype[].structtype[].internalid 1381038251
+doctype[].name "tensor"
+doctype[].idx 10015
+doctype[].internalid -1290043429
+doctype[].inherits[].idx 10000
+doctype[].contentstruct 10016
+doctype[].fieldsets{[document]}.fields[] "f1"
+doctype[].fieldsets{[document]}.fields[] "f2"
+doctype[].fieldsets{[document]}.fields[] "f3"
+doctype[].fieldsets{[document]}.fields[] "f4"
+doctype[].fieldsets{[document]}.fields[] "f5"
+doctype[].fieldsets{[document]}.fields[] "f6"
+doctype[].tensortype[].idx 10017
+doctype[].tensortype[].detailedtype "tensor(x[3])"
+doctype[].tensortype[].idx 10018
+doctype[].tensortype[].detailedtype "tensor<float>(x[2],y[1])"
+doctype[].tensortype[].idx 10019
+doctype[].tensortype[].detailedtype "tensor(x{})"
+doctype[].tensortype[].idx 10020
+doctype[].tensortype[].detailedtype "tensor(x[10],y[10])"
+doctype[].tensortype[].idx 10021
+doctype[].tensortype[].detailedtype "tensor<float>(x[10])"
+doctype[].structtype[].idx 10016
+doctype[].structtype[].name "tensor.header"
+doctype[].structtype[].field[].name "f1"
+doctype[].structtype[].field[].internalid 26661415
+doctype[].structtype[].field[].type 10017
+doctype[].structtype[].field[].name "f2"
+doctype[].structtype[].field[].internalid 2080644671
+doctype[].structtype[].field[].type 10018
+doctype[].structtype[].field[].name "f3"
+doctype[].structtype[].field[].internalid 1295091863
+doctype[].structtype[].field[].type 10019
+doctype[].structtype[].field[].name "f4"
+doctype[].structtype[].field[].internalid 1224191509
+doctype[].structtype[].field[].type 10020
+doctype[].structtype[].field[].name "f5"
+doctype[].structtype[].field[].internalid 329055840
+doctype[].structtype[].field[].type 10021
+doctype[].structtype[].field[].name "f6"
+doctype[].structtype[].field[].internalid 596352344
+doctype[].structtype[].field[].type 10005
+doctype[].structtype[].internalid 2125927172
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/application/CompressedApplicationInputStreamTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/application/CompressedApplicationInputStreamTest.java
index 1e8005c8af6..c7662ac9ee4 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/application/CompressedApplicationInputStreamTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/application/CompressedApplicationInputStreamTest.java
@@ -7,12 +7,16 @@ import com.yahoo.yolean.Exceptions;
import org.apache.commons.compress.archivers.ArchiveOutputStream;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.Arrays;
import java.util.List;
import java.util.zip.GZIPOutputStream;
@@ -26,6 +30,9 @@ import static org.junit.Assert.assertTrue;
*/
public class CompressedApplicationInputStreamTest {
+ @Rule
+ public TemporaryFolder temporaryFolder = new TemporaryFolder();
+
private static void writeFileToTar(ArchiveOutputStream taos, File file) throws IOException {
taos.putArchiveEntry(taos.createArchiveEntry(file, file.getName()));
ByteStreams.copy(new FileInputStream(file), taos);
@@ -41,14 +48,14 @@ public class CompressedApplicationInputStreamTest {
return outFile;
}
- public static File createTarFile() throws IOException {
- File outFile = File.createTempFile("testapp", ".tar.gz");
+ public static File createTarFile(Path dir) throws IOException {
+ File outFile = Files.createTempFile(dir, "testapp", ".tar.gz").toFile();
ArchiveOutputStream archiveOutputStream = new TarArchiveOutputStream(new GZIPOutputStream(new FileOutputStream(outFile)));
return createArchiveFile(archiveOutputStream, outFile);
}
- private static File createZipFile() throws IOException {
- File outFile = File.createTempFile("testapp", ".tar.gz");
+ private File createZipFile(Path dir) throws IOException {
+ File outFile = Files.createTempFile(dir, "testapp", ".tar.gz").toFile();
ArchiveOutputStream archiveOutputStream = new ZipArchiveOutputStream(new FileOutputStream(outFile));
return createArchiveFile(archiveOutputStream, outFile);
}
@@ -62,7 +69,7 @@ public class CompressedApplicationInputStreamTest {
@Test
public void require_that_valid_tar_application_can_be_unpacked() throws IOException {
- File outFile = createTarFile();
+ File outFile = createTarFile(temporaryFolder.getRoot().toPath());
try (CompressedApplicationInputStream unpacked = streamFromTarGz(outFile)) {
File outApp = unpacked.decompress();
assertTestApp(outApp);
@@ -71,7 +78,7 @@ public class CompressedApplicationInputStreamTest {
@Test
public void require_that_valid_tar_application_in_subdir_can_be_unpacked() throws IOException {
- File outFile = File.createTempFile("testapp", ".tar.gz");
+ File outFile = Files.createTempFile(temporaryFolder.getRoot().toPath(), "testapp", ".tar.gz").toFile();
ArchiveOutputStream archiveOutputStream = new TarArchiveOutputStream(new GZIPOutputStream(new FileOutputStream(outFile)));
File app = new File("src/test/resources/deploy/validapp");
@@ -100,7 +107,7 @@ public class CompressedApplicationInputStreamTest {
@Test
public void require_that_valid_zip_application_can_be_unpacked() throws IOException {
- File outFile = createZipFile();
+ File outFile = createZipFile(temporaryFolder.getRoot().toPath());
try (CompressedApplicationInputStream unpacked = streamFromZip(outFile)) {
File outApp = unpacked.decompress();
assertTestApp(outApp);
@@ -161,8 +168,8 @@ public class CompressedApplicationInputStreamTest {
streamFromTarGz(app).close();
}
- private static File createTarGz(String appDir) throws IOException, InterruptedException {
- File tmpTar = File.createTempFile("myapp", ".tar");
+ private File createTarGz(String appDir) throws IOException, InterruptedException {
+ File tmpTar = Files.createTempFile(temporaryFolder.getRoot().toPath(), "myapp", ".tar").toFile();
Process p = new ProcessBuilder("tar", "-C", appDir, "-cvf", tmpTar.getAbsolutePath(), ".").start();
p.waitFor();
p = new ProcessBuilder("gzip", tmpTar.getAbsolutePath()).start();
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandlerTest.java
index 702dd2792da..6043dddc1db 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandlerTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandlerTest.java
@@ -109,20 +109,20 @@ public class SessionCreateHandlerTest extends SessionHandlerTest {
@Test
public void require_that_post_request_must_have_correct_content_type() throws IOException {
HashMap<String, String> headers = new HashMap<>(); // no Content-Type header
- File outFile = CompressedApplicationInputStreamTest.createTarFile();
+ File outFile = CompressedApplicationInputStreamTest.createTarFile(temporaryFolder.getRoot().toPath());
HttpResponse response = createHandler().handle(post(outFile, headers, null));
assertHttpStatusCodeErrorCodeAndMessage(response, BAD_REQUEST, HttpErrorResponse.ErrorCode.BAD_REQUEST, "Request contains no Content-Type header");
}
private void assertIllegalFromParameter(String fromValue) throws IOException {
- File outFile = CompressedApplicationInputStreamTest.createTarFile();
+ File outFile = CompressedApplicationInputStreamTest.createTarFile(temporaryFolder.getRoot().toPath());
HttpRequest request = post(outFile, postHeaders, Collections.singletonMap("from", fromValue));
assertHttpStatusCodeErrorCodeAndMessage(createHandler().handle(request), BAD_REQUEST, HttpErrorResponse.ErrorCode.BAD_REQUEST, "Parameter 'from' has illegal value '" + fromValue + "'");
}
@Test
public void require_that_prepare_url_is_returned_on_success() throws IOException {
- File outFile = CompressedApplicationInputStreamTest.createTarFile();
+ File outFile = CompressedApplicationInputStreamTest.createTarFile(temporaryFolder.getRoot().toPath());
Map<String, String> parameters = Collections.singletonMap("name", "foo");
HttpResponse response = createHandler().handle(post(outFile, postHeaders, parameters));
assertNotNull(response);
@@ -143,7 +143,7 @@ public class SessionCreateHandlerTest extends SessionHandlerTest {
@Test
public void require_internal_error_when_exception() throws IOException {
- File outFile = CompressedApplicationInputStreamTest.createTarFile();
+ File outFile = CompressedApplicationInputStreamTest.createTarFile(temporaryFolder.getRoot().toPath());
new FileWriter(outFile).write("rubbish");
HttpResponse response = createHandler().handle(post(outFile));
assertHttpStatusCodeErrorCodeAndMessage(response, INTERNAL_SERVER_ERROR,
@@ -153,7 +153,7 @@ public class SessionCreateHandlerTest extends SessionHandlerTest {
@Test
public void require_that_handler_unpacks_application() throws IOException {
- File outFile = CompressedApplicationInputStreamTest.createTarFile();
+ File outFile = CompressedApplicationInputStreamTest.createTarFile(temporaryFolder.getRoot().toPath());
createHandler().handle(post(outFile));
ApplicationFile applicationFile = applicationRepository.getApplicationFileFromSession(tenant, 2, "services.xml", Session.Mode.READ);
assertTrue(applicationFile.exists());
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/Bill.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/Bill.java
index 1788154b9e2..01488711f59 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/Bill.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/Bill.java
@@ -2,6 +2,7 @@
package com.yahoo.vespa.hosted.controller.api.integration.billing;
import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.NodeResources;
import com.yahoo.config.provision.TenantName;
import com.yahoo.config.provision.zone.ZoneId;
@@ -187,6 +188,7 @@ public class Bill {
private BigDecimal cpuCost;
private BigDecimal memoryCost;
private BigDecimal diskCost;
+ private NodeResources.Architecture architecture;
public LineItem(String id, String description, BigDecimal amount, String plan, String agent, ZonedDateTime addedAt) {
this.id = id;
@@ -198,7 +200,7 @@ public class Bill {
}
public LineItem(String id, String description, BigDecimal amount, String plan, String agent, ZonedDateTime addedAt, ZonedDateTime startedAt, ZonedDateTime endedAt, ApplicationId applicationId, ZoneId zoneId,
- BigDecimal cpuHours, BigDecimal memoryHours, BigDecimal diskHours, BigDecimal cpuCost, BigDecimal memoryCost, BigDecimal diskCost) {
+ BigDecimal cpuHours, BigDecimal memoryHours, BigDecimal diskHours, BigDecimal cpuCost, BigDecimal memoryCost, BigDecimal diskCost, NodeResources.Architecture architecture) {
this(id, description, amount, plan, agent, addedAt);
this.startedAt = startedAt;
this.endedAt = endedAt;
@@ -214,6 +216,7 @@ public class Bill {
this.cpuCost = cpuCost;
this.memoryCost = memoryCost;
this.diskCost = diskCost;
+ this.architecture = architecture;
}
/** The opaque ID of this */
@@ -290,6 +293,10 @@ public class Bill {
return Optional.ofNullable(diskCost);
}
+ public Optional<NodeResources.Architecture> getArchitecture() {
+ return Optional.ofNullable(architecture);
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) return true;
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/PlanRegistryMock.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/PlanRegistryMock.java
index 5fb4d853e67..4757fa76224 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/PlanRegistryMock.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/PlanRegistryMock.java
@@ -117,7 +117,8 @@ public class PlanRegistryMock implements PlanRegistry {
usage.getDiskMillis().divide(millisPerHour, RoundingMode.HALF_UP),
cpuCost,
memCost,
- dgbCost
+ dgbCost,
+ usage.getArchitecture()
);
}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/CostInfo.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/CostInfo.java
index 3bc9580307b..c756100e563 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/CostInfo.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/CostInfo.java
@@ -2,6 +2,7 @@
package com.yahoo.vespa.hosted.controller.api.integration.resource;
import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.NodeResources;
import com.yahoo.config.provision.zone.ZoneId;
import java.math.BigDecimal;
@@ -19,11 +20,12 @@ public class CostInfo {
private final BigDecimal cpuCost;
private final BigDecimal memoryCost;
private final BigDecimal diskCost;
+ private final NodeResources.Architecture architecture;
public CostInfo(ApplicationId applicationId, ZoneId zoneId,
BigDecimal cpuHours, BigDecimal memoryHours, BigDecimal diskHours,
- BigDecimal cpuCost, BigDecimal memoryCost, BigDecimal diskCost) {
+ BigDecimal cpuCost, BigDecimal memoryCost, BigDecimal diskCost, NodeResources.Architecture architecture) {
this.applicationId = applicationId;
this.zoneId = zoneId;
this.cpuHours = cpuHours;
@@ -32,6 +34,7 @@ public class CostInfo {
this.cpuCost = cpuCost;
this.memoryCost = memoryCost;
this.diskCost = diskCost;
+ this.architecture = architecture;
}
public ApplicationId getApplicationId() {
@@ -70,4 +73,8 @@ public class CostInfo {
return cpuCost.add(memoryCost).add(diskCost);
}
+ public NodeResources.Architecture getArchitecture() {
+ return architecture;
+ }
+
}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/MeteringClient.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/MeteringClient.java
index 767ba4aa34b..944a5eaf696 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/MeteringClient.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/MeteringClient.java
@@ -17,8 +17,6 @@ public interface MeteringClient {
void consume(Collection<ResourceSnapshot> resources);
- MeteringData getMeteringData(TenantName tenantName, ApplicationName applicationName);
-
List<ResourceSnapshot> getSnapshotHistoryForTenant(TenantName tenantName, YearMonth yearMonth);
void refresh();
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceAllocation.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceAllocation.java
index 742e3a01171..8191540e898 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceAllocation.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceAllocation.java
@@ -1,6 +1,8 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.controller.api.integration.resource;
+import com.yahoo.config.provision.NodeResources;
+
import java.util.Objects;
/**
@@ -10,16 +12,18 @@ import java.util.Objects;
*/
public class ResourceAllocation {
- public static final ResourceAllocation ZERO = new ResourceAllocation(0, 0, 0);
+ public static final ResourceAllocation ZERO = new ResourceAllocation(0, 0, 0, NodeResources.Architecture.getDefault());
private final double cpuCores;
private final double memoryGb;
private final double diskGb;
+ private final NodeResources.Architecture architecture;
- public ResourceAllocation(double cpuCores, double memoryGb, double diskGb) {
+ public ResourceAllocation(double cpuCores, double memoryGb, double diskGb, NodeResources.Architecture architecture) {
this.cpuCores = cpuCores;
this.memoryGb = memoryGb;
this.diskGb = diskGb;
+ this.architecture = architecture;
}
public double usageFraction(ResourceAllocation total) {
@@ -38,14 +42,18 @@ public class ResourceAllocation {
return diskGb;
}
+ public NodeResources.Architecture getArchitecture() {
+ return architecture;
+ }
+
/** Returns a copy of this with the given allocation added */
public ResourceAllocation plus(ResourceAllocation allocation) {
- return new ResourceAllocation(cpuCores + allocation.cpuCores, memoryGb + allocation.memoryGb, diskGb + allocation.diskGb);
+ return new ResourceAllocation(cpuCores + allocation.cpuCores, memoryGb + allocation.memoryGb, diskGb + allocation.diskGb, architecture);
}
/** Returns a copy of this with each resource multiplied by given factor */
public ResourceAllocation multiply(double multiplicand) {
- return new ResourceAllocation(cpuCores * multiplicand, memoryGb * multiplicand, diskGb * multiplicand);
+ return new ResourceAllocation(cpuCores * multiplicand, memoryGb * multiplicand, diskGb * multiplicand, architecture);
}
@Override
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceDatabaseClient.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceDatabaseClient.java
index 2f277193231..8ae12c0e7ac 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceDatabaseClient.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceDatabaseClient.java
@@ -18,8 +18,6 @@ public interface ResourceDatabaseClient {
void writeResourceSnapshots(Collection<ResourceSnapshot> snapshots);
- List<ResourceSnapshot> getResourceSnapshotsForMonth(TenantName tenantName, ApplicationName applicationName, YearMonth month);
-
List<ResourceUsage> getResourceSnapshotsForPeriod(TenantName tenantName, long startTimestamp, long endTimestamp);
void refreshMaterializedView();
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceDatabaseClientMock.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceDatabaseClientMock.java
index 5a4d250ea9d..c680990e240 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceDatabaseClientMock.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceDatabaseClientMock.java
@@ -45,19 +45,6 @@ public class ResourceDatabaseClientMock implements ResourceDatabaseClient {
}
@Override
- public List<ResourceSnapshot> getResourceSnapshotsForMonth(TenantName tenantName, ApplicationName applicationName, YearMonth month) {
- return resourceSnapshots.stream()
- .filter(resourceSnapshot -> {
- LocalDate snapshotDate = LocalDate.ofInstant(resourceSnapshot.getTimestamp(), ZoneId.of("UTC"));
- return YearMonth.from(snapshotDate).equals(month) &&
- snapshotDate.getYear() == month.getYear() &&
- resourceSnapshot.getApplicationId().tenant().equals(tenantName) &&
- resourceSnapshot.getApplicationId().application().equals(applicationName);
- })
- .collect(Collectors.toList());
- }
-
- @Override
public Set<YearMonth> getMonthsWithSnapshotsForTenant(TenantName tenantName) {
return Collections.emptySet();
}
@@ -88,6 +75,7 @@ public class ResourceDatabaseClientMock implements ResourceDatabaseClient {
a.getApplicationId(),
a.getZoneId(),
plan,
+ a.getArchitecture(),
BigDecimal.valueOf(a.getCpuCores()).multiply(d),
BigDecimal.valueOf(a.getMemoryGb()).multiply(d),
BigDecimal.valueOf(a.getDiskGb()).multiply(d)
@@ -100,10 +88,12 @@ public class ResourceDatabaseClientMock implements ResourceDatabaseClient {
assert a.getApplicationId().equals(b.getApplicationId());
assert a.getZoneId().equals(b.getZoneId());
assert a.getPlan().equals(b.getPlan());
+ assert a.getArchitecture().equals(b.getArchitecture());
return new ResourceUsage(
a.getApplicationId(),
a.getZoneId(),
a.getPlan(),
+ a.getArchitecture(),
a.getCpuMillis().add(b.getCpuMillis()),
a.getMemoryMillis().add(b.getMemoryMillis()),
a.getDiskMillis().add(b.getDiskMillis())
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceSnapshot.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceSnapshot.java
index 9b3de004bae..85ee23f4df0 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceSnapshot.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceSnapshot.java
@@ -24,15 +24,15 @@ public class ResourceSnapshot {
private final Instant timestamp;
private final ZoneId zoneId;
- public ResourceSnapshot(ApplicationId applicationId, double cpuCores, double memoryGb, double diskGb, Instant timestamp, ZoneId zoneId) {
+ public ResourceSnapshot(ApplicationId applicationId, double cpuCores, double memoryGb, double diskGb, NodeResources.Architecture architecture, Instant timestamp, ZoneId zoneId) {
this.applicationId = applicationId;
- this.resourceAllocation = new ResourceAllocation(cpuCores, memoryGb, diskGb);
+ this.resourceAllocation = new ResourceAllocation(cpuCores, memoryGb, diskGb, architecture);
this.timestamp = timestamp;
this.zoneId = zoneId;
}
- public static ResourceSnapshot from(ApplicationId applicationId, int nodes, double cpuCores, double memoryGb, double diskGb, Instant timestamp, ZoneId zoneId) {
- return new ResourceSnapshot(applicationId, cpuCores * nodes, memoryGb * nodes, diskGb * nodes, timestamp, zoneId);
+ public static ResourceSnapshot from(ApplicationId applicationId, int nodes, double cpuCores, double memoryGb, double diskGb, NodeResources.Architecture architecture, Instant timestamp, ZoneId zoneId) {
+ return new ResourceSnapshot(applicationId, cpuCores * nodes, memoryGb * nodes, diskGb * nodes, architecture, timestamp, zoneId);
}
public static ResourceSnapshot from(List<Node> nodes, Instant timestamp, ZoneId zoneId) {
@@ -48,6 +48,7 @@ public class ResourceSnapshot {
nodes.stream().map(Node::resources).mapToDouble(NodeResources::vcpu).sum(),
nodes.stream().map(Node::resources).mapToDouble(NodeResources::memoryGb).sum(),
nodes.stream().map(Node::resources).mapToDouble(NodeResources::diskGb).sum(),
+ nodes.stream().map(node -> node.resources().architecture()).findFirst().orElse(NodeResources.Architecture.getDefault()),
timestamp,
zoneId
);
@@ -81,6 +82,10 @@ public class ResourceSnapshot {
return zoneId;
}
+ public NodeResources.Architecture getArchitecture() {
+ return resourceAllocation.getArchitecture();
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) return true;
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceUsage.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceUsage.java
index fdea3b26372..850ca040d03 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceUsage.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceUsage.java
@@ -2,6 +2,7 @@
package com.yahoo.vespa.hosted.controller.api.integration.resource;
import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.NodeResources;
import com.yahoo.config.provision.zone.ZoneId;
import com.yahoo.vespa.hosted.controller.api.integration.billing.Plan;
@@ -15,8 +16,9 @@ public class ResourceUsage {
private final BigDecimal cpuMillis;
private final BigDecimal memoryMillis;
private final BigDecimal diskMillis;
+ private final NodeResources.Architecture architecture;
- public ResourceUsage(ApplicationId applicationId, ZoneId zoneId, Plan plan,
+ public ResourceUsage(ApplicationId applicationId, ZoneId zoneId, Plan plan, NodeResources.Architecture architecture,
BigDecimal cpuMillis, BigDecimal memoryMillis, BigDecimal diskMillis) {
this.applicationId = applicationId;
this.zoneId = zoneId;
@@ -24,6 +26,7 @@ public class ResourceUsage {
this.memoryMillis = memoryMillis;
this.diskMillis = diskMillis;
this.plan = plan;
+ this.architecture = architecture;
}
public ApplicationId getApplicationId() {
@@ -50,4 +53,7 @@ public class ResourceUsage {
return plan;
}
+ public NodeResources.Architecture getArchitecture() {
+ return architecture;
+ }
}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/stubs/MockMeteringClient.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/stubs/MockMeteringClient.java
index 003ecb32a32..ca094f98607 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/stubs/MockMeteringClient.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/stubs/MockMeteringClient.java
@@ -1,17 +1,14 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.controller.api.integration.stubs;
-import com.yahoo.config.provision.ApplicationName;
import com.yahoo.config.provision.TenantName;
import com.yahoo.vespa.hosted.controller.api.integration.resource.MeteringData;
-import com.yahoo.vespa.hosted.controller.api.integration.resource.ResourceAllocation;
import com.yahoo.vespa.hosted.controller.api.integration.resource.ResourceSnapshot;
import com.yahoo.vespa.hosted.controller.api.integration.resource.MeteringClient;
import java.time.YearMonth;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -32,14 +29,6 @@ public class MockMeteringClient implements MeteringClient {
}
@Override
- public MeteringData getMeteringData(TenantName tenantName, ApplicationName applicationName) {
- return meteringData.orElseGet(() -> {
- ResourceAllocation emptyAllocation = new ResourceAllocation(0, 0, 0);
- return new MeteringData(emptyAllocation, emptyAllocation, emptyAllocation, Collections.emptyMap());
- });
- }
-
- @Override
public List<ResourceSnapshot> getSnapshotHistoryForTenant(TenantName tenantName, YearMonth yearMonth) {
return new ArrayList<>(resources);
}
diff --git a/controller-server/pom.xml b/controller-server/pom.xml
index fa4a0dc06d6..ca8951124ef 100644
--- a/controller-server/pom.xml
+++ b/controller-server/pom.xml
@@ -138,7 +138,7 @@
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
- <version>1.3.3</version>
+ <version>1.4</version>
</dependency>
<dependency>
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java
index acaf35133d7..d4905f7e20a 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java
@@ -33,7 +33,9 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeoutException;
+import java.util.function.Function;
import java.util.logging.Level;
+import java.util.stream.Collector;
import java.util.stream.Collectors;
/**
@@ -150,14 +152,14 @@ public class ResourceMeterMaintainer extends ControllerMaintainer {
.filter(this::unlessNodeOwnerIsSystemApplication)
.filter(this::isNodeStateMeterable)
.filter(this::isClusterTypeMeterable)
+ // Grouping by ApplicationId -> Architecture -> ResourceSnapshot
.collect(Collectors.groupingBy(node ->
- node.owner().get(),
- Collectors.collectingAndThen(Collectors.toList(),
- nodeList -> ResourceSnapshot.from(
- nodeList,
- clock.instant(),
- zoneId))
- )).values();
+ node.owner().get(),
+ groupSnapshotsByArchitecture(zoneId)))
+ .values()
+ .stream()
+ .flatMap(list -> list.values().stream())
+ .collect(Collectors.toList());
}
private boolean unlessNodeOwnerIsSystemApplication(Node node) {
@@ -182,7 +184,7 @@ public class ResourceMeterMaintainer extends ControllerMaintainer {
public static double cost(ClusterResources clusterResources, SystemName systemName) {
NodeResources nr = clusterResources.nodeResources();
- return cost(new ResourceAllocation(nr.vcpu(), nr.memoryGb(), nr.diskGb()).multiply(clusterResources.nodes()), systemName);
+ return cost(new ResourceAllocation(nr.vcpu(), nr.memoryGb(), nr.diskGb(), nr.architecture()).multiply(clusterResources.nodes()), systemName);
}
private static double cost(ResourceAllocation allocation, SystemName systemName) {
@@ -201,7 +203,7 @@ public class ResourceMeterMaintainer extends ControllerMaintainer {
metric.createContext(Collections.emptyMap()));
resourceSnapshots.forEach(snapshot -> {
- var context = getMetricContext(snapshot.getApplicationId(), snapshot.getZoneId());
+ var context = getMetricContext(snapshot);
metric.set("metering.vcpu", snapshot.getCpuCores(), context);
metric.set("metering.memoryGB", snapshot.getMemoryGb(), context);
metric.set("metering.diskGB", snapshot.getDiskGb(), context);
@@ -222,4 +224,29 @@ public class ResourceMeterMaintainer extends ControllerMaintainer {
"zoneId", zoneId.value()
));
}
+
+ private Metric.Context getMetricContext(ResourceSnapshot snapshot) {
+ return metric.createContext(Map.of(
+ "tenant", snapshot.getApplicationId().tenant().value(),
+ "applicationId", snapshot.getApplicationId().toFullString(),
+ "zoneId", snapshot.getZoneId().value(),
+ "architecture", snapshot.getArchitecture()
+ ));
+ }
+
+ private Collector<Node, ?, Map<NodeResources.Architecture, ResourceSnapshot>> groupSnapshotsByArchitecture(ZoneId zoneId) {
+ return Collectors.collectingAndThen(
+ Collectors.groupingBy(node -> node.resources().architecture()),
+ convertNodeListToResourceSnapshot(zoneId)
+ );
+ }
+
+ private Function<Map<NodeResources.Architecture, List<Node>>, Map<NodeResources.Architecture, ResourceSnapshot>> convertNodeListToResourceSnapshot(ZoneId zoneId) {
+ return nodeMap -> nodeMap.entrySet()
+ .stream()
+ .collect(Collectors.toMap(
+ Map.Entry::getKey,
+ entry -> ResourceSnapshot.from(entry.getValue(), clock.instant(), zoneId))
+ );
+ }
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/metric/CostCalculator.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/metric/CostCalculator.java
index 089767dc586..b36b2b9cad8 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/metric/CostCalculator.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/metric/CostCalculator.java
@@ -57,7 +57,7 @@ public class CostCalculator {
Property property = propertyByTenantName.get(node.owner().get().tenant());
if (property == null) continue;
var allocation = allocationByProperty.getOrDefault(property, ResourceAllocation.ZERO);
- var nodeAllocation = new ResourceAllocation(node.resources().vcpu(), node.resources().memoryGb(), node.resources().diskGb());
+ var nodeAllocation = new ResourceAllocation(node.resources().vcpu(), node.resources().memoryGb(), node.resources().diskGb(), node.resources().architecture());
allocationByProperty.put(property, allocation.plus(nodeAllocation));
totalAllocation = totalAllocation.plus(nodeAllocation);
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java
index d9a38a5b578..9089bb27035 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java
@@ -255,7 +255,6 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler {
if (path.matches("/application/v4/tenant/{tenant}/application/{application}/diff/{number}")) return applicationPackageDiff(path.get("tenant"), path.get("application"), path.get("number"));
if (path.matches("/application/v4/tenant/{tenant}/application/{application}/deploying")) return deploying(path.get("tenant"), path.get("application"), "default", request);
if (path.matches("/application/v4/tenant/{tenant}/application/{application}/deploying/pin")) return deploying(path.get("tenant"), path.get("application"), "default", request);
- if (path.matches("/application/v4/tenant/{tenant}/application/{application}/metering")) return metering(path.get("tenant"), path.get("application"), request);
if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance")) return applications(path.get("tenant"), Optional.of(path.get("application")), request);
if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance/{instance}")) return instance(path.get("tenant"), path.get("application"), path.get("instance"), request);
if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance/{instance}/deploying")) return deploying(path.get("tenant"), path.get("application"), path.get("instance"), request);
@@ -1762,68 +1761,6 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler {
return new SlimeJsonResponse(slime);
}
- private HttpResponse metering(String tenant, String application, HttpRequest request) {
-
- Slime slime = new Slime();
- Cursor root = slime.setObject();
-
- MeteringData meteringData = controller.serviceRegistry()
- .meteringService()
- .getMeteringData(TenantName.from(tenant), ApplicationName.from(application));
-
- ResourceAllocation currentSnapshot = meteringData.getCurrentSnapshot();
- Cursor currentRate = root.setObject("currentrate");
- currentRate.setDouble("cpu", currentSnapshot.getCpuCores());
- currentRate.setDouble("mem", currentSnapshot.getMemoryGb());
- currentRate.setDouble("disk", currentSnapshot.getDiskGb());
-
- ResourceAllocation thisMonth = meteringData.getThisMonth();
- Cursor thismonth = root.setObject("thismonth");
- thismonth.setDouble("cpu", thisMonth.getCpuCores());
- thismonth.setDouble("mem", thisMonth.getMemoryGb());
- thismonth.setDouble("disk", thisMonth.getDiskGb());
-
- ResourceAllocation lastMonth = meteringData.getLastMonth();
- Cursor lastmonth = root.setObject("lastmonth");
- lastmonth.setDouble("cpu", lastMonth.getCpuCores());
- lastmonth.setDouble("mem", lastMonth.getMemoryGb());
- lastmonth.setDouble("disk", lastMonth.getDiskGb());
-
-
- Map<ApplicationId, List<ResourceSnapshot>> history = meteringData.getSnapshotHistory();
- Cursor details = root.setObject("details");
-
- Cursor detailsCpu = details.setObject("cpu");
- Cursor detailsMem = details.setObject("mem");
- Cursor detailsDisk = details.setObject("disk");
-
- history.forEach((applicationId, resources) -> {
- String instanceName = applicationId.instance().value();
- Cursor detailsCpuApp = detailsCpu.setObject(instanceName);
- Cursor detailsMemApp = detailsMem.setObject(instanceName);
- Cursor detailsDiskApp = detailsDisk.setObject(instanceName);
- Cursor detailsCpuData = detailsCpuApp.setArray("data");
- Cursor detailsMemData = detailsMemApp.setArray("data");
- Cursor detailsDiskData = detailsDiskApp.setArray("data");
-
- resources.forEach(resourceSnapshot -> {
- Cursor cpu = detailsCpuData.addObject();
- cpu.setLong("unixms", resourceSnapshot.getTimestamp().toEpochMilli());
- cpu.setDouble("value", resourceSnapshot.getCpuCores());
-
- Cursor mem = detailsMemData.addObject();
- mem.setLong("unixms", resourceSnapshot.getTimestamp().toEpochMilli());
- mem.setDouble("value", resourceSnapshot.getMemoryGb());
-
- Cursor disk = detailsDiskData.addObject();
- disk.setLong("unixms", resourceSnapshot.getTimestamp().toEpochMilli());
- disk.setDouble("value", resourceSnapshot.getDiskGb());
- });
- });
-
- return new SlimeJsonResponse(slime);
- }
-
private HttpResponse deploying(String tenantName, String applicationName, String instanceName, HttpRequest request) {
Instance instance = controller.applications().requireInstance(ApplicationId.from(tenantName, applicationName, instanceName));
Slime slime = new Slime();
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/MultipartParser.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/MultipartParser.java
index 8d03ca74500..a9e24943c0d 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/MultipartParser.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/MultipartParser.java
@@ -5,6 +5,7 @@ import com.yahoo.container.jdisc.HttpRequest;
import com.yahoo.vespa.hosted.controller.api.application.v4.EnvironmentResource;
import org.apache.commons.fileupload.MultipartStream;
import org.apache.commons.fileupload.ParameterParser;
+import org.apache.commons.fileupload.util.Streams;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -21,6 +22,16 @@ import java.util.Map;
*/
public class MultipartParser {
+ private final long maxDataLength;
+
+ public MultipartParser() {
+ this(2 * (long) Math.pow(1024, 3)); // 2 GB
+ }
+
+ MultipartParser(long maxDataLength) {
+ this.maxDataLength = maxDataLength;
+ }
+
/**
* Parses the given multi-part request and returns all the parts indexed by their name.
*
@@ -37,10 +48,13 @@ public class MultipartParser {
*/
public Map<String, byte[]> parse(String contentTypeHeader, InputStream data, URI uri) {
try {
+ LimitedOutputStream output = new LimitedOutputStream(maxDataLength);
ParameterParser parameterParser = new ParameterParser();
Map<String, String> contentType = parameterParser.parse(contentTypeHeader, ';');
- if (contentType.containsKey("application/zip"))
- return Map.of(EnvironmentResource.APPLICATION_ZIP, data.readAllBytes());
+ if (contentType.containsKey("application/zip")) {
+ Streams.copy(data, output, false);
+ return Map.of(EnvironmentResource.APPLICATION_ZIP, output.toByteArray());
+ }
if ( ! contentType.containsKey("multipart/form-data"))
throw new IllegalArgumentException("Expected a multipart or application/zip message, but got Content-Type: " + contentTypeHeader);
String boundary = contentType.get("boundary");
@@ -55,17 +69,17 @@ public class MultipartParser {
if (contentDispositionContent == null)
throw new IllegalArgumentException("Missing Content-Disposition header in a multipart body part");
Map<String, String> contentDisposition = parameterParser.parse(contentDispositionContent, ';');
- ByteArrayOutputStream output = new ByteArrayOutputStream();
multipartStream.readBodyData(output);
parts.put(contentDisposition.get("name"), output.toByteArray());
+ output.reset();
nextPart = multipartStream.readBoundary();
}
return parts;
}
- catch(MultipartStream.MalformedStreamException e) {
+ catch (MultipartStream.MalformedStreamException e) {
throw new IllegalArgumentException("Malformed multipart/form-data request", e);
}
- catch(IOException e) {
+ catch (IOException e) {
throw new IllegalArgumentException("IO error reading multipart request " + uri, e);
}
}
@@ -80,4 +94,34 @@ public class MultipartParser {
return null;
}
+ /** A {@link java.io.ByteArrayOutputStream} that limits the number of bytes written to it */
+ private static class LimitedOutputStream extends ByteArrayOutputStream {
+
+ private long remaining;
+
+ /** Create a new OutputStream that can fit up to len bytes */
+ private LimitedOutputStream(long len) {
+ this.remaining = len;
+ }
+
+ @Override
+ public synchronized void write(int b) {
+ requireCapacity(1);
+ super.write(b);
+ remaining--;
+ }
+
+ @Override
+ public synchronized void write(byte[] b, int off, int len) {
+ requireCapacity(len);
+ super.write(b, off, len);
+ remaining -= len;
+ }
+
+ private void requireCapacity(int len) {
+ if (len > remaining) throw new IllegalArgumentException("Too many bytes to write");
+ }
+
+ }
+
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/controller/MeteringResponse.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/controller/MeteringResponse.java
index 850a9ef6107..33cd4948a7e 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/controller/MeteringResponse.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/controller/MeteringResponse.java
@@ -32,6 +32,7 @@ public class MeteringResponse extends SlimeJsonResponse {
object.setDouble("cpu", snapshot.getCpuCores());
object.setDouble("memory", snapshot.getMemoryGb());
object.setDouble("disk", snapshot.getDiskGb());
+ object.setString("architecture", snapshot.getArchitecture().name());
});
return slime;
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/CostReportMaintainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/CostReportMaintainerTest.java
index 80ee0988658..10193b48837 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/CostReportMaintainerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/CostReportMaintainerTest.java
@@ -1,6 +1,7 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.controller.maintenance;
+import com.yahoo.config.provision.NodeResources;
import com.yahoo.vespa.hosted.controller.ControllerTester;
import com.yahoo.vespa.hosted.controller.api.identifiers.Property;
import com.yahoo.vespa.hosted.controller.api.integration.resource.ResourceAllocation;
@@ -38,7 +39,7 @@ public class CostReportMaintainerTest {
"1970-01-01,Property3,128.0,96.0,2000.0,0.3333333333333333\n" +
"1970-01-01,Property2,160.0,96.0,2000.0,0.3611111111111111",
csv),
- Map.of(new Property("Property3"), new ResourceAllocation(256, 192, 4000))
+ Map.of(new Property("Property3"), new ResourceAllocation(256, 192, 4000, NodeResources.Architecture.getDefault()))
);
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainerTest.java
index 4acc9f91e79..6109890bae3 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainerTest.java
@@ -58,18 +58,18 @@ public class ResourceMeterMaintainerTest {
.collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().cost().getAsDouble())));
List<ResourceSnapshot> resourceSnapshots = List.of(
- new ResourceSnapshot(app1, 12, 34, 56, Instant.EPOCH, z1),
- new ResourceSnapshot(app1, 23, 45, 67, Instant.EPOCH, z2),
- new ResourceSnapshot(app2, 34, 56, 78, Instant.EPOCH, z1));
+ new ResourceSnapshot(app1, 12, 34, 56, NodeResources.Architecture.getDefault(), Instant.EPOCH, z1),
+ new ResourceSnapshot(app1, 23, 45, 67, NodeResources.Architecture.getDefault(), Instant.EPOCH, z2),
+ new ResourceSnapshot(app2, 34, 56, 78, NodeResources.Architecture.getDefault(), Instant.EPOCH, z1));
maintainer.updateDeploymentCost(resourceSnapshots);
assertCost.accept(app1, Map.of(z1, 1.40, z2, 2.50));
assertCost.accept(app2, Map.of(z1, 3.59));
// Remove a region from app1 and add region to app2
resourceSnapshots = List.of(
- new ResourceSnapshot(app1, 23, 45, 67, Instant.EPOCH, z2),
- new ResourceSnapshot(app2, 34, 56, 78, Instant.EPOCH, z1),
- new ResourceSnapshot(app2, 45, 67, 89, Instant.EPOCH, z2));
+ new ResourceSnapshot(app1, 23, 45, 67, NodeResources.Architecture.getDefault(), Instant.EPOCH, z2),
+ new ResourceSnapshot(app2, 34, 56, 78, NodeResources.Architecture.getDefault(), Instant.EPOCH, z1),
+ new ResourceSnapshot(app2, 45, 67, 89, NodeResources.Architecture.getDefault(), Instant.EPOCH, z2));
maintainer.updateDeploymentCost(resourceSnapshots);
assertCost.accept(app1, Map.of(z2, 2.50));
assertCost.accept(app2, Map.of(z1, 3.59, z2, 4.68));
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java
index f94f87b0f46..cc162548f33 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java
@@ -11,6 +11,7 @@ import com.yahoo.config.provision.ApplicationName;
import com.yahoo.config.provision.AthenzService;
import com.yahoo.config.provision.Environment;
import com.yahoo.config.provision.InstanceName;
+import com.yahoo.config.provision.NodeResources;
import com.yahoo.config.provision.RegionName;
import com.yahoo.config.provision.TenantName;
import com.yahoo.config.provision.zone.RoutingMethod;
@@ -1069,27 +1070,6 @@ public class ApplicationApiTest extends ControllerContainerTest {
new File("deploy-result.json"));
}
- @Test
- public void testMeteringResponses() {
- MockMeteringClient mockMeteringClient = tester.serviceRegistry().meteringService();
-
- // Mock response for MeteringClient
- ResourceAllocation currentSnapshot = new ResourceAllocation(1, 2, 3);
- ResourceAllocation thisMonth = new ResourceAllocation(12, 24, 1000);
- ResourceAllocation lastMonth = new ResourceAllocation(24, 48, 2000);
- ApplicationId applicationId = ApplicationId.from("doesnotexist", "doesnotexist", "default");
- Map<ApplicationId, List<ResourceSnapshot>> snapshotHistory = Map.of(applicationId, List.of(
- new ResourceSnapshot(applicationId, 1, 2,3, Instant.ofEpochMilli(123), ZoneId.defaultId()),
- new ResourceSnapshot(applicationId, 1, 2,3, Instant.ofEpochMilli(246), ZoneId.defaultId()),
- new ResourceSnapshot(applicationId, 1, 2,3, Instant.ofEpochMilli(492), ZoneId.defaultId())));
-
- mockMeteringClient.setMeteringData(new MeteringData(thisMonth, lastMonth, currentSnapshot, snapshotHistory));
-
- tester.assertResponse(request("/application/v4/tenant/doesnotexist/application/doesnotexist/metering", GET)
- .userIdentity(USER_ID)
- .oAuthCredentials(OKTA_CREDENTIALS),
- new File("instance1-metering.json"));
- }
@Test
public void testRemovingAllDeployments() {
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/MultipartParserTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/MultipartParserTest.java
index 2c81b1a7fd8..12a0a00713c 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/MultipartParserTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/MultipartParserTest.java
@@ -11,12 +11,12 @@ import org.junit.Test;
import java.io.ByteArrayInputStream;
import java.net.URI;
-import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
/**
* @author bratseth
@@ -24,7 +24,7 @@ import static org.junit.Assert.assertTrue;
public class MultipartParserTest {
@Test
- public void multipartParserTest() throws URISyntaxException {
+ public void parser() {
String data =
"Content-Type: multipart/form-data; boundary=AaB03x\r\n" +
"\r\n" +
@@ -43,13 +43,7 @@ public class MultipartParserTest {
"\r\n" +
"... contents of file1.txt ...\r\n" +
"--AaB03x--\r\n";
- ByteArrayInputStream dataStream = new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8));
- HttpRequest request = HttpRequest.createRequest(new MockCurrentContainer(),
- new URI("http://foo"),
- com.yahoo.jdisc.http.HttpRequest.Method.POST,
- dataStream);
- request.getJDiscRequest().headers().put("Content-Type", "multipart/form-data; boundary=AaB03x");
- Map<String, byte[]> parts = new MultipartParser().parse(request);
+ Map<String, byte[]> parts = parse(data, Long.MAX_VALUE);
assertEquals(3, parts.size());
assertTrue(parts.containsKey("submit-name"));
assertTrue(parts.containsKey("submit-address"));
@@ -57,6 +51,41 @@ public class MultipartParserTest {
assertEquals("Larry", new String(parts.get("submit-name"), StandardCharsets.UTF_8));
assertEquals("... contents of file1.txt ...", new String(parts.get("files"), StandardCharsets.UTF_8));
}
+
+ @Test
+ public void max_length() {
+ String part1 = "Larry";
+ String part2 = "House 1";
+ String data =
+ "Content-Type: multipart/form-data; boundary=AaB03x\r\n" +
+ "\r\n" +
+ "--AaB03x\r\n" +
+ "Content-Disposition: form-data; name=\"submit-name\"\r\n" +
+ "\r\n" +
+ part1 + "\r\n" +
+ "--AaB03x\r\n" +
+ "Content-Disposition: form-data; name=\"submit-address\"\r\n" +
+ "Content-Type: text/plain\r\n" +
+ "\r\n" +
+ part2 + "\r\n" +
+ "--AaB03x--\r\n";
+ parse(data, part1.length() + part2.length());
+ try {
+ parse(data, part1.length() + part2.length() - 1);
+ fail("Expected exception");
+ } catch (IllegalArgumentException ignored) {
+ }
+ }
+
+ private Map<String, byte[]> parse(String data, long maxLength) {
+ ByteArrayInputStream dataStream = new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8));
+ HttpRequest request = HttpRequest.createRequest(new MockCurrentContainer(),
+ URI.create("http://foo"),
+ com.yahoo.jdisc.http.HttpRequest.Method.POST,
+ dataStream);
+ request.getJDiscRequest().headers().put("Content-Type", "multipart/form-data; boundary=AaB03x");
+ return new MultipartParser(maxLength).parse(request);
+ }
private static class MockCurrentContainer implements CurrentContainer {
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/ControllerApiTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/ControllerApiTest.java
index 7bc01de2053..8a6244e19a0 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/ControllerApiTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/ControllerApiTest.java
@@ -3,6 +3,7 @@ package com.yahoo.vespa.hosted.controller.restapi.controller;
import com.yahoo.application.container.handler.Request;
import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.NodeResources;
import com.yahoo.config.provision.zone.ZoneId;
import com.yahoo.container.jdisc.HttpRequest;
import com.yahoo.test.ManualClock;
@@ -158,8 +159,8 @@ public class ControllerApiTest extends ControllerContainerTest {
Instant timestamp = Instant.ofEpochMilli(123456789);
ZoneId zoneId = ZoneId.defaultId();
List<ResourceSnapshot> snapshots = List.of(
- new ResourceSnapshot(applicationId, 12,48,1200, timestamp, zoneId),
- new ResourceSnapshot(applicationId, 24, 96,2400, timestamp, zoneId)
+ new ResourceSnapshot(applicationId, 12,48,1200, NodeResources.Architecture.arm64, timestamp, zoneId),
+ new ResourceSnapshot(applicationId, 24, 96,2400, NodeResources.Architecture.x86_64, timestamp, zoneId)
);
tester.controller().serviceRegistry().meteringService().consume(snapshots);
tester.assertResponse(
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/responses/metering.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/responses/metering.json
index b64e8f26a63..1008ada6def 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/responses/metering.json
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/responses/metering.json
@@ -5,7 +5,8 @@
"zoneId": "prod.default",
"cpu": 12.0,
"memory": 48.0,
- "disk": 1200.0
+ "disk": 1200.0,
+ "architecture":"arm64"
},
{
"applicationId": "tenant.app.instance",
@@ -13,6 +14,7 @@
"zoneId": "prod.default",
"cpu": 24.0,
"memory": 96.0,
- "disk": 2400.0
+ "disk": 2400.0,
+ "architecture":"x86_64"
}
] \ No newline at end of file