summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Bratseth <jonbratseth@yahoo.com>2017-01-12 22:17:49 +0100
committerGitHub <noreply@github.com>2017-01-12 22:17:49 +0100
commit585a5b38c5811da950336c26326636773ca289e3 (patch)
treebacb7cb5b8d3e881a2df260589b9b0e046b12e89
parentb72c29c29a2c8dd8ecac8aeffdaff688b21ee41c (diff)
Revert "Revert "Bratseth/tensor type info in documents""
-rw-r--r--config-model/src/main/java/com/yahoo/documentmodel/DataTypeCollection.java8
-rw-r--r--config-model/src/main/java/com/yahoo/documentmodel/DataTypeRepo.java8
-rw-r--r--config-model/src/main/java/com/yahoo/documentmodel/DocumentTypeRepo.java2
-rw-r--r--config-model/src/main/java/com/yahoo/documentmodel/NewDocumentType.java5
-rw-r--r--config-model/src/main/java/com/yahoo/documentmodel/VespaDocumentType.java1
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/SDDocumentTypeOrderer.java5
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/document/Attribute.java59
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/FieldOperation.java1
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/processing/IndexingValidation.java9
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/processing/TensorFieldProcessor.java15
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/processing/ValidateFieldTypes.java20
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/configmodel/producers/DocumentManager.java109
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/configmodel/producers/DocumentTypes.java90
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/application/validation/SearchDataTypeValidator.java38
-rw-r--r--config-model/src/main/javacc/SDParser.jj3
-rw-r--r--config-model/src/test/cfg/application/validation/search_alltypes/searchdefinitions/simple.sd2
-rw-r--r--config-model/src/test/configmodel/types/documentmanager.cfg44
-rw-r--r--config-model/src/test/configmodel/types/documenttypes.cfg42
-rw-r--r--config-model/src/test/configmodel/types/documenttypes_with_doc_field.cfg7
-rw-r--r--config-model/src/test/derived/advanced/documentmanager.cfg22
-rw-r--r--config-model/src/test/derived/advanced/index-info.cfg28
-rwxr-xr-xconfig-model/src/test/derived/annotationsimplicitstruct/documentmanager.cfg5
-rwxr-xr-xconfig-model/src/test/derived/annotationsinheritance/documentmanager.cfg10
-rwxr-xr-xconfig-model/src/test/derived/annotationsinheritance2/documentmanager.cfg6
-rwxr-xr-xconfig-model/src/test/derived/annotationspolymorphy/documentmanager.cfg5
-rwxr-xr-xconfig-model/src/test/derived/annotationsreference/documentmanager.cfg8
-rwxr-xr-xconfig-model/src/test/derived/annotationssimple/documentmanager.cfg4
-rw-r--r--config-model/src/test/derived/annotationsstruct/documentmanager.cfg6
-rw-r--r--config-model/src/test/derived/annotationsstructarray/documentmanager.cfg6
-rw-r--r--config-model/src/test/derived/arrays/documentmanager.cfg9
-rw-r--r--config-model/src/test/derived/arrays/index-info.cfg126
-rw-r--r--config-model/src/test/derived/attributeprefetch/documentmanager.cfg22
-rw-r--r--config-model/src/test/derived/complex/documentmanager.cfg29
-rw-r--r--config-model/src/test/derived/complex/rank-profiles.cfg2
-rw-r--r--config-model/src/test/derived/documentderiver/documentmanager.cfg75
-rw-r--r--config-model/src/test/derived/emptydefault/documentmanager.cfg6
-rw-r--r--config-model/src/test/derived/id/documentmanager.cfg5
-rw-r--r--config-model/src/test/derived/indexswitches/documentmanager.cfg8
-rw-r--r--config-model/src/test/derived/indexswitches/index-info.cfg60
-rw-r--r--config-model/src/test/derived/inheritfromgrandparent/documentmanager.cfg6
-rw-r--r--config-model/src/test/derived/inheritfromparent/documentmanager.cfg8
-rw-r--r--config-model/src/test/derived/inheritfromparent/documenttypes.cfg6
-rw-r--r--config-model/src/test/derived/mail/onlydoc/documentmanager.cfg18
-rw-r--r--config-model/src/test/derived/prefixexactattribute/documentmanager.cfg9
-rw-r--r--config-model/src/test/derived/ranktypes/documentmanager.cfg9
-rw-r--r--config-model/src/test/derived/streamingstruct/documentmanager.cfg31
-rw-r--r--config-model/src/test/derived/streamingstruct/onlydoc/documentmanager.cfg26
-rwxr-xr-xconfig-model/src/test/derived/structanyorder/documentmanager.cfg13
-rw-r--r--config-model/src/test/derived/tensor/attributes.cfg4
-rw-r--r--config-model/src/test/derived/tensor/documenttypes.cfg6
-rw-r--r--config-model/src/test/derived/tensor/rank-profiles.cfg18
-rw-r--r--config-model/src/test/derived/tensor/tensor.sd8
-rw-r--r--config-model/src/test/derived/types/attributes.cfg2
-rw-r--r--config-model/src/test/derived/types/documentmanager.cfg41
-rw-r--r--config-model/src/test/derived/types/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/types/index-info.cfg2
-rw-r--r--config-model/src/test/derived/types/summary.cfg2
-rw-r--r--config-model/src/test/derived/types/summarymap.cfg2
-rw-r--r--config-model/src/test/examples/fieldoftypedocument.cfg10
-rwxr-xr-xconfig-model/src/test/examples/structresult.cfg10
-rw-r--r--config-model/src/test/java/com/yahoo/searchdefinition/FieldOfTypeDocumentTestCase.java5
-rw-r--r--config-model/src/test/java/com/yahoo/searchdefinition/NameFieldCheckTestCase.java12
-rw-r--r--config-model/src/test/java/com/yahoo/searchdefinition/RankProfileTestCase.java8
-rwxr-xr-xconfig-model/src/test/java/com/yahoo/searchdefinition/StructTestCase.java14
-rw-r--r--config-model/src/test/java/com/yahoo/searchdefinition/processing/TensorFieldTestCase.java8
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/application/validation/SearchDataTypeValidatorTestCase.java3
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/search/AttributeChangeValidatorTest.java25
-rw-r--r--container-search/src/test/java/com/yahoo/fs4/test/RankFeaturesTestCase.java27
-rw-r--r--document/src/main/java/com/yahoo/document/ArrayDataType.java3
-rw-r--r--document/src/main/java/com/yahoo/document/DataType.java69
-rw-r--r--document/src/main/java/com/yahoo/document/Document.java5
-rw-r--r--document/src/main/java/com/yahoo/document/DocumentTypeManager.java55
-rw-r--r--document/src/main/java/com/yahoo/document/DocumentTypeManagerConfigurer.java22
-rw-r--r--document/src/main/java/com/yahoo/document/Field.java2
-rw-r--r--document/src/main/java/com/yahoo/document/PrimitiveDataType.java3
-rw-r--r--document/src/main/java/com/yahoo/document/TemporaryDataType.java11
-rw-r--r--document/src/main/java/com/yahoo/document/TensorDataType.java50
-rw-r--r--document/src/main/java/com/yahoo/document/datatypes/Array.java2
-rw-r--r--document/src/main/java/com/yahoo/document/datatypes/Struct.java2
-rw-r--r--document/src/main/java/com/yahoo/document/datatypes/StructuredFieldValue.java2
-rw-r--r--document/src/main/java/com/yahoo/document/datatypes/TensorFieldValue.java57
-rw-r--r--document/src/main/java/com/yahoo/document/json/JsonReader.java46
-rw-r--r--document/src/main/java/com/yahoo/document/serialization/DocumentReader.java2
-rw-r--r--document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializer42.java8
-rw-r--r--document/src/test/java/com/yahoo/document/DocumentUpdateTestCase.java6
-rw-r--r--document/src/test/java/com/yahoo/document/TemporaryDataTypeTestCase.java7
-rw-r--r--document/src/test/java/com/yahoo/document/datatypes/TensorFieldValueTestCase.java30
-rw-r--r--document/src/test/java/com/yahoo/document/json/DocumentUpdateJsonSerializerTest.java5
-rw-r--r--document/src/test/java/com/yahoo/document/json/JsonReaderTestCase.java137
-rw-r--r--document/src/test/java/com/yahoo/document/json/JsonWriterTestCase.java23
-rw-r--r--document/src/test/java/com/yahoo/document/serialization/SerializationTestUtils.java1
-rw-r--r--document/src/test/java/com/yahoo/document/serialization/TensorFieldValueSerializationTestCase.java25
-rw-r--r--document/src/test/java/com/yahoo/vespaxmlparser/VespaXmlFieldReaderTestCase.java5
-rw-r--r--document/src/test/java/com/yahoo/vespaxmlparser/VespaXmlUpdateReaderTestCase.java6
-rw-r--r--document/src/test/resources/tensor/empty_tensor__cppbin54 -> 64 bytes
-rw-r--r--document/src/test/resources/tensor/empty_tensor__javabin62 -> 64 bytes
-rw-r--r--document/src/test/resources/tensor/multi_cell_tensor__cppbin107 -> 107 bytes
-rw-r--r--document/src/tests/serialization/vespadocumentserializer_test.cpp2
-rw-r--r--document/src/vespa/document/config/documentmanager.def4
-rw-r--r--document/src/vespa/document/config/documenttypes.def6
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ArithmeticExpression.java8
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Base64DecodeExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Base64EncodeExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/CatExpression.java8
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ClearStateExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EchoExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExactExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Expression.java39
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/FlattenExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ForEachExpression.java14
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GetFieldExpression.java6
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GetVarExpression.java6
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GuardExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexDecodeExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexEncodeExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HostNameExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/IfThenExpression.java14
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/InputExpression.java6
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/JoinExpression.java6
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/LowerCaseExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NGramExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NowExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/OptimizePredicateExpression.java10
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/OutputExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ParenthesisExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/RandomExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ScriptExpression.java8
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SelectInputExpression.java10
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetLanguageExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetValueExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetVarExpression.java8
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SplitExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/StatementExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SubstringExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SwitchExpression.java10
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ThisExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToArrayExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToByteExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToDoubleExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToFloatExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToIntegerExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToLongExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToPositionExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToStringExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToWsetExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/TokenizeExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/TrimExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ZCurveExpression.java4
-rw-r--r--indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ExpressionConverterTestCase.java2
-rw-r--r--indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ForEachTestCase.java2
-rw-r--r--indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/SimpleExpression.java4
-rw-r--r--vespajlib/src/main/java/com/yahoo/tensor/TensorType.java19
-rw-r--r--vespajlib/src/main/java/com/yahoo/tensor/serialization/SparseBinaryFormat.java14
-rw-r--r--vespajlib/src/main/java/com/yahoo/tensor/serialization/TypedBinaryFormat.java2
-rw-r--r--vespajlib/src/main/java/com/yahoo/vespa/objects/Identifiable.java4
-rw-r--r--vespajlib/src/test/java/com/yahoo/tensor/serialization/DenseBinaryFormatTestCase.java1
156 files changed, 1419 insertions, 747 deletions
diff --git a/config-model/src/main/java/com/yahoo/documentmodel/DataTypeCollection.java b/config-model/src/main/java/com/yahoo/documentmodel/DataTypeCollection.java
index 9c507d7be05..ff1a582d7fa 100644
--- a/config-model/src/main/java/com/yahoo/documentmodel/DataTypeCollection.java
+++ b/config-model/src/main/java/com/yahoo/documentmodel/DataTypeCollection.java
@@ -9,7 +9,9 @@ import java.util.Collection;
* @author baldersheim
*/
public interface DataTypeCollection {
- public DataType getDataType(String name);
- public DataType getDataType(int id);
- public Collection<DataType> getTypes();
+
+ DataType getDataType(String name);
+ DataType getDataType(int id);
+ Collection<DataType> getTypes();
+
}
diff --git a/config-model/src/main/java/com/yahoo/documentmodel/DataTypeRepo.java b/config-model/src/main/java/com/yahoo/documentmodel/DataTypeRepo.java
index 73f8d7f91c5..2c527201ce4 100644
--- a/config-model/src/main/java/com/yahoo/documentmodel/DataTypeRepo.java
+++ b/config-model/src/main/java/com/yahoo/documentmodel/DataTypeRepo.java
@@ -11,6 +11,7 @@ import java.util.Map;
* @author baldersheim
*/
public class DataTypeRepo implements DataTypeCollection {
+
Map<Integer, DataType> typeById = new LinkedHashMap<>();
Map<String, DataType> typeByName = new LinkedHashMap<>();
@@ -25,10 +26,9 @@ public class DataTypeRepo implements DataTypeCollection {
public Collection<DataType> getTypes() { return typeById.values(); }
public DataTypeRepo add(DataType type) {
- if (typeByName.containsKey(type.getName()) ||
- typeById.containsKey(type.getId()))
- {
- throw new IllegalStateException("Data type '" + type.getName() + "', id '" + type.getId() + "' is already registered.");
+ if (typeByName.containsKey(type.getName()) || typeById.containsKey(type.getId())) {
+ throw new IllegalStateException("Data type '" + type.getName() + "', id '" +
+ type.getId() + "' is already registered.");
}
typeByName.put(type.getName(), type);
typeById.put(type.getId(), type);
diff --git a/config-model/src/main/java/com/yahoo/documentmodel/DocumentTypeRepo.java b/config-model/src/main/java/com/yahoo/documentmodel/DocumentTypeRepo.java
index b71a400666a..1abbf8b3ae1 100644
--- a/config-model/src/main/java/com/yahoo/documentmodel/DocumentTypeRepo.java
+++ b/config-model/src/main/java/com/yahoo/documentmodel/DocumentTypeRepo.java
@@ -9,6 +9,7 @@ import java.util.Map;
* @author baldersheim
*/
public class DocumentTypeRepo implements DocumentTypeCollection {
+
final Map<Integer, NewDocumentType> typeById = new LinkedHashMap<>();
final Map<NewDocumentType.Name, NewDocumentType> typeByName = new LinkedHashMap<>();
@@ -36,4 +37,5 @@ public class DocumentTypeRepo implements DocumentTypeCollection {
typeById.put(type.getFullName().getId(), type);
return this;
}
+
}
diff --git a/config-model/src/main/java/com/yahoo/documentmodel/NewDocumentType.java b/config-model/src/main/java/com/yahoo/documentmodel/NewDocumentType.java
index ccf9bdec302..7c594a4e836 100644
--- a/config-model/src/main/java/com/yahoo/documentmodel/NewDocumentType.java
+++ b/config-model/src/main/java/com/yahoo/documentmodel/NewDocumentType.java
@@ -13,15 +13,10 @@ import com.yahoo.searchdefinition.processing.BuiltInFieldSets;
import java.util.*;
/**
- * TODO: What is this and why?
- *
* @author baldersheim
*/
public final class NewDocumentType extends StructuredDataType implements DataTypeCollection {
- /**
- * TODO: What is this and why?
- */
public static final class Name {
// TODO: privatize
diff --git a/config-model/src/main/java/com/yahoo/documentmodel/VespaDocumentType.java b/config-model/src/main/java/com/yahoo/documentmodel/VespaDocumentType.java
index 793a5fcff6c..09aa55f776b 100644
--- a/config-model/src/main/java/com/yahoo/documentmodel/VespaDocumentType.java
+++ b/config-model/src/main/java/com/yahoo/documentmodel/VespaDocumentType.java
@@ -32,7 +32,6 @@ public class VespaDocumentType {
vespa.add(PositionDataType.INSTANCE);
vespa.add(DataType.URI);
vespa.add(DataType.PREDICATE);
- vespa.add(DataType.TENSOR);
return vespa;
}
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/SDDocumentTypeOrderer.java b/config-model/src/main/java/com/yahoo/searchdefinition/SDDocumentTypeOrderer.java
index 7d8a87cee8c..2a723596255 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/SDDocumentTypeOrderer.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/SDDocumentTypeOrderer.java
@@ -11,9 +11,10 @@ import java.util.*;
import java.util.logging.Level;
/**
- * @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a>
+ * @author Einar M R Rosenvinge
*/
public class SDDocumentTypeOrderer {
+
private Map<DataTypeName, SDDocumentType> createdSDTypes = new LinkedHashMap<>();
private Set<Integer> seenTypes = new LinkedHashSet<>();
List<SDDocumentType> processingOrder = new LinkedList<>();
@@ -119,6 +120,8 @@ public class SDDocumentTypeOrderer {
//do nothing
} else if (type instanceof PrimitiveDataType) {
//do nothing
+ } else if (type instanceof TensorDataType) {
+ //do nothing
} else {
deployLogger.log(Level.WARNING, "Unknown type : " + type);
}
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/document/Attribute.java b/config-model/src/main/java/com/yahoo/searchdefinition/document/Attribute.java
index 950ec791368..bc52aa27f4c 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/document/Attribute.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/document/Attribute.java
@@ -25,10 +25,6 @@ public final class Attribute implements Cloneable, Serializable {
private Type type;
private CollectionType collectionType;
- /** True if only the enum information should be read from this attribute
- * (i.e. the actual values are not relevant, only which documents have the
- * same values) Used for collapsing and unique.
- */
private boolean removeIfZero = false;
private boolean createIfNonExistent = false;
private boolean enableBitVectors = false;
@@ -41,6 +37,8 @@ public final class Attribute implements Cloneable, Serializable {
private long lowerBound = BooleanIndexDefinition.DEFAULT_LOWER_BOUND;
private long upperBound = BooleanIndexDefinition.DEFAULT_UPPER_BOUND;
private double densePostingListThreshold = BooleanIndexDefinition.DEFAULT_DENSE_POSTING_LIST_THRESHOLD;
+
+ /** This is set if the type of this is TENSOR */
private Optional<TensorType> tensorType = Optional.empty();
private boolean isPosition = false;
@@ -104,16 +102,21 @@ public final class Attribute implements Cloneable, Serializable {
}
/** Creates an attribute with default settings */
- public Attribute(String name,DataType fieldType) {
- this(name,convertDataType(fieldType), convertCollectionType(fieldType));
+ public Attribute(String name, DataType fieldType) {
+ this(name, convertDataType(fieldType), convertCollectionType(fieldType), convertTensorType(fieldType));
setRemoveIfZero(fieldType instanceof WeightedSetDataType ? ((WeightedSetDataType)fieldType).removeIfZero() : false);
setCreateIfNonExistent(fieldType instanceof WeightedSetDataType ? ((WeightedSetDataType)fieldType).createIfNonExistent() : false);
}
- public Attribute(String name,Type type, CollectionType collectionType) {
+ public Attribute(String name, Type type, CollectionType collectionType) {
+ this(name, type, collectionType, Optional.empty());
+ }
+
+ public Attribute(String name, Type type, CollectionType collectionType, Optional<TensorType> tensorType) {
this.name=name;
setType(type);
setCollectionType(collectionType);
+ this.tensorType = tensorType;
}
/**
@@ -211,44 +214,42 @@ public final class Attribute implements Cloneable, Serializable {
}
/** Converts to the right attribute type from a field datatype */
- public static CollectionType convertCollectionType(DataType fieldType) {
+ private static CollectionType convertCollectionType(DataType fieldType) {
if (fieldType instanceof ArrayDataType) {
return CollectionType.ARRAY;
} else if (fieldType instanceof WeightedSetDataType) {
return CollectionType.WEIGHTEDSET;
+ } else if (fieldType instanceof TensorDataType) {
+ return CollectionType.SINGLE;
} else if (fieldType instanceof PrimitiveDataType) {
return CollectionType.SINGLE;
} else {
throw new IllegalArgumentException("Field " + fieldType + " not supported in convertCollectionType");
}
}
+
+ private static Optional<TensorType> convertTensorType(DataType fieldType) {
+ if ( ! ( fieldType instanceof TensorDataType)) return Optional.empty();
+ return Optional.of(((TensorDataType)fieldType).getTensorType());
+ }
/** Converts to the right field type from an attribute type */
- public static DataType convertAttrType(Type attrType) {
- if (attrType== Type.STRING) {
- return DataType.STRING;
- } else if (attrType== Type.INTEGER) {
- return DataType.INT;
- } else if (attrType== Type.LONG) {
- return DataType.LONG;
- } else if (attrType== Type.FLOAT) {
- return DataType.FLOAT;
- } else if (attrType== Type.DOUBLE) {
- return DataType.DOUBLE;
- } else if (attrType == Type.BYTE) {
- return DataType.BYTE;
- } else if (attrType == Type.PREDICATE) {
- return DataType.PREDICATE;
- } else if (attrType == Type.TENSOR) {
- return DataType.TENSOR;
- } else {
- throw new IllegalArgumentException("Don't know which attribute type to " +
- "convert " + attrType + " to");
+ private DataType toDataType(Type attributeType) {
+ switch (attributeType) {
+ case STRING : return DataType.STRING;
+ case INTEGER: return DataType.INT;
+ case LONG: return DataType.LONG;
+ case FLOAT: return DataType.FLOAT;
+ case DOUBLE: return DataType.DOUBLE;
+ case BYTE: return DataType.BYTE;
+ case PREDICATE: return DataType.PREDICATE;
+ case TENSOR: return DataType.getTensor(tensorType.orElseThrow(IllegalStateException::new));
+ default: throw new IllegalArgumentException("Unknown attribute type " + attributeType);
}
}
public DataType getDataType() {
- DataType dataType = Attribute.convertAttrType(type);
+ DataType dataType = toDataType(type);
if (collectionType.equals(Attribute.CollectionType.ARRAY)) {
return DataType.getArray(dataType);
} else if (collectionType.equals(Attribute.CollectionType.WEIGHTEDSET)) {
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/FieldOperation.java b/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/FieldOperation.java
index 3b28f380b2d..78f0d9a2997 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/FieldOperation.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/FieldOperation.java
@@ -11,6 +11,7 @@ import com.yahoo.searchdefinition.document.SDField;
*/
public interface FieldOperation extends Comparable<FieldOperation> {
+ /** Apply this operation on the given field */
void apply(SDField field);
@Override
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/processing/IndexingValidation.java b/config-model/src/main/java/com/yahoo/searchdefinition/processing/IndexingValidation.java
index af04deb5347..d8b95391ecb 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/processing/IndexingValidation.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/processing/IndexingValidation.java
@@ -16,7 +16,7 @@ import java.util.HashSet;
import java.util.Set;
/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a>
+ * @author Simon Thoresen
*/
public class IndexingValidation extends Processor {
@@ -26,11 +26,11 @@ public class IndexingValidation extends Processor {
@Override
public void process() {
- VerificationContext ctx = new VerificationContext(new MyAdapter(search));
+ VerificationContext context = new VerificationContext(new MyAdapter(search));
for (SDField field : search.allFieldsList()) {
ScriptExpression script = field.getIndexingScript();
try {
- script.verify(ctx);
+ script.verify(context);
MyConverter converter = new MyConverter();
for (StatementExpression exp : script) {
converter.convert(exp); // TODO: stop doing this explicitly when visiting a script does not branch
@@ -123,8 +123,7 @@ public class IndexingValidation extends Processor {
throw new UnsupportedOperationException();
}
if (!fieldType.isAssignableFrom(valueType) &&
- !fieldType.isAssignableFrom(createCompatType(valueType)))
- {
+ !fieldType.isAssignableFrom(createCompatType(valueType))) {
throw new VerificationException(exp, "Can not assign " + valueType.getName() + " to " + fieldDesc +
" '" + fieldName + "' which is " + fieldType.getName() + ".");
}
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/processing/TensorFieldProcessor.java b/config-model/src/main/java/com/yahoo/searchdefinition/processing/TensorFieldProcessor.java
index ae16f6cfed8..36cf302477e 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/processing/TensorFieldProcessor.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/processing/TensorFieldProcessor.java
@@ -2,7 +2,9 @@
package com.yahoo.searchdefinition.processing;
import com.yahoo.config.application.api.DeployLogger;
+import com.yahoo.document.CollectionDataType;
import com.yahoo.document.DataType;
+import com.yahoo.document.TensorDataType;
import com.yahoo.searchdefinition.RankProfileRegistry;
import com.yahoo.searchdefinition.Search;
import com.yahoo.searchdefinition.document.Attribute;
@@ -23,12 +25,13 @@ public class TensorFieldProcessor extends Processor {
@Override
public void process() {
for (SDField field : search.allFieldsList()) {
- if (field.getDataType() == DataType.TENSOR) {
+ if ( field.getDataType() instanceof TensorDataType ) {
warnUseOfTensorFieldAsAttribute(field);
validateIndexingScripsForTensorField(field);
validateAttributeSettingForTensorField(field);
- } else {
- validateDataTypeForField(field);
+ }
+ else if (field.getDataType() instanceof CollectionDataType){
+ validateDataTypeForCollectionField(field);
}
}
}
@@ -55,9 +58,9 @@ public class TensorFieldProcessor extends Processor {
}
}
- private void validateDataTypeForField(SDField field) {
- if (field.getDataType().getPrimitiveType() == DataType.TENSOR) {
+ private void validateDataTypeForCollectionField(SDField field) {
+ if (((CollectionDataType)field.getDataType()).getNestedType() instanceof TensorDataType)
fail(search, field, "A field with collection type of tensor is not supported. Use simple type 'tensor' instead.");
- }
}
+
}
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/processing/ValidateFieldTypes.java b/config-model/src/main/java/com/yahoo/searchdefinition/processing/ValidateFieldTypes.java
index 1349abc3795..9ee5f48a906 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/processing/ValidateFieldTypes.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/processing/ValidateFieldTypes.java
@@ -2,6 +2,7 @@
package com.yahoo.searchdefinition.processing;
import com.yahoo.config.application.api.DeployLogger;
+import com.yahoo.document.TensorDataType;
import com.yahoo.searchdefinition.RankProfileRegistry;
import com.yahoo.searchdefinition.document.Attribute;
import com.yahoo.document.DataType;
@@ -49,22 +50,25 @@ public class ValidateFieldTypes extends Processor {
DataType seenType = seenFields.get(fieldName);
if (seenType == null) {
seenFields.put(fieldName, fieldType);
- } else if ( ! equalTypes(seenType, fieldType)) {
- throw newProcessException(searchName, fieldName, "Duplicate field name with different types. Expected " +
+ } else if ( ! compatibleTypes(seenType, fieldType)) {
+ throw newProcessException(searchName, fieldName, "Incompatible types. Expected " +
seenType.getName() + " for " + fieldDesc +
" '" + fieldName + "', got " + fieldType.getName() + ".");
}
}
- private boolean equalTypes(DataType d1, DataType d2) {
+ private boolean compatibleTypes(DataType seenType, DataType fieldType) {
// legacy tag field type compatibility; probably not needed any more (Oct 2016)
- if ("tag".equals(d1.getName())) {
- return "tag".equals(d2.getName()) || "WeightedSet<string>".equals(d2.getName());
+ if ("tag".equals(seenType.getName())) {
+ return "tag".equals(fieldType.getName()) || "WeightedSet<string>".equals(fieldType.getName());
}
- if ("tag".equals(d2.getName())) {
- return "tag".equals(d1.getName()) || "WeightedSet<string>".equals(d1.getName());
+ if ("tag".equals(fieldType.getName())) {
+ return "tag".equals(seenType.getName()) || "WeightedSet<string>".equals(seenType.getName());
}
- return d1.equals(d2);
+ if (seenType instanceof TensorDataType && fieldType instanceof TensorDataType) {
+ return fieldType.isAssignableFrom(seenType); // TODO: Just do this for all types
+ }
+ return seenType.equals(fieldType);
}
}
diff --git a/config-model/src/main/java/com/yahoo/vespa/configmodel/producers/DocumentManager.java b/config-model/src/main/java/com/yahoo/vespa/configmodel/producers/DocumentManager.java
index 3cdcf55b34e..705ec4dc4a1 100644
--- a/config-model/src/main/java/com/yahoo/vespa/configmodel/producers/DocumentManager.java
+++ b/config-model/src/main/java/com/yahoo/vespa/configmodel/producers/DocumentManager.java
@@ -17,39 +17,39 @@ import java.util.Set;
/**
* @author baldersheim
- * @since 2010-02-19
*/
public class DocumentManager {
- public DocumentmanagerConfig.Builder produce(DocumentModel model, DocumentmanagerConfig.Builder docman) {
- docman.enablecompression(false);
+ public DocumentmanagerConfig.Builder produce(DocumentModel model,
+ DocumentmanagerConfig.Builder documentConfigBuilder) {
+ documentConfigBuilder.enablecompression(false);
Set<DataType> handled = new HashSet<>();
for(NewDocumentType documentType : model.getDocumentManager().getTypes()) {
- handle(documentType, docman, handled);
- handleAnnotations(documentType.getAnnotations(), docman);
+ buildConfig(documentType, documentConfigBuilder, handled);
+ buildConfig(documentType.getAnnotations(), documentConfigBuilder);
if ( documentType != VespaDocumentType.INSTANCE) {
- DocumentmanagerConfig.Datatype.Builder dt = new DocumentmanagerConfig.Datatype.Builder();
- docman.datatype(dt);
- handleDataType(documentType, dt);
+ DocumentmanagerConfig.Datatype.Builder dataTypeBuilder = new DocumentmanagerConfig.Datatype.Builder();
+ documentConfigBuilder.datatype(dataTypeBuilder);
+ buildConfig(documentType, dataTypeBuilder);
}
}
- return docman;
+ return documentConfigBuilder;
}
- private void handle(DataTypeCollection type, DocumentmanagerConfig.Builder docman, Set<DataType> handled) {
+ private void buildConfig(DataTypeCollection type, DocumentmanagerConfig.Builder documentConfigBuilder, Set<DataType> built) {
for (DataType dataType : type.getTypes()) {
- if (handled.contains(dataType)) continue;
- handled.add(dataType);
+ if (built.contains(dataType)) continue;
+ built.add(dataType);
if (dataType instanceof TemporaryStructuredDataType) continue;
- if ((dataType.getId() < 0) || (DataType.lastPredefinedDataTypeId() < dataType.getId())) {
- Datatype.Builder dtc = new Datatype.Builder();
- docman.datatype(dtc);
- handleDataType(dataType, dtc);
+ if ((dataType.getId() < 0) || (dataType.getId()> DataType.lastPredefinedDataTypeId())) {
+ Datatype.Builder dataTypeBuilder = new Datatype.Builder();
+ documentConfigBuilder.datatype(dataTypeBuilder);
+ buildConfig(dataType, dataTypeBuilder);
}
}
}
- private void handleAnnotation(AnnotationType type, DocumentmanagerConfig.Annotationtype.Builder atb) {
+ private void buildConfig(AnnotationType type, DocumentmanagerConfig.Annotationtype.Builder atb) {
atb.
id(type.getId()).
name(type.getName());
@@ -62,34 +62,34 @@ public class DocumentManager {
}
}
}
- private void handleAnnotations(Collection<AnnotationType> types, DocumentmanagerConfig.Builder builder) {
+ private void buildConfig(Collection<AnnotationType> types, DocumentmanagerConfig.Builder builder) {
for (AnnotationType type : types) {
DocumentmanagerConfig.Annotationtype.Builder atb = new DocumentmanagerConfig.Annotationtype.Builder();
- handleAnnotation(type, atb);
+ buildConfig(type, atb);
builder.annotationtype(atb);
}
}
- private void handleDataType(DataType type, Datatype.Builder dtc) {
- dtc.id(type.getId());
+ private void buildConfig(DataType type, Datatype.Builder builder) {
+ builder.id(type.getId());
if (type instanceof ArrayDataType) {
CollectionDataType dt = (CollectionDataType) type;
- dtc.arraytype(new Datatype.Arraytype.Builder().datatype(dt.getNestedType().getId()));
+ builder.arraytype(new Datatype.Arraytype.Builder().datatype(dt.getNestedType().getId()));
} else if (type instanceof WeightedSetDataType) {
WeightedSetDataType dt = (WeightedSetDataType) type;
- dtc.weightedsettype(new Datatype.Weightedsettype.Builder().
+ builder.weightedsettype(new Datatype.Weightedsettype.Builder().
datatype(dt.getNestedType().getId()).
createifnonexistant(dt.createIfNonExistent()).
removeifzero(dt.removeIfZero()));
} else if (type instanceof MapDataType) {
MapDataType mtype = (MapDataType) type;
- dtc.maptype(new Datatype.Maptype.Builder().
+ builder.maptype(new Datatype.Maptype.Builder().
keytype(mtype.getKeyType().getId()).
valtype(mtype.getValueType().getId()));
} else if (type instanceof DocumentType) {
DocumentType dt = (DocumentType) type;
Datatype.Documenttype.Builder doc = new Datatype.Documenttype.Builder();
- dtc.documenttype(doc);
+ builder.documenttype(doc);
doc.
name(dt.getName()).
headerstruct(dt.getHeaderType().getId()).
@@ -100,7 +100,7 @@ public class DocumentManager {
} else if (type instanceof NewDocumentType) {
NewDocumentType dt = (NewDocumentType) type;
Datatype.Documenttype.Builder doc = new Datatype.Documenttype.Builder();
- dtc.documenttype(doc);
+ builder.documenttype(doc);
doc.
name(dt.getName()).
headerstruct(dt.getHeader().getId()).
@@ -108,49 +108,56 @@ public class DocumentManager {
for (NewDocumentType inherited : dt.getInherited()) {
doc.inherits(new Datatype.Documenttype.Inherits.Builder().name(inherited.getName()));
}
- handleFieldSets(dt.getFieldSets(), doc);
+ buildConfig(dt.getFieldSets(), doc);
} else if (type instanceof TemporaryStructuredDataType) {
//Ignored
} else if (type instanceof StructDataType) {
- StructDataType dt = (StructDataType) type;
- Datatype.Structtype.Builder st = new Datatype.Structtype.Builder();
- dtc.structtype(st);
- st.name(dt.getName());
- if (dt.getCompressionConfig().type.getCode() != 0) {
- st.
- compresstype(Datatype.Structtype.Compresstype.Enum.valueOf(dt.getCompressionConfig().type.toString())).
- compresslevel(dt.getCompressionConfig().compressionLevel).
- compressthreshold((int)dt.getCompressionConfig().threshold).
- compressminsize((int)dt.getCompressionConfig().minsize);
+ StructDataType structType = (StructDataType) type;
+ Datatype.Structtype.Builder structBuilder = new Datatype.Structtype.Builder();
+ builder.structtype(structBuilder);
+ structBuilder.name(structType.getName());
+ if (structType.getCompressionConfig().type.getCode() != 0) {
+ structBuilder.
+ compresstype(Datatype.Structtype.Compresstype.Enum.valueOf(structType.getCompressionConfig().type.toString())).
+ compresslevel(structType.getCompressionConfig().compressionLevel).
+ compressthreshold((int)structType.getCompressionConfig().threshold).
+ compressminsize((int)structType.getCompressionConfig().minsize);
}
- for (com.yahoo.document.Field field : dt.getFieldsThisTypeOnly()) {
- Datatype.Structtype.Field.Builder fb = new Datatype.Structtype.Field.Builder();
- st.field(fb);
- fb.name(field.getName());
+ for (com.yahoo.document.Field field : structType.getFieldsThisTypeOnly()) {
+ Datatype.Structtype.Field.Builder fieldBuilder = new Datatype.Structtype.Field.Builder();
+ structBuilder.field(fieldBuilder);
+ fieldBuilder.name(field.getName());
if (field.hasForcedId()) {
- fb.id(new Datatype.Structtype.Field.Id.Builder().id(field.getId()));
+ fieldBuilder.id(new Datatype.Structtype.Field.Id.Builder().id(field.getId()));
}
- fb.datatype(field.getDataType().getId());
+ fieldBuilder.datatype(field.getDataType().getId());
+
+ if (field.getDataType() instanceof TensorDataType)
+ fieldBuilder.detailedtype(((TensorDataType)field.getDataType()).getTensorType().toString());
}
- for (StructDataType inherited : dt.getInheritedTypes()) {
- st.inherits(new Datatype.Structtype.Inherits.Builder().name(inherited.getName()));
+ for (StructDataType inherited : structType.getInheritedTypes()) {
+ structBuilder.inherits(new Datatype.Structtype.Inherits.Builder().name(inherited.getName()));
}
} else if (type instanceof AnnotationReferenceDataType) {
AnnotationReferenceDataType annotationRef = (AnnotationReferenceDataType) type;
- dtc.annotationreftype(new Datatype.Annotationreftype.Builder().annotation(annotationRef.getAnnotationType().getName()));
+ builder.annotationreftype(new Datatype.Annotationreftype.Builder().annotation(annotationRef.getAnnotationType().getName()));
+ } else if (type instanceof TensorDataType) {
+ // Nothing to do; the type of the tensor is instead stored 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
} else {
- throw new IllegalArgumentException("Can not handle datatype '" + type.getName());
+ throw new IllegalArgumentException("Can not create config for data type '" + type.getName());
}
}
- private void handleFieldSets(Set<FieldSet> fieldSets, Datatype.Documenttype.Builder doc) {
-
+ private void buildConfig(Set<FieldSet> fieldSets, Datatype.Documenttype.Builder doc) {
for (FieldSet builtinFs : fieldSets) {
- handleFieldSet(builtinFs, doc);
+ buildConfig(builtinFs, doc);
}
}
- private void handleFieldSet(FieldSet fs, Datatype.Documenttype.Builder doc) {
+ private void buildConfig(FieldSet fs, Datatype.Documenttype.Builder doc) {
doc.fieldsets(fs.getName(), new Datatype.Documenttype.Fieldsets.Builder().fields(fs.getFieldNames()));
}
+
}
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 2ba34def464..ebe18b36410 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
@@ -2,13 +2,11 @@
package com.yahoo.vespa.configmodel.producers;
import com.yahoo.document.*;
-import com.yahoo.document.DocumenttypesConfig.Builder;
import com.yahoo.document.annotation.AnnotationReferenceDataType;
import com.yahoo.document.annotation.AnnotationType;
import com.yahoo.documentmodel.DataTypeCollection;
import com.yahoo.documentmodel.NewDocumentType;
import com.yahoo.documentmodel.VespaDocumentType;
-import com.yahoo.searchdefinition.FieldSets;
import com.yahoo.searchdefinition.document.FieldSet;
import com.yahoo.vespa.documentmodel.DocumentModel;
import java.util.*;
@@ -31,12 +29,12 @@ public class DocumentTypes {
for (NewDocumentType inherited : documentType.getInherited()) {
produceInheritOrder(inherited, builder, produced);
}
- handle(documentType, builder);
+ buildConfig(documentType, builder);
produced.put(documentType.getFullName(), documentType);
}
}
- private void handle(NewDocumentType documentType, DocumenttypesConfig.Builder builder) {
+ private void buildConfig(NewDocumentType documentType, DocumenttypesConfig.Builder builder) {
if (documentType == VespaDocumentType.INSTANCE) {
return;
}
@@ -46,40 +44,40 @@ public class DocumentTypes {
name(documentType.getName()).
headerstruct(documentType.getHeader().getId()).
bodystruct(documentType.getBody().getId());
- Set<Integer> handled = new HashSet<>();
+ Set<Integer> built = new HashSet<>();
for (NewDocumentType inherited : documentType.getInherited()) {
db.inherits(new DocumenttypesConfig.Documenttype.Inherits.Builder().id(inherited.getId()));
- markAsHandled(handled, inherited.getAllTypes());
+ markAsBuilt(built, inherited.getAllTypes());
}
for (DataType dt : documentType.getTypes()) {
- handle(dt, db, handled);
+ buildConfig(dt, db, built);
}
for(AnnotationType annotation : documentType.getAnnotations()) {
DocumenttypesConfig.Documenttype.Annotationtype.Builder atb = new DocumenttypesConfig.Documenttype.Annotationtype.Builder();
db.annotationtype(atb);
- handle(annotation, atb);
+ buildConfig(annotation, atb);
}
- handleFieldSets(documentType.getFieldSets(), db);
+ buildConfig(documentType.getFieldSets(), db);
builder.documenttype(db);
}
- private void handleFieldSets(Set<FieldSet> fieldSets, com.yahoo.document.DocumenttypesConfig.Documenttype.Builder db) {
+ private void buildConfig(Set<FieldSet> fieldSets, com.yahoo.document.DocumenttypesConfig.Documenttype.Builder db) {
for (FieldSet fs : fieldSets) {
- handleFieldSet(fs, db);
+ buildConfig(fs, db);
}
}
- private void handleFieldSet(FieldSet fs, DocumenttypesConfig.Documenttype.Builder db) {
+ private void buildConfig(FieldSet fs, DocumenttypesConfig.Documenttype.Builder db) {
db.fieldsets(fs.getName(), new DocumenttypesConfig.Documenttype.Fieldsets.Builder().fields(fs.getFieldNames()));
}
- private void markAsHandled(Set<Integer> handled, DataTypeCollection typeCollection) {
+ private void markAsBuilt(Set<Integer> built, DataTypeCollection typeCollection) {
for (DataType type : typeCollection.getTypes()) {
- handled.add(type.getId());
+ built.add(type.getId());
}
}
- private void handle(AnnotationType annotation, DocumenttypesConfig.Documenttype.Annotationtype.Builder builder) {
+ private void buildConfig(AnnotationType annotation, DocumenttypesConfig.Documenttype.Annotationtype.Builder builder) {
builder.
id(annotation.getId()).
name(annotation.getName());
@@ -92,67 +90,77 @@ public class DocumentTypes {
}
}
- private void handle(DataType type, DocumenttypesConfig.Documenttype.Builder db, Set<Integer> handled) {
- if ((VespaDocumentType.INSTANCE.getDataType(type.getId()) == null) && ! handled.contains(type.getId())) {
- handled.add(type.getId());
- DocumenttypesConfig.Documenttype.Datatype.Builder dtb = new DocumenttypesConfig.Documenttype.Datatype.Builder();
- dtb.id(type.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 StructDataType) {
- dtb.type(DocumenttypesConfig.Documenttype.Datatype.Type.Enum.valueOf("STRUCT"));
+ dataTypeBuilder.type(DocumenttypesConfig.Documenttype.Datatype.Type.Enum.STRUCT);
StructDataType dt = (StructDataType) type;
- DocumenttypesConfig.Documenttype.Datatype.Sstruct.Builder sb = new DocumenttypesConfig.Documenttype.Datatype.Sstruct.Builder();
- dtb.sstruct(sb);
- sb.name(dt.getName());
+ DocumenttypesConfig.Documenttype.Datatype.Sstruct.Builder structBuilder = new DocumenttypesConfig.Documenttype.Datatype.Sstruct.Builder();
+ dataTypeBuilder.sstruct(structBuilder);
+ structBuilder.name(dt.getName());
if (dt.getCompressionConfig().type.getCode() != 0) {
- sb.compression(new DocumenttypesConfig.Documenttype.Datatype.Sstruct.Compression.Builder().
+ structBuilder.compression(new DocumenttypesConfig.Documenttype.Datatype.Sstruct.Compression.Builder().
type(DocumenttypesConfig.Documenttype.Datatype.Sstruct.Compression.Type.Enum.valueOf(dt.getCompressionConfig().type.toString())).
level(dt.getCompressionConfig().compressionLevel).
threshold((int)dt.getCompressionConfig().threshold).
minsize((int)dt.getCompressionConfig().minsize));
}
for (com.yahoo.document.Field field : dt.getFields()) {
- sb.field(new DocumenttypesConfig.Documenttype.Datatype.Sstruct.Field.Builder().
- name(field.getName()).
+ DocumenttypesConfig.Documenttype.Datatype.Sstruct.Field.Builder builder =
+ new DocumenttypesConfig.Documenttype.Datatype.Sstruct.Field.Builder();
+ builder.name(field.getName()).
id(field.getId()).
id_v6(field.getIdV6()).
- datatype(field.getDataType().getId()));
- handle(field.getDataType(), db, handled);
+ datatype(field.getDataType().getId());
+ if (field.getDataType() instanceof TensorDataType)
+ builder.detailedtype(((TensorDataType)field.getDataType()).getTensorType().toString());
+ structBuilder.field(builder);
+ buildConfig(field.getDataType(), documentBuilder, built);
}
} else if (type instanceof ArrayDataType) {
- dtb.
- type(DocumenttypesConfig.Documenttype.Datatype.Type.Enum.valueOf("ARRAY")).
+ dataTypeBuilder.
+ type(DocumenttypesConfig.Documenttype.Datatype.Type.Enum.ARRAY).
array(new DocumenttypesConfig.Documenttype.Datatype.Array.Builder().
element(new DocumenttypesConfig.Documenttype.Datatype.Array.Element.Builder().id(((ArrayDataType)type).getNestedType().getId())));
- handle(((ArrayDataType)type).getNestedType(), db, handled);
+ buildConfig(((ArrayDataType)type).getNestedType(), documentBuilder, built);
} else if (type instanceof WeightedSetDataType) {
- dtb.type(DocumenttypesConfig.Documenttype.Datatype.Type.Enum.valueOf("WSET")).
+ dataTypeBuilder.type(DocumenttypesConfig.Documenttype.Datatype.Type.Enum.WSET).
wset(new DocumenttypesConfig.Documenttype.Datatype.Wset.Builder().
key(new DocumenttypesConfig.Documenttype.Datatype.Wset.Key.Builder().
id(((WeightedSetDataType)type).getNestedType().getId())).
createifnonexistent(((WeightedSetDataType)type).createIfNonExistent()).
removeifzero(((WeightedSetDataType)type).removeIfZero()));
- handle(((WeightedSetDataType)type).getNestedType(), db, handled);
+ buildConfig(((WeightedSetDataType)type).getNestedType(), documentBuilder, built);
} else if (type instanceof MapDataType) {
- dtb.
- type(DocumenttypesConfig.Documenttype.Datatype.Type.Enum.valueOf("MAP")).
+ dataTypeBuilder.
+ type(DocumenttypesConfig.Documenttype.Datatype.Type.Enum.MAP).
map(new DocumenttypesConfig.Documenttype.Datatype.Map.Builder().
key(new DocumenttypesConfig.Documenttype.Datatype.Map.Key.Builder().
id(((MapDataType)type).getKeyType().getId())).
value(new DocumenttypesConfig.Documenttype.Datatype.Map.Value.Builder().
id(((MapDataType)type).getValueType().getId())));
- handle(((MapDataType)type).getKeyType(), db, handled);
- handle(((MapDataType)type).getValueType(), db, handled);
+ buildConfig(((MapDataType)type).getKeyType(), documentBuilder, built);
+ buildConfig(((MapDataType)type).getValueType(), documentBuilder, built);
} else if (type instanceof AnnotationReferenceDataType) {
- dtb.
- type(DocumenttypesConfig.Documenttype.Datatype.Type.Enum.valueOf("ANNOTATIONREF")).
+ dataTypeBuilder.
+ type(DocumenttypesConfig.Documenttype.Datatype.Type.Enum.ANNOTATIONREF).
annotationref(new DocumenttypesConfig.Documenttype.Datatype.Annotationref.Builder().
annotation(new DocumenttypesConfig.Documenttype.Datatype.Annotationref.Annotation.Builder().
id(((AnnotationReferenceDataType)type).getAnnotationType().getId())));
+ } 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 {
return;
}
- db.datatype(dtb);
+ documentBuilder.datatype(dataTypeBuilder);
}
}
+
}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/SearchDataTypeValidator.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/SearchDataTypeValidator.java
index c03fb0617b8..1d39d1e6928 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/SearchDataTypeValidator.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/SearchDataTypeValidator.java
@@ -43,7 +43,7 @@ public class SearchDataTypeValidator extends Validator {
for (Field field : doc.fieldSet()) {
DataType fieldType = field.getDataType();
disallowIndexingOfMaps(cluster, def, field);
- if (!validateDataType(fieldType)) {
+ if ( ! isSupportedInSearchClusters(fieldType)) {
throw new IllegalArgumentException("Field type '" + fieldType.getName() + "' is illegal for search " +
"clusters (field '" + field.getName() + "' in definition '" +
def.getName() + "' for cluster '" + cluster.getClusterName() + "').");
@@ -51,28 +51,30 @@ public class SearchDataTypeValidator extends Validator {
}
}
- private boolean validateDataType(DataType dataType) {
- if (dataType instanceof ArrayDataType ||
- dataType instanceof WeightedSetDataType)
- {
- return validateDataType(((CollectionDataType)dataType).getNestedType());
+ private boolean isSupportedInSearchClusters(DataType dataType) {
+ if (dataType instanceof ArrayDataType || dataType instanceof WeightedSetDataType) {
+ return isSupportedInSearchClusters(((CollectionDataType)dataType).getNestedType());
}
- if (dataType instanceof StructDataType) {
+ else if (dataType instanceof StructDataType) {
return true; // Struct will work for summary TODO maybe check individual fields
}
- if (dataType instanceof MapDataType) {
+ else if (dataType instanceof MapDataType) {
return true; // Maps will work for summary, see disallowIndexingOfMaps()
}
- return dataType.equals(DataType.INT) ||
- dataType.equals(DataType.FLOAT) ||
- dataType.equals(DataType.STRING) ||
- dataType.equals(DataType.RAW) ||
- dataType.equals(DataType.LONG) ||
- dataType.equals(DataType.DOUBLE) ||
- dataType.equals(DataType.URI) ||
- dataType.equals(DataType.BYTE) ||
- dataType.equals(DataType.PREDICATE) ||
- dataType.equals(DataType.TENSOR);
+ else if (dataType instanceof TensorDataType) {
+ return true;
+ }
+ else {
+ return dataType.equals(DataType.INT) ||
+ dataType.equals(DataType.FLOAT) ||
+ dataType.equals(DataType.STRING) ||
+ dataType.equals(DataType.RAW) ||
+ dataType.equals(DataType.LONG) ||
+ dataType.equals(DataType.DOUBLE) ||
+ dataType.equals(DataType.URI) ||
+ dataType.equals(DataType.BYTE) ||
+ dataType.equals(DataType.PREDICATE);
+ }
}
private void disallowIndexingOfMaps(AbstractSearchCluster cluster, SearchDefinition def, Field field) {
diff --git a/config-model/src/main/javacc/SDParser.jj b/config-model/src/main/javacc/SDParser.jj
index 32be8906ffc..3fc84f2860b 100644
--- a/config-model/src/main/javacc/SDParser.jj
+++ b/config-model/src/main/javacc/SDParser.jj
@@ -805,13 +805,14 @@ DataType dataType() :
DataType mapType=null;
DataType arrayType=null;
DataType wsetType=null;
-
+ TensorType tensorType;
}
{
( LOOKAHEAD(<ARRAY> <LESSTHAN>) ( <ARRAY> <LESSTHAN> arrayType = dataType() <GREATERTHAN> { return DataType.getArray(arrayType); } )
| LOOKAHEAD(<WEIGHTEDSET> <LESSTHAN>) ( <WEIGHTEDSET> <LESSTHAN> wsetType = dataType() <GREATERTHAN> { return DataType.getWeightedSet(wsetType); } )
| LOOKAHEAD(<MAP> <LESSTHAN>) ( mapType = mapDataType() { return mapType; } )
| LOOKAHEAD(<ANNOTATIONREFERENCE> <LESSTHAN>) ( mapType = annotationRefDataType() { return mapType; } )
+ | LOOKAHEAD(<TENSOR_TYPE>) ( tensorType = tensorType("Field type") { return DataType.getTensor(tensorType); } )
| ( typeName = identifier() ["[]" { isArrayOldStyle = true; }] )
)
{
diff --git a/config-model/src/test/cfg/application/validation/search_alltypes/searchdefinitions/simple.sd b/config-model/src/test/cfg/application/validation/search_alltypes/searchdefinitions/simple.sd
index d2851816bc0..a2b36416fd6 100644
--- a/config-model/src/test/cfg/application/validation/search_alltypes/searchdefinitions/simple.sd
+++ b/config-model/src/test/cfg/application/validation/search_alltypes/searchdefinitions/simple.sd
@@ -11,6 +11,6 @@ search simple {
field my_uri type uri { indexing: summary }
field my_byte type byte { indexing: summary }
field my_predicate type predicate { indexing: summary }
- field my_tensor type tensor { indexing: summary }
+ field my_tensor type tensor(x{}) { indexing: summary }
}
}
diff --git a/config-model/src/test/configmodel/types/documentmanager.cfg b/config-model/src/test/configmodel/types/documentmanager.cfg
index ac148209d6b..6b01934307a 100644
--- a/config-model/src/test/configmodel/types/documentmanager.cfg
+++ b/config-model/src/test/configmodel/types/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id -1865479609
datatype[1].maptype[0].keytype 2
datatype[1].maptype[0].valtype 4
@@ -22,12 +24,16 @@ datatype[2].structtype[0].compressthreshold 95
datatype[2].structtype[0].compressminsize 800
datatype[2].structtype[0].field[0].name "Version"
datatype[2].structtype[0].field[0].datatype 0
+datatype[2].structtype[0].field[0].detailedtype ""
datatype[2].structtype[0].field[1].name "Name"
datatype[2].structtype[0].field[1].datatype 2
+datatype[2].structtype[0].field[1].detailedtype ""
datatype[2].structtype[0].field[2].name "FlagsCounter"
datatype[2].structtype[0].field[2].datatype -1865479609
+datatype[2].structtype[0].field[2].detailedtype ""
datatype[2].structtype[0].field[3].name "anotherfolder"
datatype[2].structtype[0].field[3].datatype 294108848
+datatype[2].structtype[0].field[3].detailedtype ""
datatype[3].id 109267174
datatype[3].structtype[0].name "sct"
datatype[3].structtype[0].version 0
@@ -37,8 +43,10 @@ datatype[3].structtype[0].compressthreshold 95
datatype[3].structtype[0].compressminsize 800
datatype[3].structtype[0].field[0].name "s1"
datatype[3].structtype[0].field[0].datatype 2
+datatype[3].structtype[0].field[0].detailedtype ""
datatype[3].structtype[0].field[1].name "s2"
datatype[3].structtype[0].field[1].datatype 2
+datatype[3].structtype[0].field[1].detailedtype ""
datatype[4].id 49942803
datatype[4].arraytype[0].datatype 16
datatype[5].id 339965458
@@ -53,12 +61,16 @@ datatype[6].structtype[0].compressthreshold 95
datatype[6].structtype[0].compressminsize 800
datatype[6].structtype[0].field[0].name "bytearr"
datatype[6].structtype[0].field[0].datatype 49942803
+datatype[6].structtype[0].field[0].detailedtype ""
datatype[6].structtype[0].field[1].name "mymap"
datatype[6].structtype[0].field[1].datatype 339965458
+datatype[6].structtype[0].field[1].detailedtype ""
datatype[6].structtype[0].field[2].name "title"
datatype[6].structtype[0].field[2].datatype 2
+datatype[6].structtype[0].field[2].detailedtype ""
datatype[6].structtype[0].field[3].name "structfield"
datatype[6].structtype[0].field[3].datatype 2
+datatype[6].structtype[0].field[3].detailedtype ""
datatype[7].id -1245117006
datatype[7].arraytype[0].datatype 0
datatype[8].id 1328286588
@@ -115,62 +127,91 @@ datatype[24].structtype[0].compressthreshold 95
datatype[24].structtype[0].compressminsize 800
datatype[24].structtype[0].field[0].name "abyte"
datatype[24].structtype[0].field[0].datatype 16
+datatype[24].structtype[0].field[0].detailedtype ""
datatype[24].structtype[0].field[1].name "along"
datatype[24].structtype[0].field[1].datatype 4
+datatype[24].structtype[0].field[1].detailedtype ""
datatype[24].structtype[0].field[2].name "arrayfield"
datatype[24].structtype[0].field[2].datatype -1245117006
+datatype[24].structtype[0].field[2].detailedtype ""
datatype[24].structtype[0].field[3].name "setfield"
datatype[24].structtype[0].field[3].datatype 1328286588
+datatype[24].structtype[0].field[3].detailedtype ""
datatype[24].structtype[0].field[4].name "pos"
datatype[24].structtype[0].field[4].datatype 1381038251
+datatype[24].structtype[0].field[4].detailedtype ""
datatype[24].structtype[0].field[5].name "setfield2"
datatype[24].structtype[0].field[5].datatype 18
+datatype[24].structtype[0].field[5].detailedtype ""
datatype[24].structtype[0].field[6].name "setfield3"
datatype[24].structtype[0].field[6].datatype 2125328771
+datatype[24].structtype[0].field[6].detailedtype ""
datatype[24].structtype[0].field[7].name "setfield4"
datatype[24].structtype[0].field[7].datatype 2065577986
+datatype[24].structtype[0].field[7].detailedtype ""
datatype[24].structtype[0].field[8].name "tagfield"
datatype[24].structtype[0].field[8].datatype 18
+datatype[24].structtype[0].field[8].detailedtype ""
datatype[24].structtype[0].field[9].name "structfield"
datatype[24].structtype[0].field[9].datatype 109267174
+datatype[24].structtype[0].field[9].detailedtype ""
datatype[24].structtype[0].field[10].name "structarrayfield"
datatype[24].structtype[0].field[10].datatype -1244829667
+datatype[24].structtype[0].field[10].detailedtype ""
datatype[24].structtype[0].field[11].name "stringmapfield"
datatype[24].structtype[0].field[11].datatype 339965458
+datatype[24].structtype[0].field[11].detailedtype ""
datatype[24].structtype[0].field[12].name "intmapfield"
datatype[24].structtype[0].field[12].datatype -1584287606
+datatype[24].structtype[0].field[12].detailedtype ""
datatype[24].structtype[0].field[13].name "floatmapfield"
datatype[24].structtype[0].field[13].datatype 2125154557
+datatype[24].structtype[0].field[13].detailedtype ""
datatype[24].structtype[0].field[14].name "longmapfield"
datatype[24].structtype[0].field[14].datatype -1715531035
+datatype[24].structtype[0].field[14].detailedtype ""
datatype[24].structtype[0].field[15].name "doublemapfield"
datatype[24].structtype[0].field[15].datatype 2138385264
+datatype[24].structtype[0].field[15].detailedtype ""
datatype[24].structtype[0].field[16].name "arraymapfield"
datatype[24].structtype[0].field[16].datatype 435886609
+datatype[24].structtype[0].field[16].detailedtype ""
datatype[24].structtype[0].field[17].name "arrarr"
datatype[24].structtype[0].field[17].datatype -794985308
+datatype[24].structtype[0].field[17].detailedtype ""
datatype[24].structtype[0].field[18].name "maparr"
datatype[24].structtype[0].field[18].datatype 69621385
+datatype[24].structtype[0].field[18].detailedtype ""
datatype[24].structtype[0].field[19].name "mystructfield"
datatype[24].structtype[0].field[19].datatype -2092985853
+datatype[24].structtype[0].field[19].detailedtype ""
datatype[24].structtype[0].field[20].name "mystructmap"
datatype[24].structtype[0].field[20].datatype 1901258752
+datatype[24].structtype[0].field[20].detailedtype ""
datatype[24].structtype[0].field[21].name "mystructarr"
datatype[24].structtype[0].field[21].datatype 759956026
+datatype[24].structtype[0].field[21].detailedtype ""
datatype[24].structtype[0].field[22].name "Folders"
datatype[24].structtype[0].field[22].datatype -389833101
+datatype[24].structtype[0].field[22].detailedtype ""
datatype[24].structtype[0].field[23].name "juletre"
datatype[24].structtype[0].field[23].datatype 4
+datatype[24].structtype[0].field[23].detailedtype ""
datatype[24].structtype[0].field[24].name "album0"
datatype[24].structtype[0].field[24].datatype 18
+datatype[24].structtype[0].field[24].detailedtype ""
datatype[24].structtype[0].field[25].name "album1"
datatype[24].structtype[0].field[25].datatype 18
+datatype[24].structtype[0].field[25].detailedtype ""
datatype[24].structtype[0].field[26].name "other"
datatype[24].structtype[0].field[26].datatype 4
+datatype[24].structtype[0].field[26].detailedtype ""
datatype[24].structtype[0].field[27].name "rankfeatures"
datatype[24].structtype[0].field[27].datatype 2
+datatype[24].structtype[0].field[27].detailedtype ""
datatype[24].structtype[0].field[28].name "summaryfeatures"
datatype[24].structtype[0].field[28].datatype 2
+datatype[24].structtype[0].field[28].detailedtype ""
datatype[25].id 171503364
datatype[25].maptype[0].keytype 1707615575
datatype[25].maptype[0].valtype 0
@@ -185,6 +226,7 @@ datatype[27].structtype[0].compressthreshold 95
datatype[27].structtype[0].compressminsize 800
datatype[27].structtype[0].field[0].name "complexarray"
datatype[27].structtype[0].field[0].datatype 1100964733
+datatype[27].structtype[0].field[0].detailedtype ""
datatype[28].id -853072901
datatype[28].documenttype[0].name "types"
datatype[28].documenttype[0].version 0
@@ -218,4 +260,4 @@ datatype[28].documenttype[0].fieldsets{[document]}.fields[22] "setfield4"
datatype[28].documenttype[0].fieldsets{[document]}.fields[23] "stringmapfield"
datatype[28].documenttype[0].fieldsets{[document]}.fields[24] "structarrayfield"
datatype[28].documenttype[0].fieldsets{[document]}.fields[25] "structfield"
-datatype[28].documenttype[0].fieldsets{[document]}.fields[26] "tagfield"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[26] "tagfield" \ No newline at end of file
diff --git a/config-model/src/test/configmodel/types/documenttypes.cfg b/config-model/src/test/configmodel/types/documenttypes.cfg
index eacd878e13d..dc7962adec7 100644
--- a/config-model/src/test/configmodel/types/documenttypes.cfg
+++ b/config-model/src/test/configmodel/types/documenttypes.cfg
@@ -39,18 +39,22 @@ documenttype[0].datatype[1].sstruct.field[0].name "Version"
documenttype[0].datatype[1].sstruct.field[0].id 64430502
documenttype[0].datatype[1].sstruct.field[0].id_v6 634243672
documenttype[0].datatype[1].sstruct.field[0].datatype 0
+documenttype[0].datatype[1].sstruct.field[0].detailedtype ""
documenttype[0].datatype[1].sstruct.field[1].name "Name"
documenttype[0].datatype[1].sstruct.field[1].id 2002760220
documenttype[0].datatype[1].sstruct.field[1].id_v6 62942997
documenttype[0].datatype[1].sstruct.field[1].datatype 2
+documenttype[0].datatype[1].sstruct.field[1].detailedtype ""
documenttype[0].datatype[1].sstruct.field[2].name "FlagsCounter"
documenttype[0].datatype[1].sstruct.field[2].id 1741227606
documenttype[0].datatype[1].sstruct.field[2].id_v6 1287497652
documenttype[0].datatype[1].sstruct.field[2].datatype -1865479609
+documenttype[0].datatype[1].sstruct.field[2].detailedtype ""
documenttype[0].datatype[1].sstruct.field[3].name "anotherfolder"
documenttype[0].datatype[1].sstruct.field[3].id 1582421848
documenttype[0].datatype[1].sstruct.field[3].id_v6 1898725199
documenttype[0].datatype[1].sstruct.field[3].datatype 294108848
+documenttype[0].datatype[1].sstruct.field[3].detailedtype ""
documenttype[0].datatype[2].id 109267174
documenttype[0].datatype[2].type STRUCT
documenttype[0].datatype[2].array.element.id 0
@@ -70,10 +74,12 @@ documenttype[0].datatype[2].sstruct.field[0].name "s1"
documenttype[0].datatype[2].sstruct.field[0].id 2146820765
documenttype[0].datatype[2].sstruct.field[0].id_v6 142373281
documenttype[0].datatype[2].sstruct.field[0].datatype 2
+documenttype[0].datatype[2].sstruct.field[0].detailedtype ""
documenttype[0].datatype[2].sstruct.field[1].name "s2"
documenttype[0].datatype[2].sstruct.field[1].id 45366795
documenttype[0].datatype[2].sstruct.field[1].id_v6 31106270
documenttype[0].datatype[2].sstruct.field[1].datatype 2
+documenttype[0].datatype[2].sstruct.field[1].detailedtype ""
documenttype[0].datatype[3].id 49942803
documenttype[0].datatype[3].type ARRAY
documenttype[0].datatype[3].array.element.id 16
@@ -123,18 +129,22 @@ documenttype[0].datatype[5].sstruct.field[0].name "bytearr"
documenttype[0].datatype[5].sstruct.field[0].id 1079701754
documenttype[0].datatype[5].sstruct.field[0].id_v6 1198855694
documenttype[0].datatype[5].sstruct.field[0].datatype 49942803
+documenttype[0].datatype[5].sstruct.field[0].detailedtype ""
documenttype[0].datatype[5].sstruct.field[1].name "mymap"
documenttype[0].datatype[5].sstruct.field[1].id 1954178122
documenttype[0].datatype[5].sstruct.field[1].id_v6 707189723
documenttype[0].datatype[5].sstruct.field[1].datatype 339965458
+documenttype[0].datatype[5].sstruct.field[1].detailedtype ""
documenttype[0].datatype[5].sstruct.field[2].name "title"
documenttype[0].datatype[5].sstruct.field[2].id 567626448
documenttype[0].datatype[5].sstruct.field[2].id_v6 29129762
documenttype[0].datatype[5].sstruct.field[2].datatype 2
+documenttype[0].datatype[5].sstruct.field[2].detailedtype ""
documenttype[0].datatype[5].sstruct.field[3].name "structfield"
documenttype[0].datatype[5].sstruct.field[3].id 1726890940
documenttype[0].datatype[5].sstruct.field[3].id_v6 418303145
documenttype[0].datatype[5].sstruct.field[3].datatype 2
+documenttype[0].datatype[5].sstruct.field[3].detailedtype ""
documenttype[0].datatype[6].id -1245117006
documenttype[0].datatype[6].type ARRAY
documenttype[0].datatype[6].array.element.id 0
@@ -409,118 +419,147 @@ documenttype[0].datatype[23].sstruct.field[0].name "abyte"
documenttype[0].datatype[23].sstruct.field[0].id 110138156
documenttype[0].datatype[23].sstruct.field[0].id_v6 1369099343
documenttype[0].datatype[23].sstruct.field[0].datatype 16
+documenttype[0].datatype[23].sstruct.field[0].detailedtype ""
documenttype[0].datatype[23].sstruct.field[1].name "along"
documenttype[0].datatype[23].sstruct.field[1].id 1206464520
documenttype[0].datatype[23].sstruct.field[1].id_v6 871280609
documenttype[0].datatype[23].sstruct.field[1].datatype 4
+documenttype[0].datatype[23].sstruct.field[1].detailedtype ""
documenttype[0].datatype[23].sstruct.field[2].name "arrayfield"
documenttype[0].datatype[23].sstruct.field[2].id 965790107
documenttype[0].datatype[23].sstruct.field[2].id_v6 1010955705
documenttype[0].datatype[23].sstruct.field[2].datatype -1245117006
+documenttype[0].datatype[23].sstruct.field[2].detailedtype ""
documenttype[0].datatype[23].sstruct.field[3].name "setfield"
documenttype[0].datatype[23].sstruct.field[3].id 761581914
documenttype[0].datatype[23].sstruct.field[3].id_v6 1762943268
documenttype[0].datatype[23].sstruct.field[3].datatype 1328286588
+documenttype[0].datatype[23].sstruct.field[3].detailedtype ""
documenttype[0].datatype[23].sstruct.field[4].name "pos"
documenttype[0].datatype[23].sstruct.field[4].id 1041567475
documenttype[0].datatype[23].sstruct.field[4].id_v6 26353693
documenttype[0].datatype[23].sstruct.field[4].datatype 1381038251
+documenttype[0].datatype[23].sstruct.field[4].detailedtype ""
documenttype[0].datatype[23].sstruct.field[5].name "setfield2"
documenttype[0].datatype[23].sstruct.field[5].id 1066659198
documenttype[0].datatype[23].sstruct.field[5].id_v6 813038565
documenttype[0].datatype[23].sstruct.field[5].datatype 18
+documenttype[0].datatype[23].sstruct.field[5].detailedtype ""
documenttype[0].datatype[23].sstruct.field[6].name "setfield3"
documenttype[0].datatype[23].sstruct.field[6].id 1180155772
documenttype[0].datatype[23].sstruct.field[6].id_v6 1697232199
documenttype[0].datatype[23].sstruct.field[6].datatype 2125328771
+documenttype[0].datatype[23].sstruct.field[6].detailedtype ""
documenttype[0].datatype[23].sstruct.field[7].name "setfield4"
documenttype[0].datatype[23].sstruct.field[7].id 1254131631
documenttype[0].datatype[23].sstruct.field[7].id_v6 119755202
documenttype[0].datatype[23].sstruct.field[7].datatype 2065577986
+documenttype[0].datatype[23].sstruct.field[7].detailedtype ""
documenttype[0].datatype[23].sstruct.field[8].name "tagfield"
documenttype[0].datatype[23].sstruct.field[8].id 1653562069
documenttype[0].datatype[23].sstruct.field[8].id_v6 938523246
documenttype[0].datatype[23].sstruct.field[8].datatype 18
+documenttype[0].datatype[23].sstruct.field[8].detailedtype ""
documenttype[0].datatype[23].sstruct.field[9].name "structfield"
documenttype[0].datatype[23].sstruct.field[9].id 486207386
documenttype[0].datatype[23].sstruct.field[9].id_v6 418303145
documenttype[0].datatype[23].sstruct.field[9].datatype 109267174
+documenttype[0].datatype[23].sstruct.field[9].detailedtype ""
documenttype[0].datatype[23].sstruct.field[10].name "structarrayfield"
documenttype[0].datatype[23].sstruct.field[10].id 335048518
documenttype[0].datatype[23].sstruct.field[10].id_v6 607034174
documenttype[0].datatype[23].sstruct.field[10].datatype -1244829667
+documenttype[0].datatype[23].sstruct.field[10].detailedtype ""
documenttype[0].datatype[23].sstruct.field[11].name "stringmapfield"
documenttype[0].datatype[23].sstruct.field[11].id 117465687
documenttype[0].datatype[23].sstruct.field[11].id_v6 1492788095
documenttype[0].datatype[23].sstruct.field[11].datatype 339965458
+documenttype[0].datatype[23].sstruct.field[11].detailedtype ""
documenttype[0].datatype[23].sstruct.field[12].name "intmapfield"
documenttype[0].datatype[23].sstruct.field[12].id 121004462
documenttype[0].datatype[23].sstruct.field[12].id_v6 1642487905
documenttype[0].datatype[23].sstruct.field[12].datatype -1584287606
+documenttype[0].datatype[23].sstruct.field[12].detailedtype ""
documenttype[0].datatype[23].sstruct.field[13].name "floatmapfield"
documenttype[0].datatype[23].sstruct.field[13].id 1239120925
documenttype[0].datatype[23].sstruct.field[13].id_v6 1609437589
documenttype[0].datatype[23].sstruct.field[13].datatype 2125154557
+documenttype[0].datatype[23].sstruct.field[13].detailedtype ""
documenttype[0].datatype[23].sstruct.field[14].name "longmapfield"
documenttype[0].datatype[23].sstruct.field[14].id 477718745
documenttype[0].datatype[23].sstruct.field[14].id_v6 920341968
documenttype[0].datatype[23].sstruct.field[14].datatype -1715531035
+documenttype[0].datatype[23].sstruct.field[14].detailedtype ""
documenttype[0].datatype[23].sstruct.field[15].name "doublemapfield"
documenttype[0].datatype[23].sstruct.field[15].id 877047192
documenttype[0].datatype[23].sstruct.field[15].id_v6 957317090
documenttype[0].datatype[23].sstruct.field[15].datatype 2138385264
+documenttype[0].datatype[23].sstruct.field[15].detailedtype ""
documenttype[0].datatype[23].sstruct.field[16].name "arraymapfield"
documenttype[0].datatype[23].sstruct.field[16].id 1670805928
documenttype[0].datatype[23].sstruct.field[16].id_v6 1940354311
documenttype[0].datatype[23].sstruct.field[16].datatype 435886609
+documenttype[0].datatype[23].sstruct.field[16].detailedtype ""
documenttype[0].datatype[23].sstruct.field[17].name "arrarr"
documenttype[0].datatype[23].sstruct.field[17].id 1962567166
documenttype[0].datatype[23].sstruct.field[17].id_v6 885141301
documenttype[0].datatype[23].sstruct.field[17].datatype -794985308
+documenttype[0].datatype[23].sstruct.field[17].detailedtype ""
documenttype[0].datatype[23].sstruct.field[18].name "maparr"
documenttype[0].datatype[23].sstruct.field[18].id 904375219
documenttype[0].datatype[23].sstruct.field[18].id_v6 63700074
documenttype[0].datatype[23].sstruct.field[18].datatype 69621385
+documenttype[0].datatype[23].sstruct.field[18].detailedtype ""
documenttype[0].datatype[23].sstruct.field[19].name "mystructfield"
documenttype[0].datatype[23].sstruct.field[19].id 1348513378
documenttype[0].datatype[23].sstruct.field[19].id_v6 2033170300
documenttype[0].datatype[23].sstruct.field[19].datatype -2092985853
+documenttype[0].datatype[23].sstruct.field[19].detailedtype ""
documenttype[0].datatype[23].sstruct.field[20].name "mystructmap"
documenttype[0].datatype[23].sstruct.field[20].id 1511423250
documenttype[0].datatype[23].sstruct.field[20].id_v6 449602635
documenttype[0].datatype[23].sstruct.field[20].datatype 1901258752
+documenttype[0].datatype[23].sstruct.field[20].detailedtype ""
documenttype[0].datatype[23].sstruct.field[21].name "mystructarr"
documenttype[0].datatype[23].sstruct.field[21].id 595856991
documenttype[0].datatype[23].sstruct.field[21].id_v6 764861972
documenttype[0].datatype[23].sstruct.field[21].datatype 759956026
+documenttype[0].datatype[23].sstruct.field[21].detailedtype ""
documenttype[0].datatype[23].sstruct.field[22].name "Folders"
documenttype[0].datatype[23].sstruct.field[22].id 34575524
documenttype[0].datatype[23].sstruct.field[22].id_v6 280569744
documenttype[0].datatype[23].sstruct.field[22].datatype -389833101
+documenttype[0].datatype[23].sstruct.field[22].detailedtype ""
documenttype[0].datatype[23].sstruct.field[23].name "juletre"
documenttype[0].datatype[23].sstruct.field[23].id 1039981530
documenttype[0].datatype[23].sstruct.field[23].id_v6 2073084146
documenttype[0].datatype[23].sstruct.field[23].datatype 4
+documenttype[0].datatype[23].sstruct.field[23].detailedtype ""
documenttype[0].datatype[23].sstruct.field[24].name "album0"
documenttype[0].datatype[23].sstruct.field[24].id 764312262
documenttype[0].datatype[23].sstruct.field[24].id_v6 1409364160
documenttype[0].datatype[23].sstruct.field[24].datatype 18
+documenttype[0].datatype[23].sstruct.field[24].detailedtype ""
documenttype[0].datatype[23].sstruct.field[25].name "album1"
documenttype[0].datatype[23].sstruct.field[25].id 1967160809
documenttype[0].datatype[23].sstruct.field[25].id_v6 1833811264
documenttype[0].datatype[23].sstruct.field[25].datatype 18
+documenttype[0].datatype[23].sstruct.field[25].detailedtype ""
documenttype[0].datatype[23].sstruct.field[26].name "other"
documenttype[0].datatype[23].sstruct.field[26].id 2443357
documenttype[0].datatype[23].sstruct.field[26].id_v6 903806222
documenttype[0].datatype[23].sstruct.field[26].datatype 4
+documenttype[0].datatype[23].sstruct.field[26].detailedtype ""
documenttype[0].datatype[23].sstruct.field[27].name "rankfeatures"
documenttype[0].datatype[23].sstruct.field[27].id 1883197392
documenttype[0].datatype[23].sstruct.field[27].id_v6 699950698
documenttype[0].datatype[23].sstruct.field[27].datatype 2
+documenttype[0].datatype[23].sstruct.field[27].detailedtype ""
documenttype[0].datatype[23].sstruct.field[28].name "summaryfeatures"
documenttype[0].datatype[23].sstruct.field[28].id 1840337115
documenttype[0].datatype[23].sstruct.field[28].id_v6 1981648971
documenttype[0].datatype[23].sstruct.field[28].datatype 2
+documenttype[0].datatype[23].sstruct.field[28].detailedtype ""
documenttype[0].datatype[24].id 171503364
documenttype[0].datatype[24].type MAP
documenttype[0].datatype[24].array.element.id 0
@@ -570,6 +609,7 @@ documenttype[0].datatype[26].sstruct.field[0].name "complexarray"
documenttype[0].datatype[26].sstruct.field[0].id 1028383787
documenttype[0].datatype[26].sstruct.field[0].id_v6 658530305
documenttype[0].datatype[26].sstruct.field[0].datatype 1100964733
+documenttype[0].datatype[26].sstruct.field[0].detailedtype ""
documenttype[0].fieldsets{[document]}.fields[0] "Folders"
documenttype[0].fieldsets{[document]}.fields[1] "abyte"
documenttype[0].fieldsets{[document]}.fields[2] "album0"
@@ -596,4 +636,4 @@ 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"
+documenttype[0].fieldsets{[document]}.fields[26] "tagfield" \ No newline at end of file
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 d13195f1ffe..3073dd55fba 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
@@ -24,10 +24,12 @@ documenttype[0].datatype[0].sstruct.field[0].name "rankfeatures"
documenttype[0].datatype[0].sstruct.field[0].id 1883197392
documenttype[0].datatype[0].sstruct.field[0].id_v6 699950698
documenttype[0].datatype[0].sstruct.field[0].datatype 2
+documenttype[0].datatype[0].sstruct.field[0].detailedtype ""
documenttype[0].datatype[0].sstruct.field[1].name "summaryfeatures"
documenttype[0].datatype[0].sstruct.field[1].id 1840337115
documenttype[0].datatype[0].sstruct.field[1].id_v6 1981648971
documenttype[0].datatype[0].sstruct.field[1].datatype 2
+documenttype[0].datatype[0].sstruct.field[1].detailedtype ""
documenttype[0].datatype[1].id 549879017
documenttype[0].datatype[1].type STRUCT
documenttype[0].datatype[1].array.element.id 0
@@ -83,14 +85,17 @@ documenttype[1].datatype[1].sstruct.field[0].name "doc_field"
documenttype[1].datatype[1].sstruct.field[0].id 819293364
documenttype[1].datatype[1].sstruct.field[0].id_v6 1634907905
documenttype[1].datatype[1].sstruct.field[0].datatype -1368624373
+documenttype[1].datatype[1].sstruct.field[0].detailedtype ""
documenttype[1].datatype[1].sstruct.field[1].name "rankfeatures"
documenttype[1].datatype[1].sstruct.field[1].id 1883197392
documenttype[1].datatype[1].sstruct.field[1].id_v6 699950698
documenttype[1].datatype[1].sstruct.field[1].datatype 2
+documenttype[1].datatype[1].sstruct.field[1].detailedtype ""
documenttype[1].datatype[1].sstruct.field[2].name "summaryfeatures"
documenttype[1].datatype[1].sstruct.field[2].id 1840337115
documenttype[1].datatype[1].sstruct.field[2].id_v6 1981648971
documenttype[1].datatype[1].sstruct.field[2].datatype 2
+documenttype[1].datatype[1].sstruct.field[2].detailedtype ""
documenttype[1].datatype[2].id 348447225
documenttype[1].datatype[2].type STRUCT
documenttype[1].datatype[2].array.element.id 0
@@ -106,4 +111,4 @@ documenttype[1].datatype[2].sstruct.compression.type NONE
documenttype[1].datatype[2].sstruct.compression.level 0
documenttype[1].datatype[2].sstruct.compression.threshold 95
documenttype[1].datatype[2].sstruct.compression.minsize 200
-documenttype[1].fieldsets{[document]}.fields[0] "doc_field"
+documenttype[1].fieldsets{[document]}.fields[0] "doc_field" \ No newline at end of file
diff --git a/config-model/src/test/derived/advanced/documentmanager.cfg b/config-model/src/test/derived/advanced/documentmanager.cfg
index 98c3d379987..532f53f51d2 100644
--- a/config-model/src/test/derived/advanced/documentmanager.cfg
+++ b/config-model/src/test/derived/advanced/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id -1486737430
datatype[1].arraytype[0].datatype 2
datatype[2].id -1337915045
@@ -21,44 +23,64 @@ datatype[2].structtype[0].compressthreshold 95
datatype[2].structtype[0].compressminsize 800
datatype[2].structtype[0].field[0].name "debug_src"
datatype[2].structtype[0].field[0].datatype 2
+datatype[2].structtype[0].field[0].detailedtype ""
datatype[2].structtype[0].field[1].name "attributes_src"
datatype[2].structtype[0].field[1].datatype 2
+datatype[2].structtype[0].field[1].detailedtype ""
datatype[2].structtype[0].field[2].name "location_str"
datatype[2].structtype[0].field[2].datatype 2
+datatype[2].structtype[0].field[2].detailedtype ""
datatype[2].structtype[0].field[3].name "title_src"
datatype[2].structtype[0].field[3].datatype 2
+datatype[2].structtype[0].field[3].detailedtype ""
datatype[2].structtype[0].field[4].name "product_src"
datatype[2].structtype[0].field[4].datatype 2
+datatype[2].structtype[0].field[4].detailedtype ""
datatype[2].structtype[0].field[5].name "product2_src"
datatype[2].structtype[0].field[5].datatype 2
+datatype[2].structtype[0].field[5].detailedtype ""
datatype[2].structtype[0].field[6].name "product3_src"
datatype[2].structtype[0].field[6].datatype 2
+datatype[2].structtype[0].field[6].detailedtype ""
datatype[2].structtype[0].field[7].name "debug"
datatype[2].structtype[0].field[7].datatype 2
+datatype[2].structtype[0].field[7].detailedtype ""
datatype[2].structtype[0].field[8].name "attributes"
datatype[2].structtype[0].field[8].datatype 2
+datatype[2].structtype[0].field[8].detailedtype ""
datatype[2].structtype[0].field[9].name "title"
datatype[2].structtype[0].field[9].datatype 2
+datatype[2].structtype[0].field[9].detailedtype ""
datatype[2].structtype[0].field[10].name "product"
datatype[2].structtype[0].field[10].datatype 2
+datatype[2].structtype[0].field[10].detailedtype ""
datatype[2].structtype[0].field[11].name "product2"
datatype[2].structtype[0].field[11].datatype 2
+datatype[2].structtype[0].field[11].detailedtype ""
datatype[2].structtype[0].field[12].name "product3"
datatype[2].structtype[0].field[12].datatype 2
+datatype[2].structtype[0].field[12].detailedtype ""
datatype[2].structtype[0].field[13].name "location_zcurve"
datatype[2].structtype[0].field[13].datatype 4
+datatype[2].structtype[0].field[13].detailedtype ""
datatype[2].structtype[0].field[14].name "title_s"
datatype[2].structtype[0].field[14].datatype 2
+datatype[2].structtype[0].field[14].detailedtype ""
datatype[2].structtype[0].field[15].name "location.position"
datatype[2].structtype[0].field[15].datatype -1486737430
+datatype[2].structtype[0].field[15].detailedtype ""
datatype[2].structtype[0].field[16].name "location.distance"
datatype[2].structtype[0].field[16].datatype 0
+datatype[2].structtype[0].field[16].detailedtype ""
datatype[2].structtype[0].field[17].name "mysummary"
datatype[2].structtype[0].field[17].datatype 2
+datatype[2].structtype[0].field[17].detailedtype ""
datatype[2].structtype[0].field[18].name "rankfeatures"
datatype[2].structtype[0].field[18].datatype 2
+datatype[2].structtype[0].field[18].detailedtype ""
datatype[2].structtype[0].field[19].name "summaryfeatures"
datatype[2].structtype[0].field[19].datatype 2
+datatype[2].structtype[0].field[19].detailedtype ""
datatype[3].id -704605648
datatype[3].structtype[0].name "advanced.body"
datatype[3].structtype[0].version 0
diff --git a/config-model/src/test/derived/advanced/index-info.cfg b/config-model/src/test/derived/advanced/index-info.cfg
index 1bb68110dae..7af5b858d3a 100644
--- a/config-model/src/test/derived/advanced/index-info.cfg
+++ b/config-model/src/test/derived/advanced/index-info.cfg
@@ -75,23 +75,23 @@ indexinfo[0].command[36].indexname "summaryfeatures"
indexinfo[0].command[36].command "index"
indexinfo[0].command[37].indexname "title"
indexinfo[0].command[37].command "index"
-indexinfo[0].command[38].indexname "titleabstract"
-indexinfo[0].command[38].command "index"
-indexinfo[0].command[39].indexname "default"
-indexinfo[0].command[39].command "index"
-indexinfo[0].command[40].indexname "title"
-indexinfo[0].command[40].command "lowercase"
+indexinfo[0].command[38].indexname "title"
+indexinfo[0].command[38].command "lowercase"
+indexinfo[0].command[39].indexname "title"
+indexinfo[0].command[39].command "normalize"
+indexinfo[0].command[40].indexname "title_s"
+indexinfo[0].command[40].command "index"
indexinfo[0].command[41].indexname "titleabstract"
indexinfo[0].command[41].command "lowercase"
-indexinfo[0].command[42].indexname "default"
-indexinfo[0].command[42].command "lowercase"
-indexinfo[0].command[43].indexname "title"
+indexinfo[0].command[42].indexname "titleabstract"
+indexinfo[0].command[42].command "index"
+indexinfo[0].command[43].indexname "titleabstract"
indexinfo[0].command[43].command "normalize"
-indexinfo[0].command[44].indexname "titleabstract"
-indexinfo[0].command[44].command "normalize"
+indexinfo[0].command[44].indexname "default"
+indexinfo[0].command[44].command "lowercase"
indexinfo[0].command[45].indexname "default"
-indexinfo[0].command[45].command "normalize"
-indexinfo[0].command[46].indexname "title_s"
-indexinfo[0].command[46].command "index"
+indexinfo[0].command[45].command "index"
+indexinfo[0].command[46].indexname "default"
+indexinfo[0].command[46].command "normalize"
indexinfo[0].alias[0].alias "headline"
indexinfo[0].alias[0].indexname "title" \ No newline at end of file
diff --git a/config-model/src/test/derived/annotationsimplicitstruct/documentmanager.cfg b/config-model/src/test/derived/annotationsimplicitstruct/documentmanager.cfg
index db85eb92e9b..1e9ffba5ca0 100755
--- a/config-model/src/test/derived/annotationsimplicitstruct/documentmanager.cfg
+++ b/config-model/src/test/derived/annotationsimplicitstruct/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id 517946310
datatype[1].structtype[0].name "annotation.banana"
datatype[1].structtype[0].version 0
@@ -19,6 +21,7 @@ datatype[1].structtype[0].compressthreshold 95
datatype[1].structtype[0].compressminsize 800
datatype[1].structtype[0].field[0].name "brand"
datatype[1].structtype[0].field[0].datatype 2
+datatype[1].structtype[0].field[0].detailedtype ""
datatype[2].id -364910881
datatype[2].structtype[0].name "annotationsimplicitstruct.header"
datatype[2].structtype[0].version 0
@@ -28,8 +31,10 @@ datatype[2].structtype[0].compressthreshold 95
datatype[2].structtype[0].compressminsize 800
datatype[2].structtype[0].field[0].name "rankfeatures"
datatype[2].structtype[0].field[0].datatype 2
+datatype[2].structtype[0].field[0].detailedtype ""
datatype[2].structtype[0].field[1].name "summaryfeatures"
datatype[2].structtype[0].field[1].datatype 2
+datatype[2].structtype[0].field[1].detailedtype ""
datatype[3].id -1503592268
datatype[3].structtype[0].name "annotationsimplicitstruct.body"
datatype[3].structtype[0].version 0
diff --git a/config-model/src/test/derived/annotationsinheritance/documentmanager.cfg b/config-model/src/test/derived/annotationsinheritance/documentmanager.cfg
index 11e179ec748..db7fba5d9a6 100755
--- a/config-model/src/test/derived/annotationsinheritance/documentmanager.cfg
+++ b/config-model/src/test/derived/annotationsinheritance/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id 517946310
datatype[1].structtype[0].name "annotation.banana"
datatype[1].structtype[0].version 0
@@ -19,6 +21,7 @@ datatype[1].structtype[0].compressthreshold 95
datatype[1].structtype[0].compressminsize 800
datatype[1].structtype[0].field[0].name "brand"
datatype[1].structtype[0].field[0].datatype 2
+datatype[1].structtype[0].field[0].detailedtype ""
datatype[2].id -1339036621
datatype[2].structtype[0].name "annotation.intern"
datatype[2].structtype[0].version 0
@@ -28,6 +31,7 @@ datatype[2].structtype[0].compressthreshold 95
datatype[2].structtype[0].compressminsize 800
datatype[2].structtype[0].field[0].name "enddate"
datatype[2].structtype[0].field[0].datatype 4
+datatype[2].structtype[0].field[0].detailedtype ""
datatype[2].structtype[0].inherits[0].name "annotation.employee"
datatype[2].structtype[0].inherits[0].version 0
datatype[3].id 249059607
@@ -39,6 +43,7 @@ datatype[3].structtype[0].compressthreshold 95
datatype[3].structtype[0].compressminsize 800
datatype[3].structtype[0].field[0].name "color"
datatype[3].structtype[0].field[0].datatype 2
+datatype[3].structtype[0].field[0].detailedtype ""
datatype[3].structtype[0].inherits[0].name "annotation.vehicle"
datatype[3].structtype[0].inherits[0].version 0
datatype[4].id -1466283082
@@ -50,6 +55,7 @@ datatype[4].structtype[0].compressthreshold 95
datatype[4].structtype[0].compressminsize 800
datatype[4].structtype[0].field[0].name "name"
datatype[4].structtype[0].field[0].datatype 2
+datatype[4].structtype[0].field[0].detailedtype ""
datatype[5].id -858216177
datatype[5].structtype[0].name "annotation.employee"
datatype[5].structtype[0].version 0
@@ -59,6 +65,7 @@ datatype[5].structtype[0].compressthreshold 95
datatype[5].structtype[0].compressminsize 800
datatype[5].structtype[0].field[0].name "employeeid"
datatype[5].structtype[0].field[0].datatype 0
+datatype[5].structtype[0].field[0].detailedtype ""
datatype[5].structtype[0].inherits[0].name "annotation.worker"
datatype[5].structtype[0].inherits[0].version 0
datatype[6].id -1874092641
@@ -79,6 +86,7 @@ datatype[7].structtype[0].compressthreshold 95
datatype[7].structtype[0].compressminsize 800
datatype[7].structtype[0].field[0].name "numwheels"
datatype[7].structtype[0].field[0].datatype 0
+datatype[7].structtype[0].field[0].detailedtype ""
datatype[8].id -1406250281
datatype[8].structtype[0].name "annotationsinheritance.header"
datatype[8].structtype[0].version 0
@@ -88,8 +96,10 @@ datatype[8].structtype[0].compressthreshold 95
datatype[8].structtype[0].compressminsize 800
datatype[8].structtype[0].field[0].name "rankfeatures"
datatype[8].structtype[0].field[0].datatype 2
+datatype[8].structtype[0].field[0].detailedtype ""
datatype[8].structtype[0].field[1].name "summaryfeatures"
datatype[8].structtype[0].field[1].datatype 2
+datatype[8].structtype[0].field[1].detailedtype ""
datatype[9].id 1181354668
datatype[9].structtype[0].name "annotationsinheritance.body"
datatype[9].structtype[0].version 0
diff --git a/config-model/src/test/derived/annotationsinheritance2/documentmanager.cfg b/config-model/src/test/derived/annotationsinheritance2/documentmanager.cfg
index e49d0753296..6f83fbc5ce6 100755
--- a/config-model/src/test/derived/annotationsinheritance2/documentmanager.cfg
+++ b/config-model/src/test/derived/annotationsinheritance2/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id 1443831334
datatype[1].structtype[0].name "annotation.c"
datatype[1].structtype[0].version 0
@@ -19,6 +21,7 @@ datatype[1].structtype[0].compressthreshold 95
datatype[1].structtype[0].compressminsize 800
datatype[1].structtype[0].field[0].name "cfoo"
datatype[1].structtype[0].field[0].datatype 0
+datatype[1].structtype[0].field[0].detailedtype ""
datatype[2].id 1443832295
datatype[2].structtype[0].name "annotation.d"
datatype[2].structtype[0].version 0
@@ -46,6 +49,7 @@ datatype[4].structtype[0].compressthreshold 95
datatype[4].structtype[0].compressminsize 800
datatype[4].structtype[0].field[0].name "gfoo"
datatype[4].structtype[0].field[0].datatype 2
+datatype[4].structtype[0].field[0].detailedtype ""
datatype[5].id 424382193
datatype[5].structtype[0].name "annotationsinheritance2.header"
datatype[5].structtype[0].version 0
@@ -55,8 +59,10 @@ datatype[5].structtype[0].compressthreshold 95
datatype[5].structtype[0].compressminsize 800
datatype[5].structtype[0].field[0].name "rankfeatures"
datatype[5].structtype[0].field[0].datatype 2
+datatype[5].structtype[0].field[0].detailedtype ""
datatype[5].structtype[0].field[1].name "summaryfeatures"
datatype[5].structtype[0].field[1].datatype 2
+datatype[5].structtype[0].field[1].detailedtype ""
datatype[6].id 1375438150
datatype[6].structtype[0].name "annotationsinheritance2.body"
datatype[6].structtype[0].version 0
diff --git a/config-model/src/test/derived/annotationspolymorphy/documentmanager.cfg b/config-model/src/test/derived/annotationspolymorphy/documentmanager.cfg
index d612a3b168b..db333ed0a13 100755
--- a/config-model/src/test/derived/annotationspolymorphy/documentmanager.cfg
+++ b/config-model/src/test/derived/annotationspolymorphy/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id -2014701853
datatype[1].annotationreftype[0].annotation "super"
datatype[2].id -888007918
@@ -21,6 +23,7 @@ datatype[2].structtype[0].compressthreshold 95
datatype[2].structtype[0].compressminsize 800
datatype[2].structtype[0].field[0].name "a"
datatype[2].structtype[0].field[0].datatype -2014701853
+datatype[2].structtype[0].field[0].detailedtype ""
datatype[3].id -1552577796
datatype[3].structtype[0].name "annotationspolymorphy.header"
datatype[3].structtype[0].version 0
@@ -30,8 +33,10 @@ datatype[3].structtype[0].compressthreshold 95
datatype[3].structtype[0].compressminsize 800
datatype[3].structtype[0].field[0].name "rankfeatures"
datatype[3].structtype[0].field[0].datatype 2
+datatype[3].structtype[0].field[0].detailedtype ""
datatype[3].structtype[0].field[1].name "summaryfeatures"
datatype[3].structtype[0].field[1].datatype 2
+datatype[3].structtype[0].field[1].detailedtype ""
datatype[4].id -570750959
datatype[4].structtype[0].name "annotationspolymorphy.body"
datatype[4].structtype[0].version 0
diff --git a/config-model/src/test/derived/annotationsreference/documentmanager.cfg b/config-model/src/test/derived/annotationsreference/documentmanager.cfg
index 3218262b54d..25106a41836 100755
--- a/config-model/src/test/derived/annotationsreference/documentmanager.cfg
+++ b/config-model/src/test/derived/annotationsreference/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id 517946310
datatype[1].structtype[0].name "annotation.banana"
datatype[1].structtype[0].version 0
@@ -19,6 +21,7 @@ datatype[1].structtype[0].compressthreshold 95
datatype[1].structtype[0].compressminsize 800
datatype[1].structtype[0].field[0].name "brand"
datatype[1].structtype[0].field[0].datatype 2
+datatype[1].structtype[0].field[0].detailedtype ""
datatype[2].id 400622300
datatype[2].annotationreftype[0].annotation "b"
datatype[3].id 1443829412
@@ -30,6 +33,7 @@ datatype[3].structtype[0].compressthreshold 95
datatype[3].structtype[0].compressminsize 800
datatype[3].structtype[0].field[0].name "foo"
datatype[3].structtype[0].field[0].datatype 400622300
+datatype[3].structtype[0].field[0].detailedtype ""
datatype[4].id -808460615
datatype[4].annotationreftype[0].annotation "banana"
datatype[5].id -770307521
@@ -41,6 +45,7 @@ datatype[5].structtype[0].compressthreshold 95
datatype[5].structtype[0].compressminsize 800
datatype[5].structtype[0].field[0].name "what"
datatype[5].structtype[0].field[0].datatype -808460615
+datatype[5].structtype[0].field[0].detailedtype ""
datatype[6].id 756306917
datatype[6].annotationreftype[0].annotation "cyclic"
datatype[7].id 1781099546
@@ -52,6 +57,7 @@ datatype[7].structtype[0].compressthreshold 95
datatype[7].structtype[0].compressminsize 800
datatype[7].structtype[0].field[0].name "blah"
datatype[7].structtype[0].field[0].datatype 756306917
+datatype[7].structtype[0].field[0].detailedtype ""
datatype[8].id 571255414
datatype[8].structtype[0].name "annotationsreference.header"
datatype[8].structtype[0].version 0
@@ -61,8 +67,10 @@ datatype[8].structtype[0].compressthreshold 95
datatype[8].structtype[0].compressminsize 800
datatype[8].structtype[0].field[0].name "rankfeatures"
datatype[8].structtype[0].field[0].datatype 2
+datatype[8].structtype[0].field[0].detailedtype ""
datatype[8].structtype[0].field[1].name "summaryfeatures"
datatype[8].structtype[0].field[1].datatype 2
+datatype[8].structtype[0].field[1].detailedtype ""
datatype[9].id 1692909067
datatype[9].structtype[0].name "annotationsreference.body"
datatype[9].structtype[0].version 0
diff --git a/config-model/src/test/derived/annotationssimple/documentmanager.cfg b/config-model/src/test/derived/annotationssimple/documentmanager.cfg
index 54832bb97f9..8908d886ff9 100755
--- a/config-model/src/test/derived/annotationssimple/documentmanager.cfg
+++ b/config-model/src/test/derived/annotationssimple/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id -1205708249
datatype[1].structtype[0].name "annotationssimple.header"
datatype[1].structtype[0].version 0
@@ -19,8 +21,10 @@ datatype[1].structtype[0].compressthreshold 95
datatype[1].structtype[0].compressminsize 800
datatype[1].structtype[0].field[0].name "rankfeatures"
datatype[1].structtype[0].field[0].datatype 2
+datatype[1].structtype[0].field[0].detailedtype ""
datatype[1].structtype[0].field[1].name "summaryfeatures"
datatype[1].structtype[0].field[1].datatype 2
+datatype[1].structtype[0].field[1].detailedtype ""
datatype[2].id -682121732
datatype[2].structtype[0].name "annotationssimple.body"
datatype[2].structtype[0].version 0
diff --git a/config-model/src/test/derived/annotationsstruct/documentmanager.cfg b/config-model/src/test/derived/annotationsstruct/documentmanager.cfg
index f3c93b31285..ebba05e0553 100644
--- a/config-model/src/test/derived/annotationsstruct/documentmanager.cfg
+++ b/config-model/src/test/derived/annotationsstruct/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id 1293792650
datatype[1].structtype[0].name "my_struct"
datatype[1].structtype[0].version 0
@@ -19,6 +21,7 @@ datatype[1].structtype[0].compressthreshold 95
datatype[1].structtype[0].compressminsize 800
datatype[1].structtype[0].field[0].name "my_structfield"
datatype[1].structtype[0].field[0].datatype 2
+datatype[1].structtype[0].field[0].detailedtype ""
datatype[2].id -1080124700
datatype[2].structtype[0].name "annotation.my_anno"
datatype[2].structtype[0].version 0
@@ -28,6 +31,7 @@ datatype[2].structtype[0].compressthreshold 95
datatype[2].structtype[0].compressminsize 800
datatype[2].structtype[0].field[0].name "my_annofield"
datatype[2].structtype[0].field[0].datatype 1293792650
+datatype[2].structtype[0].field[0].detailedtype ""
datatype[3].id 1341437796
datatype[3].structtype[0].name "annotationsstruct.header"
datatype[3].structtype[0].version 0
@@ -37,8 +41,10 @@ datatype[3].structtype[0].compressthreshold 95
datatype[3].structtype[0].compressminsize 800
datatype[3].structtype[0].field[0].name "rankfeatures"
datatype[3].structtype[0].field[0].datatype 2
+datatype[3].structtype[0].field[0].detailedtype ""
datatype[3].structtype[0].field[1].name "summaryfeatures"
datatype[3].structtype[0].field[1].datatype 2
+datatype[3].structtype[0].field[1].detailedtype ""
datatype[4].id -1180029319
datatype[4].structtype[0].name "annotationsstruct.body"
datatype[4].structtype[0].version 0
diff --git a/config-model/src/test/derived/annotationsstructarray/documentmanager.cfg b/config-model/src/test/derived/annotationsstructarray/documentmanager.cfg
index 01e3945fc2a..49249a7307a 100644
--- a/config-model/src/test/derived/annotationsstructarray/documentmanager.cfg
+++ b/config-model/src/test/derived/annotationsstructarray/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id 1293792650
datatype[1].structtype[0].name "my_struct"
datatype[1].structtype[0].version 0
@@ -19,6 +21,7 @@ datatype[1].structtype[0].compressthreshold 95
datatype[1].structtype[0].compressminsize 800
datatype[1].structtype[0].field[0].name "my_structfield"
datatype[1].structtype[0].field[0].datatype 2
+datatype[1].structtype[0].field[0].detailedtype ""
datatype[2].id 754837689
datatype[2].arraytype[0].datatype 1293792650
datatype[3].id -1080124700
@@ -30,6 +33,7 @@ datatype[3].structtype[0].compressthreshold 95
datatype[3].structtype[0].compressminsize 800
datatype[3].structtype[0].field[0].name "my_annofield"
datatype[3].structtype[0].field[0].datatype 754837689
+datatype[3].structtype[0].field[0].detailedtype ""
datatype[4].id 94945597
datatype[4].structtype[0].name "annotationsstructarray.header"
datatype[4].structtype[0].version 0
@@ -39,8 +43,10 @@ datatype[4].structtype[0].compressthreshold 95
datatype[4].structtype[0].compressminsize 800
datatype[4].structtype[0].field[0].name "rankfeatures"
datatype[4].structtype[0].field[0].datatype 2
+datatype[4].structtype[0].field[0].detailedtype ""
datatype[4].structtype[0].field[1].name "summaryfeatures"
datatype[4].structtype[0].field[1].datatype 2
+datatype[4].structtype[0].field[1].detailedtype ""
datatype[5].id 1616435858
datatype[5].structtype[0].name "annotationsstructarray.body"
datatype[5].structtype[0].version 0
diff --git a/config-model/src/test/derived/arrays/documentmanager.cfg b/config-model/src/test/derived/arrays/documentmanager.cfg
index 68506844b5d..f873971f931 100644
--- a/config-model/src/test/derived/arrays/documentmanager.cfg
+++ b/config-model/src/test/derived/arrays/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id -1486737430
datatype[1].arraytype[0].datatype 2
datatype[2].id -1245117006
@@ -27,18 +29,25 @@ datatype[4].structtype[0].compressthreshold 95
datatype[4].structtype[0].compressminsize 800
datatype[4].structtype[0].field[0].name "tags"
datatype[4].structtype[0].field[0].datatype -1486737430
+datatype[4].structtype[0].field[0].detailedtype ""
datatype[4].structtype[0].field[1].name "ratings"
datatype[4].structtype[0].field[1].datatype -1245117006
+datatype[4].structtype[0].field[1].detailedtype ""
datatype[4].structtype[0].field[2].name "a"
datatype[4].structtype[0].field[2].datatype 2
+datatype[4].structtype[0].field[2].detailedtype ""
datatype[4].structtype[0].field[3].name "b"
datatype[4].structtype[0].field[3].datatype -1486737430
+datatype[4].structtype[0].field[3].detailedtype ""
datatype[4].structtype[0].field[4].name "c"
datatype[4].structtype[0].field[4].datatype 1328286588
+datatype[4].structtype[0].field[4].detailedtype ""
datatype[4].structtype[0].field[5].name "rankfeatures"
datatype[4].structtype[0].field[5].datatype 2
+datatype[4].structtype[0].field[5].detailedtype ""
datatype[4].structtype[0].field[6].name "summaryfeatures"
datatype[4].structtype[0].field[6].datatype 2
+datatype[4].structtype[0].field[6].detailedtype ""
datatype[5].id -1747896808
datatype[5].structtype[0].name "arrays.body"
datatype[5].structtype[0].version 0
diff --git a/config-model/src/test/derived/arrays/index-info.cfg b/config-model/src/test/derived/arrays/index-info.cfg
index f5f65700d89..1439dcc8bf7 100644
--- a/config-model/src/test/derived/arrays/index-info.cfg
+++ b/config-model/src/test/derived/arrays/index-info.cfg
@@ -1,63 +1,63 @@
-indexinfo[].name "arrays"
-indexinfo[].command[].indexname "sddocname"
-indexinfo[].command[].command "index"
-indexinfo[].command[].indexname "sddocname"
-indexinfo[].command[].command "word"
-indexinfo[].command[].indexname "tags"
-indexinfo[].command[].command "index"
-indexinfo[].command[].indexname "tags"
-indexinfo[].command[].command "lowercase"
-indexinfo[].command[].indexname "tags"
-indexinfo[].command[].command "multivalue"
-indexinfo[].command[].indexname "tags"
-indexinfo[].command[].command "stem:SHORTEST"
-indexinfo[].command[].indexname "tags"
-indexinfo[].command[].command "normalize"
-indexinfo[].command[].indexname "ratings"
-indexinfo[].command[].command "index"
-indexinfo[].command[].indexname "ratings"
-indexinfo[].command[].command "multivalue"
-indexinfo[].command[].indexname "ratings"
-indexinfo[].command[].command "attribute"
-indexinfo[].command[].indexname "default"
-indexinfo[].command[].command "index"
-indexinfo[].command[].indexname "default"
-indexinfo[].command[].command "lowercase"
-indexinfo[].command[].indexname "default"
-indexinfo[].command[].command "stem:SHORTEST"
-indexinfo[].command[].indexname "default"
-indexinfo[].command[].command "normalize"
-indexinfo[].command[].indexname "default"
-indexinfo[].command[].command "multivalue"
-indexinfo[].command[].indexname "a"
-indexinfo[].command[].command "index"
-indexinfo[].command[].indexname "a"
-indexinfo[].command[].command "lowercase"
-indexinfo[].command[].indexname "a"
-indexinfo[].command[].command "stem:SHORTEST"
-indexinfo[].command[].indexname "a"
-indexinfo[].command[].command "normalize"
-indexinfo[].command[].indexname "b"
-indexinfo[].command[].command "index"
-indexinfo[].command[].indexname "b"
-indexinfo[].command[].command "lowercase"
-indexinfo[].command[].indexname "b"
-indexinfo[].command[].command "multivalue"
-indexinfo[].command[].indexname "b"
-indexinfo[].command[].command "stem:SHORTEST"
-indexinfo[].command[].indexname "b"
-indexinfo[].command[].command "normalize"
-indexinfo[].command[].indexname "c"
-indexinfo[].command[].command "index"
-indexinfo[].command[].indexname "c"
-indexinfo[].command[].command "lowercase"
-indexinfo[].command[].indexname "c"
-indexinfo[].command[].command "multivalue"
-indexinfo[].command[].indexname "c"
-indexinfo[].command[].command "stem:SHORTEST"
-indexinfo[].command[].indexname "c"
-indexinfo[].command[].command "normalize"
-indexinfo[].command[].indexname "rankfeatures"
-indexinfo[].command[].command "index"
-indexinfo[].command[].indexname "summaryfeatures"
-indexinfo[].command[].command "index" \ No newline at end of file
+indexinfo[0].name "arrays"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "tags"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "tags"
+indexinfo[0].command[3].command "lowercase"
+indexinfo[0].command[4].indexname "tags"
+indexinfo[0].command[4].command "multivalue"
+indexinfo[0].command[5].indexname "tags"
+indexinfo[0].command[5].command "stem:SHORTEST"
+indexinfo[0].command[6].indexname "tags"
+indexinfo[0].command[6].command "normalize"
+indexinfo[0].command[7].indexname "ratings"
+indexinfo[0].command[7].command "index"
+indexinfo[0].command[8].indexname "ratings"
+indexinfo[0].command[8].command "multivalue"
+indexinfo[0].command[9].indexname "ratings"
+indexinfo[0].command[9].command "attribute"
+indexinfo[0].command[10].indexname "a"
+indexinfo[0].command[10].command "index"
+indexinfo[0].command[11].indexname "a"
+indexinfo[0].command[11].command "lowercase"
+indexinfo[0].command[12].indexname "a"
+indexinfo[0].command[12].command "stem:SHORTEST"
+indexinfo[0].command[13].indexname "a"
+indexinfo[0].command[13].command "normalize"
+indexinfo[0].command[14].indexname "b"
+indexinfo[0].command[14].command "index"
+indexinfo[0].command[15].indexname "b"
+indexinfo[0].command[15].command "lowercase"
+indexinfo[0].command[16].indexname "b"
+indexinfo[0].command[16].command "multivalue"
+indexinfo[0].command[17].indexname "b"
+indexinfo[0].command[17].command "stem:SHORTEST"
+indexinfo[0].command[18].indexname "b"
+indexinfo[0].command[18].command "normalize"
+indexinfo[0].command[19].indexname "c"
+indexinfo[0].command[19].command "index"
+indexinfo[0].command[20].indexname "c"
+indexinfo[0].command[20].command "lowercase"
+indexinfo[0].command[21].indexname "c"
+indexinfo[0].command[21].command "multivalue"
+indexinfo[0].command[22].indexname "c"
+indexinfo[0].command[22].command "stem:SHORTEST"
+indexinfo[0].command[23].indexname "c"
+indexinfo[0].command[23].command "normalize"
+indexinfo[0].command[24].indexname "rankfeatures"
+indexinfo[0].command[24].command "index"
+indexinfo[0].command[25].indexname "summaryfeatures"
+indexinfo[0].command[25].command "index"
+indexinfo[0].command[26].indexname "default"
+indexinfo[0].command[26].command "lowercase"
+indexinfo[0].command[27].indexname "default"
+indexinfo[0].command[27].command "multivalue"
+indexinfo[0].command[28].indexname "default"
+indexinfo[0].command[28].command "index"
+indexinfo[0].command[29].indexname "default"
+indexinfo[0].command[29].command "stem:SHORTEST"
+indexinfo[0].command[30].indexname "default"
+indexinfo[0].command[30].command "normalize" \ No newline at end of file
diff --git a/config-model/src/test/derived/attributeprefetch/documentmanager.cfg b/config-model/src/test/derived/attributeprefetch/documentmanager.cfg
index 92558a62509..619bced44cf 100644
--- a/config-model/src/test/derived/attributeprefetch/documentmanager.cfg
+++ b/config-model/src/test/derived/attributeprefetch/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id 49942803
datatype[1].arraytype[0].datatype 16
datatype[2].id -1068914395
@@ -55,44 +57,64 @@ datatype[13].structtype[0].compressthreshold 95
datatype[13].structtype[0].compressminsize 800
datatype[13].structtype[0].field[0].name "singlebyte"
datatype[13].structtype[0].field[0].datatype 16
+datatype[13].structtype[0].field[0].detailedtype ""
datatype[13].structtype[0].field[1].name "multibyte"
datatype[13].structtype[0].field[1].datatype 49942803
+datatype[13].structtype[0].field[1].detailedtype ""
datatype[13].structtype[0].field[2].name "wsbyte"
datatype[13].structtype[0].field[2].datatype -1068914395
+datatype[13].structtype[0].field[2].detailedtype ""
datatype[13].structtype[0].field[3].name "singleint"
datatype[13].structtype[0].field[3].datatype 0
+datatype[13].structtype[0].field[3].detailedtype ""
datatype[13].structtype[0].field[4].name "multiint"
datatype[13].structtype[0].field[4].datatype -1245117006
+datatype[13].structtype[0].field[4].detailedtype ""
datatype[13].structtype[0].field[5].name "wsint"
datatype[13].structtype[0].field[5].datatype 519906144
+datatype[13].structtype[0].field[5].detailedtype ""
datatype[13].structtype[0].field[6].name "singlelong"
datatype[13].structtype[0].field[6].datatype 4
+datatype[13].structtype[0].field[6].detailedtype ""
datatype[13].structtype[0].field[7].name "multilong"
datatype[13].structtype[0].field[7].datatype 58874399
+datatype[13].structtype[0].field[7].detailedtype ""
datatype[13].structtype[0].field[8].name "wslong"
datatype[13].structtype[0].field[8].datatype -1059982799
+datatype[13].structtype[0].field[8].detailedtype ""
datatype[13].structtype[0].field[9].name "singlefloat"
datatype[13].structtype[0].field[9].datatype 1
+datatype[13].structtype[0].field[9].detailedtype ""
datatype[13].structtype[0].field[10].name "multifloat"
datatype[13].structtype[0].field[10].datatype 1650586661
+datatype[13].structtype[0].field[10].detailedtype ""
datatype[13].structtype[0].field[11].name "wsfloat"
datatype[13].structtype[0].field[11].datatype 1325751891
+datatype[13].structtype[0].field[11].detailedtype ""
datatype[13].structtype[0].field[12].name "singledouble"
datatype[13].structtype[0].field[12].datatype 5
+datatype[13].structtype[0].field[12].detailedtype ""
datatype[13].structtype[0].field[13].name "multidouble"
datatype[13].structtype[0].field[13].datatype -2054976470
+datatype[13].structtype[0].field[13].detailedtype ""
datatype[13].structtype[0].field[14].name "wsdouble"
datatype[13].structtype[0].field[14].datatype 760047548
+datatype[13].structtype[0].field[14].detailedtype ""
datatype[13].structtype[0].field[15].name "singlestring"
datatype[13].structtype[0].field[15].datatype 2
+datatype[13].structtype[0].field[15].detailedtype ""
datatype[13].structtype[0].field[16].name "multistring"
datatype[13].structtype[0].field[16].datatype -1486737430
+datatype[13].structtype[0].field[16].detailedtype ""
datatype[13].structtype[0].field[17].name "wsstring"
datatype[13].structtype[0].field[17].datatype 1328286588
+datatype[13].structtype[0].field[17].detailedtype ""
datatype[13].structtype[0].field[18].name "rankfeatures"
datatype[13].structtype[0].field[18].datatype 2
+datatype[13].structtype[0].field[18].detailedtype ""
datatype[13].structtype[0].field[19].name "summaryfeatures"
datatype[13].structtype[0].field[19].datatype 2
+datatype[13].structtype[0].field[19].detailedtype ""
datatype[14].id 932425403
datatype[14].structtype[0].name "prefetch.body"
datatype[14].structtype[0].version 0
diff --git a/config-model/src/test/derived/complex/documentmanager.cfg b/config-model/src/test/derived/complex/documentmanager.cfg
index 66ebbbb2846..e47f40f100a 100644
--- a/config-model/src/test/derived/complex/documentmanager.cfg
+++ b/config-model/src/test/derived/complex/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id 1650586661
datatype[1].arraytype[0].datatype 1
datatype[2].id -1245117006
@@ -23,58 +25,85 @@ datatype[3].structtype[0].compressthreshold 95
datatype[3].structtype[0].compressminsize 800
datatype[3].structtype[0].field[0].name "title"
datatype[3].structtype[0].field[0].datatype 2
+datatype[3].structtype[0].field[0].detailedtype ""
datatype[3].structtype[0].field[1].name "location"
datatype[3].structtype[0].field[1].datatype 2
+datatype[3].structtype[0].field[1].detailedtype ""
datatype[3].structtype[0].field[2].name "dyntitle"
datatype[3].structtype[0].field[2].datatype 2
+datatype[3].structtype[0].field[2].detailedtype ""
datatype[3].structtype[0].field[3].name "special1"
datatype[3].structtype[0].field[3].datatype 2
+datatype[3].structtype[0].field[3].detailedtype ""
datatype[3].structtype[0].field[4].name "special2"
datatype[3].structtype[0].field[4].datatype 2
+datatype[3].structtype[0].field[4].detailedtype ""
datatype[3].structtype[0].field[5].name "special3"
datatype[3].structtype[0].field[5].datatype 2
+datatype[3].structtype[0].field[5].detailedtype ""
datatype[3].structtype[0].field[6].name "prefixenabled"
datatype[3].structtype[0].field[6].datatype 2
+datatype[3].structtype[0].field[6].detailedtype ""
datatype[3].structtype[0].field[7].name "source"
datatype[3].structtype[0].field[7].datatype 10
+datatype[3].structtype[0].field[7].detailedtype ""
datatype[3].structtype[0].field[8].name "docurl"
datatype[3].structtype[0].field[8].datatype 10
+datatype[3].structtype[0].field[8].detailedtype ""
datatype[3].structtype[0].field[9].name "fleeting"
datatype[3].structtype[0].field[9].datatype 1650586661
+datatype[3].structtype[0].field[9].detailedtype ""
datatype[3].structtype[0].field[10].name "fleeting2"
datatype[3].structtype[0].field[10].datatype 1
+datatype[3].structtype[0].field[10].detailedtype ""
datatype[3].structtype[0].field[11].name "foundat"
datatype[3].structtype[0].field[11].datatype 4
+datatype[3].structtype[0].field[11].detailedtype ""
datatype[3].structtype[0].field[12].name "collapseby"
datatype[3].structtype[0].field[12].datatype 0
+datatype[3].structtype[0].field[12].detailedtype ""
datatype[3].structtype[0].field[13].name "yEaR"
datatype[3].structtype[0].field[13].datatype 0
+datatype[3].structtype[0].field[13].detailedtype ""
datatype[3].structtype[0].field[14].name "stringfield"
datatype[3].structtype[0].field[14].datatype 2
+datatype[3].structtype[0].field[14].detailedtype ""
datatype[3].structtype[0].field[15].name "exactemento"
datatype[3].structtype[0].field[15].datatype 2
+datatype[3].structtype[0].field[15].detailedtype ""
datatype[3].structtype[0].field[16].name "exactagain"
datatype[3].structtype[0].field[16].datatype 2
+datatype[3].structtype[0].field[16].detailedtype ""
datatype[3].structtype[0].field[17].name "ts"
datatype[3].structtype[0].field[17].datatype 4
+datatype[3].structtype[0].field[17].detailedtype ""
datatype[3].structtype[0].field[18].name "combineda"
datatype[3].structtype[0].field[18].datatype 0
+datatype[3].structtype[0].field[18].detailedtype ""
datatype[3].structtype[0].field[19].name "combinedb"
datatype[3].structtype[0].field[19].datatype 2
+datatype[3].structtype[0].field[19].detailedtype ""
datatype[3].structtype[0].field[20].name "category"
datatype[3].structtype[0].field[20].datatype 2
+datatype[3].structtype[0].field[20].detailedtype ""
datatype[3].structtype[0].field[21].name "woe"
datatype[3].structtype[0].field[21].datatype 2
+datatype[3].structtype[0].field[21].detailedtype ""
datatype[3].structtype[0].field[22].name "year_sub"
datatype[3].structtype[0].field[22].datatype 0
+datatype[3].structtype[0].field[22].detailedtype ""
datatype[3].structtype[0].field[23].name "year_arr"
datatype[3].structtype[0].field[23].datatype -1245117006
+datatype[3].structtype[0].field[23].detailedtype ""
datatype[3].structtype[0].field[24].name "exact"
datatype[3].structtype[0].field[24].datatype 2
+datatype[3].structtype[0].field[24].detailedtype ""
datatype[3].structtype[0].field[25].name "rankfeatures"
datatype[3].structtype[0].field[25].datatype 2
+datatype[3].structtype[0].field[25].detailedtype ""
datatype[3].structtype[0].field[26].name "summaryfeatures"
datatype[3].structtype[0].field[26].datatype 2
+datatype[3].structtype[0].field[26].detailedtype ""
datatype[4].id -1665926686
datatype[4].structtype[0].name "complex.body"
datatype[4].structtype[0].version 0
diff --git a/config-model/src/test/derived/complex/rank-profiles.cfg b/config-model/src/test/derived/complex/rank-profiles.cfg
index 5e2804d0ee6..a317bfeb18e 100644
--- a/config-model/src/test/derived/complex/rank-profiles.cfg
+++ b/config-model/src/test/derived/complex/rank-profiles.cfg
@@ -65,4 +65,4 @@ rankprofile[3].fef.property[9].value "loggrowth(1500,4000,19)"
rankprofile[3].fef.property[10].name "nativeProximity.proximityTable.title"
rankprofile[3].fef.property[10].value "expdecay(500,3)"
rankprofile[3].fef.property[11].name "nativeProximity.reverseProximityTable.title"
-rankprofile[3].fef.property[11].value "expdecay(400,3)"
+rankprofile[3].fef.property[11].value "expdecay(400,3)" \ No newline at end of file
diff --git a/config-model/src/test/derived/documentderiver/documentmanager.cfg b/config-model/src/test/derived/documentderiver/documentmanager.cfg
index d56d90ba358..f993b465111 100644
--- a/config-model/src/test/derived/documentderiver/documentmanager.cfg
+++ b/config-model/src/test/derived/documentderiver/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id -843666531
datatype[1].structtype[0].name "compressed_body.header"
datatype[1].structtype[0].version 0
@@ -19,6 +21,7 @@ datatype[1].structtype[0].compressthreshold 95
datatype[1].structtype[0].compressminsize 800
datatype[1].structtype[0].field[0].name "from"
datatype[1].structtype[0].field[0].datatype 2
+datatype[1].structtype[0].field[0].detailedtype ""
datatype[2].id 1704844530
datatype[2].structtype[0].name "compressed_body.body"
datatype[2].structtype[0].version 0
@@ -28,6 +31,7 @@ datatype[2].structtype[0].compressthreshold 95
datatype[2].structtype[0].compressminsize 0
datatype[2].structtype[0].field[0].name "content"
datatype[2].structtype[0].field[0].datatype 2
+datatype[2].structtype[0].field[0].detailedtype ""
datatype[3].id 1417245026
datatype[3].documenttype[0].name "compressed_body"
datatype[3].documenttype[0].version 0
@@ -44,6 +48,7 @@ datatype[4].structtype[0].compressthreshold 50
datatype[4].structtype[0].compressminsize 0
datatype[4].structtype[0].field[0].name "from"
datatype[4].structtype[0].field[0].datatype 2
+datatype[4].structtype[0].field[0].detailedtype ""
datatype[5].id -1007627725
datatype[5].structtype[0].name "compressed_both.body"
datatype[5].structtype[0].version 0
@@ -53,6 +58,7 @@ datatype[5].structtype[0].compressthreshold 90
datatype[5].structtype[0].compressminsize 0
datatype[5].structtype[0].field[0].name "content"
datatype[5].structtype[0].field[0].datatype 2
+datatype[5].structtype[0].field[0].detailedtype ""
datatype[6].id 1417705345
datatype[6].documenttype[0].name "compressed_both"
datatype[6].documenttype[0].version 0
@@ -69,6 +75,7 @@ datatype[7].structtype[0].compressthreshold 95
datatype[7].structtype[0].compressminsize 0
datatype[7].structtype[0].field[0].name "from"
datatype[7].structtype[0].field[0].datatype 2
+datatype[7].structtype[0].field[0].detailedtype ""
datatype[8].id -579052249
datatype[8].structtype[0].name "compressed_header.body"
datatype[8].structtype[0].version 0
@@ -78,6 +85,7 @@ datatype[8].structtype[0].compressthreshold 95
datatype[8].structtype[0].compressminsize 800
datatype[8].structtype[0].field[0].name "content"
datatype[8].structtype[0].field[0].datatype 2
+datatype[8].structtype[0].field[0].detailedtype ""
datatype[9].id 1946084365
datatype[9].documenttype[0].name "compressed_header"
datatype[9].documenttype[0].version 0
@@ -94,22 +102,31 @@ datatype[10].structtype[0].compressthreshold 95
datatype[10].structtype[0].compressminsize 800
datatype[10].structtype[0].field[0].name "URI"
datatype[10].structtype[0].field[0].datatype 10
+datatype[10].structtype[0].field[0].detailedtype ""
datatype[10].structtype[0].field[1].name "mailid"
datatype[10].structtype[0].field[1].datatype 2
+datatype[10].structtype[0].field[1].detailedtype ""
datatype[10].structtype[0].field[2].name "date"
datatype[10].structtype[0].field[2].datatype 0
+datatype[10].structtype[0].field[2].detailedtype ""
datatype[10].structtype[0].field[3].name "from"
datatype[10].structtype[0].field[3].datatype 2
+datatype[10].structtype[0].field[3].detailedtype ""
datatype[10].structtype[0].field[4].name "replyto"
datatype[10].structtype[0].field[4].datatype 3
+datatype[10].structtype[0].field[4].detailedtype ""
datatype[10].structtype[0].field[5].name "to"
datatype[10].structtype[0].field[5].datatype 2
+datatype[10].structtype[0].field[5].detailedtype ""
datatype[10].structtype[0].field[6].name "cc"
datatype[10].structtype[0].field[6].datatype 2
+datatype[10].structtype[0].field[6].detailedtype ""
datatype[10].structtype[0].field[7].name "bcc"
datatype[10].structtype[0].field[7].datatype 2
+datatype[10].structtype[0].field[7].detailedtype ""
datatype[10].structtype[0].field[8].name "subject"
datatype[10].structtype[0].field[8].datatype 2
+datatype[10].structtype[0].field[8].detailedtype ""
datatype[11].id -1244861287
datatype[11].arraytype[0].datatype 3
datatype[12].id -953584901
@@ -121,18 +138,25 @@ datatype[12].structtype[0].compressthreshold 95
datatype[12].structtype[0].compressminsize 800
datatype[12].structtype[0].field[0].name "mailbody"
datatype[12].structtype[0].field[0].datatype 3
+datatype[12].structtype[0].field[0].detailedtype ""
datatype[12].structtype[0].field[1].name "attachmentcount"
datatype[12].structtype[0].field[1].datatype 0
+datatype[12].structtype[0].field[1].detailedtype ""
datatype[12].structtype[0].field[2].name "attachmentnames"
datatype[12].structtype[0].field[2].datatype 2
+datatype[12].structtype[0].field[2].detailedtype ""
datatype[12].structtype[0].field[3].name "attachmenttypes"
datatype[12].structtype[0].field[3].datatype 2
+datatype[12].structtype[0].field[3].detailedtype ""
datatype[12].structtype[0].field[4].name "attachmentlanguages"
datatype[12].structtype[0].field[4].datatype 2
+datatype[12].structtype[0].field[4].detailedtype ""
datatype[12].structtype[0].field[5].name "attachmentcontent"
datatype[12].structtype[0].field[5].datatype 2
+datatype[12].structtype[0].field[5].detailedtype ""
datatype[12].structtype[0].field[6].name "attachments"
datatype[12].structtype[0].field[6].datatype -1244861287
+datatype[12].structtype[0].field[6].detailedtype ""
datatype[13].id -1081574983
datatype[13].documenttype[0].name "mail"
datatype[13].documenttype[0].version 0
@@ -159,22 +183,31 @@ datatype[17].structtype[0].compressthreshold 95
datatype[17].structtype[0].compressminsize 800
datatype[17].structtype[0].field[0].name "url"
datatype[17].structtype[0].field[0].datatype 10
+datatype[17].structtype[0].field[0].detailedtype ""
datatype[17].structtype[0].field[1].name "title"
datatype[17].structtype[0].field[1].datatype 2
+datatype[17].structtype[0].field[1].detailedtype ""
datatype[17].structtype[0].field[2].name "artist"
datatype[17].structtype[0].field[2].datatype 2
+datatype[17].structtype[0].field[2].detailedtype ""
datatype[17].structtype[0].field[3].name "year"
datatype[17].structtype[0].field[3].datatype 0
+datatype[17].structtype[0].field[3].detailedtype ""
datatype[17].structtype[0].field[4].name "description"
datatype[17].structtype[0].field[4].datatype 3
+datatype[17].structtype[0].field[4].detailedtype ""
datatype[17].structtype[0].field[5].name "tracks"
datatype[17].structtype[0].field[5].datatype -1486737430
+datatype[17].structtype[0].field[5].detailedtype ""
datatype[17].structtype[0].field[6].name "popularity"
datatype[17].structtype[0].field[6].datatype 519906144
+datatype[17].structtype[0].field[6].detailedtype ""
datatype[17].structtype[0].field[7].name "popularity2"
datatype[17].structtype[0].field[7].datatype 363959257
+datatype[17].structtype[0].field[7].detailedtype ""
datatype[17].structtype[0].field[8].name "popularity3"
datatype[17].structtype[0].field[8].datatype 363959257
+datatype[17].structtype[0].field[8].detailedtype ""
datatype[18].id 993120973
datatype[18].structtype[0].name "music.body"
datatype[18].structtype[0].version 0
@@ -198,46 +231,67 @@ datatype[20].structtype[0].compressthreshold 95
datatype[20].structtype[0].compressminsize 800
datatype[20].structtype[0].field[0].name "title"
datatype[20].structtype[0].field[0].datatype 2
+datatype[20].structtype[0].field[0].detailedtype ""
datatype[20].structtype[0].field[1].name "abstract"
datatype[20].structtype[0].field[1].datatype 2
+datatype[20].structtype[0].field[1].detailedtype ""
datatype[20].structtype[0].field[2].name "sourcename"
datatype[20].structtype[0].field[2].datatype 2
+datatype[20].structtype[0].field[2].detailedtype ""
datatype[20].structtype[0].field[3].name "providername"
datatype[20].structtype[0].field[3].datatype 2
+datatype[20].structtype[0].field[3].detailedtype ""
datatype[20].structtype[0].field[4].name "thumburl"
datatype[20].structtype[0].field[4].datatype 2
+datatype[20].structtype[0].field[4].detailedtype ""
datatype[20].structtype[0].field[5].name "thumbwidth"
datatype[20].structtype[0].field[5].datatype 0
+datatype[20].structtype[0].field[5].detailedtype ""
datatype[20].structtype[0].field[6].name "thumbheight"
datatype[20].structtype[0].field[6].datatype 0
+datatype[20].structtype[0].field[6].detailedtype ""
datatype[20].structtype[0].field[7].name "language"
datatype[20].structtype[0].field[7].datatype 2
+datatype[20].structtype[0].field[7].detailedtype ""
datatype[20].structtype[0].field[8].name "crawldocid"
datatype[20].structtype[0].field[8].datatype 2
+datatype[20].structtype[0].field[8].detailedtype ""
datatype[20].structtype[0].field[9].name "url"
datatype[20].structtype[0].field[9].datatype 10
+datatype[20].structtype[0].field[9].detailedtype ""
datatype[20].structtype[0].field[10].name "sourceurl"
datatype[20].structtype[0].field[10].datatype 10
+datatype[20].structtype[0].field[10].detailedtype ""
datatype[20].structtype[0].field[11].name "categories"
datatype[20].structtype[0].field[11].datatype 2
+datatype[20].structtype[0].field[11].detailedtype ""
datatype[20].structtype[0].field[12].name "pubdate"
datatype[20].structtype[0].field[12].datatype 4
+datatype[20].structtype[0].field[12].detailedtype ""
datatype[20].structtype[0].field[13].name "expdate"
datatype[20].structtype[0].field[13].datatype 4
+datatype[20].structtype[0].field[13].detailedtype ""
datatype[20].structtype[0].field[14].name "fingerprint"
datatype[20].structtype[0].field[14].datatype 0
+datatype[20].structtype[0].field[14].detailedtype ""
datatype[20].structtype[0].field[15].name "debug"
datatype[20].structtype[0].field[15].datatype 2
+datatype[20].structtype[0].field[15].detailedtype ""
datatype[20].structtype[0].field[16].name "attributes"
datatype[20].structtype[0].field[16].datatype 2
+datatype[20].structtype[0].field[16].detailedtype ""
datatype[20].structtype[0].field[17].name "searchcluster"
datatype[20].structtype[0].field[17].datatype 2
+datatype[20].structtype[0].field[17].detailedtype ""
datatype[20].structtype[0].field[18].name "eustaticrank"
datatype[20].structtype[0].field[18].datatype 0
+datatype[20].structtype[0].field[18].detailedtype ""
datatype[20].structtype[0].field[19].name "usstaticrank"
datatype[20].structtype[0].field[19].datatype 0
+datatype[20].structtype[0].field[19].detailedtype ""
datatype[20].structtype[0].field[20].name "asiastaticrank"
datatype[20].structtype[0].field[20].datatype 0
+datatype[20].structtype[0].field[20].detailedtype ""
datatype[21].id -2059783233
datatype[21].structtype[0].name "newssummary.body"
datatype[21].structtype[0].version 0
@@ -261,44 +315,64 @@ datatype[23].structtype[0].compressthreshold 95
datatype[23].structtype[0].compressminsize 800
datatype[23].structtype[0].field[0].name "dynabstract"
datatype[23].structtype[0].field[0].datatype 2
+datatype[23].structtype[0].field[0].detailedtype ""
datatype[23].structtype[0].field[1].name "othersourcenames"
datatype[23].structtype[0].field[1].datatype 2
+datatype[23].structtype[0].field[1].detailedtype ""
datatype[23].structtype[0].field[2].name "author"
datatype[23].structtype[0].field[2].datatype 2
+datatype[23].structtype[0].field[2].detailedtype ""
datatype[23].structtype[0].field[3].name "otherlanguages"
datatype[23].structtype[0].field[3].datatype 2
+datatype[23].structtype[0].field[3].detailedtype ""
datatype[23].structtype[0].field[4].name "charset"
datatype[23].structtype[0].field[4].datatype 2
+datatype[23].structtype[0].field[4].detailedtype ""
datatype[23].structtype[0].field[5].name "mimetype"
datatype[23].structtype[0].field[5].datatype 2
+datatype[23].structtype[0].field[5].detailedtype ""
datatype[23].structtype[0].field[6].name "referrerurl"
datatype[23].structtype[0].field[6].datatype 10
+datatype[23].structtype[0].field[6].detailedtype ""
datatype[23].structtype[0].field[7].name "sourcelocation"
datatype[23].structtype[0].field[7].datatype 2
+datatype[23].structtype[0].field[7].detailedtype ""
datatype[23].structtype[0].field[8].name "sourcecountry"
datatype[23].structtype[0].field[8].datatype 2
+datatype[23].structtype[0].field[8].detailedtype ""
datatype[23].structtype[0].field[9].name "sourcelocale"
datatype[23].structtype[0].field[9].datatype 2
+datatype[23].structtype[0].field[9].detailedtype ""
datatype[23].structtype[0].field[10].name "sourcecontinent"
datatype[23].structtype[0].field[10].datatype 2
+datatype[23].structtype[0].field[10].detailedtype ""
datatype[23].structtype[0].field[11].name "articlecountry"
datatype[23].structtype[0].field[11].datatype 2
+datatype[23].structtype[0].field[11].detailedtype ""
datatype[23].structtype[0].field[12].name "articlelocale"
datatype[23].structtype[0].field[12].datatype 2
+datatype[23].structtype[0].field[12].detailedtype ""
datatype[23].structtype[0].field[13].name "articlecontinent"
datatype[23].structtype[0].field[13].datatype 2
+datatype[23].structtype[0].field[13].detailedtype ""
datatype[23].structtype[0].field[14].name "sourcerank"
datatype[23].structtype[0].field[14].datatype 0
+datatype[23].structtype[0].field[14].detailedtype ""
datatype[23].structtype[0].field[15].name "crawldate"
datatype[23].structtype[0].field[15].datatype 4
+datatype[23].structtype[0].field[15].detailedtype ""
datatype[23].structtype[0].field[16].name "indexdate"
datatype[23].structtype[0].field[16].datatype 4
+datatype[23].structtype[0].field[16].detailedtype ""
datatype[23].structtype[0].field[17].name "procdate"
datatype[23].structtype[0].field[17].datatype 4
+datatype[23].structtype[0].field[17].detailedtype ""
datatype[23].structtype[0].field[18].name "sourceid"
datatype[23].structtype[0].field[18].datatype 0
+datatype[23].structtype[0].field[18].detailedtype ""
datatype[23].structtype[0].field[19].name "sourcefeedid"
datatype[23].structtype[0].field[19].datatype 0
+datatype[23].structtype[0].field[19].detailedtype ""
datatype[24].id 197293167
datatype[24].structtype[0].name "newsarticle.body"
datatype[24].structtype[0].version 0
@@ -308,6 +382,7 @@ datatype[24].structtype[0].compressthreshold 95
datatype[24].structtype[0].compressminsize 800
datatype[24].structtype[0].field[0].name "body"
datatype[24].structtype[0].field[0].datatype 2
+datatype[24].structtype[0].field[0].detailedtype ""
datatype[25].id -1710661691
datatype[25].documenttype[0].name "newsarticle"
datatype[25].documenttype[0].version 0
diff --git a/config-model/src/test/derived/emptydefault/documentmanager.cfg b/config-model/src/test/derived/emptydefault/documentmanager.cfg
index 4235199342a..9e25ff1c8ec 100644
--- a/config-model/src/test/derived/emptydefault/documentmanager.cfg
+++ b/config-model/src/test/derived/emptydefault/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id 461724009
datatype[1].structtype[0].name "emptydefault.header"
datatype[1].structtype[0].version 0
@@ -19,12 +21,16 @@ datatype[1].structtype[0].compressthreshold 95
datatype[1].structtype[0].compressminsize 800
datatype[1].structtype[0].field[0].name "one"
datatype[1].structtype[0].field[0].datatype 2
+datatype[1].structtype[0].field[0].detailedtype ""
datatype[1].structtype[0].field[1].name "two"
datatype[1].structtype[0].field[1].datatype 2
+datatype[1].structtype[0].field[1].detailedtype ""
datatype[1].structtype[0].field[2].name "rankfeatures"
datatype[1].structtype[0].field[2].datatype 2
+datatype[1].structtype[0].field[2].detailedtype ""
datatype[1].structtype[0].field[3].name "summaryfeatures"
datatype[1].structtype[0].field[3].datatype 2
+datatype[1].structtype[0].field[3].detailedtype ""
datatype[2].id 311791038
datatype[2].structtype[0].name "emptydefault.body"
datatype[2].structtype[0].version 0
diff --git a/config-model/src/test/derived/id/documentmanager.cfg b/config-model/src/test/derived/id/documentmanager.cfg
index 40996d46399..00ffb00975b 100644
--- a/config-model/src/test/derived/id/documentmanager.cfg
+++ b/config-model/src/test/derived/id/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id -531633022
datatype[1].structtype[0].name "id.header"
datatype[1].structtype[0].version 0
@@ -19,10 +21,13 @@ datatype[1].structtype[0].compressthreshold 95
datatype[1].structtype[0].compressminsize 800
datatype[1].structtype[0].field[0].name "uri"
datatype[1].structtype[0].field[0].datatype 10
+datatype[1].structtype[0].field[0].detailedtype ""
datatype[1].structtype[0].field[1].name "rankfeatures"
datatype[1].structtype[0].field[1].datatype 2
+datatype[1].structtype[0].field[1].detailedtype ""
datatype[1].structtype[0].field[2].name "summaryfeatures"
datatype[1].structtype[0].field[2].datatype 2
+datatype[1].structtype[0].field[2].detailedtype ""
datatype[2].id -1830022377
datatype[2].structtype[0].name "id.body"
datatype[2].structtype[0].version 0
diff --git a/config-model/src/test/derived/indexswitches/documentmanager.cfg b/config-model/src/test/derived/indexswitches/documentmanager.cfg
index 0a32e670d7b..bdc983ebb67 100644
--- a/config-model/src/test/derived/indexswitches/documentmanager.cfg
+++ b/config-model/src/test/derived/indexswitches/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id -555640823
datatype[1].structtype[0].name "indexswitches.header"
datatype[1].structtype[0].version 0
@@ -19,16 +21,22 @@ datatype[1].structtype[0].compressthreshold 95
datatype[1].structtype[0].compressminsize 800
datatype[1].structtype[0].field[0].name "title"
datatype[1].structtype[0].field[0].datatype 2
+datatype[1].structtype[0].field[0].detailedtype ""
datatype[1].structtype[0].field[1].name "descr"
datatype[1].structtype[0].field[1].datatype 2
+datatype[1].structtype[0].field[1].detailedtype ""
datatype[1].structtype[0].field[2].name "source_src"
datatype[1].structtype[0].field[2].datatype 2
+datatype[1].structtype[0].field[2].detailedtype ""
datatype[1].structtype[0].field[3].name "source"
datatype[1].structtype[0].field[3].datatype 2
+datatype[1].structtype[0].field[3].detailedtype ""
datatype[1].structtype[0].field[4].name "rankfeatures"
datatype[1].structtype[0].field[4].datatype 2
+datatype[1].structtype[0].field[4].detailedtype ""
datatype[1].structtype[0].field[5].name "summaryfeatures"
datatype[1].structtype[0].field[5].datatype 2
+datatype[1].structtype[0].field[5].detailedtype ""
datatype[2].id -1892617122
datatype[2].structtype[0].name "indexswitches.body"
datatype[2].structtype[0].version 0
diff --git a/config-model/src/test/derived/indexswitches/index-info.cfg b/config-model/src/test/derived/indexswitches/index-info.cfg
index 3daf23f8b67..6387551ec98 100644
--- a/config-model/src/test/derived/indexswitches/index-info.cfg
+++ b/config-model/src/test/derived/indexswitches/index-info.cfg
@@ -5,37 +5,37 @@ indexinfo[0].command[1].indexname "sddocname"
indexinfo[0].command[1].command "word"
indexinfo[0].command[2].indexname "title"
indexinfo[0].command[2].command "index"
-indexinfo[0].command[3].indexname "default"
-indexinfo[0].command[3].command "index"
+indexinfo[0].command[3].indexname "title"
+indexinfo[0].command[3].command "lowercase"
indexinfo[0].command[4].indexname "title"
-indexinfo[0].command[4].command "lowercase"
-indexinfo[0].command[5].indexname "default"
-indexinfo[0].command[5].command "lowercase"
-indexinfo[0].command[6].indexname "title"
-indexinfo[0].command[6].command "stem:SHORTEST"
-indexinfo[0].command[7].indexname "default"
-indexinfo[0].command[7].command "stem:SHORTEST"
-indexinfo[0].command[8].indexname "title"
-indexinfo[0].command[8].command "normalize"
-indexinfo[0].command[9].indexname "default"
+indexinfo[0].command[4].command "stem:SHORTEST"
+indexinfo[0].command[5].indexname "title"
+indexinfo[0].command[5].command "normalize"
+indexinfo[0].command[6].indexname "descr"
+indexinfo[0].command[6].command "index"
+indexinfo[0].command[7].indexname "descr"
+indexinfo[0].command[7].command "lowercase"
+indexinfo[0].command[8].indexname "descr"
+indexinfo[0].command[8].command "stem:SHORTEST"
+indexinfo[0].command[9].indexname "descr"
indexinfo[0].command[9].command "normalize"
-indexinfo[0].command[10].indexname "descr"
+indexinfo[0].command[10].indexname "source_src"
indexinfo[0].command[10].command "index"
-indexinfo[0].command[11].indexname "descr"
-indexinfo[0].command[11].command "lowercase"
-indexinfo[0].command[12].indexname "descr"
-indexinfo[0].command[12].command "stem:SHORTEST"
-indexinfo[0].command[13].indexname "descr"
-indexinfo[0].command[13].command "normalize"
-indexinfo[0].command[14].indexname "source_src"
-indexinfo[0].command[14].command "index"
-indexinfo[0].command[15].indexname "rankfeatures"
+indexinfo[0].command[11].indexname "rankfeatures"
+indexinfo[0].command[11].command "index"
+indexinfo[0].command[12].indexname "source"
+indexinfo[0].command[12].command "index"
+indexinfo[0].command[13].indexname "source"
+indexinfo[0].command[13].command "lowercase"
+indexinfo[0].command[14].indexname "source"
+indexinfo[0].command[14].command "normalize"
+indexinfo[0].command[15].indexname "summaryfeatures"
indexinfo[0].command[15].command "index"
-indexinfo[0].command[16].indexname "source"
-indexinfo[0].command[16].command "index"
-indexinfo[0].command[17].indexname "source"
-indexinfo[0].command[17].command "lowercase"
-indexinfo[0].command[18].indexname "source"
-indexinfo[0].command[18].command "normalize"
-indexinfo[0].command[19].indexname "summaryfeatures"
-indexinfo[0].command[19].command "index" \ No newline at end of file
+indexinfo[0].command[16].indexname "default"
+indexinfo[0].command[16].command "lowercase"
+indexinfo[0].command[17].indexname "default"
+indexinfo[0].command[17].command "index"
+indexinfo[0].command[18].indexname "default"
+indexinfo[0].command[18].command "stem:SHORTEST"
+indexinfo[0].command[19].indexname "default"
+indexinfo[0].command[19].command "normalize" \ No newline at end of file
diff --git a/config-model/src/test/derived/inheritfromgrandparent/documentmanager.cfg b/config-model/src/test/derived/inheritfromgrandparent/documentmanager.cfg
index 8c51dc52c58..ea0aa3a3e93 100644
--- a/config-model/src/test/derived/inheritfromgrandparent/documentmanager.cfg
+++ b/config-model/src/test/derived/inheritfromgrandparent/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id 1246084544
datatype[1].structtype[0].name "grandparent_struct"
datatype[1].structtype[0].version 0
@@ -19,6 +21,7 @@ datatype[1].structtype[0].compressthreshold 95
datatype[1].structtype[0].compressminsize 800
datatype[1].structtype[0].field[0].name "grandparent_field"
datatype[1].structtype[0].field[0].datatype 2
+datatype[1].structtype[0].field[0].detailedtype ""
datatype[2].id 990971719
datatype[2].structtype[0].name "grandparent.header"
datatype[2].structtype[0].version 0
@@ -28,8 +31,10 @@ datatype[2].structtype[0].compressthreshold 95
datatype[2].structtype[0].compressminsize 800
datatype[2].structtype[0].field[0].name "rankfeatures"
datatype[2].structtype[0].field[0].datatype 2
+datatype[2].structtype[0].field[0].detailedtype ""
datatype[2].structtype[0].field[1].name "summaryfeatures"
datatype[2].structtype[0].field[1].datatype 2
+datatype[2].structtype[0].field[1].detailedtype ""
datatype[3].id 978262812
datatype[3].structtype[0].name "grandparent.body"
datatype[3].structtype[0].version 0
@@ -78,6 +83,7 @@ datatype[8].structtype[0].compressthreshold 95
datatype[8].structtype[0].compressminsize 800
datatype[8].structtype[0].field[0].name "child_field"
datatype[8].structtype[0].field[0].datatype 1246084544
+datatype[8].structtype[0].field[0].detailedtype ""
datatype[9].id -126593034
datatype[9].structtype[0].name "child.body"
datatype[9].structtype[0].version 0
diff --git a/config-model/src/test/derived/inheritfromparent/documentmanager.cfg b/config-model/src/test/derived/inheritfromparent/documentmanager.cfg
index fec59f5ff72..80a9cbcfc3b 100644
--- a/config-model/src/test/derived/inheritfromparent/documentmanager.cfg
+++ b/config-model/src/test/derived/inheritfromparent/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id 1091188812
datatype[1].structtype[0].name "parent_struct"
datatype[1].structtype[0].version 0
@@ -19,6 +21,7 @@ datatype[1].structtype[0].compressthreshold 95
datatype[1].structtype[0].compressminsize 800
datatype[1].structtype[0].field[0].name "parent_field"
datatype[1].structtype[0].field[0].datatype 2
+datatype[1].structtype[0].field[0].detailedtype ""
datatype[2].id 836075987
datatype[2].structtype[0].name "parent.header"
datatype[2].structtype[0].version 0
@@ -28,12 +31,16 @@ datatype[2].structtype[0].compressthreshold 95
datatype[2].structtype[0].compressminsize 800
datatype[2].structtype[0].field[0].name "weight_src"
datatype[2].structtype[0].field[0].datatype 1
+datatype[2].structtype[0].field[0].detailedtype ""
datatype[2].structtype[0].field[1].name "weight"
datatype[2].structtype[0].field[1].datatype 1
+datatype[2].structtype[0].field[1].detailedtype ""
datatype[2].structtype[0].field[2].name "rankfeatures"
datatype[2].structtype[0].field[2].datatype 2
+datatype[2].structtype[0].field[2].detailedtype ""
datatype[2].structtype[0].field[3].name "summaryfeatures"
datatype[2].structtype[0].field[3].datatype 2
+datatype[2].structtype[0].field[3].detailedtype ""
datatype[3].id -389494616
datatype[3].structtype[0].name "parent.body"
datatype[3].structtype[0].version 0
@@ -58,6 +65,7 @@ datatype[5].structtype[0].compressthreshold 95
datatype[5].structtype[0].compressminsize 800
datatype[5].structtype[0].field[0].name "child_field"
datatype[5].structtype[0].field[0].datatype 1091188812
+datatype[5].structtype[0].field[0].detailedtype ""
datatype[6].id -126593034
datatype[6].structtype[0].name "child.body"
datatype[6].structtype[0].version 0
diff --git a/config-model/src/test/derived/inheritfromparent/documenttypes.cfg b/config-model/src/test/derived/inheritfromparent/documenttypes.cfg
index 44677776f3c..351ea0d9527 100644
--- a/config-model/src/test/derived/inheritfromparent/documenttypes.cfg
+++ b/config-model/src/test/derived/inheritfromparent/documenttypes.cfg
@@ -24,6 +24,7 @@ documenttype[0].datatype[0].sstruct.field[0].name "parent_field"
documenttype[0].datatype[0].sstruct.field[0].id 933533022
documenttype[0].datatype[0].sstruct.field[0].id_v6 2116869443
documenttype[0].datatype[0].sstruct.field[0].datatype 2
+documenttype[0].datatype[0].sstruct.field[0].detailedtype ""
documenttype[0].datatype[1].id 836075987
documenttype[0].datatype[1].type STRUCT
documenttype[0].datatype[1].array.element.id 0
@@ -43,18 +44,22 @@ documenttype[0].datatype[1].sstruct.field[0].name "weight_src"
documenttype[0].datatype[1].sstruct.field[0].id 1225660233
documenttype[0].datatype[1].sstruct.field[0].id_v6 1350588470
documenttype[0].datatype[1].sstruct.field[0].datatype 1
+documenttype[0].datatype[1].sstruct.field[0].detailedtype ""
documenttype[0].datatype[1].sstruct.field[1].name "weight"
documenttype[0].datatype[1].sstruct.field[1].id 1001392207
documenttype[0].datatype[1].sstruct.field[1].id_v6 1329620545
documenttype[0].datatype[1].sstruct.field[1].datatype 1
+documenttype[0].datatype[1].sstruct.field[1].detailedtype ""
documenttype[0].datatype[1].sstruct.field[2].name "rankfeatures"
documenttype[0].datatype[1].sstruct.field[2].id 1883197392
documenttype[0].datatype[1].sstruct.field[2].id_v6 699950698
documenttype[0].datatype[1].sstruct.field[2].datatype 2
+documenttype[0].datatype[1].sstruct.field[2].detailedtype ""
documenttype[0].datatype[1].sstruct.field[3].name "summaryfeatures"
documenttype[0].datatype[1].sstruct.field[3].id 1840337115
documenttype[0].datatype[1].sstruct.field[3].id_v6 1981648971
documenttype[0].datatype[1].sstruct.field[3].datatype 2
+documenttype[0].datatype[1].sstruct.field[3].detailedtype ""
documenttype[0].datatype[2].id -389494616
documenttype[0].datatype[2].type STRUCT
documenttype[0].datatype[2].array.element.id 0
@@ -97,6 +102,7 @@ documenttype[1].datatype[0].sstruct.field[0].name "child_field"
documenttype[1].datatype[0].sstruct.field[0].id 1814271363
documenttype[1].datatype[0].sstruct.field[0].id_v6 405182398
documenttype[1].datatype[0].sstruct.field[0].datatype 1091188812
+documenttype[1].datatype[0].sstruct.field[0].detailedtype ""
documenttype[1].datatype[1].id -126593034
documenttype[1].datatype[1].type STRUCT
documenttype[1].datatype[1].array.element.id 0
diff --git a/config-model/src/test/derived/mail/onlydoc/documentmanager.cfg b/config-model/src/test/derived/mail/onlydoc/documentmanager.cfg
index 0e95d51bdd8..0a70b48fe21 100644
--- a/config-model/src/test/derived/mail/onlydoc/documentmanager.cfg
+++ b/config-model/src/test/derived/mail/onlydoc/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id -88808602
datatype[1].structtype[0].name "mail.header"
datatype[1].structtype[0].version 0
@@ -19,22 +21,31 @@ datatype[1].structtype[0].compressthreshold 95
datatype[1].structtype[0].compressminsize 800
datatype[1].structtype[0].field[0].name "URI"
datatype[1].structtype[0].field[0].datatype 10
+datatype[1].structtype[0].field[0].detailedtype ""
datatype[1].structtype[0].field[1].name "mailid"
datatype[1].structtype[0].field[1].datatype 2
+datatype[1].structtype[0].field[1].detailedtype ""
datatype[1].structtype[0].field[2].name "date"
datatype[1].structtype[0].field[2].datatype 0
+datatype[1].structtype[0].field[2].detailedtype ""
datatype[1].structtype[0].field[3].name "from"
datatype[1].structtype[0].field[3].datatype 2
+datatype[1].structtype[0].field[3].detailedtype ""
datatype[1].structtype[0].field[4].name "replyto"
datatype[1].structtype[0].field[4].datatype 2
+datatype[1].structtype[0].field[4].detailedtype ""
datatype[1].structtype[0].field[5].name "to"
datatype[1].structtype[0].field[5].datatype 2
+datatype[1].structtype[0].field[5].detailedtype ""
datatype[1].structtype[0].field[6].name "cc"
datatype[1].structtype[0].field[6].datatype 2
+datatype[1].structtype[0].field[6].detailedtype ""
datatype[1].structtype[0].field[7].name "bcc"
datatype[1].structtype[0].field[7].datatype 2
+datatype[1].structtype[0].field[7].detailedtype ""
datatype[1].structtype[0].field[8].name "subject"
datatype[1].structtype[0].field[8].datatype 2
+datatype[1].structtype[0].field[8].detailedtype ""
datatype[2].id -1244861287
datatype[2].arraytype[0].datatype 3
datatype[3].id -953584901
@@ -46,18 +57,25 @@ datatype[3].structtype[0].compressthreshold 95
datatype[3].structtype[0].compressminsize 800
datatype[3].structtype[0].field[0].name "body"
datatype[3].structtype[0].field[0].datatype 2
+datatype[3].structtype[0].field[0].detailedtype ""
datatype[3].structtype[0].field[1].name "attachmentcount"
datatype[3].structtype[0].field[1].datatype 0
+datatype[3].structtype[0].field[1].detailedtype ""
datatype[3].structtype[0].field[2].name "attachmentnames"
datatype[3].structtype[0].field[2].datatype 2
+datatype[3].structtype[0].field[2].detailedtype ""
datatype[3].structtype[0].field[3].name "attachmenttypes"
datatype[3].structtype[0].field[3].datatype 2
+datatype[3].structtype[0].field[3].detailedtype ""
datatype[3].structtype[0].field[4].name "attachmentlanguages"
datatype[3].structtype[0].field[4].datatype 2
+datatype[3].structtype[0].field[4].detailedtype ""
datatype[3].structtype[0].field[5].name "attachmentcontent"
datatype[3].structtype[0].field[5].datatype 2
+datatype[3].structtype[0].field[5].detailedtype ""
datatype[3].structtype[0].field[6].name "attachments"
datatype[3].structtype[0].field[6].datatype -1244861287
+datatype[3].structtype[0].field[6].detailedtype ""
datatype[4].id -1081574983
datatype[4].documenttype[0].name "mail"
datatype[4].documenttype[0].version 0
diff --git a/config-model/src/test/derived/prefixexactattribute/documentmanager.cfg b/config-model/src/test/derived/prefixexactattribute/documentmanager.cfg
index 1b51178e6d8..41e39ac52df 100644
--- a/config-model/src/test/derived/prefixexactattribute/documentmanager.cfg
+++ b/config-model/src/test/derived/prefixexactattribute/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id -739138930
datatype[1].structtype[0].name "prefixexactattribute.header"
datatype[1].structtype[0].version 0
@@ -19,18 +21,25 @@ datatype[1].structtype[0].compressthreshold 95
datatype[1].structtype[0].compressminsize 800
datatype[1].structtype[0].field[0].name "indexfield0"
datatype[1].structtype[0].field[0].datatype 2
+datatype[1].structtype[0].field[0].detailedtype ""
datatype[1].structtype[0].field[1].name "attributefield1"
datatype[1].structtype[0].field[1].datatype 2
+datatype[1].structtype[0].field[1].detailedtype ""
datatype[1].structtype[0].field[2].name "attributefield2"
datatype[1].structtype[0].field[2].datatype 2
+datatype[1].structtype[0].field[2].detailedtype ""
datatype[1].structtype[0].field[3].name "indexfield1"
datatype[1].structtype[0].field[3].datatype 2
+datatype[1].structtype[0].field[3].detailedtype ""
datatype[1].structtype[0].field[4].name "indexfield2"
datatype[1].structtype[0].field[4].datatype 2
+datatype[1].structtype[0].field[4].detailedtype ""
datatype[1].structtype[0].field[5].name "rankfeatures"
datatype[1].structtype[0].field[5].datatype 2
+datatype[1].structtype[0].field[5].detailedtype ""
datatype[1].structtype[0].field[6].name "summaryfeatures"
datatype[1].structtype[0].field[6].datatype 2
+datatype[1].structtype[0].field[6].detailedtype ""
datatype[2].id -480519133
datatype[2].structtype[0].name "prefixexactattribute.body"
datatype[2].structtype[0].version 0
diff --git a/config-model/src/test/derived/ranktypes/documentmanager.cfg b/config-model/src/test/derived/ranktypes/documentmanager.cfg
index c57a58c244c..50be09891e5 100644
--- a/config-model/src/test/derived/ranktypes/documentmanager.cfg
+++ b/config-model/src/test/derived/ranktypes/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id -471393776
datatype[1].structtype[0].name "ranktypes.header"
datatype[1].structtype[0].version 0
@@ -19,18 +21,25 @@ datatype[1].structtype[0].compressthreshold 95
datatype[1].structtype[0].compressminsize 800
datatype[1].structtype[0].field[0].name "title"
datatype[1].structtype[0].field[0].datatype 2
+datatype[1].structtype[0].field[0].detailedtype ""
datatype[1].structtype[0].field[1].name "descr"
datatype[1].structtype[0].field[1].datatype 2
+datatype[1].structtype[0].field[1].detailedtype ""
datatype[1].structtype[0].field[2].name "keywords"
datatype[1].structtype[0].field[2].datatype 2
+datatype[1].structtype[0].field[2].detailedtype ""
datatype[1].structtype[0].field[3].name "identity"
datatype[1].structtype[0].field[3].datatype 2
+datatype[1].structtype[0].field[3].detailedtype ""
datatype[1].structtype[0].field[4].name "identity_literal"
datatype[1].structtype[0].field[4].datatype 2
+datatype[1].structtype[0].field[4].detailedtype ""
datatype[1].structtype[0].field[5].name "rankfeatures"
datatype[1].structtype[0].field[5].datatype 2
+datatype[1].structtype[0].field[5].detailedtype ""
datatype[1].structtype[0].field[6].name "summaryfeatures"
datatype[1].structtype[0].field[6].datatype 2
+datatype[1].structtype[0].field[6].detailedtype ""
datatype[2].id 1374506021
datatype[2].structtype[0].name "ranktypes.body"
datatype[2].structtype[0].version 0
diff --git a/config-model/src/test/derived/streamingstruct/documentmanager.cfg b/config-model/src/test/derived/streamingstruct/documentmanager.cfg
index 306f1102fb1..42826c5be33 100644
--- a/config-model/src/test/derived/streamingstruct/documentmanager.cfg
+++ b/config-model/src/test/derived/streamingstruct/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id 105061838
datatype[1].structtype[0].name "ns1"
datatype[1].structtype[0].version 0
@@ -19,10 +21,13 @@ datatype[1].structtype[0].compressthreshold 95
datatype[1].structtype[0].compressminsize 800
datatype[1].structtype[0].field[0].name "nf1"
datatype[1].structtype[0].field[0].datatype 3474528
+datatype[1].structtype[0].field[0].detailedtype ""
datatype[1].structtype[0].field[1].name "nf1s"
datatype[1].structtype[0].field[1].datatype 3474528
+datatype[1].structtype[0].field[1].detailedtype ""
datatype[1].structtype[0].field[2].name "nf2"
datatype[1].structtype[0].field[2].datatype 2
+datatype[1].structtype[0].field[2].detailedtype ""
datatype[2].id 3474528
datatype[2].structtype[0].name "s1"
datatype[2].structtype[0].version 0
@@ -32,12 +37,16 @@ datatype[2].structtype[0].compressthreshold 95
datatype[2].structtype[0].compressminsize 800
datatype[2].structtype[0].field[0].name "f1"
datatype[2].structtype[0].field[0].datatype 2
+datatype[2].structtype[0].field[0].detailedtype ""
datatype[2].structtype[0].field[1].name "f1s"
datatype[2].structtype[0].field[1].datatype 2
+datatype[2].structtype[0].field[1].detailedtype ""
datatype[2].structtype[0].field[2].name "f2"
datatype[2].structtype[0].field[2].datatype 0
+datatype[2].structtype[0].field[2].detailedtype ""
datatype[2].structtype[0].field[3].name "f3"
datatype[2].structtype[0].field[3].datatype 5
+datatype[2].structtype[0].field[3].detailedtype ""
datatype[3].id -1497802371
datatype[3].maptype[0].keytype 4
datatype[3].maptype[0].valtype 2
@@ -52,48 +61,70 @@ datatype[5].structtype[0].compressthreshold 95
datatype[5].structtype[0].compressminsize 800
datatype[5].structtype[0].field[0].name "coupleof"
datatype[5].structtype[0].field[0].datatype 2
+datatype[5].structtype[0].field[0].detailedtype ""
datatype[5].structtype[0].field[1].name "normalfields"
datatype[5].structtype[0].field[1].datatype 2
+datatype[5].structtype[0].field[1].detailedtype ""
datatype[5].structtype[0].field[2].name "a"
datatype[5].structtype[0].field[2].datatype 3474528
+datatype[5].structtype[0].field[2].detailedtype ""
datatype[5].structtype[0].field[3].name "m"
datatype[5].structtype[0].field[3].datatype -1497802371
+datatype[5].structtype[0].field[3].detailedtype ""
datatype[5].structtype[0].field[4].name "b"
datatype[5].structtype[0].field[4].datatype 3474528
+datatype[5].structtype[0].field[4].detailedtype ""
datatype[5].structtype[0].field[5].name "c"
datatype[5].structtype[0].field[5].datatype 3474528
+datatype[5].structtype[0].field[5].detailedtype ""
datatype[5].structtype[0].field[6].name "c2"
datatype[5].structtype[0].field[6].datatype 3474528
+datatype[5].structtype[0].field[6].detailedtype ""
datatype[5].structtype[0].field[7].name "c3"
datatype[5].structtype[0].field[7].datatype 3474528
+datatype[5].structtype[0].field[7].detailedtype ""
datatype[5].structtype[0].field[8].name "n"
datatype[5].structtype[0].field[8].datatype 105061838
+datatype[5].structtype[0].field[8].detailedtype ""
datatype[5].structtype[0].field[9].name "array1"
datatype[5].structtype[0].field[9].datatype -1425630723
+datatype[5].structtype[0].field[9].detailedtype ""
datatype[5].structtype[0].field[10].name "array2"
datatype[5].structtype[0].field[10].datatype -1425630723
+datatype[5].structtype[0].field[10].detailedtype ""
datatype[5].structtype[0].field[11].name "array3"
datatype[5].structtype[0].field[11].datatype -1425630723
+datatype[5].structtype[0].field[11].detailedtype ""
datatype[5].structtype[0].field[12].name "subject"
datatype[5].structtype[0].field[12].datatype 3474528
+datatype[5].structtype[0].field[12].detailedtype ""
datatype[5].structtype[0].field[13].name "d"
datatype[5].structtype[0].field[13].datatype 3474528
+datatype[5].structtype[0].field[13].detailedtype ""
datatype[5].structtype[0].field[14].name "e"
datatype[5].structtype[0].field[14].datatype 3474528
+datatype[5].structtype[0].field[14].detailedtype ""
datatype[5].structtype[0].field[15].name "f"
datatype[5].structtype[0].field[15].datatype 3474528
+datatype[5].structtype[0].field[15].detailedtype ""
datatype[5].structtype[0].field[16].name "g"
datatype[5].structtype[0].field[16].datatype 2
+datatype[5].structtype[0].field[16].detailedtype ""
datatype[5].structtype[0].field[17].name "anothersummaryfield"
datatype[5].structtype[0].field[17].datatype 2
+datatype[5].structtype[0].field[17].detailedtype ""
datatype[5].structtype[0].field[18].name "rankfeatures"
datatype[5].structtype[0].field[18].datatype 2
+datatype[5].structtype[0].field[18].detailedtype ""
datatype[5].structtype[0].field[19].name "summaryfeatures"
datatype[5].structtype[0].field[19].datatype 2
+datatype[5].structtype[0].field[19].detailedtype ""
datatype[5].structtype[0].field[20].name "snippet"
datatype[5].structtype[0].field[20].datatype 2
+datatype[5].structtype[0].field[20].detailedtype ""
datatype[5].structtype[0].field[21].name "snippet2"
datatype[5].structtype[0].field[21].datatype 2
+datatype[5].structtype[0].field[21].detailedtype ""
datatype[6].id 1858438651
datatype[6].structtype[0].name "streamingstruct.body"
datatype[6].structtype[0].version 0
diff --git a/config-model/src/test/derived/streamingstruct/onlydoc/documentmanager.cfg b/config-model/src/test/derived/streamingstruct/onlydoc/documentmanager.cfg
index fc9b0e315b8..d379d862626 100644
--- a/config-model/src/test/derived/streamingstruct/onlydoc/documentmanager.cfg
+++ b/config-model/src/test/derived/streamingstruct/onlydoc/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id 105061838
datatype[1].structtype[0].name "ns1"
datatype[1].structtype[0].version 0
@@ -19,10 +21,13 @@ datatype[1].structtype[0].compressthreshold 95
datatype[1].structtype[0].compressminsize 800
datatype[1].structtype[0].field[0].name "nf1"
datatype[1].structtype[0].field[0].datatype 3474528
+datatype[1].structtype[0].field[0].detailedtype ""
datatype[1].structtype[0].field[1].name "nf1s"
datatype[1].structtype[0].field[1].datatype 3474528
+datatype[1].structtype[0].field[1].detailedtype ""
datatype[1].structtype[0].field[2].name "nf2"
datatype[1].structtype[0].field[2].datatype 2
+datatype[1].structtype[0].field[2].detailedtype ""
datatype[2].id 3474528
datatype[2].structtype[0].name "s1"
datatype[2].structtype[0].version 0
@@ -32,12 +37,16 @@ datatype[2].structtype[0].compressthreshold 95
datatype[2].structtype[0].compressminsize 800
datatype[2].structtype[0].field[0].name "f1"
datatype[2].structtype[0].field[0].datatype 2
+datatype[2].structtype[0].field[0].detailedtype ""
datatype[2].structtype[0].field[1].name "f1s"
datatype[2].structtype[0].field[1].datatype 2
+datatype[2].structtype[0].field[1].detailedtype ""
datatype[2].structtype[0].field[2].name "f2"
datatype[2].structtype[0].field[2].datatype 0
+datatype[2].structtype[0].field[2].detailedtype ""
datatype[2].structtype[0].field[3].name "f3"
datatype[2].structtype[0].field[3].datatype 5
+datatype[2].structtype[0].field[3].detailedtype ""
datatype[3].id -1497802371
datatype[3].maptype[0].keytype 4
datatype[3].maptype[0].valtype 2
@@ -52,38 +61,55 @@ datatype[5].structtype[0].compressthreshold 95
datatype[5].structtype[0].compressminsize 800
datatype[5].structtype[0].field[0].name "coupleof"
datatype[5].structtype[0].field[0].datatype 2
+datatype[5].structtype[0].field[0].detailedtype ""
datatype[5].structtype[0].field[1].name "normalfields"
datatype[5].structtype[0].field[1].datatype 2
+datatype[5].structtype[0].field[1].detailedtype ""
datatype[5].structtype[0].field[2].name "a"
datatype[5].structtype[0].field[2].datatype 3474528
+datatype[5].structtype[0].field[2].detailedtype ""
datatype[5].structtype[0].field[3].name "m"
datatype[5].structtype[0].field[3].datatype -1497802371
+datatype[5].structtype[0].field[3].detailedtype ""
datatype[5].structtype[0].field[4].name "b"
datatype[5].structtype[0].field[4].datatype 3474528
+datatype[5].structtype[0].field[4].detailedtype ""
datatype[5].structtype[0].field[5].name "c"
datatype[5].structtype[0].field[5].datatype 3474528
+datatype[5].structtype[0].field[5].detailedtype ""
datatype[5].structtype[0].field[6].name "c2"
datatype[5].structtype[0].field[6].datatype 3474528
+datatype[5].structtype[0].field[6].detailedtype ""
datatype[5].structtype[0].field[7].name "c3"
datatype[5].structtype[0].field[7].datatype 3474528
+datatype[5].structtype[0].field[7].detailedtype ""
datatype[5].structtype[0].field[8].name "n"
datatype[5].structtype[0].field[8].datatype 105061838
+datatype[5].structtype[0].field[8].detailedtype ""
datatype[5].structtype[0].field[9].name "array1"
datatype[5].structtype[0].field[9].datatype -1425630723
+datatype[5].structtype[0].field[9].detailedtype ""
datatype[5].structtype[0].field[10].name "array2"
datatype[5].structtype[0].field[10].datatype -1425630723
+datatype[5].structtype[0].field[10].detailedtype ""
datatype[5].structtype[0].field[11].name "array3"
datatype[5].structtype[0].field[11].datatype -1425630723
+datatype[5].structtype[0].field[11].detailedtype ""
datatype[5].structtype[0].field[12].name "subject"
datatype[5].structtype[0].field[12].datatype 3474528
+datatype[5].structtype[0].field[12].detailedtype ""
datatype[5].structtype[0].field[13].name "d"
datatype[5].structtype[0].field[13].datatype 3474528
+datatype[5].structtype[0].field[13].detailedtype ""
datatype[5].structtype[0].field[14].name "e"
datatype[5].structtype[0].field[14].datatype 3474528
+datatype[5].structtype[0].field[14].detailedtype ""
datatype[5].structtype[0].field[15].name "f"
datatype[5].structtype[0].field[15].datatype 3474528
+datatype[5].structtype[0].field[15].detailedtype ""
datatype[5].structtype[0].field[16].name "g"
datatype[5].structtype[0].field[16].datatype 2
+datatype[5].structtype[0].field[16].detailedtype ""
datatype[6].id 1858438651
datatype[6].structtype[0].name "streamingstruct.body"
datatype[6].structtype[0].version 0
diff --git a/config-model/src/test/derived/structanyorder/documentmanager.cfg b/config-model/src/test/derived/structanyorder/documentmanager.cfg
index dc56ed1cfc9..b4777f7535f 100755
--- a/config-model/src/test/derived/structanyorder/documentmanager.cfg
+++ b/config-model/src/test/derived/structanyorder/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id 109267174
datatype[1].structtype[0].name "sct"
datatype[1].structtype[0].version 0
@@ -19,12 +21,16 @@ datatype[1].structtype[0].compressthreshold 95
datatype[1].structtype[0].compressminsize 800
datatype[1].structtype[0].field[0].name "s1"
datatype[1].structtype[0].field[0].datatype 2
+datatype[1].structtype[0].field[0].detailedtype ""
datatype[1].structtype[0].field[1].name "s2"
datatype[1].structtype[0].field[1].datatype 2
+datatype[1].structtype[0].field[1].detailedtype ""
datatype[1].structtype[0].field[2].name "s3"
datatype[1].structtype[0].field[2].datatype 109267174
+datatype[1].structtype[0].field[2].detailedtype ""
datatype[1].structtype[0].field[3].name "s4"
datatype[1].structtype[0].field[3].datatype 97614088
+datatype[1].structtype[0].field[3].detailedtype ""
datatype[2].id 97614088
datatype[2].structtype[0].name "foo"
datatype[2].structtype[0].version 0
@@ -34,6 +40,7 @@ datatype[2].structtype[0].compressthreshold 95
datatype[2].structtype[0].compressminsize 800
datatype[2].structtype[0].field[0].name "s1"
datatype[2].structtype[0].field[0].datatype 0
+datatype[2].structtype[0].field[0].detailedtype ""
datatype[3].id 517946310
datatype[3].structtype[0].name "annotation.banana"
datatype[3].structtype[0].version 0
@@ -43,8 +50,10 @@ datatype[3].structtype[0].compressthreshold 95
datatype[3].structtype[0].compressminsize 800
datatype[3].structtype[0].field[0].name "b"
datatype[3].structtype[0].field[0].datatype 109267174
+datatype[3].structtype[0].field[0].detailedtype ""
datatype[3].structtype[0].field[1].name "c"
datatype[3].structtype[0].field[1].datatype 97614088
+datatype[3].structtype[0].field[1].detailedtype ""
datatype[4].id -1244829667
datatype[4].arraytype[0].datatype 109267174
datatype[5].id -364910881
@@ -56,12 +65,16 @@ datatype[5].structtype[0].compressthreshold 95
datatype[5].structtype[0].compressminsize 800
datatype[5].structtype[0].field[0].name "structfield"
datatype[5].structtype[0].field[0].datatype 109267174
+datatype[5].structtype[0].field[0].detailedtype ""
datatype[5].structtype[0].field[1].name "structarrayfield"
datatype[5].structtype[0].field[1].datatype -1244829667
+datatype[5].structtype[0].field[1].detailedtype ""
datatype[5].structtype[0].field[2].name "rankfeatures"
datatype[5].structtype[0].field[2].datatype 2
+datatype[5].structtype[0].field[2].detailedtype ""
datatype[5].structtype[0].field[3].name "summaryfeatures"
datatype[5].structtype[0].field[3].datatype 2
+datatype[5].structtype[0].field[3].detailedtype ""
datatype[6].id -1503592268
datatype[6].structtype[0].name "annotationsimplicitstruct.body"
datatype[6].structtype[0].version 0
diff --git a/config-model/src/test/derived/tensor/attributes.cfg b/config-model/src/test/derived/tensor/attributes.cfg
index a3026d579d5..8819e28b354 100644
--- a/config-model/src/test/derived/tensor/attributes.cfg
+++ b/config-model/src/test/derived/tensor/attributes.cfg
@@ -16,7 +16,7 @@ attribute[0].arity 8
attribute[0].lowerbound -9223372036854775808
attribute[0].upperbound 9223372036854775807
attribute[0].densepostinglistthreshold 0.4
-attribute[0].tensortype ""
+attribute[0].tensortype "tensor(x[2],y[])"
attribute[1].name "f3"
attribute[1].datatype TENSOR
attribute[1].collectiontype SINGLE
@@ -35,7 +35,7 @@ attribute[1].arity 8
attribute[1].lowerbound -9223372036854775808
attribute[1].upperbound 9223372036854775807
attribute[1].densepostinglistthreshold 0.4
-attribute[1].tensortype ""
+attribute[1].tensortype "tensor(x{})"
attribute[2].name "f4"
attribute[2].datatype TENSOR
attribute[2].collectiontype SINGLE
diff --git a/config-model/src/test/derived/tensor/documenttypes.cfg b/config-model/src/test/derived/tensor/documenttypes.cfg
index 2a76458a97a..7c39af767f4 100644
--- a/config-model/src/test/derived/tensor/documenttypes.cfg
+++ b/config-model/src/test/derived/tensor/documenttypes.cfg
@@ -24,26 +24,32 @@ documenttype[0].datatype[0].sstruct.field[0].name "f1"
documenttype[0].datatype[0].sstruct.field[0].id 26661415
documenttype[0].datatype[0].sstruct.field[0].id_v6 1740179945
documenttype[0].datatype[0].sstruct.field[0].datatype 21
+documenttype[0].datatype[0].sstruct.field[2].detailedtype "tensor(x[])"
documenttype[0].datatype[0].sstruct.field[1].name "f2"
documenttype[0].datatype[0].sstruct.field[1].id 2080644671
documenttype[0].datatype[0].sstruct.field[1].id_v6 1424572148
documenttype[0].datatype[0].sstruct.field[1].datatype 21
+documenttype[0].datatype[0].sstruct.field[2].detailedtype "tensor(x[2],y[])"
documenttype[0].datatype[0].sstruct.field[2].name "f3"
documenttype[0].datatype[0].sstruct.field[2].id 1295091863
documenttype[0].datatype[0].sstruct.field[2].id_v6 1444109654
documenttype[0].datatype[0].sstruct.field[2].datatype 21
+documenttype[0].datatype[0].sstruct.field[2].detailedtype "tensor(x{})"
documenttype[0].datatype[0].sstruct.field[3].name "f4"
documenttype[0].datatype[0].sstruct.field[3].id 1224191509
documenttype[0].datatype[0].sstruct.field[3].id_v6 1039544782
documenttype[0].datatype[0].sstruct.field[3].datatype 21
+documenttype[0].datatype[0].sstruct.field[3].detailedtype "tensor(x[],y[])"
documenttype[0].datatype[0].sstruct.field[4].name "rankfeatures"
documenttype[0].datatype[0].sstruct.field[4].id 1883197392
documenttype[0].datatype[0].sstruct.field[4].id_v6 699950698
documenttype[0].datatype[0].sstruct.field[4].datatype 2
+documenttype[0].datatype[0].sstruct.field[4].detailedtype ""
documenttype[0].datatype[0].sstruct.field[5].name "summaryfeatures"
documenttype[0].datatype[0].sstruct.field[5].id 1840337115
documenttype[0].datatype[0].sstruct.field[5].id_v6 1981648971
documenttype[0].datatype[0].sstruct.field[5].datatype 2
+documenttype[0].datatype[0].sstruct.field[5].detailedtype ""
documenttype[0].datatype[1].id -1903234535
documenttype[0].datatype[1].type STRUCT
documenttype[0].datatype[1].array.element.id 0
diff --git a/config-model/src/test/derived/tensor/rank-profiles.cfg b/config-model/src/test/derived/tensor/rank-profiles.cfg
index d70555c9131..d9c6c5088c2 100644
--- a/config-model/src/test/derived/tensor/rank-profiles.cfg
+++ b/config-model/src/test/derived/tensor/rank-profiles.cfg
@@ -1,4 +1,8 @@
rankprofile[].name "default"
+rankprofile[].fef.property[].name "vespa.type.attribute.f2"
+rankprofile[].fef.property[].value "tensor(x[2],y[])"
+rankprofile[].fef.property[].name "vespa.type.attribute.f3"
+rankprofile[].fef.property[].value "tensor(x{})"
rankprofile[].fef.property[].name "vespa.type.attribute.f4"
rankprofile[].fef.property[].value "tensor(x[10],y[20])"
rankprofile[].name "unranked"
@@ -10,6 +14,10 @@ rankprofile[].fef.property[].name "vespa.hitcollector.arraysize"
rankprofile[].fef.property[].value "0"
rankprofile[].fef.property[].name "vespa.dump.ignoredefaultfeatures"
rankprofile[].fef.property[].value "true"
+rankprofile[].fef.property[].name "vespa.type.attribute.f2"
+rankprofile[].fef.property[].value "tensor(x[2],y[])"
+rankprofile[].fef.property[].name "vespa.type.attribute.f3"
+rankprofile[].fef.property[].value "tensor(x{})"
rankprofile[].fef.property[].name "vespa.type.attribute.f4"
rankprofile[].fef.property[].value "tensor(x[10],y[20])"
rankprofile[].name "profile1"
@@ -17,6 +25,10 @@ rankprofile[].fef.property[].name "vespa.rank.firstphase"
rankprofile[].fef.property[].value "rankingExpression(firstphase)"
rankprofile[].fef.property[].name "rankingExpression(firstphase).rankingScript"
rankprofile[].fef.property[].value "map(attribute(f4), f(x)(x * x)) + reduce(tensor(x[2],y[3])(random), count) * rename(attribute(f4), (x, y), (y, x))"
+rankprofile[].fef.property[].name "vespa.type.attribute.f2"
+rankprofile[].fef.property[].value "tensor(x[2],y[])"
+rankprofile[].fef.property[].name "vespa.type.attribute.f3"
+rankprofile[].fef.property[].value "tensor(x{})"
rankprofile[].fef.property[].name "vespa.type.attribute.f4"
rankprofile[].fef.property[].value "tensor(x[10],y[20])"
rankprofile[].name "profile2"
@@ -24,5 +36,9 @@ rankprofile[].fef.property[].name "vespa.rank.firstphase"
rankprofile[].fef.property[].value "rankingExpression(firstphase)"
rankprofile[].fef.property[].name "rankingExpression(firstphase).rankingScript"
rankprofile[].fef.property[].value "reduce(join(attribute(f4), tensor(x[2],y[2],z[3])((x==y)*(y==z)), f(a,b)(a * b)), sum, x)"
+rankprofile[].fef.property[].name "vespa.type.attribute.f2"
+rankprofile[].fef.property[].value "tensor(x[2],y[])"
+rankprofile[].fef.property[].name "vespa.type.attribute.f3"
+rankprofile[].fef.property[].value "tensor(x{})"
rankprofile[].fef.property[].name "vespa.type.attribute.f4"
-rankprofile[].fef.property[].value "tensor(x[10],y[20])"
+rankprofile[].fef.property[].value "tensor(x[10],y[20])" \ No newline at end of file
diff --git a/config-model/src/test/derived/tensor/tensor.sd b/config-model/src/test/derived/tensor/tensor.sd
index fab4cafddab..18f1245e0b4 100644
--- a/config-model/src/test/derived/tensor/tensor.sd
+++ b/config-model/src/test/derived/tensor/tensor.sd
@@ -2,16 +2,16 @@
search tensor {
document tensor {
- field f1 type tensor {
+ field f1 type tensor(x[]) {
indexing: summary
}
- field f2 type tensor {
+ field f2 type tensor(x[2],y[]) {
indexing: attribute
}
- field f3 type tensor {
+ field f3 type tensor(x{}) {
indexing: attribute | summary
}
- field f4 type tensor {
+ field f4 type tensor(x[],y[]) {
indexing: attribute
attribute: tensor(x[10],y[20])
}
diff --git a/config-model/src/test/derived/types/attributes.cfg b/config-model/src/test/derived/types/attributes.cfg
index f20562d2a3c..d5679a25ed5 100644
--- a/config-model/src/test/derived/types/attributes.cfg
+++ b/config-model/src/test/derived/types/attributes.cfg
@@ -206,4 +206,4 @@ attribute[10].arity 8
attribute[10].lowerbound -9223372036854775808
attribute[10].upperbound 9223372036854775807
attribute[10].densepostinglistthreshold 0.4
-attribute[10].tensortype ""
+attribute[10].tensortype "" \ No newline at end of file
diff --git a/config-model/src/test/derived/types/documentmanager.cfg b/config-model/src/test/derived/types/documentmanager.cfg
index a2018ffa195..ca9a300ad9c 100644
--- a/config-model/src/test/derived/types/documentmanager.cfg
+++ b/config-model/src/test/derived/types/documentmanager.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id -1865479609
datatype[1].maptype[0].keytype 2
datatype[1].maptype[0].valtype 4
@@ -22,12 +24,16 @@ datatype[2].structtype[0].compressthreshold 95
datatype[2].structtype[0].compressminsize 800
datatype[2].structtype[0].field[0].name "Version"
datatype[2].structtype[0].field[0].datatype 0
+datatype[2].structtype[0].field[0].detailedtype ""
datatype[2].structtype[0].field[1].name "Name"
datatype[2].structtype[0].field[1].datatype 2
+datatype[2].structtype[0].field[1].detailedtype ""
datatype[2].structtype[0].field[2].name "FlagsCounter"
datatype[2].structtype[0].field[2].datatype -1865479609
+datatype[2].structtype[0].field[2].detailedtype ""
datatype[2].structtype[0].field[3].name "anotherfolder"
datatype[2].structtype[0].field[3].datatype 294108848
+datatype[2].structtype[0].field[3].detailedtype ""
datatype[3].id 109267174
datatype[3].structtype[0].name "sct"
datatype[3].structtype[0].version 0
@@ -37,8 +43,10 @@ datatype[3].structtype[0].compressthreshold 95
datatype[3].structtype[0].compressminsize 800
datatype[3].structtype[0].field[0].name "s1"
datatype[3].structtype[0].field[0].datatype 2
+datatype[3].structtype[0].field[0].detailedtype ""
datatype[3].structtype[0].field[1].name "s2"
datatype[3].structtype[0].field[1].datatype 2
+datatype[3].structtype[0].field[1].detailedtype ""
datatype[4].id 49942803
datatype[4].arraytype[0].datatype 16
datatype[5].id 339965458
@@ -53,12 +61,16 @@ datatype[6].structtype[0].compressthreshold 95
datatype[6].structtype[0].compressminsize 800
datatype[6].structtype[0].field[0].name "bytearr"
datatype[6].structtype[0].field[0].datatype 49942803
+datatype[6].structtype[0].field[0].detailedtype ""
datatype[6].structtype[0].field[1].name "mymap"
datatype[6].structtype[0].field[1].datatype 339965458
+datatype[6].structtype[0].field[1].detailedtype ""
datatype[6].structtype[0].field[2].name "title"
datatype[6].structtype[0].field[2].datatype 2
+datatype[6].structtype[0].field[2].detailedtype ""
datatype[6].structtype[0].field[3].name "structfield"
datatype[6].structtype[0].field[3].datatype 2
+datatype[6].structtype[0].field[3].detailedtype ""
datatype[7].id -1245117006
datatype[7].arraytype[0].datatype 0
datatype[8].id 1328286588
@@ -115,60 +127,88 @@ datatype[24].structtype[0].compressthreshold 95
datatype[24].structtype[0].compressminsize 800
datatype[24].structtype[0].field[0].name "abyte"
datatype[24].structtype[0].field[0].datatype 16
+datatype[24].structtype[0].field[0].detailedtype ""
datatype[24].structtype[0].field[1].name "along"
datatype[24].structtype[0].field[1].datatype 4
+datatype[24].structtype[0].field[1].detailedtype ""
datatype[24].structtype[0].field[2].name "arrayfield"
datatype[24].structtype[0].field[2].datatype -1245117006
+datatype[24].structtype[0].field[2].detailedtype ""
datatype[24].structtype[0].field[3].name "setfield"
datatype[24].structtype[0].field[3].datatype 1328286588
+datatype[24].structtype[0].field[3].detailedtype ""
datatype[24].structtype[0].field[4].name "setfield2"
datatype[24].structtype[0].field[4].datatype 18
+datatype[24].structtype[0].field[4].detailedtype ""
datatype[24].structtype[0].field[5].name "setfield3"
datatype[24].structtype[0].field[5].datatype 2125328771
+datatype[24].structtype[0].field[5].detailedtype ""
datatype[24].structtype[0].field[6].name "setfield4"
datatype[24].structtype[0].field[6].datatype 2065577986
+datatype[24].structtype[0].field[6].detailedtype ""
datatype[24].structtype[0].field[7].name "tagfield"
datatype[24].structtype[0].field[7].datatype 18
+datatype[24].structtype[0].field[7].detailedtype ""
datatype[24].structtype[0].field[8].name "structfield"
datatype[24].structtype[0].field[8].datatype 109267174
+datatype[24].structtype[0].field[8].detailedtype ""
datatype[24].structtype[0].field[9].name "structarrayfield"
datatype[24].structtype[0].field[9].datatype -1244829667
+datatype[24].structtype[0].field[9].detailedtype ""
datatype[24].structtype[0].field[10].name "stringmapfield"
datatype[24].structtype[0].field[10].datatype 339965458
+datatype[24].structtype[0].field[10].detailedtype ""
datatype[24].structtype[0].field[11].name "intmapfield"
datatype[24].structtype[0].field[11].datatype -1584287606
+datatype[24].structtype[0].field[11].detailedtype ""
datatype[24].structtype[0].field[12].name "floatmapfield"
datatype[24].structtype[0].field[12].datatype 2125154557
+datatype[24].structtype[0].field[12].detailedtype ""
datatype[24].structtype[0].field[13].name "longmapfield"
datatype[24].structtype[0].field[13].datatype -1715531035
+datatype[24].structtype[0].field[13].detailedtype ""
datatype[24].structtype[0].field[14].name "doublemapfield"
datatype[24].structtype[0].field[14].datatype 2138385264
+datatype[24].structtype[0].field[14].detailedtype ""
datatype[24].structtype[0].field[15].name "arraymapfield"
datatype[24].structtype[0].field[15].datatype 435886609
+datatype[24].structtype[0].field[15].detailedtype ""
datatype[24].structtype[0].field[16].name "arrarr"
datatype[24].structtype[0].field[16].datatype -794985308
+datatype[24].structtype[0].field[16].detailedtype ""
datatype[24].structtype[0].field[17].name "maparr"
datatype[24].structtype[0].field[17].datatype 69621385
+datatype[24].structtype[0].field[17].detailedtype ""
datatype[24].structtype[0].field[18].name "mystructfield"
datatype[24].structtype[0].field[18].datatype -2092985853
+datatype[24].structtype[0].field[18].detailedtype ""
datatype[24].structtype[0].field[19].name "mystructmap"
datatype[24].structtype[0].field[19].datatype 1901258752
+datatype[24].structtype[0].field[19].detailedtype ""
datatype[24].structtype[0].field[20].name "mystructarr"
datatype[24].structtype[0].field[20].datatype 759956026
+datatype[24].structtype[0].field[20].detailedtype ""
datatype[24].structtype[0].field[21].name "Folders"
datatype[24].structtype[0].field[21].datatype -389833101
+datatype[24].structtype[0].field[21].detailedtype ""
datatype[24].structtype[0].field[22].name "juletre"
datatype[24].structtype[0].field[22].datatype 4
+datatype[24].structtype[0].field[22].detailedtype ""
datatype[24].structtype[0].field[23].name "album0"
datatype[24].structtype[0].field[23].datatype 18
+datatype[24].structtype[0].field[23].detailedtype ""
datatype[24].structtype[0].field[24].name "album1"
datatype[24].structtype[0].field[24].datatype 18
+datatype[24].structtype[0].field[24].detailedtype ""
datatype[24].structtype[0].field[25].name "other"
datatype[24].structtype[0].field[25].datatype 4
+datatype[24].structtype[0].field[25].detailedtype ""
datatype[24].structtype[0].field[26].name "rankfeatures"
datatype[24].structtype[0].field[26].datatype 2
+datatype[24].structtype[0].field[26].detailedtype ""
datatype[24].structtype[0].field[27].name "summaryfeatures"
datatype[24].structtype[0].field[27].datatype 2
+datatype[24].structtype[0].field[27].detailedtype ""
datatype[25].id 171503364
datatype[25].maptype[0].keytype 1707615575
datatype[25].maptype[0].valtype 0
@@ -183,6 +223,7 @@ datatype[27].structtype[0].compressthreshold 95
datatype[27].structtype[0].compressminsize 800
datatype[27].structtype[0].field[0].name "complexarray"
datatype[27].structtype[0].field[0].datatype 1100964733
+datatype[27].structtype[0].field[0].detailedtype ""
datatype[28].id -853072901
datatype[28].documenttype[0].name "types"
datatype[28].documenttype[0].version 0
diff --git a/config-model/src/test/derived/types/ilscripts.cfg b/config-model/src/test/derived/types/ilscripts.cfg
index cc692e120be..70b799d0df0 100644
--- a/config-model/src/test/derived/types/ilscripts.cfg
+++ b/config-model/src/test/derived/types/ilscripts.cfg
@@ -52,4 +52,4 @@ ilscript[0].content[22] "input mystructfield | passthrough mystructfield"
ilscript[0].content[23] "input mystructmap | passthrough mystructmap"
ilscript[0].content[24] "input stringmapfield | passthrough stringmapfield"
ilscript[0].content[25] "input structarrayfield | passthrough structarrayfield"
-ilscript[0].content[26] "input structfield | passthrough structfield"
+ilscript[0].content[26] "input structfield | passthrough structfield" \ No newline at end of file
diff --git a/config-model/src/test/derived/types/index-info.cfg b/config-model/src/test/derived/types/index-info.cfg
index 4b94127c687..85d4c884571 100644
--- a/config-model/src/test/derived/types/index-info.cfg
+++ b/config-model/src/test/derived/types/index-info.cfg
@@ -424,4 +424,4 @@ indexinfo[0].command[210].command "multivalue"
indexinfo[0].command[211].indexname "rankfeatures"
indexinfo[0].command[211].command "index"
indexinfo[0].command[212].indexname "summaryfeatures"
-indexinfo[0].command[212].command "index"
+indexinfo[0].command[212].command "index" \ No newline at end of file
diff --git a/config-model/src/test/derived/types/summary.cfg b/config-model/src/test/derived/types/summary.cfg
index 6a62dedb851..b1205f45709 100644
--- a/config-model/src/test/derived/types/summary.cfg
+++ b/config-model/src/test/derived/types/summary.cfg
@@ -32,4 +32,4 @@ classes[1].fields[3].type "int64"
classes[1].fields[4].name "rankfeatures"
classes[1].fields[4].type "featuredata"
classes[1].fields[5].name "summaryfeatures"
-classes[1].fields[5].type "featuredata"
+classes[1].fields[5].type "featuredata" \ No newline at end of file
diff --git a/config-model/src/test/derived/types/summarymap.cfg b/config-model/src/test/derived/types/summarymap.cfg
index eac532d966b..8a3ed769213 100644
--- a/config-model/src/test/derived/types/summarymap.cfg
+++ b/config-model/src/test/derived/types/summarymap.cfg
@@ -22,4 +22,4 @@ override[6].command "attribute"
override[6].arguments "other"
override[7].field "juletre"
override[7].command "attribute"
-override[7].arguments "juletre"
+override[7].arguments "juletre" \ No newline at end of file
diff --git a/config-model/src/test/examples/fieldoftypedocument.cfg b/config-model/src/test/examples/fieldoftypedocument.cfg
index 9ce928381ec..d3dd0d06b66 100644
--- a/config-model/src/test/examples/fieldoftypedocument.cfg
+++ b/config-model/src/test/examples/fieldoftypedocument.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id -1344444812
datatype[1].structtype[0].name "book.header"
datatype[1].structtype[0].version 0
@@ -19,10 +21,13 @@ datatype[1].structtype[0].compressthreshold 95
datatype[1].structtype[0].compressminsize 800
datatype[1].structtype[0].field[0].name "soundtrack"
datatype[1].structtype[0].field[0].datatype 1412693671
+datatype[1].structtype[0].field[0].detailedtype ""
datatype[1].structtype[0].field[1].name "rankfeatures"
datatype[1].structtype[0].field[1].datatype 2
+datatype[1].structtype[0].field[1].detailedtype ""
datatype[1].structtype[0].field[2].name "summaryfeatures"
datatype[1].structtype[0].field[2].datatype 2
+datatype[1].structtype[0].field[2].detailedtype ""
datatype[2].id -820813431
datatype[2].structtype[0].name "book.body"
datatype[2].structtype[0].version 0
@@ -47,14 +52,19 @@ datatype[4].structtype[0].compressthreshold 95
datatype[4].structtype[0].compressminsize 800
datatype[4].structtype[0].field[0].name "intfield"
datatype[4].structtype[0].field[0].datatype 0
+datatype[4].structtype[0].field[0].detailedtype ""
datatype[4].structtype[0].field[1].name "stringfield"
datatype[4].structtype[0].field[1].datatype 2
+datatype[4].structtype[0].field[1].detailedtype ""
datatype[4].structtype[0].field[2].name "longfield"
datatype[4].structtype[0].field[2].datatype 4
+datatype[4].structtype[0].field[2].detailedtype ""
datatype[4].structtype[0].field[3].name "rankfeatures"
datatype[4].structtype[0].field[3].datatype 2
+datatype[4].structtype[0].field[3].detailedtype ""
datatype[4].structtype[0].field[4].name "summaryfeatures"
datatype[4].structtype[0].field[4].datatype 2
+datatype[4].structtype[0].field[4].detailedtype ""
datatype[5].id 993120973
datatype[5].structtype[0].name "music.body"
datatype[5].structtype[0].version 0
diff --git a/config-model/src/test/examples/structresult.cfg b/config-model/src/test/examples/structresult.cfg
index addb5f6205c..075ac54b983 100755
--- a/config-model/src/test/examples/structresult.cfg
+++ b/config-model/src/test/examples/structresult.cfg
@@ -8,8 +8,10 @@ datatype[0].structtype[0].compressthreshold 95
datatype[0].structtype[0].compressminsize 800
datatype[0].structtype[0].field[0].name "x"
datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[0].detailedtype ""
datatype[0].structtype[0].field[1].name "y"
datatype[0].structtype[0].field[1].datatype 0
+datatype[0].structtype[0].field[1].detailedtype ""
datatype[1].id 93505813
datatype[1].structtype[0].name "bar"
datatype[1].structtype[0].version 0
@@ -19,6 +21,7 @@ datatype[1].structtype[0].compressthreshold 95
datatype[1].structtype[0].compressminsize 800
datatype[1].structtype[0].field[0].name "humbe"
datatype[1].structtype[0].field[0].datatype 97614088
+datatype[1].structtype[0].field[0].detailedtype ""
datatype[2].id 97614088
datatype[2].structtype[0].name "foo"
datatype[2].structtype[0].version 0
@@ -28,9 +31,11 @@ datatype[2].structtype[0].compressthreshold 95
datatype[2].structtype[0].compressminsize 800
datatype[2].structtype[0].field[0].name "fubar"
datatype[2].structtype[0].field[0].datatype 0
+datatype[2].structtype[0].field[0].detailedtype ""
datatype[2].structtype[0].field[1].name "bar"
datatype[2].structtype[0].field[1].id[0].id 1
datatype[2].structtype[0].field[1].datatype 2
+datatype[2].structtype[0].field[1].detailedtype ""
datatype[3].id -1245205573
datatype[3].arraytype[0].datatype 97614088
datatype[4].id -1910204744
@@ -42,14 +47,19 @@ datatype[4].structtype[0].compressthreshold 95
datatype[4].structtype[0].compressminsize 800
datatype[4].structtype[0].field[0].name "mystruct"
datatype[4].structtype[0].field[0].datatype 97614088
+datatype[4].structtype[0].field[0].detailedtype ""
datatype[4].structtype[0].field[1].name "arraystruct"
datatype[4].structtype[0].field[1].datatype -1245205573
+datatype[4].structtype[0].field[1].detailedtype ""
datatype[4].structtype[0].field[2].name "advanced"
datatype[4].structtype[0].field[2].datatype 93505813
+datatype[4].structtype[0].field[2].detailedtype ""
datatype[4].structtype[0].field[3].name "rankfeatures"
datatype[4].structtype[0].field[3].datatype 2
+datatype[4].structtype[0].field[3].detailedtype ""
datatype[4].structtype[0].field[4].name "summaryfeatures"
datatype[4].structtype[0].field[4].datatype 2
+datatype[4].structtype[0].field[4].detailedtype ""
datatype[5].id 993120973
datatype[5].structtype[0].name "music.body"
datatype[5].structtype[0].version 0
diff --git a/config-model/src/test/java/com/yahoo/searchdefinition/FieldOfTypeDocumentTestCase.java b/config-model/src/test/java/com/yahoo/searchdefinition/FieldOfTypeDocumentTestCase.java
index 4a3119e55b7..83d5c422fdf 100644
--- a/config-model/src/test/java/com/yahoo/searchdefinition/FieldOfTypeDocumentTestCase.java
+++ b/config-model/src/test/java/com/yahoo/searchdefinition/FieldOfTypeDocumentTestCase.java
@@ -14,9 +14,10 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
/**
- * @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a>
+ * @author Einar M R Rosenvinge
*/
public class FieldOfTypeDocumentTestCase extends SearchDefinitionTestCase {
+
@Test
public void testDocument() throws IOException, ParseException {
@@ -25,7 +26,7 @@ public class FieldOfTypeDocumentTestCase extends SearchDefinitionTestCase {
sds.add("src/test/examples/fieldoftypedocument.sd");
DocumentmanagerConfig.Builder value = Deriver.getDocumentManagerConfig(sds);
assertConfigFile("src/test/examples/fieldoftypedocument.cfg",
- new DocumentmanagerConfig(value).toString() + "\n");
+ new DocumentmanagerConfig(value).toString() + "\n");
DocumentTypeManager manager = new DocumentTypeManager();
DocumentTypeManagerConfigurer.configure(manager, "raw:" + new DocumentmanagerConfig(value).toString());
diff --git a/config-model/src/test/java/com/yahoo/searchdefinition/NameFieldCheckTestCase.java b/config-model/src/test/java/com/yahoo/searchdefinition/NameFieldCheckTestCase.java
index f8fe979c866..5542c1ce5e9 100644
--- a/config-model/src/test/java/com/yahoo/searchdefinition/NameFieldCheckTestCase.java
+++ b/config-model/src/test/java/com/yahoo/searchdefinition/NameFieldCheckTestCase.java
@@ -6,14 +6,16 @@ import org.junit.Test;
import java.io.IOException;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+
/**
* Tests that "name" is not allowed as name for a field.
*
* And that duplicate names are not allowed.
*
- * @author <a href="mailto:larschr@yahoo-inc.com">Lars Christian Jensen</a>
+ * @author Lars Christian Jensen
*/
public class NameFieldCheckTestCase extends SearchDefinitionTestCase {
@@ -22,8 +24,8 @@ public class NameFieldCheckTestCase extends SearchDefinitionTestCase {
try {
SearchBuilder.buildFromFile("src/test/examples/name-check.sd");
fail("Should throw exception.");
- } catch (Exception e) {
- e.printStackTrace();
+ } catch (Exception expected) {
+ // Success
}
}
@@ -33,8 +35,7 @@ public class NameFieldCheckTestCase extends SearchDefinitionTestCase {
SearchBuilder.buildFromFile("src/test/examples/duplicatenamesinsearchdifferenttype.sd");
fail("Should throw exception.");
} catch (Exception e) {
- e.printStackTrace();
- assertTrue(e.getMessage().matches(".*Duplicate.*different type.*"));
+ assertEquals("For search 'duplicatenamesinsearch', field 'grpphotoids64': Incompatible types. Expected Array<long> for index field 'grpphotoids64', got string.", e.getMessage());
}
}
@@ -44,7 +45,6 @@ public class NameFieldCheckTestCase extends SearchDefinitionTestCase {
SearchBuilder.buildFromFile("src/test/examples/duplicatenamesindoc.sd");
fail("Should throw exception.");
} catch (Exception e) {
- e.printStackTrace();
assertTrue(e.getMessage().matches(".*Duplicate.*"));
}
}
diff --git a/config-model/src/test/java/com/yahoo/searchdefinition/RankProfileTestCase.java b/config-model/src/test/java/com/yahoo/searchdefinition/RankProfileTestCase.java
index ae3b775f13d..b2968eb4a85 100644
--- a/config-model/src/test/java/com/yahoo/searchdefinition/RankProfileTestCase.java
+++ b/config-model/src/test/java/com/yahoo/searchdefinition/RankProfileTestCase.java
@@ -102,9 +102,9 @@ public class RankProfileTestCase extends SearchDefinitionTestCase {
SearchBuilder builder = new SearchBuilder(registry);
builder.importString("search test {\n" +
" document test { \n" +
- " field a type tensor { indexing: attribute \n attribute: tensor(x[10]) }\n" +
- " field b type tensor { indexing: attribute \n attribute: tensor(y{}) }\n" +
- " field c type tensor { indexing: attribute }\n" +
+ " field a type tensor(x[]) { indexing: attribute \n attribute: tensor(x[10]) }\n" +
+ " field b type tensor(y{}) { indexing: attribute \n attribute: tensor(y{}) }\n" +
+ " field c type tensor(x[]) { indexing: attribute }\n" +
" }\n" +
" rank-profile p1 {}\n" +
" rank-profile p2 {}\n" +
@@ -123,7 +123,7 @@ public class RankProfileTestCase extends SearchDefinitionTestCase {
RawRankProfile rawProfile = new RawRankProfile(profile, new AttributeFields(search));
assertEquals("tensor(x[10])", findProperty(rawProfile.configProperties(), "vespa.type.attribute.a").get());
assertEquals("tensor(y{})", findProperty(rawProfile.configProperties(), "vespa.type.attribute.b").get());
- assertFalse(findProperty(rawProfile.configProperties(), "vespa.type.attribute.c").isPresent());
+ assertEquals("tensor(x[])", findProperty(rawProfile.configProperties(), "vespa.type.attribute.c").get());
}
@Test
diff --git a/config-model/src/test/java/com/yahoo/searchdefinition/StructTestCase.java b/config-model/src/test/java/com/yahoo/searchdefinition/StructTestCase.java
index c33ebc95bd2..3236be983d8 100755
--- a/config-model/src/test/java/com/yahoo/searchdefinition/StructTestCase.java
+++ b/config-model/src/test/java/com/yahoo/searchdefinition/StructTestCase.java
@@ -10,26 +10,28 @@ import java.io.IOException;
import static org.junit.Assert.fail;
/**
- * tests importing of document containing array type fields
+ * Tests importing of document containing array type fields
*
* @author bratseth
*/
public class StructTestCase extends SearchDefinitionTestCase {
+
@Test
public void testStruct() throws IOException, ParseException {
assertConfigFile("src/test/examples/structresult.cfg",
- new DocumentmanagerConfig(Deriver.getDocumentManagerConfig("src/test/examples/struct.sd")).toString() + "\n");
+ new DocumentmanagerConfig(Deriver.getDocumentManagerConfig("src/test/examples/struct.sd")).toString() + "\n");
}
+
@Test
public void testBadStruct() throws IOException {
try {
SearchBuilder.buildFromFile("src/test/examples/badstruct.sd");
fail("Should throw exception.");
- } catch (ParseException e) {
- //ok!
- //e.printStackTrace();
+ } catch (ParseException expected) {
+ // success
}
}
+
@Test
public void testStructAndDocumentWithSameNames() throws IOException, ParseException {
try {
@@ -41,8 +43,6 @@ public class StructTestCase extends SearchDefinitionTestCase {
/**
* Declaring a struct before a document will fail, no doc type to add it to.
- * @throws IOException
- * @throws ParseException
*/
@Test(expected = IllegalArgumentException.class)
public void testStructOutsideDocumentIllegal() throws IOException, ParseException {
diff --git a/config-model/src/test/java/com/yahoo/searchdefinition/processing/TensorFieldTestCase.java b/config-model/src/test/java/com/yahoo/searchdefinition/processing/TensorFieldTestCase.java
index ecadf8e1b71..0007019e6b4 100644
--- a/config-model/src/test/java/com/yahoo/searchdefinition/processing/TensorFieldTestCase.java
+++ b/config-model/src/test/java/com/yahoo/searchdefinition/processing/TensorFieldTestCase.java
@@ -19,28 +19,28 @@ public class TensorFieldTestCase {
public void requireThatTensorFieldCannotBeOfCollectionType() throws ParseException {
exception.expect(IllegalArgumentException.class);
exception.expectMessage("For search 'test', field 'f1': A field with collection type of tensor is not supported. Use simple type 'tensor' instead.");
- SearchBuilder.createFromString(getSd("field f1 type array<tensor> {}"));
+ SearchBuilder.createFromString(getSd("field f1 type array<tensor(x{})> {}"));
}
@Test
public void requireThatTensorFieldCannotBeIndexField() throws ParseException {
exception.expect(IllegalArgumentException.class);
exception.expectMessage("For search 'test', field 'f1': A field of type 'tensor' cannot be specified as an 'index' field.");
- SearchBuilder.createFromString(getSd("field f1 type tensor { indexing: index }"));
+ SearchBuilder.createFromString(getSd("field f1 type tensor(x{}) { indexing: index }"));
}
@Test
public void requireThatTensorAttributeCannotBeFastSearch() throws ParseException {
exception.expect(IllegalArgumentException.class);
exception.expectMessage("For search 'test', field 'f1': An attribute of type 'tensor' cannot be 'fast-search'.");
- SearchBuilder.createFromString(getSd("field f1 type tensor { indexing: attribute \n attribute: fast-search }"));
+ SearchBuilder.createFromString(getSd("field f1 type tensor(x{}) { indexing: attribute \n attribute: fast-search }"));
}
@Test
public void requireThatIllegalTensorTypeSpecThrowsException() throws ParseException {
exception.expect(IllegalArgumentException.class);
exception.expectMessage("For attribute field 'f1': Illegal tensor type spec: Failed parsing element 'invalid' in type spec 'tensor(invalid)'");
- SearchBuilder.createFromString(getSd("field f1 type tensor { indexing: attribute \n attribute: tensor(invalid) }"));
+ SearchBuilder.createFromString(getSd("field f1 type tensor(x{}) { indexing: attribute \n attribute: tensor(invalid) }"));
}
private static String getSd(String field) {
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/SearchDataTypeValidatorTestCase.java b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/SearchDataTypeValidatorTestCase.java
index 8c1a288c46d..a8b4065ef38 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/SearchDataTypeValidatorTestCase.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/SearchDataTypeValidatorTestCase.java
@@ -8,7 +8,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a>
+ * @author Simon Thoresen
*/
public class SearchDataTypeValidatorTestCase {
@@ -37,4 +37,5 @@ public class SearchDataTypeValidatorTestCase {
"'simple' for cluster 'content').", e.getMessage());
}
}
+
}
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/search/AttributeChangeValidatorTest.java b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/search/AttributeChangeValidatorTest.java
index b3ef8c6d7f2..e43827d7693 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/search/AttributeChangeValidatorTest.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/search/AttributeChangeValidatorTest.java
@@ -9,6 +9,7 @@ import java.util.List;
import static com.yahoo.vespa.model.application.validation.change.ConfigChangeTestUtils.newRefeedAction;
import static com.yahoo.vespa.model.application.validation.change.ConfigChangeTestUtils.newRestartAction;
+import static org.junit.Assert.assertEquals;
public class AttributeChangeValidatorTest {
@@ -110,8 +111,8 @@ public class AttributeChangeValidatorTest {
@Test
public void requireThatChangingTensorTypeOfTensorFieldRequiresRefeed() throws Exception {
new Fixture(
- "field f1 type tensor { indexing: attribute \n attribute: tensor(x[100]) }",
- "field f1 type tensor { indexing: attribute \n attribute: tensor(y[]) }")
+ "field f1 type tensor(x[]) { indexing: attribute \n attribute: tensor(x[100]) }",
+ "field f1 type tensor(y[]) { indexing: attribute \n attribute: tensor(y[]) }")
.assertValidation(newRefeedAction(
"tensor-type-change",
ValidationOverrides.empty(),
@@ -119,10 +120,24 @@ public class AttributeChangeValidatorTest {
}
@Test
- public void requireThatNotChangingTensorTypeOfTensorFieldIsOk() throws Exception {
+ public void requireThatCompatibleTensorTypeChangeIsOk() throws Exception {
new Fixture(
- "field f1 type tensor { indexing: attribute \n attribute: tensor(x[104], y[52]) }",
- "field f1 type tensor { indexing: attribute \n attribute: tensor(x[104], y[52]) }")
+ "field f1 type tensor(x[],y[]) { indexing: attribute \n attribute: tensor(x[104], y[52]) }",
+ "field f1 type tensor(x[200],y[]) { indexing: attribute \n attribute: tensor(x[104], y[52]) }")
.assertValidation();
}
+
+ @Test
+ public void requireIncompatibleTensorTypeChangeIsNotOk() throws Exception {
+ try {
+ new Fixture(
+ "field f1 type tensor(x[],y[]) { indexing: attribute \n attribute: tensor(x[104], y[52]) }",
+ "field f1 type tensor(x[100],y[]) { indexing: attribute \n attribute: tensor(x[104], y[52]) }")
+ .assertValidation();
+ }
+ catch (IllegalArgumentException e) {
+ assertEquals("For search 'test', field 'f1': Incompatible types. Expected tensor(x[100],y[]) for attribute 'f1', got tensor(x[104],y[52]).", e.getMessage());
+ }
+ }
+
}
diff --git a/container-search/src/test/java/com/yahoo/fs4/test/RankFeaturesTestCase.java b/container-search/src/test/java/com/yahoo/fs4/test/RankFeaturesTestCase.java
index 8c209438565..5cf9aeda978 100644
--- a/container-search/src/test/java/com/yahoo/fs4/test/RankFeaturesTestCase.java
+++ b/container-search/src/test/java/com/yahoo/fs4/test/RankFeaturesTestCase.java
@@ -5,6 +5,7 @@ import com.yahoo.io.GrowableByteBuffer;
import com.yahoo.search.query.ranking.RankFeatures;
import com.yahoo.search.query.ranking.RankProperties;
import com.yahoo.tensor.Tensor;
+import com.yahoo.tensor.TensorType;
import com.yahoo.tensor.serialization.TypedBinaryFormat;
import com.yahoo.text.Utf8;
import org.junit.Test;
@@ -30,16 +31,18 @@ public class RankFeaturesTestCase {
@Test
public void requireThatSingleTensorIsBinaryEncoded() {
- Tensor tensor = Tensor.from("{ {x:a, y:b, z:c}:2.0, {x:a, y:b, z:c2}:3.0 }");
- assertTensorEncodingAndDecoding("query(my_tensor)", "my_tensor", tensor);
- assertTensorEncodingAndDecoding("$my_tensor", "my_tensor", tensor);
+ TensorType type = new TensorType.Builder().mapped("x").mapped("y").mapped("z").build();
+ Tensor tensor = Tensor.from(type, "{ {x:a, y:b, z:c}:2.0, {x:a, y:b, z:c2}:3.0 }");
+ assertTensorEncodingAndDecoding(type, "query(my_tensor)", "my_tensor", tensor);
+ assertTensorEncodingAndDecoding(type, "$my_tensor", "my_tensor", tensor);
}
@Test
public void requireThatMultipleTensorsAreBinaryEncoded() {
- Tensor tensor1 = Tensor.from("{ {x:a, y:b, z:c}:2.0, {x:a, y:b, z:c2}:3.0 }");
- Tensor tensor2 = Tensor.from("{ {x:a, y:b, z:c}:5.0 }");
- assertTensorEncodingAndDecoding(Arrays.asList(
+ TensorType type = new TensorType.Builder().mapped("x").mapped("y").mapped("z").build();
+ Tensor tensor1 = Tensor.from(type, "{ {x:a, y:b, z:c}:2.0, {x:a, y:b, z:c2}:3.0 }");
+ Tensor tensor2 = Tensor.from(type, "{ {x:a, y:b, z:c}:5.0 }");
+ assertTensorEncodingAndDecoding(type, Arrays.asList(
new Entry("query(tensor1)", "tensor1", tensor1),
new Entry("$tensor2", "tensor2", tensor2)));
}
@@ -55,11 +58,11 @@ public class RankFeaturesTestCase {
}
}
- private static void assertTensorEncodingAndDecoding(List<Entry> entries) {
+ private static void assertTensorEncodingAndDecoding(TensorType type, List<Entry> entries) {
RankProperties properties = createRankPropertiesWithTensors(entries);
assertEquals(entries.size(), properties.asMap().size());
- Map<String, Object> decodedProperties = decode(encode(properties));
+ Map<String, Object> decodedProperties = decode(type, encode(properties));
assertEquals(entries.size() * 2, properties.asMap().size()); // tensor type info has been added
assertEquals(entries.size() * 2, decodedProperties.size());
for (Entry entry : entries) {
@@ -68,8 +71,8 @@ public class RankFeaturesTestCase {
}
}
- private static void assertTensorEncodingAndDecoding(String key, String normalizedKey, Tensor tensor) {
- assertTensorEncodingAndDecoding(Arrays.asList(new Entry(key, normalizedKey, tensor)));
+ private static void assertTensorEncodingAndDecoding(TensorType type, String key, String normalizedKey, Tensor tensor) {
+ assertTensorEncodingAndDecoding(type, Arrays.asList(new Entry(key, normalizedKey, tensor)));
}
private static RankProperties createRankPropertiesWithTensors(List<Entry> entries) {
@@ -91,7 +94,7 @@ public class RankFeaturesTestCase {
return result;
}
- private static Map<String, Object> decode(byte[] encodedProperties) {
+ private static Map<String, Object> decode(TensorType type, byte[] encodedProperties) {
GrowableByteBuffer buffer = GrowableByteBuffer.wrap(encodedProperties);
byte[] mapNameBytes = new byte[buffer.getInt()];
buffer.get(mapNameBytes);
@@ -106,7 +109,7 @@ public class RankFeaturesTestCase {
if (key.contains(".type")) {
result.put(key, Utf8.toString(value));
} else {
- result.put(key, TypedBinaryFormat.decode(null, value)); // TODO: Pass type
+ result.put(key, TypedBinaryFormat.decode(type, value));
}
}
return result;
diff --git a/document/src/main/java/com/yahoo/document/ArrayDataType.java b/document/src/main/java/com/yahoo/document/ArrayDataType.java
index 640bd94bd1c..4b24bb1ae00 100644
--- a/document/src/main/java/com/yahoo/document/ArrayDataType.java
+++ b/document/src/main/java/com/yahoo/document/ArrayDataType.java
@@ -8,9 +8,10 @@ import java.util.ArrayList;
import java.util.List;
/**
- * @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a>
+ * @author Einar M R Rosenvinge
*/
public class ArrayDataType extends CollectionDataType {
+
// The global class identifier shared with C++.
public static int classId = registerClass(Ids.document + 54, ArrayDataType.class);
diff --git a/document/src/main/java/com/yahoo/document/DataType.java b/document/src/main/java/com/yahoo/document/DataType.java
index 51af799efd9..184340f295e 100644
--- a/document/src/main/java/com/yahoo/document/DataType.java
+++ b/document/src/main/java/com/yahoo/document/DataType.java
@@ -14,6 +14,7 @@ import com.yahoo.document.datatypes.Raw;
import com.yahoo.document.datatypes.StringFieldValue;
import com.yahoo.document.datatypes.TensorFieldValue;
import com.yahoo.document.datatypes.UriFieldValue;
+import com.yahoo.tensor.TensorType;
import com.yahoo.vespa.objects.Identifiable;
import com.yahoo.vespa.objects.Ids;
import com.yahoo.vespa.objects.ObjectVisitor;
@@ -46,40 +47,30 @@ public abstract class DataType extends Identifiable implements Serializable, Com
public final static PrimitiveDataType RAW = new PrimitiveDataType("raw", 3, Raw.class, Raw.getFactory());
public final static NumericDataType LONG = new NumericDataType("long", 4, LongFieldValue.class, LongFieldValue.getFactory());
public final static NumericDataType DOUBLE = new NumericDataType("double", 5, DoubleFieldValue.class, DoubleFieldValue.getFactory());
- // ARRAY is type 6, but never used, array IDs are generated
- // public final static PrimitiveDataType FIELDMAP = new PrimitiveDataType("FieldMap", 7, FieldMap.class);
public final static DocumentType DOCUMENT = new DocumentType("document");
- // Not used anymore : public final static NumericDataType TIMESTAMP = new NumericDataType("Timestamp", 9, LongFieldValue.class);
public final static PrimitiveDataType URI = new PrimitiveDataType("uri", 10, UriFieldValue.class, new UriFieldValue.Factory());
- // Not used anymore : public final static PrimitiveDataType EXACTSTRING = new PrimitiveDataType("ExactString", 11, StringFieldValue.class);
- // Not used anymore: public final static PrimitiveDataType CONTENT = new PrimitiveDataType("content", 12, Content.class, new Content.Factory());
public final static NumericDataType BYTE = new NumericDataType("byte", 16, ByteFieldValue.class, ByteFieldValue.getFactory());
- // WEIGHTEDSET is type 17, but never used, weighted set IDs are generated
- // Tags are converted to weightedset&lt;string&gt; when reading the search definition
- public final static WeightedSetDataType TAG = new WeightedSetDataType(DataType.STRING, true, true);
- // Not yet, just reserve id 19. public final static NumericDataType SHORT = new NumericDataType("Int", 19, ShortFieldValue.class);
- // Guess I'll say STRUCT is 19 though, although I never intend to use it for anything as it has to be autogenerated now..
- // Let's say that AnnotationReference is 20, but those types will be generated from AnnotationReferenceDataType
public final static PrimitiveDataType PREDICATE = new PrimitiveDataType("predicate", 20, PredicateFieldValue.class, PredicateFieldValue.getFactory());
- public final static PrimitiveDataType TENSOR = new PrimitiveDataType("tensor", 21, TensorFieldValue.class, TensorFieldValue.getFactory());
+ public final static int tensorDataTypeCode = 21; // All TensorDataType instances have id=21 but carries additional type information serialized separately
+ // ADDITIONAL parametrized types added at runtime: map, struct, array, weighted set, annotation reference, tensor
+
+ // Tags are converted to weightedset<string> when reading the search definition TODO: Remove it
+ public final static WeightedSetDataType TAG = new WeightedSetDataType(DataType.STRING, true, true);
public static int lastPredefinedDataTypeId() {
return 21;
}
- /**
- * Set to true when this type is registered in a type manager. From that time we should refuse changes.
- */
+ /** Set to true when this type is registered in a type manager. From that time we should refuse changes. */
private boolean registered = false;
private String name;
- /**
- * The id of this type
- */
+ /** The id of this type */
private int dataTypeId;
static final private CopyOnWriteHashMap<Pair, Constructor> constructorCache = new CopyOnWriteHashMap<>();
+
/**
* Creates a datatype
*
@@ -96,26 +87,21 @@ public abstract class DataType extends Identifiable implements Serializable, Com
return (DataType)super.clone();
}
- public void setRegistered() {
+ void setRegistered() {
registered = true;
}
-
public boolean isRegistered() {
return registered;
}
- /**
- * Creates a new, empty FieldValue of this type.
- *
- * @return a new, empty FieldValue of this type.
- */
+ /** Creates a new, empty FieldValue of this type */
public abstract FieldValue createFieldValue();
/**
- * This will try to create the object by reflection. This can be very expensive
- * so some might discourage that.
- * @param arg The constructor argument.
- * @return Fully constructed value.
+ * Creates a field value by reflection
+ *
+ * @param arg the value of the newly created field value
+ * @return a fully constructed value
*/
protected FieldValue createByReflection(Object arg) {
Class<?> valClass = getValueClass();
@@ -141,8 +127,8 @@ public abstract class DataType extends Identifiable implements Serializable, Com
/**
* Creates a new FieldValue of this type, with the given value.
*
- * @param arg the value that the new FieldValue shall have.
- * @return A new FieldValue of this type, with the given value.
+ * @param arg the value of the new FieldValue
+ * @return a new FieldValue of this type, with the given value
*/
public FieldValue createFieldValue(Object arg) {
if (arg == null) {
@@ -211,12 +197,17 @@ public abstract class DataType extends Identifiable implements Serializable, Com
return new WeightedSetDataType(type, createIfNonExistent, removeIfZero);
}
+ /** Returns the given tensor type as a DataType */
+ public static TensorDataType getTensor(TensorType type) {
+ return new TensorDataType(type);
+ }
+
public String getName() {
return name;
}
/**
- * Sets the name of this data type.&nbsp;WARNING! Do not use!
+ * Sets the name of this data type. WARNING! Do not use!
*
* @param name the name of this data type.
*/
@@ -229,7 +220,7 @@ public abstract class DataType extends Identifiable implements Serializable, Com
}
/**
- * Sets the ID of this data type.&nbsp;WARNING! Do not use!
+ * Sets the ID of this data type. WARNING! Do not use!
*
* @param id the ID of this data type.
*/
@@ -238,7 +229,7 @@ public abstract class DataType extends Identifiable implements Serializable, Com
}
/**
- * Registeres this type in the given document manager.
+ * Registers this type in the given document manager.
*
* @param manager the DocumentTypeManager to register in.
*/
@@ -255,14 +246,12 @@ public abstract class DataType extends Identifiable implements Serializable, Com
}
public boolean equals(Object other) {
- if (!(other instanceof DataType)) {
- return false;
- }
+ if (!(other instanceof DataType)) return false;
DataType type = (DataType)other;
return (name.equals(type.name) && dataTypeId == type.dataTypeId);
}
- public java.lang.String toString() {
+ public String toString() {
return "datatype " + name + " (code: " + dataTypeId + ")";
}
@@ -278,8 +267,8 @@ public abstract class DataType extends Identifiable implements Serializable, Com
*/
public FieldPath buildFieldPath(String fieldPathString) {
if (fieldPathString.length() > 0) {
- throw new IllegalArgumentException(
- "Datatype " + toString() + " does not support further recursive structure: " + fieldPathString);
+ throw new IllegalArgumentException("Datatype " + toString() +
+ " does not support further recursive structure: " + fieldPathString);
}
return new FieldPath();
}
diff --git a/document/src/main/java/com/yahoo/document/Document.java b/document/src/main/java/com/yahoo/document/Document.java
index 34c952e1cec..e1d912b4e51 100644
--- a/document/src/main/java/com/yahoo/document/Document.java
+++ b/document/src/main/java/com/yahoo/document/Document.java
@@ -26,7 +26,7 @@ import java.util.Map;
* be removed soon.
*
* @author bratseth
- * @author <a href="einarmr@yahoo-inc.com">Einar M R Rosenvinge</a>
+ * @author Einar M R Rosenvinge
*/
public class Document extends StructuredFieldValue {
@@ -267,7 +267,9 @@ public class Document extends StructuredFieldValue {
}
/** Returns true if the argument is a document which has the same set of values */
+ @Override
public boolean equals(Object o) {
+ if (o == this) return true;
if (!(o instanceof Document)) return false;
Document other = (Document) o;
return (super.equals(o) && docId.equals(other.docId) &&
@@ -394,4 +396,5 @@ public class Document extends StructuredFieldValue {
comp = body.compareTo(otherValue.body);
return comp;
}
+
}
diff --git a/document/src/main/java/com/yahoo/document/DocumentTypeManager.java b/document/src/main/java/com/yahoo/document/DocumentTypeManager.java
index 0de7fe60500..1b3370cfa66 100644
--- a/document/src/main/java/com/yahoo/document/DocumentTypeManager.java
+++ b/document/src/main/java/com/yahoo/document/DocumentTypeManager.java
@@ -12,6 +12,7 @@ import com.yahoo.document.serialization.DocumentDeserializer;
import com.yahoo.document.serialization.DocumentDeserializerFactory;
import com.yahoo.document.serialization.VespaDocumentDeserializer42;
import com.yahoo.io.GrowableByteBuffer;
+import com.yahoo.tensor.TensorType;
import java.lang.reflect.Modifier;
import java.util.*;
@@ -28,13 +29,23 @@ import java.util.logging.Logger;
* datatypes, for instance displaying the data type in human-readable form
* or as XML.
*
- * @author <a href="mailto:thomasg@yahoo-inc.com">Thomas Gundersen</a>
+ * @author Thomas Gundersen
*/
public class DocumentTypeManager {
private final static Logger log = Logger.getLogger(DocumentTypeManager.class.getName());
private ConfigSubscriber subscriber;
+ // *Configured data types* (not built-in/primitive) indexed by their id
+ //
+ // *Primitive* data types are always available and have a single id.
+ //
+ // *Built-in dynamic* types: The tensor type.
+ // Any tensor type has the same id and is always available just like primitive types.
+ // However, unlike primitive types, each tensor type is a separate DataType instance
+ // (which carries additional type information (detailedType) supplied at runtime).
+ // The reason for this is that we want the data type to stay the same when we change the detailed tensor type
+ // to maintain compatibility on (some) tensor type changes.
private Map<Integer, DataType> dataTypes = new LinkedHashMap<>();
private Map<DataTypeName, DocumentType> documentTypes = new LinkedHashMap<>();
private AnnotationTypeRegistry annotationTypeRegistry = new AnnotationTypeRegistry();
@@ -85,6 +96,7 @@ public class DocumentTypeManager {
}
public boolean hasDataType(String name) {
+ if (name.startsWith("tensor(")) return true; // built-in dynamic: Always present
for (DataType type : dataTypes.values()) {
if (type.getName().equalsIgnoreCase(name)) {
return true;
@@ -94,10 +106,14 @@ public class DocumentTypeManager {
}
public boolean hasDataType(int code) {
+ if (code == DataType.tensorDataTypeCode) return true; // built-in dynamic: Always present
return dataTypes.containsKey(code);
}
public DataType getDataType(String name) {
+ if (name.startsWith("tensor(")) // built-in dynamic
+ return new TensorDataType(TensorType.fromSpec(name));
+
List<DataType> foundTypes = new ArrayList<>();
for (DataType type : dataTypes.values()) {
if (type.getName().equalsIgnoreCase(name)) {
@@ -125,7 +141,19 @@ public class DocumentTypeManager {
return foundTypes.get(0);
}
- public DataType getDataType(int code) {
+ public DataType getDataType(int code) { return getDataType(code, ""); }
+
+ /**
+ * Return a data type instance
+ *
+ * @param code the code of the data type to return, which must be either built in or present in this manager
+ * @param detailedType detailed type information, or the empty string if none
+ * @return the appropriate DataType instance
+ */
+ public DataType getDataType(int code, String detailedType) {
+ if (code == DataType.tensorDataTypeCode) // built-in dynamic
+ return new TensorDataType(TensorType.fromSpec(detailedType));
+
DataType type = dataTypes.get(code);
if (type == null) {
StringBuilder types=new StringBuilder();
@@ -138,11 +166,11 @@ public class DocumentTypeManager {
}
}
- DataType getDataTypeAndReturnTemporary(int code) {
+ DataType getDataTypeAndReturnTemporary(int code, String detailedType) {
if (hasDataType(code)) {
- return getDataType(code);
+ return getDataType(code, detailedType);
}
- return new TemporaryDataType(code);
+ return new TemporaryDataType(code, detailedType);
}
/**
@@ -156,9 +184,11 @@ public class DocumentTypeManager {
/**
* Register a single datatype. Re-registering an existing, but equal, datatype is ok.
+ *
* @param type The datatype to register
*/
void registerSingleType(DataType type) {
+ if (type instanceof TensorDataType) return; // built-in dynamic: Created on the fly
if (dataTypes.containsKey(type.getId())) {
DataType existingType = dataTypes.get(type.getId());
if (((type instanceof TemporaryDataType) || (type instanceof TemporaryStructuredDataType))
@@ -188,7 +218,7 @@ public class DocumentTypeManager {
dataTypes.remove(existingType.getId());
} else {
throw new IllegalStateException("Datatype " + existingType + " is not equal to datatype attempted registered "
- + type + ", but already uses id " + type.getId());
+ + type + ", but already uses id " + type.getId());
}
}
@@ -250,7 +280,8 @@ public class DocumentTypeManager {
}
/**
- * A read only view of the registered data types
+ * Returns a read only view of the registered data types
+ *
* @return collection of types
*/
public Collection<DataType> getDataTypes() {
@@ -318,7 +349,7 @@ public class DocumentTypeManager {
for (Field field : structDataType.getFieldsThisTypeOnly()) {
DataType fieldType = field.getDataType();
if (fieldType instanceof TemporaryDataType) {
- field.setDataType(getDataType(fieldType.getCode()));
+ field.setDataType(getDataType(fieldType.getCode(), ((TemporaryDataType)fieldType).getDetailedType()));
} else {
if (!seenStructs.contains(fieldType)) {
replaceTemporaryTypes(fieldType, seenStructs);
@@ -329,7 +360,7 @@ public class DocumentTypeManager {
private void replaceTemporaryTypesInCollection(CollectionDataType collectionDataType, List<DataType> seenStructs) {
if (collectionDataType.getNestedType() instanceof TemporaryDataType) {
- collectionDataType.setNestedType(getDataType(collectionDataType.getNestedType().getCode()));
+ collectionDataType.setNestedType(getDataType(collectionDataType.getNestedType().getCode(), ""));
} else {
replaceTemporaryTypes(collectionDataType.getNestedType(), seenStructs);
}
@@ -337,13 +368,13 @@ public class DocumentTypeManager {
private void replaceTemporaryTypesInMap(MapDataType mapDataType, List<DataType> seenStructs) {
if (mapDataType.getValueType() instanceof TemporaryDataType) {
- mapDataType.setValueType(getDataType(mapDataType.getValueType().getCode()));
+ mapDataType.setValueType(getDataType(mapDataType.getValueType().getCode(), ""));
} else {
replaceTemporaryTypes(mapDataType.getValueType(), seenStructs);
}
if (mapDataType.getKeyType() instanceof TemporaryDataType) {
- mapDataType.setKeyType(getDataType(mapDataType.getKeyType().getCode()));
+ mapDataType.setKeyType(getDataType(mapDataType.getKeyType().getCode(), ""));
} else {
replaceTemporaryTypes(mapDataType.getKeyType(), seenStructs);
}
@@ -351,7 +382,7 @@ public class DocumentTypeManager {
private void replaceTemporaryTypesInWeightedSet(WeightedSetDataType weightedSetDataType, List<DataType> seenStructs) {
if (weightedSetDataType.getNestedType() instanceof TemporaryDataType) {
- weightedSetDataType.setNestedType(getDataType(weightedSetDataType.getNestedType().getCode()));
+ weightedSetDataType.setNestedType(getDataType(weightedSetDataType.getNestedType().getCode(), ""));
} else {
replaceTemporaryTypes(weightedSetDataType.getNestedType(), seenStructs);
}
diff --git a/document/src/main/java/com/yahoo/document/DocumentTypeManagerConfigurer.java b/document/src/main/java/com/yahoo/document/DocumentTypeManagerConfigurer.java
index 9d7139e6226..7b5f1392032 100644
--- a/document/src/main/java/com/yahoo/document/DocumentTypeManagerConfigurer.java
+++ b/document/src/main/java/com/yahoo/document/DocumentTypeManagerConfigurer.java
@@ -13,7 +13,7 @@ import java.util.logging.Logger;
/**
* Configures the Vespa document manager from a config id.
*
- * @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a>
+ * @author Einar M R Rosenvinge
*/
public class DocumentTypeManagerConfigurer implements ConfigSubscriber.SingleSubscriber<DocumentmanagerConfig>{
@@ -82,21 +82,21 @@ public class DocumentTypeManagerConfigurer implements ConfigSubscriber.SingleSub
try {
for (Object o : thisDataType.arraytype()) {
DocumentmanagerConfig.Datatype.Arraytype array = (DocumentmanagerConfig.Datatype.Arraytype) o;
- DataType nestedType = manager.getDataType(array.datatype());
+ DataType nestedType = manager.getDataType(array.datatype(), "");
ArrayDataType type = new ArrayDataType(nestedType, id);
manager.register(type);
}
for (Object o : thisDataType.maptype()) {
DocumentmanagerConfig.Datatype.Maptype map = (DocumentmanagerConfig.Datatype.Maptype) o;
- DataType keyType = manager.getDataType(map.keytype());
- DataType valType = manager.getDataType(map.valtype());
+ DataType keyType = manager.getDataType(map.keytype(), "");
+ DataType valType = manager.getDataType(map.valtype(), "");
MapDataType type = new MapDataType(keyType, valType, id);
manager.register(type);
}
for (Object o : thisDataType.weightedsettype()) {
DocumentmanagerConfig.Datatype.Weightedsettype wset =
(DocumentmanagerConfig.Datatype.Weightedsettype) o;
- DataType nestedType = manager.getDataType(wset.datatype());
+ DataType nestedType = manager.getDataType(wset.datatype(), "");
WeightedSetDataType type = new WeightedSetDataType(
nestedType, wset.createifnonexistant(), wset.removeifzero(), id);
manager.register(type);
@@ -114,8 +114,8 @@ public class DocumentTypeManagerConfigurer implements ConfigSubscriber.SingleSub
DocumentmanagerConfig.Datatype.Structtype.Field field =
(DocumentmanagerConfig.Datatype.Structtype.Field) j;
DataType fieldType = (field.datatype() == id)
- ? manager.getDataTypeAndReturnTemporary(field.datatype())
- : manager.getDataType(field.datatype());
+ ? manager.getDataTypeAndReturnTemporary(field.datatype(), field.detailedtype())
+ : manager.getDataType(field.datatype(), field.detailedtype());
if (field.id().size() == 1) {
type.addField(new Field(field.name(), field.id().get(0).id(), fieldType, true));
@@ -127,8 +127,8 @@ public class DocumentTypeManagerConfigurer implements ConfigSubscriber.SingleSub
}
for (Object o : thisDataType.documenttype()) {
DocumentmanagerConfig.Datatype.Documenttype doc = (DocumentmanagerConfig.Datatype.Documenttype) o;
- StructDataType header = (StructDataType) manager.getDataType(doc.headerstruct());
- StructDataType body = (StructDataType) manager.getDataType(doc.bodystruct());
+ StructDataType header = (StructDataType) manager.getDataType(doc.headerstruct(), "");
+ StructDataType body = (StructDataType) manager.getDataType(doc.bodystruct(), "");
for (Field field : body.getFields()) {
field.setHeader(false);
}
@@ -210,7 +210,7 @@ public class DocumentTypeManagerConfigurer implements ConfigSubscriber.SingleSub
private static void addAnnotationTypePayloads(DocumentmanagerConfig config, DocumentTypeManager manager) {
for (DocumentmanagerConfig.Annotationtype annType : config.annotationtype()) {
AnnotationType annotationType = manager.getAnnotationTypeRegistry().getType(annType.id());
- DataType payload = manager.getDataType(annType.datatype());
+ DataType payload = manager.getDataType(annType.datatype(), "");
if (!payload.equals(DataType.NONE)) {
annotationType.setDataType(payload);
}
@@ -234,7 +234,7 @@ public class DocumentTypeManagerConfigurer implements ConfigSubscriber.SingleSub
int id = thisDataType.id();
for (Object o : thisDataType.structtype()) {
DocumentmanagerConfig.Datatype.Structtype struct = (DocumentmanagerConfig.Datatype.Structtype) o;
- StructDataType thisStruct = (StructDataType) manager.getDataType(id);
+ StructDataType thisStruct = (StructDataType) manager.getDataType(id, "");
for (DocumentmanagerConfig.Datatype.Structtype.Inherits parent : struct.inherits()) {
StructDataType parentStruct = (StructDataType) manager.getDataType(parent.name());
diff --git a/document/src/main/java/com/yahoo/document/Field.java b/document/src/main/java/com/yahoo/document/Field.java
index 86543916b42..b80d92e0e4d 100644
--- a/document/src/main/java/com/yahoo/document/Field.java
+++ b/document/src/main/java/com/yahoo/document/Field.java
@@ -13,7 +13,7 @@ import java.io.Serializable;
* A name and type. Fields are contained in document types to describe their fields,
* but is also used to represent name/type pairs which are not part of document types.
*
- * @author <a href="mailto:thomasg@yahoo-inc.com">Thomas Gundersen</a>
+ * @author Thomas Gundersen
* @author bratseth
*/
public class Field extends FieldBase implements FieldSet, Comparable, Serializable {
diff --git a/document/src/main/java/com/yahoo/document/PrimitiveDataType.java b/document/src/main/java/com/yahoo/document/PrimitiveDataType.java
index a0024bb0497..23bf4b43ccf 100644
--- a/document/src/main/java/com/yahoo/document/PrimitiveDataType.java
+++ b/document/src/main/java/com/yahoo/document/PrimitiveDataType.java
@@ -8,9 +8,10 @@ import com.yahoo.vespa.objects.ObjectVisitor;
import java.util.Objects;
/**
- * @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a>
+ * @author Einar M R Rosenvinge
*/
public class PrimitiveDataType extends DataType {
+
public static abstract class Factory {
public abstract FieldValue create();
}
diff --git a/document/src/main/java/com/yahoo/document/TemporaryDataType.java b/document/src/main/java/com/yahoo/document/TemporaryDataType.java
index da65dde72da..a0c6fcb889d 100644
--- a/document/src/main/java/com/yahoo/document/TemporaryDataType.java
+++ b/document/src/main/java/com/yahoo/document/TemporaryDataType.java
@@ -4,11 +4,15 @@ package com.yahoo.document;
import com.yahoo.document.datatypes.FieldValue;
/**
- * @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a>
+ * @author Einar M R Rosenvinge
*/
class TemporaryDataType extends DataType {
- TemporaryDataType(int dataTypeId) {
+
+ private final String detailedType;
+
+ TemporaryDataType(int dataTypeId, String detailedType) {
super("temporary_" + dataTypeId, dataTypeId);
+ this.detailedType = detailedType;
}
@Override
@@ -25,4 +29,7 @@ class TemporaryDataType extends DataType {
public boolean isValueCompatible(FieldValue value) {
return false;
}
+
+ String getDetailedType() { return detailedType; }
+
}
diff --git a/document/src/main/java/com/yahoo/document/TensorDataType.java b/document/src/main/java/com/yahoo/document/TensorDataType.java
new file mode 100644
index 00000000000..dbaf6ee7763
--- /dev/null
+++ b/document/src/main/java/com/yahoo/document/TensorDataType.java
@@ -0,0 +1,50 @@
+package com.yahoo.document;
+
+import com.yahoo.document.datatypes.FieldValue;
+import com.yahoo.document.datatypes.TensorFieldValue;
+import com.yahoo.tensor.TensorType;
+import com.yahoo.vespa.objects.Ids;
+
+/**
+ * A DataType containing a tensor type
+ *
+ * @author bratseth
+ */
+public class TensorDataType extends DataType {
+
+ private final TensorType tensorType;
+
+ // The global class identifier shared with C++.
+ public static int classId = registerClass(Ids.document + 59, TensorDataType.class);
+
+ public TensorDataType(TensorType tensorType) {
+ super(tensorType.toString(), DataType.tensorDataTypeCode);
+ this.tensorType = tensorType;
+ }
+
+ public TensorDataType clone() {
+ return (TensorDataType)super.clone();
+ }
+
+ @Override
+ public FieldValue createFieldValue() {
+ return new TensorFieldValue(tensorType);
+ }
+
+ @Override
+ public Class<? extends TensorFieldValue> getValueClass() {
+ return TensorFieldValue.class;
+ }
+
+ @Override
+ public boolean isValueCompatible(FieldValue value) {
+ if (value == null) return false;
+ if ( ! TensorFieldValue.class.isAssignableFrom(value.getClass())) return false;
+ TensorFieldValue tensorValue = (TensorFieldValue)value;
+ return tensorValue.getDataType().getTensorType().isAssignableTo(tensorType);
+ }
+
+ /** Returns the type of the tensor this field can hold */
+ public TensorType getTensorType() { return tensorType; }
+
+}
diff --git a/document/src/main/java/com/yahoo/document/datatypes/Array.java b/document/src/main/java/com/yahoo/document/datatypes/Array.java
index 66cc472de69..09fb8b71db1 100644
--- a/document/src/main/java/com/yahoo/document/datatypes/Array.java
+++ b/document/src/main/java/com/yahoo/document/datatypes/Array.java
@@ -16,7 +16,7 @@ import java.util.*;
/**
* FieldValue which encapsulates a Array value
*
- * @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a>
+ * @author Einar M R Rosenvinge
*/
public final class Array<T extends FieldValue> extends CollectionFieldValue<T> implements List<T> {
diff --git a/document/src/main/java/com/yahoo/document/datatypes/Struct.java b/document/src/main/java/com/yahoo/document/datatypes/Struct.java
index 5a01dc33aa1..b5920cb4758 100644
--- a/document/src/main/java/com/yahoo/document/datatypes/Struct.java
+++ b/document/src/main/java/com/yahoo/document/datatypes/Struct.java
@@ -215,7 +215,6 @@ public class Struct extends StructuredFieldValue {
if (!super.equals(o)) return false;
Struct struct = (Struct) o;
-
return values.equals(struct.values);
}
@@ -388,4 +387,5 @@ public class Struct extends StructuredFieldValue {
}
return fieldType.cast(fieldValue);
}
+
}
diff --git a/document/src/main/java/com/yahoo/document/datatypes/StructuredFieldValue.java b/document/src/main/java/com/yahoo/document/datatypes/StructuredFieldValue.java
index b4585a2188d..7957d9b812f 100644
--- a/document/src/main/java/com/yahoo/document/datatypes/StructuredFieldValue.java
+++ b/document/src/main/java/com/yahoo/document/datatypes/StructuredFieldValue.java
@@ -10,7 +10,7 @@ import java.util.List;
import java.util.Map;
/**
- * @author <a href="mailto:humbe@yahoo-inc.com">H&aring;kon Humberset</a>
+ * @author HÃ¥kon Humberset
*/
public abstract class StructuredFieldValue extends CompositeFieldValue {
diff --git a/document/src/main/java/com/yahoo/document/datatypes/TensorFieldValue.java b/document/src/main/java/com/yahoo/document/datatypes/TensorFieldValue.java
index bee29478219..9d8e9a83b5e 100644
--- a/document/src/main/java/com/yahoo/document/datatypes/TensorFieldValue.java
+++ b/document/src/main/java/com/yahoo/document/datatypes/TensorFieldValue.java
@@ -3,11 +3,12 @@ package com.yahoo.document.datatypes;
import com.yahoo.document.DataType;
import com.yahoo.document.Field;
-import com.yahoo.document.PrimitiveDataType;
+import com.yahoo.document.TensorDataType;
import com.yahoo.document.serialization.FieldReader;
import com.yahoo.document.serialization.FieldWriter;
import com.yahoo.document.serialization.XmlStream;
import com.yahoo.tensor.Tensor;
+import com.yahoo.tensor.TensorType;
import java.util.Objects;
import java.util.Optional;
@@ -20,12 +21,18 @@ import java.util.Optional;
public class TensorFieldValue extends FieldValue {
private Optional<Tensor> tensor;
+
+ private final TensorDataType dataType;
- public TensorFieldValue() {
- tensor = Optional.empty();
+ /** Create an empty tensor field value */
+ public TensorFieldValue(TensorType type) {
+ this.dataType = new TensorDataType(type);
+ this.tensor = Optional.empty();
}
+ /** Create a tensor field value containing the given tensor */
public TensorFieldValue(Tensor tensor) {
+ this.dataType = new TensorDataType(tensor.type());
this.tensor = Optional.of(tensor);
}
@@ -34,8 +41,8 @@ public class TensorFieldValue extends FieldValue {
}
@Override
- public DataType getDataType() {
- return DataType.TENSOR;
+ public TensorDataType getDataType() {
+ return dataType;
}
@Override
@@ -51,16 +58,23 @@ public class TensorFieldValue extends FieldValue {
@Override
public void assign(Object o) {
if (o == null) {
- tensor = Optional.empty();
+ assignTensor(Optional.empty());
} else if (o instanceof Tensor) {
- tensor = Optional.of((Tensor)o);
+ assignTensor(Optional.of((Tensor)o));
} else if (o instanceof TensorFieldValue) {
- tensor = ((TensorFieldValue)o).getTensor();
+ assignTensor(((TensorFieldValue)o).getTensor());
} else {
throw new IllegalArgumentException("Expected class '" + getClass().getName() + "', got '" +
- o.getClass().getName() + "'.");
+ o.getClass().getName() + "'.");
}
}
+
+ public void assignTensor(Optional<Tensor> tensor) {
+ if (tensor.isPresent() && ! dataType.getTensorType().isAssignableTo(tensor.get().type()))
+ throw new IllegalArgumentException("Type mismatch: Cannot assign tensor of type " + tensor.get().type() +
+ " to field of type " + dataType.getTensorType());
+ this.tensor = tensor;
+ }
@Override
public void serialize(Field field, FieldWriter writer) {
@@ -74,27 +88,14 @@ public class TensorFieldValue extends FieldValue {
@Override
public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (!(o instanceof TensorFieldValue)) {
- return false;
- }
- TensorFieldValue rhs = (TensorFieldValue)o;
- if (!Objects.equals(tensor, rhs.tensor)) {
- return false;
- }
+ if (this == o) return true;
+ if ( ! (o instanceof TensorFieldValue)) return false;
+
+ TensorFieldValue other = (TensorFieldValue)o;
+ if ( ! dataType.getTensorType().equals(other.dataType.getTensorType())) return false;
+ if ( ! tensor.equals(other.tensor)) return false;
return true;
}
- public static PrimitiveDataType.Factory getFactory() {
- return new PrimitiveDataType.Factory() {
-
- @Override
- public FieldValue create() {
- return new TensorFieldValue();
- }
- };
- }
}
diff --git a/document/src/main/java/com/yahoo/document/json/JsonReader.java b/document/src/main/java/com/yahoo/document/json/JsonReader.java
index b1c635d7641..e0740338aae 100644
--- a/document/src/main/java/com/yahoo/document/json/JsonReader.java
+++ b/document/src/main/java/com/yahoo/document/json/JsonReader.java
@@ -583,71 +583,41 @@ public class JsonReader {
}
private void fillTensor(TensorFieldValue tensorFieldValue) {
+ Tensor.Builder tensorBuilder = Tensor.Builder.of(tensorFieldValue.getDataType().getTensorType());
expectObjectStart(buffer.currentToken());
int initNesting = buffer.nesting();
- Tensor.Builder tensorBuilder = null;
// read tensor cell fields and ignore everything else
for (buffer.next(); buffer.nesting() >= initNesting; buffer.next()) {
if (TENSOR_CELLS.equals(buffer.currentName()))
- tensorBuilder = readTensorCells(tensorBuilder);
+ readTensorCells(tensorBuilder);
}
expectObjectEnd(buffer.currentToken());
- if (tensorBuilder == null) // no cells + no type: empty tensor type
- tensorBuilder = Tensor.Builder.of(TensorType.empty);
tensorFieldValue.assign(tensorBuilder.build());
}
- private Tensor.Builder readTensorCells(Tensor.Builder tensorBuilder) {
+ private void readTensorCells(Tensor.Builder tensorBuilder) {
expectArrayStart(buffer.currentToken());
int initNesting = buffer.nesting();
- for (buffer.next(); buffer.nesting() >= initNesting; buffer.next()) {
- tensorBuilder = readTensorCell(tensorBuilder);
- }
+ for (buffer.next(); buffer.nesting() >= initNesting; buffer.next())
+ readTensorCell(tensorBuilder);
expectCompositeEnd(buffer.currentToken());
- return tensorBuilder;
}
- private Tensor.Builder readTensorCell(Tensor.Builder tensorBuilder) {
+ private void readTensorCell(Tensor.Builder tensorBuilder) {
expectObjectStart(buffer.currentToken());
int initNesting = buffer.nesting();
double cellValue = 0.0;
- Tensor.Builder.CellBuilder cellBuilder = null;
+ Tensor.Builder.CellBuilder cellBuilder = tensorBuilder.cell();
for (buffer.next(); buffer.nesting() >= initNesting; buffer.next()) {
String currentName = buffer.currentName();
if (TENSOR_ADDRESS.equals(currentName)) {
- if (tensorBuilder != null) {
- cellBuilder = tensorBuilder.cell();
- readTensorAddress(cellBuilder);
- }
- else { // gnarly temporary path to create a type on the fly TODO; Remove when we always have a type
- expectObjectStart(buffer.currentToken());
- int initNesting2 = buffer.nesting();
- List<Pair<String,String>> entries = new ArrayList<>();
- for (buffer.next(); buffer.nesting() >= initNesting2; buffer.next()) {
- String dimension = buffer.currentName();
- String label = buffer.currentText();
- entries.add(new Pair<>(dimension, label));
- }
- TensorType.Builder typeBuilder = new TensorType.Builder();
- for (Pair<String,String> entry : entries)
- typeBuilder.mapped(entry.getFirst());
- tensorBuilder = Tensor.Builder.of(typeBuilder.build());
- cellBuilder = tensorBuilder.cell();
- for (Pair<String,String> entry : entries)
- cellBuilder.label(entry.getFirst(), entry.getSecond());
- expectObjectEnd(buffer.currentToken());
- }
+ readTensorAddress(cellBuilder);
} else if (TENSOR_VALUE.equals(currentName)) {
cellValue = Double.valueOf(buffer.currentText());
}
}
expectObjectEnd(buffer.currentToken());
- if (tensorBuilder == null) { // no content TODO; This will go away with the above
- tensorBuilder = Tensor.Builder.of(TensorType.empty);
- cellBuilder = tensorBuilder.cell();
- }
cellBuilder.value(cellValue);
- return tensorBuilder;
}
private void readTensorAddress(MappedTensor.Builder.CellBuilder cellBuilder) {
diff --git a/document/src/main/java/com/yahoo/document/serialization/DocumentReader.java b/document/src/main/java/com/yahoo/document/serialization/DocumentReader.java
index 52a62caf296..5f1b227790b 100644
--- a/document/src/main/java/com/yahoo/document/serialization/DocumentReader.java
+++ b/document/src/main/java/com/yahoo/document/serialization/DocumentReader.java
@@ -9,7 +9,7 @@ import com.yahoo.document.DocumentTypeManager;
/**
* This interface is used to implement custom deserialization of document updates.
*
- * @author <a href="mailto:ravishar@yahoo-inc.com">Ravi Sharma</a>
+ * @author Ravi Sharma
* @author baldersheim
*/
public interface DocumentReader {
diff --git a/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializer42.java b/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializer42.java
index 753008de7e0..6e9495b1437 100644
--- a/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializer42.java
+++ b/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializer42.java
@@ -115,8 +115,8 @@ public class VespaDocumentDeserializer42 extends VespaDocumentSerializer42 imple
// Verify that we have correct version
version = getShort(null);
if (version < 6 || version > Document.SERIALIZED_VERSION) {
- throw new DeserializationException(
- "Unknown version " + version + ", expected " + Document.SERIALIZED_VERSION + ".");
+ throw new DeserializationException("Unknown version " + version + ", expected " +
+ Document.SERIALIZED_VERSION + ".");
}
int dataLength = 0;
@@ -278,7 +278,7 @@ public class VespaDocumentDeserializer42 extends VespaDocumentSerializer42 imple
int encodedTensorLength = buf.getInt1_4Bytes();
if (encodedTensorLength > 0) {
byte[] encodedTensor = getBytes(null, encodedTensorLength);
- value.assign(TypedBinaryFormat.decode(null, encodedTensor)); // TODO: Pass type
+ value.assign(TypedBinaryFormat.decode(value.getDataType().getTensorType(), encodedTensor));
} else {
value.clear();
}
@@ -328,7 +328,7 @@ public class VespaDocumentDeserializer42 extends VespaDocumentSerializer42 imple
fieldIdsAndLengths.add(new Tuple2<>(getInt1_4Bytes(null), getInt2_4_8Bytes(null)));
}
- //save a reference to the big buffer we're reading from:
+ // save a reference to the big buffer we're reading from:
GrowableByteBuffer bigBuf = buf;
if (version < 7) {
diff --git a/document/src/test/java/com/yahoo/document/DocumentUpdateTestCase.java b/document/src/test/java/com/yahoo/document/DocumentUpdateTestCase.java
index 413d1581e58..02773c7dad0 100644
--- a/document/src/test/java/com/yahoo/document/DocumentUpdateTestCase.java
+++ b/document/src/test/java/com/yahoo/document/DocumentUpdateTestCase.java
@@ -10,6 +10,7 @@ import com.yahoo.document.update.FieldUpdate;
import com.yahoo.document.update.ValueUpdate;
import com.yahoo.io.GrowableByteBuffer;
import com.yahoo.tensor.Tensor;
+import com.yahoo.tensor.TensorType;
import java.io.FileOutputStream;
import java.io.IOException;
@@ -43,6 +44,7 @@ public class DocumentUpdateTestCase extends junit.framework.TestCase {
private final String documentId = "doc:something:foooo";
private final String tensorField = "tensorfield";
+ private final TensorType tensorType = new TensorType.Builder().mapped("x").build();
private Document createDocument() {
return new Document(docMan.getDocumentType("foobar"), new DocumentId(documentId));
@@ -60,7 +62,7 @@ public class DocumentUpdateTestCase extends junit.framework.TestCase {
DataType stringwset = DataType.getWeightedSet(DataType.STRING);
docType.addField(new Field("strwset", stringwset));
- docType.addField(new Field(tensorField, DataType.TENSOR));
+ docType.addField(new Field(tensorField, new TensorDataType(tensorType)));
docMan.register(docType);
docType2 = new DocumentType("otherdoctype");
@@ -625,7 +627,7 @@ public class DocumentUpdateTestCase extends junit.framework.TestCase {
private DocumentUpdate createTensorAssignUpdate() {
DocumentUpdate result = new DocumentUpdate(docType, new DocumentId(documentId));
result.addFieldUpdate(FieldUpdate.createAssign(docType.getField(tensorField),
- createTensorFieldValue("{{x:0}:2.0}")));
+ createTensorFieldValue("{{x:0}:2.0}")));
return result;
}
diff --git a/document/src/test/java/com/yahoo/document/TemporaryDataTypeTestCase.java b/document/src/test/java/com/yahoo/document/TemporaryDataTypeTestCase.java
index 6f841aac821..6f3abd85521 100644
--- a/document/src/test/java/com/yahoo/document/TemporaryDataTypeTestCase.java
+++ b/document/src/test/java/com/yahoo/document/TemporaryDataTypeTestCase.java
@@ -9,16 +9,17 @@ import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat;
/**
- * @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a>
- * @since 5.1.10
+ * @author Einar M R Rosenvinge
*/
public class TemporaryDataTypeTestCase {
+
@Test
public void requireNulls() {
- TemporaryDataType type = new TemporaryDataType(0);
+ TemporaryDataType type = new TemporaryDataType(0, "");
assertThat(type.createFieldValue(new Object()), nullValue());
assertThat(type.createFieldValue(), nullValue());
assertThat(type.getValueClass(), nullValue());
assertThat(type.isValueCompatible(new StringFieldValue("")), is(false));
}
+
}
diff --git a/document/src/test/java/com/yahoo/document/datatypes/TensorFieldValueTestCase.java b/document/src/test/java/com/yahoo/document/datatypes/TensorFieldValueTestCase.java
index 80386141968..c94c917d2ca 100644
--- a/document/src/test/java/com/yahoo/document/datatypes/TensorFieldValueTestCase.java
+++ b/document/src/test/java/com/yahoo/document/datatypes/TensorFieldValueTestCase.java
@@ -2,6 +2,7 @@
package com.yahoo.document.datatypes;
import com.yahoo.tensor.Tensor;
+import com.yahoo.tensor.TensorType;
import org.junit.Test;
import static org.junit.Assert.assertFalse;
@@ -13,8 +14,8 @@ import static org.junit.Assert.assertTrue;
*/
public class TensorFieldValueTestCase {
- private static TensorFieldValue createFieldValue(String tensor) {
- return new TensorFieldValue(Tensor.from(tensor));
+ private static TensorFieldValue createFieldValue(String tensorString) {
+ return new TensorFieldValue(Tensor.from(tensorString));
}
@Test
@@ -23,20 +24,27 @@ public class TensorFieldValueTestCase {
}
@Test
+ public void requireThatDifferentTensorTypesWithEmptyValuesAreNotEqual() {
+ TensorFieldValue field1 = new TensorFieldValue(new TensorType.Builder().mapped("x").build());
+ TensorFieldValue field2 = new TensorFieldValue(new TensorType.Builder().indexed("y").build());
+ assertFalse(field1.equals(field2));
+ }
+
+ @Test
public void requireThatDifferentTensorValuesAreNotEqual() {
- TensorFieldValue lhs = createFieldValue("{{x:0}:2.0}");
- TensorFieldValue rhs = createFieldValue("{{x:0}:3.0}");
- assertFalse(lhs.equals(rhs));
- assertFalse(lhs.equals(new TensorFieldValue()));
+ TensorFieldValue field1 = createFieldValue("{{x:0}:2.0}");
+ TensorFieldValue field2 = createFieldValue("{{x:0}:3.0}");
+ assertFalse(field1.equals(field2));
+ assertFalse(field1.equals(new TensorFieldValue(TensorType.empty)));
}
@Test
public void requireThatSameTensorValueIsEqual() {
Tensor tensor = Tensor.from("{{x:0}:2.0}");
- TensorFieldValue lhs = new TensorFieldValue(tensor);
- TensorFieldValue rhs = new TensorFieldValue(tensor);
- assertTrue(lhs.equals(lhs));
- assertTrue(lhs.equals(rhs));
- assertTrue(lhs.equals(createFieldValue("{{x:0}:2.0}")));
+ TensorFieldValue field1 = new TensorFieldValue(tensor);
+ TensorFieldValue field2 = new TensorFieldValue(tensor);
+ assertTrue(field1.equals(field1));
+ assertTrue(field1.equals(field2));
+ assertTrue(field1.equals(createFieldValue("{{x:0}:2.0}")));
}
}
diff --git a/document/src/test/java/com/yahoo/document/json/DocumentUpdateJsonSerializerTest.java b/document/src/test/java/com/yahoo/document/json/DocumentUpdateJsonSerializerTest.java
index ffec7927ab3..a0f993fd2fc 100644
--- a/document/src/test/java/com/yahoo/document/json/DocumentUpdateJsonSerializerTest.java
+++ b/document/src/test/java/com/yahoo/document/json/DocumentUpdateJsonSerializerTest.java
@@ -10,7 +10,9 @@ import com.yahoo.document.DocumentUpdate;
import com.yahoo.document.Field;
import com.yahoo.document.MapDataType;
import com.yahoo.document.PositionDataType;
+import com.yahoo.document.TensorDataType;
import com.yahoo.document.WeightedSetDataType;
+import com.yahoo.tensor.TensorType;
import com.yahoo.text.Utf8;
import org.junit.Test;
@@ -27,6 +29,7 @@ import static com.yahoo.test.json.JsonTestHelper.inputJson;
*/
public class DocumentUpdateJsonSerializerTest {
+ final static TensorType tensorType = new TensorType.Builder().mapped("x").mapped("y").build();
final static DocumentTypeManager types = new DocumentTypeManager();
final static JsonFactory parserFactory = new JsonFactory();
final static DocumentType docType = new DocumentType("doctype");
@@ -39,7 +42,7 @@ public class DocumentUpdateJsonSerializerTest {
docType.addField(new Field("float_field", DataType.FLOAT));
docType.addField(new Field("double_field", DataType.DOUBLE));
docType.addField(new Field("byte_field", DataType.BYTE));
- docType.addField(new Field("tensor_field", DataType.TENSOR));
+ docType.addField(new Field("tensor_field", new TensorDataType(tensorType)));
docType.addField(new Field("predicate_field", DataType.PREDICATE));
docType.addField(new Field("raw_field", DataType.RAW));
docType.addField(new Field("int_array", new ArrayDataType(DataType.INT)));
diff --git a/document/src/test/java/com/yahoo/document/json/JsonReaderTestCase.java b/document/src/test/java/com/yahoo/document/json/JsonReaderTestCase.java
index 6c46f743332..34c93580eb3 100644
--- a/document/src/test/java/com/yahoo/document/json/JsonReaderTestCase.java
+++ b/document/src/test/java/com/yahoo/document/json/JsonReaderTestCase.java
@@ -19,6 +19,7 @@ import com.yahoo.document.Field;
import com.yahoo.document.MapDataType;
import com.yahoo.document.PositionDataType;
import com.yahoo.document.StructDataType;
+import com.yahoo.document.TensorDataType;
import com.yahoo.document.WeightedSetDataType;
import com.yahoo.document.datatypes.Array;
import com.yahoo.document.datatypes.FieldValue;
@@ -37,7 +38,10 @@ import com.yahoo.document.update.ClearValueUpdate;
import com.yahoo.document.update.FieldUpdate;
import com.yahoo.document.update.MapValueUpdate;
import com.yahoo.document.update.ValueUpdate;
+import com.yahoo.tensor.IndexedTensor;
+import com.yahoo.tensor.MappedTensor;
import com.yahoo.tensor.Tensor;
+import com.yahoo.tensor.TensorType;
import com.yahoo.text.Utf8;
import org.apache.commons.codec.binary.Base64;
import org.junit.After;
@@ -66,11 +70,12 @@ import static org.junit.Assert.*;
/**
* Basic test of JSON streams to Vespa document instances.
*
- * @author <a href="mailto:steinar@yahoo-inc.com">Steinar Knutsen</a>
+ * @author Steinar Knutsen
*/
public class JsonReaderTestCase {
- DocumentTypeManager types;
- JsonFactory parserFactory;
+
+ private DocumentTypeManager types;
+ private JsonFactory parserFactory;
@Rule
public ExpectedException exception = ExpectedException.none();
@@ -133,7 +138,10 @@ public class JsonReaderTestCase {
}
{
DocumentType x = new DocumentType("testtensor");
- x.addField(new Field("tensorfield", DataType.TENSOR));
+ x.addField(new Field("mappedtensorfield",
+ new TensorDataType(new TensorType.Builder().mapped("x").mapped("y").build())));
+ x.addField(new Field("indexedtensorfield",
+ new TensorDataType(new TensorType.Builder().indexed("x").indexed("y").build())));
types.registerDocumentType(x);
}
{
@@ -1022,83 +1030,88 @@ public class JsonReaderTestCase {
Document doc = createPutWithoutTensor().getDocument();
assertEquals("testtensor", doc.getId().getDocType());
assertEquals("id:unittest:testtensor::0", doc.getId().toString());
- TensorFieldValue fieldValue = (TensorFieldValue)doc.getFieldValue(doc.getField("tensorfield"));
+ TensorFieldValue fieldValue = (TensorFieldValue)doc.getFieldValue(doc.getField("mappedtensorfield"));
assertNull(fieldValue);
}
@Test
public void testParsingOfEmptyTensor() {
- assertTensorField("{}", createPutWithTensor("{}"));
+ assertMappedTensorField("tensor(x{},y{}):{}", createPutWithMappedTensor("{}"));
}
@Test
public void testParsingOfTensorWithEmptyDimensions() {
- assertTensorField("{}",
- createPutWithTensor("{ "
- + " \"dimensions\": [] "
- + "}"));
+ assertMappedTensorField("tensor(x{},y{}):{}",
+ createPutWithMappedTensor("{ "
+ + " \"dimensions\": [] "
+ + "}"));
}
@Test
public void testParsingOfTensorWithEmptyCells() {
- assertTensorField("{}",
- createPutWithTensor("{ "
- + " \"cells\": [] "
- + "}"));
+ assertMappedTensorField("tensor(x{},y{}):{}",
+ createPutWithMappedTensor("{ "
+ + " \"cells\": [] "
+ + "}"));
}
@Test
- public void testParsingOfTensorWithCells() {
- assertTensorField("{{x:a,y:b}:2.0,{x:c,y:b}:3.0}}",
- createPutWithTensor("{ "
- + " \"cells\": [ "
- + " { \"address\": { \"x\": \"a\", \"y\": \"b\" }, "
- + " \"value\": 2.0 }, "
- + " { \"address\": { \"x\": \"c\", \"y\": \"b\" }, "
- + " \"value\": 3.0 } "
- + " ]"
- + "}"));
+ public void testParsingOfMappedTensorWithCells() {
+ Tensor tensor = assertMappedTensorField("{{x:a,y:b}:2.0,{x:c,y:b}:3.0}}",
+ createPutWithMappedTensor("{ "
+ + " \"cells\": [ "
+ + " { \"address\": { \"x\": \"a\", \"y\": \"b\" }, "
+ + " \"value\": 2.0 }, "
+ + " { \"address\": { \"x\": \"c\", \"y\": \"b\" }, "
+ + " \"value\": 3.0 } "
+ + " ]"
+ + "}"));
+ assertTrue(tensor instanceof MappedTensor); // any functional instance is fine
}
@Test
- public void testParsingOfTensorWithSingleCellInDifferentJsonOrder() {
- assertTensorField("{{x:a,y:b}:2.0}",
- createPutWithTensor("{ "
- + " \"cells\": [ "
- + " { \"value\": 2.0, "
- + " \"address\": { \"x\": \"a\", \"y\": \"b\" } } "
- + " ]"
- + "}"));
+ public void testParsingOfIndexedTensorWithCells() {
+ Tensor tensor = assertTensorField("{{x:0,y:0}:2.0,{x:1,y:0}:3.0}}",
+ createPutWithTensor("{ "
+ + " \"cells\": [ "
+ + " { \"address\": { \"x\": \"0\", \"y\": \"0\" }, "
+ + " \"value\": 2.0 }, "
+ + " { \"address\": { \"x\": \"1\", \"y\": \"0\" }, "
+ + " \"value\": 3.0 } "
+ + " ]"
+ + "}", "indexedtensorfield"), "indexedtensorfield");
+ assertTrue(tensor instanceof IndexedTensor); // this matters for performance
}
@Test
- public void testParsingOfTensorWithSingleCellWithoutAddress() {
- assertTensorField("{{}:2.0}",
- createPutWithTensor("{ "
- + " \"cells\": [ "
- + " { \"value\": 2.0 } "
- + " ]"
- + "}"));
+ public void testParsingOfTensorWithSingleCellInDifferentJsonOrder() {
+ assertMappedTensorField("{{x:a,y:b}:2.0}",
+ createPutWithMappedTensor("{ "
+ + " \"cells\": [ "
+ + " { \"value\": 2.0, "
+ + " \"address\": { \"x\": \"a\", \"y\": \"b\" } } "
+ + " ]"
+ + "}"));
}
@Test
- public void testParsingOfTensorWithSingleCellWithoutValue() {
- assertTensorField("{{x:a}:0.0}",
- createPutWithTensor("{ "
- + " \"cells\": [ "
- + " { \"address\": { \"x\": \"a\" } } "
- + " ]"
- + "}"));
+ public void testAssignUpdateOfEmptyMappedTensor() {
+ assertTensorAssignUpdate("tensor(x{},y{}):{}", createAssignUpdateWithMappedTensor("{}"));
}
@Test
- public void testAssignUpdateOfEmptyTensor() {
- assertTensorAssignUpdate("{}", createAssignUpdateWithTensor("{}"));
+ public void testAssignUpdateOfEmptyIndexedTensor() {
+ try {
+ assertTensorAssignUpdate("tensor(x{},y{}):{}", createAssignUpdateWithTensor("{}", "indexedtensorfield"));
+ }
+ catch (IllegalArgumentException e) {
+ assertEquals("An indexed tensor must have a value", "Tensor of type tensor(x[],y[]) has no values", e.getMessage());
+ }
}
@Test
public void testAssignUpdateOfNullTensor() {
- ClearValueUpdate clearUpdate = (ClearValueUpdate) getTensorField(createAssignUpdateWithTensor(null)).getValueUpdate(0);
+ ClearValueUpdate clearUpdate = (ClearValueUpdate) getTensorField(createAssignUpdateWithMappedTensor(null)).getValueUpdate(0);
assertTrue(clearUpdate != null);
assertTrue(clearUpdate.getValue() == null);
}
@@ -1106,7 +1119,7 @@ public class JsonReaderTestCase {
@Test
public void testAssignUpdateOfTensorWithCells() {
assertTensorAssignUpdate("{{x:a,y:b}:2.0,{x:c,y:b}:3.0}}",
- createAssignUpdateWithTensor("{ "
+ createAssignUpdateWithMappedTensor("{ "
+ " \"cells\": [ "
+ " { \"address\": { \"x\": \"a\", \"y\": \"b\" }, "
+ " \"value\": 2.0 }, "
@@ -1194,10 +1207,13 @@ public class JsonReaderTestCase {
return (DocumentPut) reader.next();
}
- private DocumentPut createPutWithTensor(String inputTensor) {
+ private DocumentPut createPutWithMappedTensor(String inputTensor) {
+ return createPutWithTensor(inputTensor, "mappedtensorfield");
+ }
+ private DocumentPut createPutWithTensor(String inputTensor, String tensorFieldName) {
InputStream rawDoc = new ByteArrayInputStream(
Utf8.toBytes("["
- + " { \"put\": \"" + TENSOR_DOC_ID + "\", \"fields\": { \"tensorfield\": "
+ + " { \"put\": \"" + TENSOR_DOC_ID + "\", \"fields\": { \"" + tensorFieldName + "\": "
+ inputTensor
+ " }}"
+ "]"));
@@ -1205,20 +1221,27 @@ public class JsonReaderTestCase {
return (DocumentPut) reader.next();
}
- private DocumentUpdate createAssignUpdateWithTensor(String inputTensor) {
+ private DocumentUpdate createAssignUpdateWithMappedTensor(String inputTensor) {
+ return createAssignUpdateWithTensor(inputTensor, "mappedtensorfield");
+ }
+ private DocumentUpdate createAssignUpdateWithTensor(String inputTensor, String tensorFieldName) {
InputStream rawDoc = new ByteArrayInputStream(
- Utf8.toBytes("[ { \"update\": \"" + TENSOR_DOC_ID + "\", \"fields\": { \"tensorfield\": {"
+ Utf8.toBytes("[ { \"update\": \"" + TENSOR_DOC_ID + "\", \"fields\": { \"" + tensorFieldName + "\": {"
+ "\"assign\": " + (inputTensor != null ? inputTensor : "null") + " } } } ]"));
JsonReader reader = new JsonReader(types, rawDoc, parserFactory);
return (DocumentUpdate) reader.next();
}
- private static void assertTensorField(String expectedTensor, DocumentPut put) {
+ private static Tensor assertMappedTensorField(String expectedTensor, DocumentPut put) {
+ return assertTensorField(expectedTensor, put, "mappedtensorfield");
+ }
+ private static Tensor assertTensorField(String expectedTensor, DocumentPut put, String tensorFieldName) {
final Document doc = put.getDocument();
assertEquals("testtensor", doc.getId().getDocType());
assertEquals(TENSOR_DOC_ID, doc.getId().toString());
- TensorFieldValue fieldValue = (TensorFieldValue)doc.getFieldValue(doc.getField("tensorfield"));
+ TensorFieldValue fieldValue = (TensorFieldValue)doc.getFieldValue(doc.getField(tensorFieldName));
assertEquals(Tensor.from(expectedTensor), fieldValue.getTensor().get());
+ return fieldValue.getTensor().get();
}
private static void assertTensorAssignUpdate(String expectedTensor, DocumentUpdate update) {
@@ -1230,7 +1253,7 @@ public class JsonReaderTestCase {
}
private static FieldUpdate getTensorField(DocumentUpdate update) {
- FieldUpdate fieldUpdate = update.getFieldUpdate("tensorfield");
+ FieldUpdate fieldUpdate = update.getFieldUpdate("mappedtensorfield");
assertEquals(1, fieldUpdate.size());
return fieldUpdate;
}
diff --git a/document/src/test/java/com/yahoo/document/json/JsonWriterTestCase.java b/document/src/test/java/com/yahoo/document/json/JsonWriterTestCase.java
index f29c208a113..57b3e088efc 100644
--- a/document/src/test/java/com/yahoo/document/json/JsonWriterTestCase.java
+++ b/document/src/test/java/com/yahoo/document/json/JsonWriterTestCase.java
@@ -19,8 +19,10 @@ import com.yahoo.document.Field;
import com.yahoo.document.MapDataType;
import com.yahoo.document.PositionDataType;
import com.yahoo.document.StructDataType;
+import com.yahoo.document.TensorDataType;
import com.yahoo.document.WeightedSetDataType;
import com.yahoo.document.datatypes.TensorFieldValue;
+import com.yahoo.tensor.TensorType;
import com.yahoo.text.Utf8;
import org.apache.commons.codec.binary.Base64;
import org.junit.After;
@@ -115,7 +117,8 @@ public class JsonWriterTestCase {
}
{
DocumentType x = new DocumentType("testtensor");
- x.addField(new Field("tensorfield", DataType.TENSOR));
+ TensorType tensorType = new TensorType.Builder().mapped("x").mapped("y").build();
+ x.addField(new Field("tensorfield", new TensorDataType(tensorType)));
types.registerDocumentType(x);
}
}
@@ -298,7 +301,7 @@ public class JsonWriterTestCase {
@Test
public void testWritingOfEmptyTensor() throws IOException {
- assertTensorRoundTripEquality("{}","{ \"cells\": [{\"address\": {}, \"value\": 0.0}] }");
+ assertTensorRoundTripEquality("{}","{ \"cells\": [] }");
}
@Test
@@ -321,20 +324,12 @@ public class JsonWriterTestCase {
}
@Test
- public void testWritingOfTensorWithSingleCellWithEmptyAddress() throws IOException {
- assertTensorRoundTripEquality("{ "
- + " \"cells\": [ "
- + " { \"address\": {}, \"value\": 2.0 } "
- + " ]"
- + "}");
- }
-
- @Test
public void testWritingOfTensorFieldValueWithoutTensor() throws IOException {
- DocumentType tensorType = types.getDocumentType("testtensor");
+ DocumentType documentTypeWithTensor = types.getDocumentType("testtensor");
String docId = "id:unittest:testtensor::0";
- Document doc = new Document(tensorType, docId);
- doc.setFieldValue(tensorType.getField("tensorfield"), new TensorFieldValue());
+ Document doc = new Document(documentTypeWithTensor, docId);
+ Field tensorField = documentTypeWithTensor.getField("tensorfield");
+ doc.setFieldValue(tensorField, new TensorFieldValue(((TensorDataType)tensorField.getDataType()).getTensorType()));
assertEqualJson(asDocument(docId, "{ \"tensorfield\": {} }"), JsonWriter.toByteArray(doc));
}
diff --git a/document/src/test/java/com/yahoo/document/serialization/SerializationTestUtils.java b/document/src/test/java/com/yahoo/document/serialization/SerializationTestUtils.java
index f3987085e32..7e3fabc30fb 100644
--- a/document/src/test/java/com/yahoo/document/serialization/SerializationTestUtils.java
+++ b/document/src/test/java/com/yahoo/document/serialization/SerializationTestUtils.java
@@ -2,6 +2,7 @@
package com.yahoo.document.serialization;
import com.yahoo.document.Document;
+import com.yahoo.document.datatypes.TensorFieldValue;
import com.yahoo.io.GrowableByteBuffer;
import java.io.IOException;
diff --git a/document/src/test/java/com/yahoo/document/serialization/TensorFieldValueSerializationTestCase.java b/document/src/test/java/com/yahoo/document/serialization/TensorFieldValueSerializationTestCase.java
index 22cb35ae937..ae61bb3cf6f 100644
--- a/document/src/test/java/com/yahoo/document/serialization/TensorFieldValueSerializationTestCase.java
+++ b/document/src/test/java/com/yahoo/document/serialization/TensorFieldValueSerializationTestCase.java
@@ -4,8 +4,10 @@ package com.yahoo.document.serialization;
import com.yahoo.document.DataType;
import com.yahoo.document.Document;
import com.yahoo.document.DocumentType;
+import com.yahoo.document.TensorDataType;
import com.yahoo.document.datatypes.TensorFieldValue;
import com.yahoo.tensor.Tensor;
+import com.yahoo.tensor.TensorType;
import org.junit.Test;
import java.io.IOException;
@@ -19,30 +21,31 @@ import static org.junit.Assert.assertEquals;
*/
public class TensorFieldValueSerializationTestCase {
+ private final static TensorType tensorType = new TensorType.Builder().mapped("dimX").mapped("dimY").build();
private final static String TENSOR_FIELD = "my_tensor";
private final static String TENSOR_FILES = "src/test/resources/tensor/";
- private final static TestDocumentFactory docFactory =
- new TestDocumentFactory(createDocType(), "id:test:my_type::foo");
+ private final static TestDocumentFactory docFactory = new TestDocumentFactory(createDocType(),
+ "id:test:my_type::foo");
private static DocumentType createDocType() {
DocumentType type = new DocumentType("my_type");
- type.addField(TENSOR_FIELD, DataType.TENSOR);
+ type.addField(TENSOR_FIELD, new TensorDataType(tensorType));
return type;
}
@Test
public void requireThatTensorFieldValueIsSerializedAndDeserialized() {
- assertSerialization(new TensorFieldValue());
- assertSerialization(createTensor("{}"));
- assertSerialization(createTensor("{{dimX:a,dimY:bb}:2.0,{dimX:ccc,dimY:dddd}:3.0,{dimX:e,dimY:ff}:5.0}"));
+ assertSerialization(new TensorFieldValue(tensorType));
+ assertSerialization(createTensor(tensorType, "{}"));
+ assertSerialization(createTensor(tensorType, "{{dimX:a,dimY:bb}:2.0,{dimX:ccc,dimY:dddd}:3.0,{dimX:e,dimY:ff}:5.0}"));
}
@Test
public void requireThatSerializationMatchesCpp() throws IOException {
- assertSerializationMatchesCpp("non_existing_tensor", new TensorFieldValue());
- assertSerializationMatchesCpp("empty_tensor", createTensor("{}"));
+ assertSerializationMatchesCpp("non_existing_tensor", new TensorFieldValue(tensorType));
+ assertSerializationMatchesCpp("empty_tensor", createTensor(tensorType, "{}"));
assertSerializationMatchesCpp("multi_cell_tensor",
- createTensor("{{dimX:a,dimY:bb}:2.0,{dimX:ccc,dimY:dddd}:3.0,{dimX:e,dimY:ff}:5.0}"));
+ createTensor(tensorType, "{{dimX:a,dimY:bb}:2.0,{dimX:ccc,dimY:dddd}:3.0,{dimX:e,dimY:ff}:5.0}"));
}
private static void assertSerialization(TensorFieldValue tensor) {
@@ -60,8 +63,8 @@ public class TensorFieldValueSerializationTestCase {
SerializationTestUtils.assertSerializationMatchesCpp(TENSOR_FILES, fileName, document, docFactory);
}
- private static TensorFieldValue createTensor(String tensor) {
- return new TensorFieldValue(Tensor.from(tensor));
+ private static TensorFieldValue createTensor(TensorType type, String tensorCellString) {
+ return new TensorFieldValue(Tensor.from(type, tensorCellString));
}
}
diff --git a/document/src/test/java/com/yahoo/vespaxmlparser/VespaXmlFieldReaderTestCase.java b/document/src/test/java/com/yahoo/vespaxmlparser/VespaXmlFieldReaderTestCase.java
index 3cfbcac5b62..3dc6ebd1403 100644
--- a/document/src/test/java/com/yahoo/vespaxmlparser/VespaXmlFieldReaderTestCase.java
+++ b/document/src/test/java/com/yahoo/vespaxmlparser/VespaXmlFieldReaderTestCase.java
@@ -12,6 +12,7 @@ import com.yahoo.document.predicate.FeatureRange;
import com.yahoo.document.predicate.FeatureSet;
import com.yahoo.document.predicate.Predicate;
import com.yahoo.document.serialization.DeserializationException;
+import com.yahoo.tensor.TensorType;
import org.apache.commons.codec.binary.Base64;
import org.junit.Test;
@@ -75,8 +76,8 @@ public class VespaXmlFieldReaderTestCase {
@Test
public void requireThatPutsForTensorFieldsAreNotSupported() throws Exception {
- assertThrows(new Field("my_tensor", DataType.TENSOR), "",
- "Field 'my_tensor': XML input for fields of type TENSOR is not supported. Please use JSON input instead.");
+ assertThrows(new Field("my_tensor", new TensorDataType(TensorType.empty)), "",
+ "Field 'my_tensor': XML input for fields of type TENSOR is not supported. Please use JSON input instead.");
}
private class MockedReaderFixture {
diff --git a/document/src/test/java/com/yahoo/vespaxmlparser/VespaXmlUpdateReaderTestCase.java b/document/src/test/java/com/yahoo/vespaxmlparser/VespaXmlUpdateReaderTestCase.java
index 8730265c80d..8a5fabde9ea 100644
--- a/document/src/test/java/com/yahoo/vespaxmlparser/VespaXmlUpdateReaderTestCase.java
+++ b/document/src/test/java/com/yahoo/vespaxmlparser/VespaXmlUpdateReaderTestCase.java
@@ -7,7 +7,9 @@ import com.yahoo.document.DocumentTypeManager;
import com.yahoo.document.DocumentUpdate;
import com.yahoo.document.Field;
import com.yahoo.document.StructDataType;
+import com.yahoo.document.TensorDataType;
import com.yahoo.document.serialization.DeserializationException;
+import com.yahoo.tensor.TensorType;
import org.junit.Ignore;
import org.junit.Test;
@@ -215,8 +217,8 @@ public class VespaXmlUpdateReaderTestCase {
@Test
public void requireThatUpdatesForTensorFieldsAreNotSupported() throws Exception {
- assertThrows(new Field("my_tensor", DataType.TENSOR), "<assign field='my_tensor'></assign>",
- "Field 'my_tensor': XML input for fields of type TENSOR is not supported. Please use JSON input instead.");
+ assertThrows(new Field("my_tensor", new TensorDataType(TensorType.empty)), "<assign field='my_tensor'></assign>",
+ "Field 'my_tensor': XML input for fields of type TENSOR is not supported. Please use JSON input instead.");
}
private static void assertThrows(Field field, String fieldXml, String expected) throws Exception {
diff --git a/document/src/test/resources/tensor/empty_tensor__cpp b/document/src/test/resources/tensor/empty_tensor__cpp
index 365182b14eb..2c15c152558 100644
--- a/document/src/test/resources/tensor/empty_tensor__cpp
+++ b/document/src/test/resources/tensor/empty_tensor__cpp
Binary files differ
diff --git a/document/src/test/resources/tensor/empty_tensor__java b/document/src/test/resources/tensor/empty_tensor__java
index 1fbade8c785..2c15c152558 100644
--- a/document/src/test/resources/tensor/empty_tensor__java
+++ b/document/src/test/resources/tensor/empty_tensor__java
Binary files differ
diff --git a/document/src/test/resources/tensor/multi_cell_tensor__cpp b/document/src/test/resources/tensor/multi_cell_tensor__cpp
index c0b2b3a165a..d923fc10559 100644
--- a/document/src/test/resources/tensor/multi_cell_tensor__cpp
+++ b/document/src/test/resources/tensor/multi_cell_tensor__cpp
Binary files differ
diff --git a/document/src/tests/serialization/vespadocumentserializer_test.cpp b/document/src/tests/serialization/vespadocumentserializer_test.cpp
index 98aa3f3ae3e..7e5e978f0d1 100644
--- a/document/src/tests/serialization/vespadocumentserializer_test.cpp
+++ b/document/src/tests/serialization/vespadocumentserializer_test.cpp
@@ -811,7 +811,7 @@ void checkDeserialization(const string &name, std::unique_ptr<Tensor> tensor) {
TEST("Require that tensor deserialization matches Java") {
checkDeserialization("non_existing_tensor", std::unique_ptr<Tensor>());
- checkDeserialization("empty_tensor", createTensor({{{}, 0.0}}, {}));
+ checkDeserialization("empty_tensor", createTensor({}, {}));
checkDeserialization("multi_cell_tensor",
createTensor({ {{{"dimX", "a"}, {"dimY", "bb"}}, 2.0 },
{{{"dimX", "ccc"},
diff --git a/document/src/vespa/document/config/documentmanager.def b/document/src/vespa/document/config/documentmanager.def
index 267273cfa21..6ababfc19fb 100644
--- a/document/src/vespa/document/config/documentmanager.def
+++ b/document/src/vespa/document/config/documentmanager.def
@@ -60,6 +60,10 @@ datatype[].structtype[].field[].id[].id int
## one specified in config.
datatype[].structtype[].field[].datatype int
+## Additional, optional type information which can be changed without
+## (necessarily) causing field incompatibility
+datatype[].structtype[].field[].detailedtype string default=""
+
## Specify a document type to inherit
datatype[].structtype[].inherits[].name string
diff --git a/document/src/vespa/document/config/documenttypes.def b/document/src/vespa/document/config/documenttypes.def
index 5e0c5e4e528..21cde02ad54 100644
--- a/document/src/vespa/document/config/documenttypes.def
+++ b/document/src/vespa/document/config/documenttypes.def
@@ -28,7 +28,7 @@ documenttype[].inherits[].id int
documenttype[].datatype[].id int
## This is the type of the datatype.
-documenttype[].datatype[].type enum {STRUCT, ARRAY, WSET, MAP, ANNOTATIONREF, PRIMITIVE}
+documenttype[].datatype[].type enum {STRUCT, ARRAY, WSET, MAP, ANNOTATIONREF, PRIMITIVE, TENSOR}
## This is the id of the datatype of the element in the array.
documenttype[].datatype[].array.element.id int default=0
@@ -82,6 +82,10 @@ documenttype[].datatype[].sstruct.field[].id_v6 int
## or one of its inherited document types.
documenttype[].datatype[].sstruct.field[].datatype int
+## Additional, optional type information which can be changed without
+## (necessarily) causing field incompatibility
+documenttype[].datatype[].sstruct.field[].detailedtype string default=""
+
## The id of the annotation type.
documenttype[].annotationtype[].id int
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ArithmeticExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ArithmeticExpression.java
index ce56597cc86..cd783999456 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ArithmeticExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ArithmeticExpression.java
@@ -74,10 +74,10 @@ public class ArithmeticExpression extends CompositeExpression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- DataType input = ctx.getValue();
- ctx.setValue(evaluate(ctx.setValue(input).execute(lhs).getValue(),
- ctx.setValue(input).execute(rhs).getValue()));
+ protected void doVerify(VerificationContext context) {
+ DataType input = context.getValue();
+ context.setValue(evaluate(context.setValue(input).execute(lhs).getValue(),
+ context.setValue(input).execute(rhs).getValue()));
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Base64DecodeExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Base64DecodeExpression.java
index d40005bcba1..97034185a40 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Base64DecodeExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Base64DecodeExpression.java
@@ -33,8 +33,8 @@ public class Base64DecodeExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.setValue(createdOutputType());
+ protected void doVerify(VerificationContext context) {
+ context.setValue(createdOutputType());
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Base64EncodeExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Base64EncodeExpression.java
index b29971449e4..dc86c0480ea 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Base64EncodeExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Base64EncodeExpression.java
@@ -25,8 +25,8 @@ public class Base64EncodeExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.setValue(createdOutputType());
+ protected void doVerify(VerificationContext context) {
+ context.setValue(createdOutputType());
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/CatExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/CatExpression.java
index fe7771f83ec..79576563504 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/CatExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/CatExpression.java
@@ -49,17 +49,17 @@ public class CatExpression extends ExpressionList<Expression> {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- DataType input = ctx.getValue();
+ protected void doVerify(VerificationContext context) {
+ DataType input = context.getValue();
List<DataType> types = new LinkedList<>();
for (Expression exp : this) {
- DataType val = ctx.setValue(input).execute(exp).getValue();
+ DataType val = context.setValue(input).execute(exp).getValue();
types.add(val);
if (val == null) {
throw new VerificationException(this, "Attempting to concatenate a null value (" + exp + ").");
}
}
- ctx.setValue(resolveOutputType(types));
+ context.setValue(resolveOutputType(types));
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ClearStateExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ClearStateExpression.java
index 7fb4951bfd9..a8af8f7b4fb 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ClearStateExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ClearStateExpression.java
@@ -15,8 +15,8 @@ public class ClearStateExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.clear();
+ protected void doVerify(VerificationContext context) {
+ context.clear();
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EchoExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EchoExpression.java
index 67f0c2faef4..93fbf4339bb 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EchoExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EchoExpression.java
@@ -31,7 +31,7 @@ public class EchoExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
+ protected void doVerify(VerificationContext context) {
// empty
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExactExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExactExpression.java
index be70291cb70..9727cc815cf 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExactExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExactExpression.java
@@ -39,7 +39,7 @@ public class ExactExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
+ protected void doVerify(VerificationContext context) {
// empty
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Expression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Expression.java
index f94a100b31d..2ed288760e7 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Expression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Expression.java
@@ -13,7 +13,7 @@ import com.yahoo.vespa.indexinglanguage.parser.ParseException;
import com.yahoo.vespa.objects.Selectable;
/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a>
+ * @author Simon Thoresen
*/
public abstract class Expression extends Selectable {
@@ -30,9 +30,9 @@ public abstract class Expression extends Selectable {
return adapter.getFullOutput();
}
- public static DocumentUpdate execute(Expression expression, AdapterFactory factory, DocumentUpdate upd) {
+ public static DocumentUpdate execute(Expression expression, AdapterFactory factory, DocumentUpdate update) {
DocumentUpdate ret = null;
- for (UpdateAdapter adapter : factory.newUpdateAdapterList(upd)) {
+ for (UpdateAdapter adapter : factory.newUpdateAdapterList(update)) {
DocumentUpdate output = adapter.getExpression(expression).execute(adapter);
if (output == null) {
// ignore
@@ -43,7 +43,7 @@ public abstract class Expression extends Selectable {
}
}
if (ret != null) {
- ret.setCreateIfNonExistent(upd.getCreateIfNonExistent());
+ ret.setCreateIfNonExistent(update.getCreateIfNonExistent());
}
return ret;
}
@@ -57,10 +57,10 @@ public abstract class Expression extends Selectable {
return execute(new ExecutionContext(adapter));
}
- public final FieldValue execute(ExecutionContext ctx) {
+ public final FieldValue execute(ExecutionContext context) {
DataType inputType = requiredInputType();
if (inputType != null) {
- FieldValue input = ctx.getValue();
+ FieldValue input = context.getValue();
if (input == null) {
return null;
}
@@ -69,16 +69,16 @@ public abstract class Expression extends Selectable {
" input, got " + input.getDataType().getName() + ".");
}
}
- doExecute(ctx);
+ doExecute(context);
DataType outputType = createdOutputType();
if (outputType != null) {
- FieldValue output = ctx.getValue();
+ FieldValue output = context.getValue();
if (output != null && !outputType.isValueCompatible(output)) {
throw new IllegalStateException("Expression '" + this + "' expected " + outputType.getName() +
" output, got " + output.getDataType().getName() + ".");
}
}
- return ctx.getValue();
+ return context.getValue();
}
protected abstract void doExecute(ExecutionContext ctx);
@@ -132,12 +132,10 @@ public abstract class Expression extends Selectable {
return verify(new VerificationContext(adapter));
}
- public final DataType verify(VerificationContext ctx) {
-// System.err.println("enter_verify(exp = '" + this + "', req = " + requiredInputType(ctx) +
-// ", in = " + ctx.getValue() + ")");
+ public final DataType verify(VerificationContext context) {
DataType inputType = requiredInputType();
if (inputType != null) {
- DataType input = ctx.getValue();
+ DataType input = context.getValue();
if (input == null) {
throw new VerificationException(this, "Expected " + inputType.getName() + " input, got null.");
}
@@ -149,12 +147,10 @@ public abstract class Expression extends Selectable {
input.getName() + ".");
}
}
- doVerify(ctx);
+ doVerify(context);
DataType outputType = createdOutputType();
-// System.err.println("exit_verify(exp = '" + this + "', req = " + createdOutputType(ctx) +
-// ", out = " + ctx.getValue() + ")");
if (outputType != null) {
- DataType output = ctx.getValue();
+ DataType output = context.getValue();
if (output == null) {
throw new VerificationException(this, "Expected " + outputType.getName() + " output, got null.");
}
@@ -166,10 +162,10 @@ public abstract class Expression extends Selectable {
output.getName() + ".");
}
}
- return ctx.getValue();
+ return context.getValue();
}
- protected abstract void doVerify(VerificationContext ctx);
+ protected abstract void doVerify(VerificationContext context);
public abstract DataType requiredInputType();
@@ -203,12 +199,13 @@ public abstract class Expression extends Selectable {
}
return true;
}
+
// Convenience For testing
public static Document execute(Expression expression, Document doc) {
return expression.execute(new SimpleAdapterFactory(), doc);
}
- public static final DocumentUpdate execute(Expression expression, DocumentUpdate upd) {
- return expression.execute(expression, new SimpleAdapterFactory(), upd);
+ public static final DocumentUpdate execute(Expression expression, DocumentUpdate update) {
+ return expression.execute(expression, new SimpleAdapterFactory(), update);
}
public final FieldValue execute() {
return execute(new ExecutionContext());
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/FlattenExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/FlattenExpression.java
index 915092f5e02..a0dc490d4a4 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/FlattenExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/FlattenExpression.java
@@ -58,8 +58,8 @@ public class FlattenExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.setValue(createdOutputType());
+ protected void doVerify(VerificationContext context) {
+ context.setValue(createdOutputType());
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ForEachExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ForEachExpression.java
index a74f02e9a4a..d634309ca9f 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ForEachExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ForEachExpression.java
@@ -45,26 +45,26 @@ public class ForEachExpression extends CompositeExpression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- DataType input = ctx.getValue();
+ protected void doVerify(VerificationContext context) {
+ DataType input = context.getValue();
if (input instanceof ArrayDataType || input instanceof WeightedSetDataType) {
- ctx.setValue(((CollectionDataType)input).getNestedType()).execute(exp);
+ context.setValue(((CollectionDataType)input).getNestedType()).execute(exp);
if (input instanceof ArrayDataType) {
- ctx.setValue(DataType.getArray(ctx.getValue()));
+ context.setValue(DataType.getArray(context.getValue()));
} else {
WeightedSetDataType wset = (WeightedSetDataType)input;
- ctx.setValue(DataType.getWeightedSet(ctx.getValue(), wset.createIfNonExistent(), wset.removeIfZero()));
+ context.setValue(DataType.getWeightedSet(context.getValue(), wset.createIfNonExistent(), wset.removeIfZero()));
}
} else if (input instanceof StructDataType) {
for (Field field : ((StructDataType)input).getFields()) {
DataType fieldType = field.getDataType();
- DataType valueType = ctx.setValue(fieldType).execute(exp).getValue();
+ DataType valueType = context.setValue(fieldType).execute(exp).getValue();
if (!fieldType.isAssignableFrom(valueType)) {
throw new VerificationException(this, "Expected " + fieldType.getName() + " output, got " +
valueType.getName() + ".");
}
}
- ctx.setValue(input);
+ context.setValue(input);
} else {
throw new VerificationException(this, "Expected Array, Struct or WeightedSet input, got " +
input.getName() + ".");
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GetFieldExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GetFieldExpression.java
index 6cc06953437..80fc5ad04f5 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GetFieldExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GetFieldExpression.java
@@ -38,8 +38,8 @@ public class GetFieldExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- DataType input = ctx.getValue();
+ protected void doVerify(VerificationContext context) {
+ DataType input = context.getValue();
if (!(input instanceof StructuredDataType)) {
throw new VerificationException(this, "Expected structured input, got " + input.getName() + ".");
}
@@ -47,7 +47,7 @@ public class GetFieldExpression extends Expression {
if (field == null) {
throw new VerificationException(this, "Field '" + fieldName + "' not found.");
}
- ctx.setValue(field.getDataType());
+ context.setValue(field.getDataType());
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GetVarExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GetVarExpression.java
index 34f0139037b..e18143fb2f4 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GetVarExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GetVarExpression.java
@@ -25,12 +25,12 @@ public class GetVarExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- DataType input = ctx.getVariable(varName);
+ protected void doVerify(VerificationContext context) {
+ DataType input = context.getVariable(varName);
if (input == null) {
throw new VerificationException(this, "Variable '" + varName + "' not found.");
}
- ctx.setValue(input);
+ context.setValue(input);
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GuardExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GuardExpression.java
index b7a49e938b5..db187f0b5d1 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GuardExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GuardExpression.java
@@ -35,8 +35,8 @@ public class GuardExpression extends CompositeExpression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- exp.verify(ctx);
+ protected void doVerify(VerificationContext context) {
+ exp.verify(context);
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexDecodeExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexDecodeExpression.java
index 11e58883b27..b582218f958 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexDecodeExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexDecodeExpression.java
@@ -37,8 +37,8 @@ public class HexDecodeExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.setValue(createdOutputType());
+ protected void doVerify(VerificationContext context) {
+ context.setValue(createdOutputType());
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexEncodeExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexEncodeExpression.java
index 80c7b95308f..18650837ad6 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexEncodeExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexEncodeExpression.java
@@ -18,8 +18,8 @@ public class HexEncodeExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.setValue(createdOutputType());
+ protected void doVerify(VerificationContext context) {
+ context.setValue(createdOutputType());
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HostNameExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HostNameExpression.java
index 30007090b78..b8fdfb0f26a 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HostNameExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HostNameExpression.java
@@ -22,8 +22,8 @@ public class HostNameExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.setValue(createdOutputType());
+ protected void doVerify(VerificationContext context) {
+ context.setValue(createdOutputType());
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/IfThenExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/IfThenExpression.java
index eb7e1c9a005..d81672da371 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/IfThenExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/IfThenExpression.java
@@ -95,13 +95,13 @@ public class IfThenExpression extends CompositeExpression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- DataType input = ctx.getValue();
- ctx.setValue(input).execute(lhs);
- ctx.setValue(input).execute(rhs);
- ctx.setValue(input).execute(ifTrue);
- ctx.setValue(input).execute(ifFalse);
- ctx.setValue(input);
+ protected void doVerify(VerificationContext context) {
+ DataType input = context.getValue();
+ context.setValue(input).execute(lhs);
+ context.setValue(input).execute(rhs);
+ context.setValue(input).execute(ifTrue);
+ context.setValue(input).execute(ifFalse);
+ context.setValue(input);
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/InputExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/InputExpression.java
index 29957e440a4..618c7787440 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/InputExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/InputExpression.java
@@ -38,12 +38,12 @@ public class InputExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- DataType val = ctx.getInputType(this, fieldName);
+ protected void doVerify(VerificationContext context) {
+ DataType val = context.getInputType(this, fieldName);
if (val == null) {
throw new VerificationException(this, "Field '" + fieldName + "' not found.");
}
- ctx.setValue(val);
+ context.setValue(val);
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/JoinExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/JoinExpression.java
index b440c2e68c8..b73ac949cae 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/JoinExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/JoinExpression.java
@@ -44,12 +44,12 @@ public class JoinExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- DataType input = ctx.getValue();
+ protected void doVerify(VerificationContext context) {
+ DataType input = context.getValue();
if (!(input instanceof ArrayDataType)) {
throw new VerificationException(this, "Expected Array input, got " + input.getName() + ".");
}
- ctx.setValue(createdOutputType());
+ context.setValue(createdOutputType());
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/LowerCaseExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/LowerCaseExpression.java
index 272e2c3a3e5..e64c3a21a31 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/LowerCaseExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/LowerCaseExpression.java
@@ -18,8 +18,8 @@ public class LowerCaseExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.setValue(createdOutputType());
+ protected void doVerify(VerificationContext context) {
+ context.setValue(createdOutputType());
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NGramExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NGramExpression.java
index 74e2b30a799..441c30dd9d9 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NGramExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NGramExpression.java
@@ -73,7 +73,7 @@ public class NGramExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
+ protected void doVerify(VerificationContext context) {
// empty
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NowExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NowExpression.java
index 75fb355580c..ec1ac5ee4ed 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NowExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NowExpression.java
@@ -30,8 +30,8 @@ public class NowExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.setValue(createdOutputType());
+ protected void doVerify(VerificationContext context) {
+ context.setValue(createdOutputType());
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/OptimizePredicateExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/OptimizePredicateExpression.java
index 838fb0b3c3b..b3980cf71ad 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/OptimizePredicateExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/OptimizePredicateExpression.java
@@ -42,11 +42,11 @@ public class OptimizePredicateExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- checkVariable(ctx, "arity", DataType.INT, true);
- checkVariable(ctx, "lower_bound", DataType.LONG, false);
- checkVariable(ctx, "upper_bound", DataType.LONG, false);
- ctx.setValue(DataType.PREDICATE);
+ protected void doVerify(VerificationContext context) {
+ checkVariable(context, "arity", DataType.INT, true);
+ checkVariable(context, "lower_bound", DataType.LONG, false);
+ checkVariable(context, "upper_bound", DataType.LONG, false);
+ context.setValue(DataType.PREDICATE);
}
private void checkVariable(VerificationContext ctx, String var, DataType type, boolean required) {
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/OutputExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/OutputExpression.java
index 063ec3a8955..fdda256eab2 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/OutputExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/OutputExpression.java
@@ -27,8 +27,8 @@ public abstract class OutputExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.tryOutputType(this, fieldName, ctx.getValue());
+ protected void doVerify(VerificationContext context) {
+ context.tryOutputType(this, fieldName, context.getValue());
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ParenthesisExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ParenthesisExpression.java
index 57d833a0748..3b1f3bd234d 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ParenthesisExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ParenthesisExpression.java
@@ -27,8 +27,8 @@ public class ParenthesisExpression extends CompositeExpression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- innerExp.verify(ctx);
+ protected void doVerify(VerificationContext context) {
+ innerExp.verify(context);
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/RandomExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/RandomExpression.java
index 8a5cfc1bb88..4aeeafb8ba6 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/RandomExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/RandomExpression.java
@@ -38,8 +38,8 @@ public class RandomExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.setValue(createdOutputType());
+ protected void doVerify(VerificationContext context) {
+ context.setValue(createdOutputType());
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ScriptExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ScriptExpression.java
index 79ac7590cac..d536127f123 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ScriptExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ScriptExpression.java
@@ -41,12 +41,12 @@ public class ScriptExpression extends ExpressionList<StatementExpression> {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- DataType input = ctx.getValue();
+ protected void doVerify(VerificationContext context) {
+ DataType input = context.getValue();
for (Expression exp : this) {
- ctx.setValue(input).execute(exp);
+ context.setValue(input).execute(exp);
}
- ctx.setValue(input);
+ context.setValue(input);
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SelectInputExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SelectInputExpression.java
index 8663dcf7a9d..fd079812cfc 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SelectInputExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SelectInputExpression.java
@@ -42,16 +42,16 @@ public class SelectInputExpression extends CompositeExpression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- DataType input = ctx.getValue();
+ protected void doVerify(VerificationContext context) {
+ DataType input = context.getValue();
for (Pair<String, Expression> entry : cases) {
- DataType val = ctx.getInputType(this, entry.getFirst());
+ DataType val = context.getInputType(this, entry.getFirst());
if (val == null) {
throw new VerificationException(this, "Field '" + entry.getFirst() + "' not found.");
}
- ctx.setValue(val).execute(entry.getSecond());
+ context.setValue(val).execute(entry.getSecond());
}
- ctx.setValue(input);
+ context.setValue(input);
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetLanguageExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetLanguageExpression.java
index 35f02ccb05b..59a4d2a42b5 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetLanguageExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetLanguageExpression.java
@@ -16,7 +16,7 @@ public class SetLanguageExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
+ protected void doVerify(VerificationContext context) {
// empty
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetValueExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetValueExpression.java
index edc1fcfa9ee..59091dc06c0 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetValueExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetValueExpression.java
@@ -30,8 +30,8 @@ public class SetValueExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.setValue(value.getDataType());
+ protected void doVerify(VerificationContext context) {
+ context.setValue(value.getDataType());
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetVarExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetVarExpression.java
index d92831fd6b3..61267f32e33 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetVarExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetVarExpression.java
@@ -25,14 +25,14 @@ public class SetVarExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- DataType next = ctx.getValue();
- DataType prev = ctx.getVariable(varName);
+ protected void doVerify(VerificationContext context) {
+ DataType next = context.getValue();
+ DataType prev = context.getVariable(varName);
if (prev != null && !prev.equals(next)) {
throw new VerificationException(this, "Attempting to assign conflicting types to variable '" + varName +
"', " + prev.getName() + " vs " + next.getName() + ".");
}
- ctx.setVariable(varName, next);
+ context.setVariable(varName, next);
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SplitExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SplitExpression.java
index c2cfcd0cd0e..1fea4029c3b 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SplitExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SplitExpression.java
@@ -38,8 +38,8 @@ public class SplitExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.setValue(createdOutputType());
+ protected void doVerify(VerificationContext context) {
+ context.setValue(createdOutputType());
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/StatementExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/StatementExpression.java
index 012ca87ed37..0595165c5ba 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/StatementExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/StatementExpression.java
@@ -35,9 +35,9 @@ public class StatementExpression extends ExpressionList<Expression> {
}
@Override
- protected void doVerify(VerificationContext ctx) {
+ protected void doVerify(VerificationContext context) {
for (Expression exp : this) {
- ctx.execute(exp);
+ context.execute(exp);
}
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SubstringExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SubstringExpression.java
index bb4351bee77..fabfc1f742e 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SubstringExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SubstringExpression.java
@@ -44,8 +44,8 @@ public class SubstringExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.setValue(createdOutputType());
+ protected void doVerify(VerificationContext context) {
+ context.setValue(createdOutputType());
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SwitchExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SwitchExpression.java
index 21f633c3aba..45ec5c45b74 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SwitchExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SwitchExpression.java
@@ -73,8 +73,8 @@ public class SwitchExpression extends CompositeExpression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- DataType input = ctx.getValue();
+ protected void doVerify(VerificationContext context) {
+ DataType input = context.getValue();
if (input == null) {
throw new VerificationException(this, "Expected " + DataType.STRING.getName() + " input, got null.");
}
@@ -83,10 +83,10 @@ public class SwitchExpression extends CompositeExpression {
input.getName() + ".");
}
for (Expression exp : cases.values()) {
- ctx.setValue(input).execute(exp);
+ context.setValue(input).execute(exp);
}
- ctx.setValue(input).execute(defaultExp);
- ctx.setValue(input);
+ context.setValue(input).execute(defaultExp);
+ context.setValue(input);
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ThisExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ThisExpression.java
index 8ad37b98f4c..ffea3f9ac92 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ThisExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ThisExpression.java
@@ -15,7 +15,7 @@ public class ThisExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
+ protected void doVerify(VerificationContext context) {
// empty
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToArrayExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToArrayExpression.java
index 197ed431955..4f072b9c820 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToArrayExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToArrayExpression.java
@@ -26,8 +26,8 @@ public class ToArrayExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.setValue(DataType.getArray(ctx.getValue()));
+ protected void doVerify(VerificationContext context) {
+ context.setValue(DataType.getArray(context.getValue()));
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToByteExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToByteExpression.java
index cd01f8251b0..c537fcb5e45 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToByteExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToByteExpression.java
@@ -16,8 +16,8 @@ public class ToByteExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.setValue(createdOutputType());
+ protected void doVerify(VerificationContext context) {
+ context.setValue(createdOutputType());
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToDoubleExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToDoubleExpression.java
index fb54aefe696..3cf7a1d14d7 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToDoubleExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToDoubleExpression.java
@@ -16,8 +16,8 @@ public class ToDoubleExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.setValue(createdOutputType());
+ protected void doVerify(VerificationContext context) {
+ context.setValue(createdOutputType());
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToFloatExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToFloatExpression.java
index ebd866abfa9..1bac0df2020 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToFloatExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToFloatExpression.java
@@ -16,8 +16,8 @@ public class ToFloatExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.setValue(createdOutputType());
+ protected void doVerify(VerificationContext context) {
+ context.setValue(createdOutputType());
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToIntegerExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToIntegerExpression.java
index 0c900c7756a..b39a3803ba0 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToIntegerExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToIntegerExpression.java
@@ -16,8 +16,8 @@ public class ToIntegerExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.setValue(createdOutputType());
+ protected void doVerify(VerificationContext context) {
+ context.setValue(createdOutputType());
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToLongExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToLongExpression.java
index 63b8b446437..efb914fb203 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToLongExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToLongExpression.java
@@ -16,8 +16,8 @@ public class ToLongExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.setValue(createdOutputType());
+ protected void doVerify(VerificationContext context) {
+ context.setValue(createdOutputType());
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToPositionExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToPositionExpression.java
index 2b89e05b7b2..1b2bb923ae1 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToPositionExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToPositionExpression.java
@@ -16,8 +16,8 @@ public class ToPositionExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.setValue(createdOutputType());
+ protected void doVerify(VerificationContext context) {
+ context.setValue(createdOutputType());
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToStringExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToStringExpression.java
index 0db289a6b6b..997bd01646b 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToStringExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToStringExpression.java
@@ -15,8 +15,8 @@ public class ToStringExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.setValue(createdOutputType());
+ protected void doVerify(VerificationContext context) {
+ context.setValue(createdOutputType());
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToWsetExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToWsetExpression.java
index f15bac00031..8dcb5336dc7 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToWsetExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToWsetExpression.java
@@ -42,8 +42,8 @@ public class ToWsetExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.setValue(DataType.getWeightedSet(ctx.getValue(), createIfNonExistent, removeIfZero));
+ protected void doVerify(VerificationContext context) {
+ context.setValue(DataType.getWeightedSet(context.getValue(), createIfNonExistent, removeIfZero));
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/TokenizeExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/TokenizeExpression.java
index 272fbde342c..1617b715c68 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/TokenizeExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/TokenizeExpression.java
@@ -46,7 +46,7 @@ public class TokenizeExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
+ protected void doVerify(VerificationContext context) {
// empty
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/TrimExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/TrimExpression.java
index d544b9218e4..4b23be7fe91 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/TrimExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/TrimExpression.java
@@ -16,8 +16,8 @@ public class TrimExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.setValue(createdOutputType());
+ protected void doVerify(VerificationContext context) {
+ context.setValue(createdOutputType());
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ZCurveExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ZCurveExpression.java
index cdf795ea7d5..65e06c970a8 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ZCurveExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ZCurveExpression.java
@@ -32,8 +32,8 @@ public class ZCurveExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
- ctx.setValue(createdOutputType());
+ protected void doVerify(VerificationContext context) {
+ context.setValue(createdOutputType());
}
@Override
diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ExpressionConverterTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ExpressionConverterTestCase.java
index cd5f17c3b98..068ebedc4fc 100644
--- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ExpressionConverterTestCase.java
+++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ExpressionConverterTestCase.java
@@ -264,7 +264,7 @@ public class ExpressionConverterTestCase {
}
@Override
- protected void doVerify(VerificationContext ctx) {
+ protected void doVerify(VerificationContext context) {
}
diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ForEachTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ForEachTestCase.java
index 2bf00c98490..a13cc2125e5 100644
--- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ForEachTestCase.java
+++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ForEachTestCase.java
@@ -237,7 +237,7 @@ public class ForEachTestCase {
}
@Override
- protected void doVerify(VerificationContext ctx) {
+ protected void doVerify(VerificationContext context) {
}
diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/SimpleExpression.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/SimpleExpression.java
index 11f269b4d01..9f3b431ff75 100644
--- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/SimpleExpression.java
+++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/SimpleExpression.java
@@ -47,9 +47,9 @@ class SimpleExpression extends Expression {
}
@Override
- protected void doVerify(VerificationContext ctx) {
+ protected void doVerify(VerificationContext context) {
if (hasVerifyValue) {
- ctx.setValue(verifyValue);
+ context.setValue(verifyValue);
}
}
diff --git a/vespajlib/src/main/java/com/yahoo/tensor/TensorType.java b/vespajlib/src/main/java/com/yahoo/tensor/TensorType.java
index fbc469c1829..b0132693fa3 100644
--- a/vespajlib/src/main/java/com/yahoo/tensor/TensorType.java
+++ b/vespajlib/src/main/java/com/yahoo/tensor/TensorType.java
@@ -74,6 +74,25 @@ public class TensorType {
return Optional.empty();
}
+ /**
+ * Returns whether a tensor of the given type can be assigned to this type,
+ * i.e of this type is a generalization of the given type.
+ */
+ public boolean isAssignableTo(TensorType other) {
+ if (other.dimensions().size() != this.dimensions().size()) return false;
+ for (int i = 0; i < other.dimensions().size(); i++) {
+ Dimension thisDimension = this.dimensions().get(i);
+ Dimension otherDimension = other.dimensions().get(i);
+ if (thisDimension.isIndexed() != otherDimension.isIndexed()) return false;
+ if ( ! thisDimension.name().equals(otherDimension.name())) return false;
+ if (thisDimension.size().isPresent()) {
+ if ( ! otherDimension.size().isPresent()) return false;
+ if (otherDimension.size().get() > thisDimension.size().get() ) return false;
+ }
+ }
+ return true;
+ }
+
@Override
public String toString() {
return "tensor(" + dimensions.stream().map(Dimension::toString).collect(Collectors.joining(",")) + ")";
diff --git a/vespajlib/src/main/java/com/yahoo/tensor/serialization/SparseBinaryFormat.java b/vespajlib/src/main/java/com/yahoo/tensor/serialization/SparseBinaryFormat.java
index 30b36e83457..8ab23c8d77c 100644
--- a/vespajlib/src/main/java/com/yahoo/tensor/serialization/SparseBinaryFormat.java
+++ b/vespajlib/src/main/java/com/yahoo/tensor/serialization/SparseBinaryFormat.java
@@ -54,24 +54,12 @@ class SparseBinaryFormat implements BinaryFormat {
@Override
public Tensor decode(TensorType type, GrowableByteBuffer buffer) {
- if (type == null) // TODO (January 2017): Remove this when types are available
- type = decodeDimensionsToType(buffer);
- else
- consumeAndValidateDimensions(type, buffer);
+ consumeAndValidateDimensions(type, buffer);
Tensor.Builder builder = Tensor.Builder.of(type);
decodeCells(buffer, builder, type);
return builder.build();
}
- private TensorType decodeDimensionsToType(GrowableByteBuffer buffer) {
- TensorType.Builder builder = new TensorType.Builder();
- int numDimensions = buffer.getInt1_4Bytes();
- for (int i = 0; i < numDimensions; ++i) {
- builder.mapped(buffer.getUtf8String());
- }
- return builder.build();
- }
-
private void consumeAndValidateDimensions(TensorType type, GrowableByteBuffer buffer) {
int dimensionCount = buffer.getInt1_4Bytes();
if (type.dimensions().size() != dimensionCount)
diff --git a/vespajlib/src/main/java/com/yahoo/tensor/serialization/TypedBinaryFormat.java b/vespajlib/src/main/java/com/yahoo/tensor/serialization/TypedBinaryFormat.java
index 65216aa2fcd..19c1810d928 100644
--- a/vespajlib/src/main/java/com/yahoo/tensor/serialization/TypedBinaryFormat.java
+++ b/vespajlib/src/main/java/com/yahoo/tensor/serialization/TypedBinaryFormat.java
@@ -24,7 +24,7 @@ public class TypedBinaryFormat {
public static byte[] encode(Tensor tensor) {
GrowableByteBuffer buffer = new GrowableByteBuffer();
- if (tensor instanceof IndexedTensor && 1==2) { // TODO: Activate when we have type information everywhere
+ if (tensor instanceof IndexedTensor) {
buffer.putInt1_4Bytes(DENSE_BINARY_FORMAT_TYPE);
new DenseBinaryFormat().encode(buffer, tensor);
}
diff --git a/vespajlib/src/main/java/com/yahoo/vespa/objects/Identifiable.java b/vespajlib/src/main/java/com/yahoo/vespa/objects/Identifiable.java
index e0edc6f4e64..d303a69a68d 100644
--- a/vespajlib/src/main/java/com/yahoo/vespa/objects/Identifiable.java
+++ b/vespajlib/src/main/java/com/yahoo/vespa/objects/Identifiable.java
@@ -16,7 +16,7 @@ import java.util.HashMap;
* methods.
*
* @author baldersheim
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a>
+ * @author Simon Thoresen
*/
public class Identifiable extends Selectable implements Cloneable {
@@ -177,7 +177,7 @@ public class Identifiable extends Selectable implements Cloneable {
*
* @param id The class identifier to register with.
* @param spec The class to register.
- * @return The identifier argument.
+ * @return the identifier argument.
*/
protected static int registerClass(int id, Class<? extends Identifiable> spec) {
if (registry == null) {
diff --git a/vespajlib/src/test/java/com/yahoo/tensor/serialization/DenseBinaryFormatTestCase.java b/vespajlib/src/test/java/com/yahoo/tensor/serialization/DenseBinaryFormatTestCase.java
index d2b2044f3ed..15e82e6b15c 100644
--- a/vespajlib/src/test/java/com/yahoo/tensor/serialization/DenseBinaryFormatTestCase.java
+++ b/vespajlib/src/test/java/com/yahoo/tensor/serialization/DenseBinaryFormatTestCase.java
@@ -28,7 +28,6 @@ public class DenseBinaryFormatTestCase {
}
@Test
- @Ignore // TODO: Activate when encoding in this format is activated
public void requireThatSerializationFormatDoNotChange() {
byte[] encodedTensor = new byte[]{2, // binary format type
2, // dimension count