aboutsummaryrefslogtreecommitdiffstats
path: root/config-model/src/test/java/com/yahoo/schema/derived
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2022-05-19 12:03:06 +0200
committerJon Bratseth <bratseth@gmail.com>2022-05-19 12:03:06 +0200
commit5c24dc5c9642a8d9ed70aee4c950fd0678a1ebec (patch)
treebd9b74bf00c832456f0b83c1b2cd7010be387d68 /config-model/src/test/java/com/yahoo/schema/derived
parentf17c4fe7de4c55f5c4ee61897eab8c2f588d8405 (diff)
Rename the 'searchdefinition' package to 'schema'
Diffstat (limited to 'config-model/src/test/java/com/yahoo/schema/derived')
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/AbstractExportingTestCase.java165
-rwxr-xr-xconfig-model/src/test/java/com/yahoo/schema/derived/AnnotationsTestCase.java66
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/ArraysTestCase.java23
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/AttributeListTestCase.java129
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/AttributesTestCase.java36
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/CasingTestCase.java36
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/CombinedAttributeAndIndexSchemaTestCase.java21
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/DeriverTestCase.java31
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/DuplicateStructTestCase.java19
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/EmptyRankProfileTestCase.java38
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/ExactMatchTestCase.java17
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/ExportingTestCase.java195
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/ExpressionsAsArgsTestCase.java25
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/FieldsetTestCase.java16
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/GeminiTestCase.java70
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/IdTestCase.java49
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/ImportedFieldsTestCase.java42
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/IndexSchemaTestCase.java208
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/InheritanceTestCase.java192
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/IntegerAttributeToStringIndexTestCase.java17
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/LiteralBoostTestCase.java113
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/LowercaseTestCase.java19
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/MailTestCase.java24
-rwxr-xr-xconfig-model/src/test/java/com/yahoo/schema/derived/MatchSettingsResolvingTestCase.java63
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/MultiStructTestCase.java27
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/MultipleSummariesTestCase.java22
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/NameCollisionTestCase.java27
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/NativeRankTypeDefinitionsTestCase.java92
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/NearestNeighborTestCase.java39
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/NeuralNetTestCase.java42
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/NuwaTestCase.java33
-rwxr-xr-xconfig-model/src/test/java/com/yahoo/schema/derived/OrderIlscriptsTestCase.java19
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/PrefixExactAttributeTestCase.java21
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/RankProfilesTestCase.java20
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/RankPropertiesTestCase.java19
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/ReferenceFieldsTestCase.java18
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/ReferenceFromSeveralTestCase.java27
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/SchemaInheritanceTestCase.java34
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/SchemaOrdererTestCase.java146
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/SimpleInheritTestCase.java47
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/SliceTestCase.java23
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/SortingTestCase.java22
-rwxr-xr-xconfig-model/src/test/java/com/yahoo/schema/derived/StreamingStructTestCase.java26
-rwxr-xr-xconfig-model/src/test/java/com/yahoo/schema/derived/StructAnyOrderTestCase.java17
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/StructInheritanceTestCase.java52
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/SummaryMapTestCase.java187
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/SummaryTestCase.java182
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/TestableDeployLogger.java30
-rwxr-xr-xconfig-model/src/test/java/com/yahoo/schema/derived/TokenizationTestCase.java19
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/TwoStreamingStructsTestCase.java34
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/TypeConversionTestCase.java44
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/TypesTestCase.java21
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/VsmFieldsTestCase.java42
53 files changed, 2946 insertions, 0 deletions
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/AbstractExportingTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/AbstractExportingTestCase.java
new file mode 100644
index 00000000000..ad2c2d6078d
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/AbstractExportingTestCase.java
@@ -0,0 +1,165 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.config.application.api.DeployLogger;
+import com.yahoo.config.model.application.provider.MockFileRegistry;
+import com.yahoo.config.model.deploy.DeployState;
+import com.yahoo.config.model.deploy.TestProperties;
+import com.yahoo.document.config.DocumenttypesConfig;
+import com.yahoo.document.config.DocumentmanagerConfig;
+import com.yahoo.schema.Schema;
+import com.yahoo.schema.ApplicationBuilder;
+import com.yahoo.schema.AbstractSchemaTestCase;
+import com.yahoo.schema.parser.ParseException;
+import com.yahoo.vespa.configmodel.producers.DocumentManager;
+import com.yahoo.vespa.configmodel.producers.DocumentTypes;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Superclass of tests needing file comparisons
+ *
+ * @author bratseth
+ */
+public abstract class AbstractExportingTestCase extends AbstractSchemaTestCase {
+
+ private static final String tempDir = "temp/";
+ private static final String schemaRoot = "src/test/derived/";
+
+ private DerivedConfiguration derive(String dirName,
+ String schemaName,
+ TestProperties properties,
+ DeployLogger logger) throws IOException, ParseException {
+ File toDir = new File(tempDir + dirName);
+ toDir.mkdirs();
+ deleteContent(toDir);
+
+ ApplicationBuilder builder = ApplicationBuilder.createFromDirectory(schemaRoot + dirName + "/",
+ new MockFileRegistry(),
+ logger,
+ properties);
+ return derive(dirName, schemaName, properties, builder, logger);
+ }
+
+ private DerivedConfiguration derive(String dirName,
+ String schemaName,
+ TestProperties properties,
+ ApplicationBuilder builder,
+ DeployLogger logger) throws IOException {
+ DerivedConfiguration config = new DerivedConfiguration(builder.getSchema(schemaName),
+ new DeployState.Builder().properties(properties)
+ .deployLogger(logger)
+ .rankProfileRegistry(builder.getRankProfileRegistry())
+ .queryProfiles(builder.getQueryProfileRegistry())
+ .build());
+ return export(dirName, builder, config);
+ }
+
+ DerivedConfiguration derive(String dirName, ApplicationBuilder builder, Schema schema) throws IOException {
+ DerivedConfiguration config = new DerivedConfiguration(schema,
+ builder.getRankProfileRegistry(),
+ builder.getQueryProfileRegistry());
+ return export(dirName, builder, config);
+ }
+
+ private DerivedConfiguration export(String name, ApplicationBuilder builder, DerivedConfiguration config) throws IOException {
+ String path = exportConfig(name, config);
+ DerivedConfiguration.exportDocuments(new DocumentManager()
+ .produce(builder.getModel(), new DocumentmanagerConfig.Builder()), path);
+ DerivedConfiguration.exportDocuments(new DocumentTypes().produce(builder.getModel(), new DocumenttypesConfig.Builder()), path);
+ DerivedConfiguration.exportQueryProfiles(builder.getQueryProfileRegistry(), path);
+ config.exportConstants(path);
+ return config;
+ }
+
+ private String exportConfig(String name, DerivedConfiguration config) throws IOException {
+ String path = tempDir + name;
+ config.export(path);
+ return path;
+ }
+
+ /**
+ * Derives a config from name/name.sd below the test dir and verifies that every .cfg file in name/ has a
+ * corresponding file with the same content in temp/name. Versions can and should be omitted from the .cfg file
+ * names. This will fail if the search definition dir has multiple search definitions.
+ *
+ * @param dirName the name of the directory containing the searchdef file to verify
+ * @throws ParseException if the .sd file could not be parsed
+ * @throws IOException if file access failed
+ */
+ protected DerivedConfiguration assertCorrectDeriving(String dirName) throws IOException, ParseException {
+ return assertCorrectDeriving(dirName, new TestableDeployLogger());
+ }
+ protected DerivedConfiguration assertCorrectDeriving(String dirName, DeployLogger logger) throws IOException, ParseException {
+ return assertCorrectDeriving(dirName, null, logger);
+ }
+
+ protected DerivedConfiguration assertCorrectDeriving(String dirName,
+ String searchDefinitionName,
+ DeployLogger logger) throws IOException, ParseException {
+ return assertCorrectDeriving(dirName, searchDefinitionName, new TestProperties(), logger);
+ }
+
+ protected DerivedConfiguration assertCorrectDeriving(String dirName,
+ TestProperties properties) throws IOException, ParseException {
+ return assertCorrectDeriving(dirName, null, properties, new TestableDeployLogger());
+ }
+
+ protected DerivedConfiguration assertCorrectDeriving(String dirName,
+ String schemaName,
+ TestProperties properties,
+ DeployLogger logger) throws IOException, ParseException {
+ DerivedConfiguration derived = derive(dirName, schemaName, properties, logger);
+ assertCorrectConfigFiles(dirName);
+ return derived;
+ }
+
+ /**
+ * Asserts config is correctly derived given a builder.
+ * This will fail if the builder contains multiple search definitions.
+ */
+ protected DerivedConfiguration assertCorrectDeriving(ApplicationBuilder builder, String dirName, DeployLogger logger) throws IOException {
+ builder.build(true);
+ DerivedConfiguration derived = derive(dirName, null, new TestProperties(), builder, logger);
+ assertCorrectConfigFiles(dirName);
+ return derived;
+ }
+
+ protected DerivedConfiguration assertCorrectDeriving(ApplicationBuilder builder, Schema schema, String name) throws IOException {
+ DerivedConfiguration derived = derive(name, builder, schema);
+ assertCorrectConfigFiles(name);
+ return derived;
+ }
+
+ /**
+ * Assert that search is derived into the files in the directory given by name.
+ *
+ * @param name the local name of the directory containing the files to check
+ * @throws IOException if file access failed
+ */
+ void assertCorrectConfigFiles(String name) throws IOException {
+ File[] files = new File(schemaRoot, name).listFiles();
+ if (files == null) return;
+ for (File file : files) {
+ if ( ! file.getName().endsWith(".cfg")) continue;
+ boolean orderMatters = file.getName().equals("ilscripts.cfg");
+ assertEqualFiles(file.getPath(), tempDir + name + "/" + file.getName(), orderMatters);
+ }
+ }
+
+ static void assertEqualFiles(String correctFileName, String checkFileName, boolean orderMatters) throws IOException {
+ // Set updateOnAssert to true if you want update the files with correct answer.
+ assertConfigFiles(correctFileName, checkFileName, orderMatters, false);
+ }
+
+ void deleteContent(File dir) {
+ File[] files = dir.listFiles();
+ if (files == null) return;
+
+ for (File file : files) {
+ file.delete();
+ }
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/AnnotationsTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/AnnotationsTestCase.java
new file mode 100755
index 00000000000..60867261f93
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/AnnotationsTestCase.java
@@ -0,0 +1,66 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * @author Einar M R Rosenvinge
+ */
+public class AnnotationsTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void requireThatStructRegistersIfOnlyUsedByAnnotation() throws IOException, ParseException {
+ assertCorrectDeriving("annotationsstruct");
+ }
+
+ @Test
+ public void requireThatStructRegistersIfOnlyUsedAsArrayByAnnotation() throws IOException, ParseException {
+ assertCorrectDeriving("annotationsstructarray");
+ }
+
+ @Test
+ public void testSimpleAnnotationDeriving() throws IOException, ParseException {
+ assertCorrectDeriving("annotationssimple");
+ }
+
+ @Test
+ public void testAnnotationDerivingWithImplicitStruct() throws IOException, ParseException {
+ assertCorrectDeriving("annotationsimplicitstruct");
+ }
+
+ @Test
+ public void testAnnotationDerivingInheritance() throws IOException, ParseException {
+ assertCorrectDeriving("annotationsinheritance");
+ }
+
+ @Test
+ public void testAnnotationDerivingInheritance2() throws IOException, ParseException {
+ assertCorrectDeriving("annotationsinheritance2");
+ }
+
+ @Test
+ public void testSimpleReference() throws IOException, ParseException {
+ assertCorrectDeriving("annotationsreference");
+ }
+
+ @Test
+ public void testAdvancedReference() throws IOException, ParseException {
+ assertCorrectDeriving("annotationsreference2");
+ }
+
+ @Test
+ public void testAnnotationsPolymorphy() throws IOException, ParseException {
+ assertCorrectDeriving("annotationspolymorphy");
+ }
+
+ /**
+ * An annotation declared before document {} should work.
+ */
+ @Test
+ public void testAnnotationOutsideOfDocumentNew() throws IOException, ParseException {
+ assertCorrectDeriving("annotationsoutsideofdocument");
+ }
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/ArraysTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/ArraysTestCase.java
new file mode 100644
index 00000000000..5b138413a7a
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/ArraysTestCase.java
@@ -0,0 +1,23 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * Tests array type deriving. Indexing statements over array
+ * types is not yet supported, so this tests document type
+ * configuration deriving only. Expand later.
+ *
+ * @author bratseth
+ */
+public class ArraysTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testDocumentDeriving() throws IOException, ParseException {
+ assertCorrectDeriving("arrays");
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/AttributeListTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/AttributeListTestCase.java
new file mode 100644
index 00000000000..1c51d3ec365
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/AttributeListTestCase.java
@@ -0,0 +1,129 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.Schema;
+import com.yahoo.schema.ApplicationBuilder;
+import com.yahoo.schema.AbstractSchemaTestCase;
+import com.yahoo.schema.document.Attribute;
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.Iterator;
+
+import static com.yahoo.config.model.test.TestUtil.joinLines;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * Tests attribute deriving
+ *
+ * @author bratseth
+ */
+public class AttributeListTestCase extends AbstractSchemaTestCase {
+
+ @Test
+ public void testDeriving() throws IOException, ParseException {
+ // Test attribute importing
+ Schema schema = ApplicationBuilder.buildFromFile("src/test/examples/simple.sd");
+
+ // Test attribute deriving
+ AttributeFields attributeFields = new AttributeFields(schema);
+ Iterator attributes = attributeFields.attributeIterator();
+ Attribute attribute;
+ attribute = (Attribute)attributes.next();
+ assertEquals("popularity", attribute.getName());
+ assertEquals(Attribute.Type.INTEGER, attribute.getType());
+ assertEquals(Attribute.CollectionType.SINGLE, attribute.getCollectionType());
+
+ attribute = (Attribute)attributes.next();
+ assertEquals("measurement", attribute.getName());
+ assertEquals(Attribute.Type.INTEGER, attribute.getType());
+ assertEquals(Attribute.CollectionType.SINGLE, attribute.getCollectionType());
+
+ attribute = (Attribute)attributes.next();
+ assertEquals("smallattribute", attribute.getName());
+ assertEquals(Attribute.Type.BYTE, attribute.getType());
+ assertEquals(Attribute.CollectionType.ARRAY, attribute.getCollectionType());
+
+ attribute = (Attribute)attributes.next();
+ assertEquals("access", attribute.getName());
+ assertEquals(Attribute.Type.BYTE, attribute.getType());
+ assertEquals(Attribute.CollectionType.SINGLE, attribute.getCollectionType());
+
+ attribute = (Attribute)attributes.next();
+ assertEquals("category_arr", attribute.getName());
+ assertEquals(Attribute.Type.STRING, attribute.getType());
+ assertEquals(Attribute.CollectionType.ARRAY, attribute.getCollectionType());
+
+ attribute = (Attribute)attributes.next();
+ assertEquals("measurement_arr", attribute.getName());
+ assertEquals(Attribute.Type.INTEGER, attribute.getType());
+ assertEquals(Attribute.CollectionType.ARRAY, attribute.getCollectionType());
+
+ attribute = (Attribute)attributes.next();
+ assertEquals("popsiness", attribute.getName());
+ assertEquals(Attribute.Type.INTEGER, attribute.getType());
+ assertEquals(Attribute.CollectionType.SINGLE, attribute.getCollectionType());
+
+ assertFalse(attributes.hasNext());
+ }
+
+ @Test
+ public void fields_in_array_of_struct_are_derived_into_array_attributes() throws IOException, ParseException {
+ Schema schema = ApplicationBuilder.buildFromFile("src/test/derived/array_of_struct_attribute/test.sd");
+ Iterator<Attribute> attributes = new AttributeFields(schema).attributeIterator();
+
+ assertAttribute("elem_array.name", Attribute.Type.STRING, Attribute.CollectionType.ARRAY, true, attributes.next());
+ assertAttribute("elem_array.weight", Attribute.Type.INTEGER, Attribute.CollectionType.ARRAY, false, attributes.next());
+ assertFalse(attributes.hasNext());
+ }
+
+ @Test
+ public void fields_in_map_of_struct_are_derived_into_array_attributes() throws IOException, ParseException {
+ Schema schema = ApplicationBuilder.buildFromFile("src/test/derived/map_of_struct_attribute/test.sd");
+ Iterator<Attribute> attributes = new AttributeFields(schema).attributeIterator();
+
+ assertAttribute("str_elem_map.key", Attribute.Type.STRING, Attribute.CollectionType.ARRAY, true, attributes.next());
+ assertAttribute("str_elem_map.value.name", Attribute.Type.STRING, Attribute.CollectionType.ARRAY, false, attributes.next());
+ assertAttribute("str_elem_map.value.weight", Attribute.Type.INTEGER, Attribute.CollectionType.ARRAY, false, attributes.next());
+ assertAttribute("int_elem_map.key", Attribute.Type.INTEGER, Attribute.CollectionType.ARRAY, false, attributes.next());
+ assertAttribute("int_elem_map.value.name", Attribute.Type.STRING, Attribute.CollectionType.ARRAY, true, attributes.next());
+ assertFalse(attributes.hasNext());
+ }
+
+ private static void assertAttribute(String name, Attribute.Type type, Attribute.CollectionType collection, boolean isFastSearch, Attribute attr) {
+ assertEquals(name, attr.getName());
+ assertEquals(type, attr.getType());
+ assertEquals(collection, attr.getCollectionType());
+ assertEquals(isFastSearch, attr.isFastSearch());
+ }
+
+ @Test
+ public void only_zcurve_attribute_is_derived_from_array_of_position_field() throws ParseException {
+ Schema schema = ApplicationBuilder.createFromString(
+ joinLines("search test {",
+ " document test {",
+ " field pos_array type array<position> {",
+ " indexing: attribute",
+ " }",
+ " }",
+ "}")).getSchema();
+ Iterator<Attribute> attributes = new AttributeFields(schema).attributeIterator();
+
+ assertAttribute("pos_array_zcurve", Attribute.Type.LONG, Attribute.CollectionType.ARRAY, true, attributes.next());
+ assertFalse(attributes.hasNext());
+ }
+
+ @Test
+ public void fields_in_map_of_primitive_are_derived_into_array_attributes() throws IOException, ParseException {
+ Schema schema = ApplicationBuilder.buildFromFile("src/test/derived/map_attribute/test.sd");
+ Iterator<Attribute> attributes = new AttributeFields(schema).attributeIterator();
+
+ assertAttribute("str_map.key", Attribute.Type.STRING, Attribute.CollectionType.ARRAY, true, attributes.next());
+ assertAttribute("str_map.value", Attribute.Type.STRING, Attribute.CollectionType.ARRAY, false, attributes.next());
+ assertAttribute("int_map.key", Attribute.Type.INTEGER, Attribute.CollectionType.ARRAY, false, attributes.next());
+ assertFalse(attributes.hasNext());
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/AttributesTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/AttributesTestCase.java
new file mode 100644
index 00000000000..3d08805acdf
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/AttributesTestCase.java
@@ -0,0 +1,36 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * Tests attribute settings
+ *
+ * @author bratseth
+ */
+public class AttributesTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testDocumentDeriving() throws IOException, ParseException {
+ assertCorrectDeriving("attributes");
+ }
+
+ @Test
+ public void testArrayOfStructAttribute() throws IOException, ParseException {
+ assertCorrectDeriving("array_of_struct_attribute");
+ }
+
+ @Test
+ public void testMapOfStructAttribute() throws IOException, ParseException {
+ assertCorrectDeriving("map_of_struct_attribute");
+ }
+
+ @Test
+ public void testMapOfPrimitiveAttribute() throws IOException, ParseException {
+ assertCorrectDeriving("map_attribute");
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/CasingTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/CasingTestCase.java
new file mode 100644
index 00000000000..80ebcb825f4
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/CasingTestCase.java
@@ -0,0 +1,36 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.Schema;
+import com.yahoo.schema.ApplicationBuilder;
+import com.yahoo.schema.AbstractSchemaTestCase;
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Correct casing for derived attributes
+ *
+ * @author vegardh
+ */
+public class CasingTestCase extends AbstractSchemaTestCase {
+
+ @Test
+ public void testCasing() throws IOException, ParseException {
+ Schema schema = ApplicationBuilder.buildFromFile("src/test/examples/casing.sd");
+ assertEquals(schema.getIndex("color").getName(), "color");
+ assertEquals(schema.getIndex("Foo").getName(), "Foo");
+ assertEquals(schema.getIndex("Price").getName(), "Price");
+ assertEquals(schema.getAttribute("artist").getName(), "artist");
+ assertEquals(schema.getAttribute("Drummer").getName(), "Drummer");
+ assertEquals(schema.getAttribute("guitarist").getName(), "guitarist");
+ assertEquals(schema.getAttribute("title").getName(), "title");
+ assertEquals(schema.getAttribute("Trumpetist").getName(), "Trumpetist");
+ assertEquals(schema.getAttribute("Saxophonist").getName(), "Saxophonist");
+ assertEquals(schema.getAttribute("TenorSaxophonist").getName(), "TenorSaxophonist");
+ assertEquals(schema.getAttribute("Flutist").getName(), "Flutist");
+ }
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/CombinedAttributeAndIndexSchemaTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/CombinedAttributeAndIndexSchemaTestCase.java
new file mode 100644
index 00000000000..542320d9670
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/CombinedAttributeAndIndexSchemaTestCase.java
@@ -0,0 +1,21 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * Tests deriving a configuration with multiple summaries
+ *
+ * @author bratseth
+ */
+public class CombinedAttributeAndIndexSchemaTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testMultipleSummaries() throws IOException, ParseException {
+ assertCorrectDeriving("combinedattributeandindexsearch");
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/DeriverTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/DeriverTestCase.java
new file mode 100644
index 00000000000..422f4522b26
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/DeriverTestCase.java
@@ -0,0 +1,31 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.document.DataType;
+import com.yahoo.document.DocumentTypeManager;
+import com.yahoo.document.config.DocumentmanagerConfig;
+import com.yahoo.schema.AbstractSchemaTestCase;
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Tests deriving using the Deriver facade
+ *
+ * @author bratseth
+ */
+public class DeriverTestCase extends AbstractSchemaTestCase {
+
+ @Test
+ public void testDeriveDocManager() {
+ DocumentTypeManager dtm = new DocumentTypeManager(new DocumentmanagerConfig(
+ Deriver.getDocumentManagerConfig(List.of(
+ "src/test/derived/deriver/child.sd",
+ "src/test/derived/deriver/parent.sd",
+ "src/test/derived/deriver/grandparent.sd"))));
+ assertEquals(dtm.getDocumentType("child").getField("a").getDataType(), DataType.STRING);
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/DuplicateStructTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/DuplicateStructTestCase.java
new file mode 100644
index 00000000000..7915a1d7763
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/DuplicateStructTestCase.java
@@ -0,0 +1,19 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.config.model.deploy.TestProperties;
+import org.junit.Test;
+
+/**
+ * @author arnej
+ */
+public class DuplicateStructTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void exact_duplicate_struct_works() throws Exception {
+ assertCorrectDeriving("duplicate_struct", "foobar",
+ new TestProperties(),
+ new TestableDeployLogger());
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/EmptyRankProfileTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/EmptyRankProfileTestCase.java
new file mode 100644
index 00000000000..c3195d1a626
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/EmptyRankProfileTestCase.java
@@ -0,0 +1,38 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.config.model.test.MockApplicationPackage;
+import com.yahoo.document.DataType;
+import com.yahoo.search.query.profile.QueryProfileRegistry;
+import com.yahoo.schema.RankProfileRegistry;
+import com.yahoo.schema.Schema;
+import com.yahoo.schema.ApplicationBuilder;
+import com.yahoo.schema.AbstractSchemaTestCase;
+import com.yahoo.schema.document.SDDocumentType;
+import com.yahoo.schema.document.SDField;
+import org.junit.Test;
+
+/**
+ * Tests deriving rank for files from search definitions
+ *
+ * @author bratseth
+ */
+public class EmptyRankProfileTestCase extends AbstractSchemaTestCase {
+
+ @Test
+ public void testDeriving() {
+ Schema schema = new Schema("test", MockApplicationPackage.createEmpty());
+ RankProfileRegistry rankProfileRegistry = RankProfileRegistry.createRankProfileRegistryWithBuiltinRankProfiles(schema);
+ SDDocumentType doc = new SDDocumentType("test");
+ schema.addDocument(doc);
+ doc.addField(new SDField(doc, "a", DataType.STRING));
+ SDField field = new SDField(doc, "b", DataType.STRING);
+ field.setLiteralBoost(500);
+ doc.addField(field);
+ doc.addField(new SDField(doc, "c", DataType.STRING));
+
+ schema = ApplicationBuilder.buildFromRawSchema(schema, rankProfileRegistry, new QueryProfileRegistry());
+ new DerivedConfiguration(schema, rankProfileRegistry);
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/ExactMatchTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/ExactMatchTestCase.java
new file mode 100644
index 00000000000..13a0a8201fb
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/ExactMatchTestCase.java
@@ -0,0 +1,17 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * @author bratseth
+ */
+public class ExactMatchTestCase extends AbstractExportingTestCase {
+ @Test
+ public void testExactString() throws IOException, ParseException {
+ assertCorrectDeriving("exactmatch");
+ }
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/ExportingTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/ExportingTestCase.java
new file mode 100644
index 00000000000..16a9a459dcb
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/ExportingTestCase.java
@@ -0,0 +1,195 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.config.model.deploy.TestProperties;
+import com.yahoo.schema.ApplicationBuilder;
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Tests exporting
+ *
+ * @author bratseth
+ */
+public class ExportingTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testIndexInfoLowerCase() throws IOException, ParseException {
+ assertCorrectDeriving("indexinfo_lowercase");
+ }
+
+ @Test
+ public void testPositionArray() throws IOException, ParseException {
+ assertCorrectDeriving("position_array",
+ new TestProperties().setUseV8GeoPositions(true));
+ }
+
+ @Test
+ public void testPositionAttribute() throws IOException, ParseException {
+ assertCorrectDeriving("position_attribute",
+ new TestProperties().setUseV8GeoPositions(true));
+ }
+
+ @Test
+ public void testPositionExtra() throws IOException, ParseException {
+ assertCorrectDeriving("position_extra",
+ new TestProperties().setUseV8GeoPositions(true));
+ }
+
+ @Test
+ public void testPositionNoSummary() throws IOException, ParseException {
+ assertCorrectDeriving("position_nosummary",
+ new TestProperties().setUseV8GeoPositions(true));
+ }
+
+ @Test
+ public void testPositionSummary() throws IOException, ParseException {
+ assertCorrectDeriving("position_summary",
+ new TestProperties().setUseV8GeoPositions(true));
+ }
+
+ @Test
+ public void testUriArray() throws IOException, ParseException {
+ assertCorrectDeriving("uri_array");
+ }
+
+ @Test
+ public void testUriWSet() throws IOException, ParseException {
+ assertCorrectDeriving("uri_wset");
+ }
+
+ @Test
+ public void testMusic() throws IOException, ParseException {
+ assertCorrectDeriving("music");
+ }
+
+ @Test
+ public void testComplexPhysicalExporting() throws IOException, ParseException {
+ assertCorrectDeriving("complex");
+ }
+
+ @Test
+ public void testAttributePrefetch() throws IOException, ParseException {
+ assertCorrectDeriving("attributeprefetch");
+ }
+
+ @Test
+ public void testAdvancedIL() throws IOException, ParseException {
+ assertCorrectDeriving("advanced");
+ }
+
+ @Test
+ public void testEmptyDefaultIndex() throws IOException, ParseException {
+ assertCorrectDeriving("emptydefault");
+ }
+
+ @Test
+ public void testIndexSwitches() throws IOException, ParseException {
+ assertCorrectDeriving("indexswitches");
+ }
+
+ @Test
+ public void testRankTypes() throws IOException, ParseException {
+ assertCorrectDeriving("ranktypes");
+ }
+
+ @Test
+ public void testAttributeRank() throws IOException, ParseException {
+ assertCorrectDeriving("attributerank");
+ }
+
+ @Test
+ public void testNewRank() throws IOException, ParseException {
+ assertCorrectDeriving("newrank");
+ }
+
+ @Test
+ public void testRankingExpression() throws IOException, ParseException {
+ assertCorrectDeriving("rankingexpression");
+ }
+
+ @Test
+ public void testAvoidRenamingRankingExpression() throws IOException, ParseException {
+ assertCorrectDeriving("renamedfeatures", "foo",
+ new TestProperties().setAvoidRenamingSummaryFeatures(true),
+ new TestableDeployLogger());
+ }
+
+ @Test
+ public void testMlr() throws IOException, ParseException {
+ assertCorrectDeriving("mlr");
+ }
+
+ @Test
+ public void testMusic3() throws IOException, ParseException {
+ assertCorrectDeriving("music3");
+ }
+
+ @Test
+ public void testIndexSchema() throws IOException, ParseException {
+ assertCorrectDeriving("indexschema");
+ }
+
+ @Test
+ public void testIndexinfoFieldsets() throws IOException, ParseException {
+ assertCorrectDeriving("indexinfo_fieldsets");
+ }
+
+ @Test
+ public void testStreamingJuniper() throws IOException, ParseException {
+ assertCorrectDeriving("streamingjuniper");
+ }
+
+ @Test
+ public void testPredicateAttribute() throws IOException, ParseException {
+ assertCorrectDeriving("predicate_attribute");
+ }
+
+ @Test
+ public void testTensor() throws IOException, ParseException {
+ assertCorrectDeriving("tensor");
+ }
+
+ @Test
+ public void testTensor2() throws IOException, ParseException {
+ String dir = "src/test/derived/tensor2/";
+ ApplicationBuilder builder = new ApplicationBuilder();
+ builder.addSchemaFile(dir + "first.sd");
+ builder.addSchemaFile(dir + "second.sd");
+ builder.build(true);
+ derive("tensor2", builder, builder.getSchema("second"));
+ assertCorrectConfigFiles("tensor2");
+ }
+
+ @Test
+ public void testHnswIndex() throws IOException, ParseException {
+ assertCorrectDeriving("hnsw_index");
+ }
+
+ @Test
+ public void testRankProfileInheritance() throws IOException, ParseException {
+ assertCorrectDeriving("rankprofileinheritance", "child", new TestableDeployLogger());
+ }
+
+ @Test
+ public void testLanguage() throws IOException, ParseException {
+ TestableDeployLogger logger = new TestableDeployLogger();
+ assertCorrectDeriving("language", logger);
+ assertEquals(0, logger.warnings.size());
+ }
+
+ @Test
+ public void testRankProfileModularity() throws IOException, ParseException {
+ assertCorrectDeriving("rankprofilemodularity");
+ }
+
+ @Test
+ public void testStructAndFieldSet() throws IOException, ParseException {
+ assertCorrectDeriving("structandfieldset");
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/ExpressionsAsArgsTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/ExpressionsAsArgsTestCase.java
new file mode 100644
index 00000000000..d2020305bc1
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/ExpressionsAsArgsTestCase.java
@@ -0,0 +1,25 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * Tests correct deriving of expressions as arguments to functions.
+ *
+ * @author lesters
+ */
+public class ExpressionsAsArgsTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testDocumentDeriving() throws IOException, ParseException {
+ assertCorrectDeriving("function_arguments");
+ assertCorrectDeriving("function_arguments_with_expressions");
+ }
+
+}
+
+
+
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/FieldsetTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/FieldsetTestCase.java
new file mode 100644
index 00000000000..fdab49c9fff
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/FieldsetTestCase.java
@@ -0,0 +1,16 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+public class FieldsetTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testRankProfiles() throws IOException, ParseException {
+ assertCorrectDeriving("fieldset");
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/GeminiTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/GeminiTestCase.java
new file mode 100644
index 00000000000..5531fb65942
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/GeminiTestCase.java
@@ -0,0 +1,70 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.collections.Pair;
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author bratseth
+ */
+public class GeminiTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testRanking2() throws IOException, ParseException {
+ DerivedConfiguration c = assertCorrectDeriving("gemini2");
+ RawRankProfile p = c.getRankProfileList().getRankProfiles().get("test");
+ Map<String, String> ranking = removePartKeySuffixes(asMap(p.configProperties()));
+ assertEquals("attribute(right)", resolve(lookup("toplevel", ranking), ranking));
+ }
+
+ private Map<String, String> asMap(List<Pair<String, String>> properties) {
+ Map<String, String> map = new HashMap<>();
+ for (Pair<String, String> property : properties)
+ map.put(property.getFirst(), property.getSecond());
+ return map;
+ }
+
+ private Map<String, String> removePartKeySuffixes(Map<String, String> p) {
+ Map<String, String> pWithoutSuffixes = new HashMap<>();
+ for (Map.Entry<String, String> entry : p.entrySet())
+ pWithoutSuffixes.put(removePartSuffix(entry.getKey()), entry.getValue());
+ return pWithoutSuffixes;
+ }
+
+ private String removePartSuffix(String s) {
+ int partIndex = s.indexOf(".part");
+ if (partIndex <= 0) return s;
+ return s.substring(0, partIndex);
+ }
+
+ /**
+ * Recursively resolves references to other ranking expressions - rankingExpression(name) -
+ * and replaces the reference by the expression
+ */
+ private String resolve(String expression, Map<String, String> ranking) {
+ int referenceStartIndex;
+ while ((referenceStartIndex = expression.indexOf("rankingExpression(")) >= 0) {
+ int referenceEndIndex = expression.indexOf(")", referenceStartIndex);
+ expression = expression.substring(0, referenceStartIndex) +
+ resolve(lookup(expression.substring(referenceStartIndex + "rankingExpression(".length(), referenceEndIndex), ranking), ranking) +
+ expression.substring(referenceEndIndex + 1);
+ }
+ return expression;
+ }
+
+ private String lookup(String expressionName, Map<String, String> ranking) {
+ String value = ranking.get("rankingExpression(" + expressionName + ").rankingScript");
+ if (value == null) {
+ return expressionName;
+ }
+ return value;
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/IdTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/IdTestCase.java
new file mode 100644
index 00000000000..1e57d52e3b0
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/IdTestCase.java
@@ -0,0 +1,49 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.config.model.application.provider.BaseDeployLogger;
+import com.yahoo.config.model.test.MockApplicationPackage;
+import com.yahoo.document.DataType;
+import com.yahoo.schema.RankProfileRegistry;
+import com.yahoo.schema.Schema;
+import com.yahoo.schema.document.SDDocumentType;
+import com.yahoo.schema.document.SDField;
+import com.yahoo.schema.processing.Processing;
+import com.yahoo.vespa.model.container.search.QueryProfiles;
+import org.junit.Test;
+
+import java.util.Set;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+/**
+ * Tests that documents ids are treated as they should
+ *
+ * @author bratseth
+ */
+public class IdTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testExplicitUpperCaseIdField() {
+ Schema schema = new Schema("test", MockApplicationPackage.createEmpty());
+ SDDocumentType document = new SDDocumentType("test");
+ schema.addDocument(document);
+ SDField uri = new SDField(document, "URI", DataType.URI);
+ uri.parseIndexingScript("{ summary | index }");
+ document.addField(uri);
+
+ new Processing().process(schema, new BaseDeployLogger(), new RankProfileRegistry(), new QueryProfiles(),
+ true, false, Set.of());
+
+ assertNull(document.getField("uri"));
+ assertNull(document.getField("Uri"));
+ assertNotNull(document.getField("URI"));
+ }
+
+ @Test
+ public void testCompleteDeriving() throws Exception {
+ assertCorrectDeriving("id");
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/ImportedFieldsTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/ImportedFieldsTestCase.java
new file mode 100644
index 00000000000..5578a1a602b
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/ImportedFieldsTestCase.java
@@ -0,0 +1,42 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.config.model.deploy.TestProperties;
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * @author geirst
+ */
+public class ImportedFieldsTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void configs_for_imported_fields_are_derived() throws IOException, ParseException {
+ assertCorrectDeriving("importedfields", "child", new TestableDeployLogger());
+ }
+
+ @Test
+ public void configs_for_imported_struct_fields_are_derived() throws IOException, ParseException {
+ assertCorrectDeriving("imported_struct_fields", "child",
+ new TestProperties(),
+ new TestableDeployLogger());
+ }
+
+ @Test
+ public void configs_for_imported_position_field_are_derived() throws IOException, ParseException {
+ assertCorrectDeriving("imported_position_field", "child", new TestableDeployLogger());
+ }
+
+ @Test
+ public void configs_for_imported_position_field_summary_are_derived() throws IOException, ParseException {
+ assertCorrectDeriving("imported_position_field_summary", "child", new TestableDeployLogger());
+ }
+
+ @Test
+ public void derives_configs_for_imported_fields_when_reference_fields_are_inherited() throws IOException, ParseException {
+ assertCorrectDeriving("imported_fields_inherited_reference", "child_c", new TestableDeployLogger());
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/IndexSchemaTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/IndexSchemaTestCase.java
new file mode 100644
index 00000000000..1f40c6bcb50
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/IndexSchemaTestCase.java
@@ -0,0 +1,208 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.document.DataType;
+import com.yahoo.document.Field;
+import com.yahoo.document.StructDataType;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+/**
+ * @author Simon Thoresen Hult
+ */
+public class IndexSchemaTestCase {
+
+ @Test
+ public void requireThatPrimitiveIsNotFlattened() {
+ assertFlat(new Field("foo", DataType.BYTE), new Field("foo", DataType.BYTE));
+ assertFlat(new Field("foo", DataType.DOUBLE), new Field("foo", DataType.DOUBLE));
+ assertFlat(new Field("foo", DataType.FLOAT), new Field("foo", DataType.FLOAT));
+ assertFlat(new Field("foo", DataType.INT), new Field("foo", DataType.INT));
+ assertFlat(new Field("foo", DataType.LONG), new Field("foo", DataType.LONG));
+ assertFlat(new Field("foo", DataType.RAW), new Field("foo", DataType.RAW));
+ assertFlat(new Field("foo", DataType.STRING), new Field("foo", DataType.STRING));
+ assertFlat(new Field("foo", DataType.URI), new Field("foo", DataType.URI));
+ assertFlat(new Field("foo", DataType.PREDICATE), new Field("foo", DataType.PREDICATE));
+ }
+
+ @Test
+ public void requireThatArrayOfPrimitiveIsNotFlattened() {
+ assertFlat(new Field("foo", DataType.getArray(DataType.BYTE)),
+ new Field("foo", DataType.getArray(DataType.BYTE)));
+ assertFlat(new Field("foo", DataType.getArray(DataType.DOUBLE)),
+ new Field("foo", DataType.getArray(DataType.DOUBLE)));
+ assertFlat(new Field("foo", DataType.getArray(DataType.FLOAT)),
+ new Field("foo", DataType.getArray(DataType.FLOAT)));
+ assertFlat(new Field("foo", DataType.getArray(DataType.INT)),
+ new Field("foo", DataType.getArray(DataType.INT)));
+ assertFlat(new Field("foo", DataType.getArray(DataType.LONG)),
+ new Field("foo", DataType.getArray(DataType.LONG)));
+ assertFlat(new Field("foo", DataType.getArray(DataType.RAW)),
+ new Field("foo", DataType.getArray(DataType.RAW)));
+ assertFlat(new Field("foo", DataType.getArray(DataType.STRING)),
+ new Field("foo", DataType.getArray(DataType.STRING)));
+ assertFlat(new Field("foo", DataType.getArray(DataType.URI)),
+ new Field("foo", DataType.getArray(DataType.URI)));
+ assertFlat(new Field("foo", DataType.getArray(DataType.PREDICATE)),
+ new Field("foo", DataType.getArray(DataType.PREDICATE)));
+ }
+
+ @Test
+ public void requireThatStructIsFlattened() {
+ StructDataType type = new StructDataType("my_struct");
+ type.addField(new Field("my_byte", DataType.BYTE));
+ type.addField(new Field("my_double", DataType.DOUBLE));
+ type.addField(new Field("my_float", DataType.FLOAT));
+ type.addField(new Field("my_int", DataType.INT));
+ type.addField(new Field("my_long", DataType.LONG));
+ type.addField(new Field("my_raw", DataType.RAW));
+ type.addField(new Field("my_string", DataType.STRING));
+ type.addField(new Field("my_uri", DataType.URI));
+
+ assertFlat(new Field("foo", type),
+ new Field("foo.my_byte", DataType.BYTE),
+ new Field("foo.my_double", DataType.DOUBLE),
+ new Field("foo.my_float", DataType.FLOAT),
+ new Field("foo.my_int", DataType.INT),
+ new Field("foo.my_long", DataType.LONG),
+ new Field("foo.my_raw", DataType.RAW),
+ new Field("foo.my_string", DataType.STRING),
+ new Field("foo.my_uri", DataType.URI));
+ }
+
+ @Test
+ public void requireThatArrayOfStructIsFlattened() {
+ StructDataType type = new StructDataType("my_struct");
+ type.addField(new Field("my_byte", DataType.BYTE));
+ type.addField(new Field("my_double", DataType.DOUBLE));
+ type.addField(new Field("my_float", DataType.FLOAT));
+ type.addField(new Field("my_int", DataType.INT));
+ type.addField(new Field("my_long", DataType.LONG));
+ type.addField(new Field("my_raw", DataType.RAW));
+ type.addField(new Field("my_string", DataType.STRING));
+ type.addField(new Field("my_uri", DataType.URI));
+
+ assertFlat(new Field("foo", DataType.getArray(type)),
+ new Field("foo.my_byte", DataType.getArray(DataType.BYTE)),
+ new Field("foo.my_double", DataType.getArray(DataType.DOUBLE)),
+ new Field("foo.my_float", DataType.getArray(DataType.FLOAT)),
+ new Field("foo.my_int", DataType.getArray(DataType.INT)),
+ new Field("foo.my_long", DataType.getArray(DataType.LONG)),
+ new Field("foo.my_raw", DataType.getArray(DataType.RAW)),
+ new Field("foo.my_string", DataType.getArray(DataType.STRING)),
+ new Field("foo.my_uri", DataType.getArray(DataType.URI)));
+ }
+
+ @Test
+ public void requireThatArrayOfArrayOfStructIsFlattened() {
+ StructDataType type = new StructDataType("my_struct");
+ type.addField(new Field("my_byte", DataType.BYTE));
+ type.addField(new Field("my_double", DataType.DOUBLE));
+ type.addField(new Field("my_float", DataType.FLOAT));
+ type.addField(new Field("my_int", DataType.INT));
+ type.addField(new Field("my_long", DataType.LONG));
+ type.addField(new Field("my_raw", DataType.RAW));
+ type.addField(new Field("my_string", DataType.STRING));
+ type.addField(new Field("my_uri", DataType.URI));
+
+ assertFlat(new Field("foo", DataType.getArray(DataType.getArray(type))),
+ new Field("foo.my_byte", DataType.getArray(DataType.getArray(DataType.BYTE))),
+ new Field("foo.my_double", DataType.getArray(DataType.getArray(DataType.DOUBLE))),
+ new Field("foo.my_float", DataType.getArray(DataType.getArray(DataType.FLOAT))),
+ new Field("foo.my_int", DataType.getArray(DataType.getArray(DataType.INT))),
+ new Field("foo.my_long", DataType.getArray(DataType.getArray(DataType.LONG))),
+ new Field("foo.my_raw", DataType.getArray(DataType.getArray(DataType.RAW))),
+ new Field("foo.my_string", DataType.getArray(DataType.getArray(DataType.STRING))),
+ new Field("foo.my_uri", DataType.getArray(DataType.getArray(DataType.URI))));
+ }
+
+ @Test
+ public void requireThatStructWithArrayFieldIsFlattened() {
+ StructDataType type = new StructDataType("my_struct");
+ type.addField(new Field("my_byte", DataType.getArray(DataType.BYTE)));
+ type.addField(new Field("my_double", DataType.getArray(DataType.DOUBLE)));
+ type.addField(new Field("my_float", DataType.getArray(DataType.FLOAT)));
+ type.addField(new Field("my_int", DataType.getArray(DataType.INT)));
+ type.addField(new Field("my_long", DataType.getArray(DataType.LONG)));
+ type.addField(new Field("my_raw", DataType.getArray(DataType.RAW)));
+ type.addField(new Field("my_string", DataType.getArray(DataType.STRING)));
+ type.addField(new Field("my_uri", DataType.getArray(DataType.URI)));
+
+ assertFlat(new Field("foo", type),
+ new Field("foo.my_byte", DataType.getArray(DataType.BYTE)),
+ new Field("foo.my_double", DataType.getArray(DataType.DOUBLE)),
+ new Field("foo.my_float", DataType.getArray(DataType.FLOAT)),
+ new Field("foo.my_int", DataType.getArray(DataType.INT)),
+ new Field("foo.my_long", DataType.getArray(DataType.LONG)),
+ new Field("foo.my_raw", DataType.getArray(DataType.RAW)),
+ new Field("foo.my_string", DataType.getArray(DataType.STRING)),
+ new Field("foo.my_uri", DataType.getArray(DataType.URI)));
+ }
+
+ @Test
+ public void requireThatStructWithArrayOfArrayFieldIsFlattened() {
+ StructDataType type = new StructDataType("my_struct");
+ type.addField(new Field("my_byte", DataType.getArray(DataType.getArray(DataType.BYTE))));
+ type.addField(new Field("my_double", DataType.getArray(DataType.getArray(DataType.DOUBLE))));
+ type.addField(new Field("my_float", DataType.getArray(DataType.getArray(DataType.FLOAT))));
+ type.addField(new Field("my_int", DataType.getArray(DataType.getArray(DataType.INT))));
+ type.addField(new Field("my_long", DataType.getArray(DataType.getArray(DataType.LONG))));
+ type.addField(new Field("my_raw", DataType.getArray(DataType.getArray(DataType.RAW))));
+ type.addField(new Field("my_string", DataType.getArray(DataType.getArray(DataType.STRING))));
+ type.addField(new Field("my_uri", DataType.getArray(DataType.getArray(DataType.URI))));
+
+ assertFlat(new Field("foo", type),
+ new Field("foo.my_byte", DataType.getArray(DataType.getArray(DataType.BYTE))),
+ new Field("foo.my_double", DataType.getArray(DataType.getArray(DataType.DOUBLE))),
+ new Field("foo.my_float", DataType.getArray(DataType.getArray(DataType.FLOAT))),
+ new Field("foo.my_int", DataType.getArray(DataType.getArray(DataType.INT))),
+ new Field("foo.my_long", DataType.getArray(DataType.getArray(DataType.LONG))),
+ new Field("foo.my_raw", DataType.getArray(DataType.getArray(DataType.RAW))),
+ new Field("foo.my_string", DataType.getArray(DataType.getArray(DataType.STRING))),
+ new Field("foo.my_uri", DataType.getArray(DataType.getArray(DataType.URI))));
+ }
+
+ @Test
+ public void requireThatArrayOfStructWithArrayFieldIsFlattened() {
+ StructDataType type = new StructDataType("my_struct");
+ type.addField(new Field("my_byte", DataType.getArray(DataType.BYTE)));
+ type.addField(new Field("my_double", DataType.getArray(DataType.DOUBLE)));
+ type.addField(new Field("my_float", DataType.getArray(DataType.FLOAT)));
+ type.addField(new Field("my_int", DataType.getArray(DataType.INT)));
+ type.addField(new Field("my_long", DataType.getArray(DataType.LONG)));
+ type.addField(new Field("my_raw", DataType.getArray(DataType.RAW)));
+ type.addField(new Field("my_string", DataType.getArray(DataType.STRING)));
+ type.addField(new Field("my_uri", DataType.getArray(DataType.URI)));
+
+ assertFlat(new Field("foo", DataType.getArray(type)),
+ new Field("foo.my_byte", DataType.getArray(DataType.getArray(DataType.BYTE))),
+ new Field("foo.my_double", DataType.getArray(DataType.getArray(DataType.DOUBLE))),
+ new Field("foo.my_float", DataType.getArray(DataType.getArray(DataType.FLOAT))),
+ new Field("foo.my_int", DataType.getArray(DataType.getArray(DataType.INT))),
+ new Field("foo.my_long", DataType.getArray(DataType.getArray(DataType.LONG))),
+ new Field("foo.my_raw", DataType.getArray(DataType.getArray(DataType.RAW))),
+ new Field("foo.my_string", DataType.getArray(DataType.getArray(DataType.STRING))),
+ new Field("foo.my_uri", DataType.getArray(DataType.getArray(DataType.URI))));
+ }
+
+ private static void assertFlat(Field fieldToFlatten, Field... expectedFields) {
+ List<Field> actual = new LinkedList<>(IndexSchema.flattenField(fieldToFlatten));
+ List<Field> expected = new LinkedList<>(Arrays.asList(expectedFields));
+ Collections.sort(actual);
+ Collections.sort(expected);
+ for (Field field : actual) {
+ if (!expected.remove(field)) {
+ fail("Unexpected field: " + field);
+ }
+ }
+ assertTrue("Missing fields: " + expected, expected.isEmpty());
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/InheritanceTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/InheritanceTestCase.java
new file mode 100644
index 00000000000..1c433237fd8
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/InheritanceTestCase.java
@@ -0,0 +1,192 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.config.model.deploy.TestProperties;
+import com.yahoo.config.model.test.MockApplicationPackage;
+import com.yahoo.document.DataType;
+import com.yahoo.document.config.DocumentmanagerConfig;
+import com.yahoo.schema.Index;
+import com.yahoo.schema.Schema;
+import com.yahoo.schema.ApplicationBuilder;
+import com.yahoo.schema.document.SDDocumentType;
+import com.yahoo.schema.document.SDField;
+import com.yahoo.schema.parser.ParseException;
+import com.yahoo.vespa.configmodel.producers.DocumentManager;
+import org.junit.Rule;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.rules.TemporaryFolder;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+/**
+ * Tests inheritance
+ *
+ * @author bratseth
+ */
+public class InheritanceTestCase extends AbstractExportingTestCase {
+
+ @Rule
+ public TemporaryFolder tmpDir = new TemporaryFolder();
+
+ @Test
+ public void requireThatIndexedStructFieldCanBeInherited() throws IOException, ParseException {
+ String dir = "src/test/derived/inheritstruct/";
+ ApplicationBuilder builder = new ApplicationBuilder();
+ builder.addSchemaFile(dir + "parent.sd");
+ builder.addSchemaFile(dir + "child.sd");
+ builder.build(true);
+ derive("inheritstruct", builder, builder.getSchema("child"));
+ assertCorrectConfigFiles("inheritstruct");
+ }
+
+ @Test
+ public void requireThatInheritFromNullIsCaught() throws IOException, ParseException {
+ try {
+ assertCorrectDeriving("inheritfromnull");
+ } catch (IllegalArgumentException e) {
+ assertEquals("document inheritfromnull inherits from unavailable document foo", e.getMessage());
+ }
+ }
+
+ @Test
+ public void requireThatStructTypesAreInheritedThroughDiamond() throws IOException, ParseException {
+ String dir = "src/test/derived/inheritdiamond/";
+ {
+ ApplicationBuilder builder = new ApplicationBuilder();
+ builder.addSchemaFile(dir + "grandparent.sd");
+ builder.addSchemaFile(dir + "mother.sd");
+ builder.addSchemaFile(dir + "father.sd");
+ builder.addSchemaFile(dir + "child.sd");
+ builder.build(true);
+ derive("inheritdiamond", builder, builder.getSchema("child"));
+ assertCorrectConfigFiles("inheritdiamond");
+ }
+ List<String> files = Arrays.asList("grandparent.sd", "mother.sd", "father.sd", "child.sd");
+ File outDir = tmpDir.newFolder("out");
+ for (int startIdx = 0; startIdx < files.size(); ++startIdx) {
+ var builder = new ApplicationBuilder(new TestProperties());
+ for (int fileIdx = startIdx; fileIdx < startIdx + files.size(); ++fileIdx) {
+ String fileName = files.get(fileIdx % files.size());
+ builder.addSchemaFile(dir + fileName);
+ }
+ builder.build(true);
+ DocumentmanagerConfig.Builder b = new DocumentmanagerConfig.Builder();
+ DerivedConfiguration.exportDocuments(new DocumentManager().
+ produce(builder.getModel(), b), outDir.getPath());
+ DocumentmanagerConfig dc = b.build();
+ assertEquals(5, dc.doctype().size());
+
+ assertNull(structType("child.body", dc));
+ var childHeader = structType("child.header", dc);
+ assertEquals(childHeader.field(0).name(), "foo");
+ assertEquals(childHeader.field(1).name(), "bar");
+ assertEquals(childHeader.field(2).name(), "baz");
+ assertEquals(childHeader.field(3).name(), "cox");
+
+ var root = documentType("document", dc);
+ var child = documentType("child", dc);
+ var mother = documentType("mother", dc);
+ var father = documentType("father", dc);
+ var grandparent = documentType("grandparent", dc);
+
+ assertEquals(child.inherits(0).idx(), root.idx());
+ assertEquals(child.inherits(1).idx(), mother.idx());
+ assertEquals(child.inherits(2).idx(), father.idx());
+ assertEquals(mother.inherits(0).idx(), root.idx());
+ assertEquals(mother.inherits(1).idx(), grandparent.idx());
+ }
+ }
+
+ private DocumentmanagerConfig.Doctype.Structtype structType(String name, DocumentmanagerConfig dc) {
+ for (var dt : dc.doctype()) {
+ for (var st : dt.structtype()) {
+ if (name.equals(st.name())) return st;
+ }
+ }
+ return null;
+ }
+
+ private DocumentmanagerConfig.Doctype documentType(String name, DocumentmanagerConfig dc) {
+ for (var dot : dc.doctype()) {
+ if (name.equals(dot.name())) return dot;
+ }
+ return null;
+ }
+
+ @Test
+ public void requireThatStructTypesAreInheritedFromParent() throws IOException, ParseException {
+ String dir = "src/test/derived/inheritfromparent/";
+ ApplicationBuilder builder = new ApplicationBuilder();
+ builder.addSchemaFile(dir + "parent.sd");
+ builder.addSchemaFile(dir + "child.sd");
+ builder.build(true);
+ derive("inheritfromparent", builder, builder.getSchema("child"));
+ assertCorrectConfigFiles("inheritfromparent");
+ }
+
+ @Test
+ public void requireThatStructTypesAreInheritedFromGrandParent() throws IOException, ParseException {
+ String dir = "src/test/derived/inheritfromgrandparent/";
+ ApplicationBuilder builder = new ApplicationBuilder();
+ builder.addSchemaFile(dir + "grandparent.sd");
+ builder.addSchemaFile(dir + "parent.sd");
+ builder.addSchemaFile(dir + "child.sd");
+ builder.build(true);
+ derive("inheritfromgrandparent", builder, builder.getSchema("child"));
+ assertCorrectConfigFiles("inheritfromgrandparent");
+ }
+
+ @Test
+ public void testInheritance() throws IOException, ParseException {
+ String dir = "src/test/derived/inheritance/";
+ ApplicationBuilder builder = new ApplicationBuilder();
+ builder.addSchemaFile(dir + "grandparent.sd");
+ builder.addSchemaFile(dir + "father.sd");
+ builder.addSchemaFile(dir + "mother.sd");
+ builder.addSchemaFile(dir + "child.sd");
+ builder.build(true);
+ derive("inheritance", builder, builder.getSchema("child"));
+ assertCorrectConfigFiles("inheritance");
+ }
+
+ @Test
+ public void testIndexSettingInheritance() {
+ SDDocumentType parent = new SDDocumentType("parent");
+ Schema parentSchema = new Schema("parent", MockApplicationPackage.createEmpty());
+ parentSchema.addDocument(parent);
+ SDField prefixed = parent.addField("prefixed", DataType.STRING);
+ prefixed.parseIndexingScript("{ index }");
+ prefixed.addIndex(new Index("prefixed", true));
+
+ SDDocumentType child = new SDDocumentType("child");
+ child.inherit(parent);
+ Schema childSchema = new Schema("child", MockApplicationPackage.createEmpty());
+ childSchema.addDocument(child);
+
+ prefixed = (SDField)child.getField("prefixed");
+ assertNotNull(prefixed);
+ assertEquals(new Index("prefixed", true), childSchema.getIndex("prefixed"));
+ }
+
+ @Test
+ public void testInheritStructDiamondNew() throws IOException, ParseException {
+ String dir = "src/test/derived/declstruct/";
+ List<String> files = Arrays.asList("common.sd", "foo.sd", "bar.sd", "foobar.sd");
+ var builder = new ApplicationBuilder(new TestProperties());
+ for (String fileName : files) {
+ builder.addSchemaFile(dir + fileName);
+ }
+ builder.build(true);
+ derive("declstruct", builder, builder.getSchema("foobar"));
+ assertCorrectConfigFiles("declstruct");
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/IntegerAttributeToStringIndexTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/IntegerAttributeToStringIndexTestCase.java
new file mode 100644
index 00000000000..b5f222673ab
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/IntegerAttributeToStringIndexTestCase.java
@@ -0,0 +1,17 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * @author bratseth
+ */
+public class IntegerAttributeToStringIndexTestCase extends AbstractExportingTestCase {
+ @Test
+ public void testIt() throws IOException, ParseException {
+ assertCorrectDeriving("integerattributetostringindex");
+ }
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/LiteralBoostTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/LiteralBoostTestCase.java
new file mode 100644
index 00000000000..c5090c88a1b
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/LiteralBoostTestCase.java
@@ -0,0 +1,113 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.config.model.application.provider.BaseDeployLogger;
+import com.yahoo.config.model.test.MockApplicationPackage;
+import com.yahoo.document.DataType;
+import com.yahoo.search.query.profile.QueryProfileRegistry;
+import com.yahoo.schema.RankProfile;
+import com.yahoo.schema.RankProfileRegistry;
+import com.yahoo.schema.Schema;
+import com.yahoo.schema.ApplicationBuilder;
+import com.yahoo.schema.document.SDDocumentType;
+import com.yahoo.schema.document.SDField;
+import com.yahoo.schema.processing.Processing;
+import com.yahoo.vespa.model.container.search.QueryProfiles;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Set;
+
+import static com.yahoo.schema.processing.AssertIndexingScript.assertIndexing;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * @author bratseth
+ */
+public class LiteralBoostTestCase extends AbstractExportingTestCase {
+
+ /**
+ * Tests adding of literal boost constructs
+ */
+ @Test
+ public void testLiteralBoost() {
+ Schema schema = new Schema("literalboost", MockApplicationPackage.createEmpty());
+ RankProfileRegistry rankProfileRegistry = RankProfileRegistry.createRankProfileRegistryWithBuiltinRankProfiles(schema);
+ SDDocumentType document = new SDDocumentType("literalboost");
+ schema.addDocument(document);
+ SDField field1 = document.addField("a", DataType.STRING);
+ field1.parseIndexingScript("{ index }");
+ field1.setLiteralBoost(20);
+ RankProfile other = new RankProfile("other", schema, rankProfileRegistry);
+ rankProfileRegistry.add(other);
+ other.addRankSetting(new RankProfile.RankSetting("a", RankProfile.RankSetting.Type.LITERALBOOST, 333));
+
+ new Processing().process(schema, new BaseDeployLogger(), rankProfileRegistry, new QueryProfiles(),
+ true, false, Set.of());
+ DerivedConfiguration derived = new DerivedConfiguration(schema, rankProfileRegistry);
+
+ // Check attribute fields
+ derived.getAttributeFields(); // TODO: assert content
+
+ // Check il script addition
+ assertIndexing(Arrays.asList("clear_state | guard { input a | tokenize normalize stem:\"BEST\" | index a; }",
+ "clear_state | guard { input a | tokenize | index a_literal; }"),
+ schema);
+
+ // Check index info addition
+ IndexInfo indexInfo = derived.getIndexInfo();
+ assertTrue(indexInfo.hasCommand("a", "literal-boost"));
+ }
+
+ /**
+ * Tests adding a literal boost in a non-default rank profile only
+ */
+ @Test
+ public void testNonDefaultRankLiteralBoost() {
+ Schema schema = new Schema("literalboost", MockApplicationPackage.createEmpty());
+ RankProfileRegistry rankProfileRegistry = RankProfileRegistry.createRankProfileRegistryWithBuiltinRankProfiles(schema);
+ SDDocumentType document = new SDDocumentType("literalboost");
+ schema.addDocument(document);
+ SDField field1 = document.addField("a", DataType.STRING);
+ field1.parseIndexingScript("{ index }");
+ RankProfile other = new RankProfile("other", schema, rankProfileRegistry);
+ rankProfileRegistry.add(other);
+ other.addRankSetting(new RankProfile.RankSetting("a", RankProfile.RankSetting.Type.LITERALBOOST, 333));
+
+ schema = ApplicationBuilder.buildFromRawSchema(schema, rankProfileRegistry, new QueryProfileRegistry());
+ DerivedConfiguration derived = new DerivedConfiguration(schema, rankProfileRegistry);
+
+ // Check il script addition
+ assertIndexing(Arrays.asList("clear_state | guard { input a | tokenize normalize stem:\"BEST\" | index a; }",
+ "clear_state | guard { input a | tokenize | index a_literal; }"),
+ schema);
+
+ // Check index info addition
+ IndexInfo indexInfo = derived.getIndexInfo();
+ assertTrue(indexInfo.hasCommand("a","literal-boost"));
+ }
+
+ /** Tests literal boosts in two fields going to the same index */
+ @Test
+ public void testTwoLiteralBoostFields() {
+ Schema schema = new Schema("msb", MockApplicationPackage.createEmpty());
+ RankProfileRegistry rankProfileRegistry = RankProfileRegistry.createRankProfileRegistryWithBuiltinRankProfiles(schema);
+ SDDocumentType document = new SDDocumentType("msb");
+ schema.addDocument(document);
+ SDField field1 = document.addField("title", DataType.STRING);
+ field1.parseIndexingScript("{ summary | index }");
+ field1.setLiteralBoost(20);
+ SDField field2 = document.addField("body", DataType.STRING);
+ field2.parseIndexingScript("{ summary | index }");
+ field2.setLiteralBoost(20);
+
+ schema = ApplicationBuilder.buildFromRawSchema(schema, rankProfileRegistry, new QueryProfileRegistry());
+ new DerivedConfiguration(schema, rankProfileRegistry);
+ assertIndexing(Arrays.asList("clear_state | guard { input title | tokenize normalize stem:\"BEST\" | summary title | index title; }",
+ "clear_state | guard { input body | tokenize normalize stem:\"BEST\" | summary body | index body; }",
+ "clear_state | guard { input title | tokenize | index title_literal; }",
+ "clear_state | guard { input body | tokenize | index body_literal; }"),
+ schema);
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/LowercaseTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/LowercaseTestCase.java
new file mode 100644
index 00000000000..f234a9cc324
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/LowercaseTestCase.java
@@ -0,0 +1,19 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * @author bratseth
+ */
+public class LowercaseTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testDeriving() throws IOException, ParseException {
+ assertCorrectDeriving("lowercase");
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/MailTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/MailTestCase.java
new file mode 100644
index 00000000000..c48c44554ed
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/MailTestCase.java
@@ -0,0 +1,24 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.ApplicationBuilder;
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+import java.io.IOException;
+
+/**
+ * Tests streaming configuration deriving
+ *
+ * @author bratseth
+ */
+public class MailTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testMail() throws IOException, ParseException {
+ String dir = "src/test/derived/mail/";
+ ApplicationBuilder sb = new ApplicationBuilder();
+ sb.addSchemaFile(dir + "mail.sd");
+ assertCorrectDeriving(sb, dir, new TestableDeployLogger());
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/MatchSettingsResolvingTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/MatchSettingsResolvingTestCase.java
new file mode 100755
index 00000000000..a7df862134a
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/MatchSettingsResolvingTestCase.java
@@ -0,0 +1,63 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.config.model.deploy.TestProperties;
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * @author arnej
+ */
+public class MatchSettingsResolvingTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testSimpleDefaults() throws IOException, ParseException {
+ assertCorrectDeriving("matchsettings_simple_def", new TestProperties());
+ }
+
+ @Test
+ public void testSimpleWithStructSettings() throws IOException, ParseException {
+ assertCorrectDeriving("matchsettings_simple_wss",
+ new TestProperties());
+ }
+
+ @Test
+ public void testSimpleWithFieldSettings() throws IOException, ParseException {
+ assertCorrectDeriving("matchsettings_simple_wfs", new TestProperties());
+ }
+
+ @Test
+ public void testSimpleStructAndFieldSettings() throws IOException, ParseException {
+ assertCorrectDeriving("matchsettings_simple_wss_wfs", new TestProperties());
+ }
+
+ @Test
+ public void testMapDefaults() throws IOException, ParseException {
+ assertCorrectDeriving("matchsettings_map_def", new TestProperties());
+ }
+
+ @Test
+ public void testMapWithStructSettings() throws IOException, ParseException {
+ assertCorrectDeriving("matchsettings_map_wss", new TestProperties());
+ }
+
+ @Test
+ public void testMapWithFieldSettings() throws IOException, ParseException {
+ assertCorrectDeriving("matchsettings_map_wfs", new TestProperties());
+ }
+
+ @Test
+ public void testMapAfter() throws IOException, ParseException {
+ assertCorrectDeriving("matchsettings_map_after", new TestProperties());
+ }
+
+
+ @Test
+ public void testMapInStruct() throws IOException, ParseException {
+ assertCorrectDeriving("matchsettings_map_in_struct", new TestProperties());
+ }
+
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/MultiStructTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/MultiStructTestCase.java
new file mode 100644
index 00000000000..66b3698b38c
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/MultiStructTestCase.java
@@ -0,0 +1,27 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.config.model.deploy.TestProperties;
+import com.yahoo.config.model.application.provider.MockFileRegistry;
+import com.yahoo.schema.ApplicationBuilder;
+import org.junit.Test;
+
+/**
+ * Tests deriving a configuration with structs in multiple .sd files
+ *
+ * @author arnej
+ */
+public class MultiStructTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testDocTypeConfigs() throws Exception {
+ var logger = new TestableDeployLogger();
+ var props = new TestProperties();
+ ApplicationBuilder builder = ApplicationBuilder.createFromDirectory
+ ("src/test/derived/multi_struct/", new MockFileRegistry(), logger, props);
+ derive("multi_struct", builder, builder.getSchema("shop"));
+ assertCorrectConfigFiles("multi_struct");
+ }
+
+}
+
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/MultipleSummariesTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/MultipleSummariesTestCase.java
new file mode 100644
index 00000000000..d434673e43a
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/MultipleSummariesTestCase.java
@@ -0,0 +1,22 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.config.model.deploy.TestProperties;
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * Tests deriving a configuration with multiple summaries
+ *
+ * @author bratseth
+ */
+public class MultipleSummariesTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testMultipleSummariesNew() throws IOException, ParseException {
+ assertCorrectDeriving("multiplesummaries", new TestProperties());
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/NameCollisionTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/NameCollisionTestCase.java
new file mode 100644
index 00000000000..689ff9814cc
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/NameCollisionTestCase.java
@@ -0,0 +1,27 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+package com.yahoo.schema.derived;
+
+import com.yahoo.config.model.deploy.TestProperties;
+import com.yahoo.document.DocumentTypeManager;
+
+import org.junit.Test;
+import static org.junit.Assert.assertThrows;
+
+/**
+ * Verifies that a struct in a document type is preferred over another document type
+ * of the same name.
+ *
+ * @author bratseth
+ */
+public class NameCollisionTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testNameCollision() throws Exception {
+ assertCorrectDeriving("namecollision", "collisionstruct",
+ new TestProperties(),
+ new TestableDeployLogger());
+ DocumentTypeManager.fromFile("temp/namecollision/documentmanager.cfg");
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/NativeRankTypeDefinitionsTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/NativeRankTypeDefinitionsTestCase.java
new file mode 100644
index 00000000000..f628420556a
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/NativeRankTypeDefinitionsTestCase.java
@@ -0,0 +1,92 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.AbstractSchemaTestCase;
+import com.yahoo.schema.document.RankType;
+import org.junit.Test;
+
+import java.util.Iterator;
+
+import static org.junit.Assert.*;
+
+/**
+ * Testing stuff related to native rank type definitions
+ *
+ * @author geirst
+ */
+public class NativeRankTypeDefinitionsTestCase extends AbstractSchemaTestCase {
+ @Test
+ public void testTables() {
+ assertEquals(NativeTable.Type.FIRST_OCCURRENCE.getName(), "firstOccurrenceTable");
+ assertEquals(NativeTable.Type.OCCURRENCE_COUNT.getName(), "occurrenceCountTable");
+ assertEquals(NativeTable.Type.PROXIMITY.getName(), "proximityTable");
+ assertEquals(NativeTable.Type.REVERSE_PROXIMITY.getName(), "reverseProximityTable");
+ assertEquals(NativeTable.Type.WEIGHT.getName(), "weightTable");
+ }
+ @Test
+ public void testDefinitions() {
+ NativeRankTypeDefinitionSet defs = new NativeRankTypeDefinitionSet("default");
+
+ NativeRankTypeDefinition rank;
+ Iterator<NativeTable> tables;
+
+ assertEquals(4, defs.types().size());
+
+ {
+ rank = defs.getRankTypeDefinition(RankType.EMPTY);
+ assertNotNull(rank);
+ assertEquals(RankType.EMPTY, rank.getType());
+ tables = rank.rankSettingIterator();
+ assertEquals(new NativeTable(NativeTable.Type.FIRST_OCCURRENCE, "linear(0,0)"), tables.next());
+ assertEquals(new NativeTable(NativeTable.Type.OCCURRENCE_COUNT, "linear(0,0)"), tables.next());
+ assertEquals(new NativeTable(NativeTable.Type.PROXIMITY, "linear(0,0)"), tables.next());
+ assertEquals(new NativeTable(NativeTable.Type.REVERSE_PROXIMITY, "linear(0,0)"), tables.next());
+ assertEquals(new NativeTable(NativeTable.Type.WEIGHT, "linear(0,0)"), tables.next());
+ assertFalse(tables.hasNext());
+ }
+
+ {
+ rank = defs.getRankTypeDefinition(RankType.ABOUT);
+ assertNotNull(rank);
+ assertEquals(RankType.ABOUT, rank.getType());
+ tables = rank.rankSettingIterator();
+ assertEquals(new NativeTable(NativeTable.Type.FIRST_OCCURRENCE, "expdecay(8000,12.50)"), tables.next());
+ assertEquals(new NativeTable(NativeTable.Type.OCCURRENCE_COUNT, "loggrowth(1500,4000,19)"), tables.next());
+ assertEquals(new NativeTable(NativeTable.Type.PROXIMITY, "expdecay(500,3)"), tables.next());
+ assertEquals(new NativeTable(NativeTable.Type.REVERSE_PROXIMITY, "expdecay(400,3)"), tables.next());
+ assertEquals(new NativeTable(NativeTable.Type.WEIGHT, "linear(1,0)"), tables.next());
+ assertFalse(tables.hasNext());
+ }
+
+ {
+ rank = defs.getRankTypeDefinition(RankType.IDENTITY);
+ assertNotNull(rank);
+ assertEquals(RankType.IDENTITY, rank.getType());
+ tables = rank.rankSettingIterator();
+ assertEquals(new NativeTable(NativeTable.Type.FIRST_OCCURRENCE, "expdecay(100,12.50)"), tables.next());
+ assertEquals(new NativeTable(NativeTable.Type.OCCURRENCE_COUNT, "loggrowth(1500,4000,19)"), tables.next());
+ assertEquals(new NativeTable(NativeTable.Type.PROXIMITY, "expdecay(5000,3)"), tables.next());
+ assertEquals(new NativeTable(NativeTable.Type.REVERSE_PROXIMITY, "expdecay(3000,3)"), tables.next());
+ assertEquals(new NativeTable(NativeTable.Type.WEIGHT, "linear(1,0)"), tables.next());
+ assertFalse(tables.hasNext());
+ }
+
+ {
+ rank = defs.getRankTypeDefinition(RankType.TAGS);
+ assertNotNull(rank);
+ assertEquals(RankType.TAGS, rank.getType());
+ tables = rank.rankSettingIterator();
+ assertEquals(new NativeTable(NativeTable.Type.FIRST_OCCURRENCE, "expdecay(8000,12.50)"), tables.next());
+ assertEquals(new NativeTable(NativeTable.Type.OCCURRENCE_COUNT, "loggrowth(1500,4000,19)"), tables.next());
+ assertEquals(new NativeTable(NativeTable.Type.PROXIMITY, "expdecay(500,3)"), tables.next());
+ assertEquals(new NativeTable(NativeTable.Type.REVERSE_PROXIMITY, "expdecay(400,3)"), tables.next());
+ assertEquals(new NativeTable(NativeTable.Type.WEIGHT, "loggrowth(38,50,1)"), tables.next());
+ assertFalse(tables.hasNext());
+ }
+
+ {
+ assertEquals(RankType.ABOUT, defs.getRankTypeDefinition(RankType.DEFAULT).getType());
+ }
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/NearestNeighborTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/NearestNeighborTestCase.java
new file mode 100644
index 00000000000..baee7bec2a2
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/NearestNeighborTestCase.java
@@ -0,0 +1,39 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.component.ComponentId;
+import com.yahoo.search.Query;
+import com.yahoo.search.query.profile.compiled.CompiledQueryProfileRegistry;
+import com.yahoo.search.query.profile.config.QueryProfileConfigurer;
+import com.yahoo.schema.parser.ParseException;
+import com.yahoo.vespa.model.container.search.QueryProfiles;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+public class NearestNeighborTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testNearestNeighbor() throws IOException, ParseException {
+ try {
+ ComponentId.resetGlobalCountersForTests();
+ DerivedConfiguration c = assertCorrectDeriving("nearestneighbor");
+
+ CompiledQueryProfileRegistry queryProfiles =
+ QueryProfileConfigurer.createFromConfig(new QueryProfiles(c.getQueryProfiles(), (level, message) -> {}).getConfig()).compile();
+ Query q = new Query("?ranking.features.query(q_vec)=[1,2,3,4,5,6]", // length is 6, not 5
+ queryProfiles.getComponent("default"));
+ fail("This should fail when q_vec is parsed as a tensor");
+ } catch (IllegalArgumentException e) {
+ // success
+ assertEquals("Could not set 'ranking.features.query(q_vec)' to '[1,2,3,4,5,6]'", e.getMessage());
+ } catch (RuntimeException e) {
+ e.printStackTrace();
+ throw e;
+ }
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/NeuralNetTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/NeuralNetTestCase.java
new file mode 100644
index 00000000000..6e584099331
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/NeuralNetTestCase.java
@@ -0,0 +1,42 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.search.Query;
+import com.yahoo.search.query.profile.compiled.CompiledQueryProfile;
+import com.yahoo.search.query.profile.compiled.CompiledQueryProfileRegistry;
+import com.yahoo.search.query.profile.config.QueryProfileConfigurer;
+import com.yahoo.schema.parser.ParseException;
+import com.yahoo.vespa.model.container.search.QueryProfiles;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import com.yahoo.component.ComponentId;
+
+import static org.junit.Assert.assertEquals;
+
+public class NeuralNetTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testNeuralNet() throws IOException, ParseException {
+ ComponentId.resetGlobalCountersForTests();
+ DerivedConfiguration c = assertCorrectDeriving("neuralnet");
+ // Verify that query profiles end up correct when passed through the same intermediate forms as a full system
+ CompiledQueryProfileRegistry queryProfiles =
+ QueryProfileConfigurer.createFromConfig(new QueryProfiles(c.getQueryProfiles(), (level, message) -> {}).getConfig()).compile();
+ assertNeuralNetQuery(c, queryProfiles.getComponent("default"));
+ }
+
+ @Test
+ public void testNeuralNet_noQueryProfiles() throws IOException, ParseException {
+ ComponentId.resetGlobalCountersForTests();
+ DerivedConfiguration c = assertCorrectDeriving("neuralnet_noqueryprofile");
+ }
+
+ private void assertNeuralNetQuery(DerivedConfiguration c, CompiledQueryProfile defaultprofile) {
+ Query q = new Query("?test=foo&ranking.features.query(b_1)=[1,2,3,4,5,6,7,8,9]", defaultprofile);
+ assertEquals("tensor(out[9]):[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]",
+ q.properties().get("ranking.features.query(b_1)").toString());
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/NuwaTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/NuwaTestCase.java
new file mode 100644
index 00000000000..210c8a9bdd4
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/NuwaTestCase.java
@@ -0,0 +1,33 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * A real world mlr ranking model, useful to benchmark memory and cpu usage.
+ *
+ * @author bratseth
+ */
+public class NuwaTestCase extends AbstractExportingTestCase {
+
+ @Test
+ @Ignore
+ public void testNuwa() throws IOException, ParseException {
+ System.gc();
+ long freeBytesBefore = Runtime.getRuntime().freeMemory();
+ long totalBytesBefore = Runtime.getRuntime().totalMemory();
+
+ DerivedConfiguration configuration = assertCorrectDeriving("nuwa");
+
+ System.gc();
+ long freeBytesAfter = Runtime.getRuntime().freeMemory();
+ long totalBytesAfter = Runtime.getRuntime().totalMemory();
+ long additionalAllocated = totalBytesAfter - totalBytesBefore;
+ System.out.println("Consumed " + ((freeBytesBefore - (freeBytesAfter - additionalAllocated) ) / 1000000) + " Mb");
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/OrderIlscriptsTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/OrderIlscriptsTestCase.java
new file mode 100755
index 00000000000..8af0d0a21d3
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/OrderIlscriptsTestCase.java
@@ -0,0 +1,19 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * @author Einar M R Rosenvinge
+ */
+public class OrderIlscriptsTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testOrderIlscripts() throws IOException, ParseException {
+ assertCorrectDeriving("orderilscripts");
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/PrefixExactAttributeTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/PrefixExactAttributeTestCase.java
new file mode 100644
index 00000000000..fdcb71432e4
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/PrefixExactAttributeTestCase.java
@@ -0,0 +1,21 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * Tests deriving of various field types
+ *
+ * @author bratseth
+ */
+public class PrefixExactAttributeTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testTypes() throws IOException, ParseException {
+ assertCorrectDeriving("prefixexactattribute");
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/RankProfilesTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/RankProfilesTestCase.java
new file mode 100644
index 00000000000..a83db0caf5a
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/RankProfilesTestCase.java
@@ -0,0 +1,20 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.config.model.deploy.TestProperties;
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * Tests a search definition with various rank profiles having different settings
+ *
+ * @author bratseth
+ */
+public class RankProfilesTestCase extends AbstractExportingTestCase {
+ @Test
+ public void testRankProfiles() throws IOException, ParseException {
+ assertCorrectDeriving("rankprofiles", null, new TestProperties(), new TestableDeployLogger());
+ }
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/RankPropertiesTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/RankPropertiesTestCase.java
new file mode 100644
index 00000000000..8db880e56fe
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/RankPropertiesTestCase.java
@@ -0,0 +1,19 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * @author bratseth
+ */
+public class RankPropertiesTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testRankProperties() throws IOException, ParseException {
+ assertCorrectDeriving("rankproperties");
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/ReferenceFieldsTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/ReferenceFieldsTestCase.java
new file mode 100644
index 00000000000..99d0cf8bf6d
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/ReferenceFieldsTestCase.java
@@ -0,0 +1,18 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * @author geirst
+ */
+public class ReferenceFieldsTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void configs_related_to_reference_fields_are_derived() throws IOException, ParseException {
+ assertCorrectDeriving("reference_fields", "ad", new TestableDeployLogger());
+ }
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/ReferenceFromSeveralTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/ReferenceFromSeveralTestCase.java
new file mode 100644
index 00000000000..ff4506a7f57
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/ReferenceFromSeveralTestCase.java
@@ -0,0 +1,27 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.config.model.deploy.TestProperties;
+import com.yahoo.config.model.application.provider.MockFileRegistry;
+import com.yahoo.schema.ApplicationBuilder;
+import org.junit.Test;
+
+/**
+ * Tests deriving a configuration with references from multiple .sd files
+ *
+ * @author arnej
+ */
+public class ReferenceFromSeveralTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testDocManConfigs() throws Exception {
+ var logger = new TestableDeployLogger();
+ var props = new TestProperties();
+ ApplicationBuilder builder = ApplicationBuilder.createFromDirectory
+ ("src/test/derived/reference_from_several/", new MockFileRegistry(), logger, props);
+ derive("reference_from_several", builder, builder.getSchema("foo"));
+ assertCorrectConfigFiles("reference_from_several");
+ }
+
+}
+
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/SchemaInheritanceTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/SchemaInheritanceTestCase.java
new file mode 100644
index 00000000000..1b5d55158b5
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/SchemaInheritanceTestCase.java
@@ -0,0 +1,34 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.config.model.application.provider.MockFileRegistry;
+import com.yahoo.config.model.deploy.TestProperties;
+import com.yahoo.io.IOUtils;
+import com.yahoo.schema.ApplicationBuilder;
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * @author bratseth
+ */
+public class SchemaInheritanceTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testIt() throws IOException, ParseException {
+ try {
+ ApplicationBuilder builder = ApplicationBuilder.createFromDirectory("src/test/derived/schemainheritance/",
+ new MockFileRegistry(),
+ new TestableDeployLogger(),
+ new TestProperties());
+ derive("schemainheritance", builder, builder.getSchema("child"));
+ assertCorrectConfigFiles("schemainheritance");
+ }
+ finally {
+ IOUtils.recursiveDeleteDir(new File("src/test/derived/schemainheritance/models.generated/"));
+ }
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/SchemaOrdererTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/SchemaOrdererTestCase.java
new file mode 100644
index 00000000000..e672763f13c
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/SchemaOrdererTestCase.java
@@ -0,0 +1,146 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.config.model.test.MockApplicationPackage;
+import com.yahoo.documentmodel.NewDocumentReferenceDataType;
+import com.yahoo.schema.DocumentReference;
+import com.yahoo.schema.DocumentReferences;
+import com.yahoo.schema.Schema;
+import com.yahoo.schema.AbstractSchemaTestCase;
+import com.yahoo.schema.document.SDDocumentType;
+import com.yahoo.schema.document.SDField;
+import com.yahoo.schema.document.TemporarySDField;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+import static java.util.Collections.emptyMap;
+import static java.util.stream.Collectors.toList;
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author bratseth
+ * @author bjorncs
+ */
+public class SchemaOrdererTestCase extends AbstractSchemaTestCase {
+
+ private static Map<String, Schema> createSchemas() {
+ Map<String, Schema> schemas = new HashMap<>();
+
+ Schema grandParent = createSchema("grandParent", schemas);
+
+ Schema mother = createSchema("mother", schemas);
+ inherit(mother, grandParent);
+
+ Schema father = createSchema("father", schemas);
+ inherit(father, grandParent);
+ createDocumentReference(father, mother, "wife_ref");
+
+ Schema daugther = createSchema("daughter", schemas);
+ inherit(daugther, father);
+ inherit(daugther, mother);
+
+ Schema son = createSchema("son", schemas);
+ inherit(son, father);
+ inherit(son, mother);
+
+ Schema product = createSchema("product", schemas);
+
+ Schema pc = createSchema("pc", schemas);
+ inherit(pc, product);
+ Schema pcAccessory = createSchema("accessory-pc", schemas);
+ inherit(pcAccessory, product);
+ createDocumentReference(pcAccessory, pc, "pc_ref");
+
+ createSchema("alone", schemas);
+
+ return schemas;
+ }
+
+ private static Schema createSchema(String name, Map<String, Schema> schemas) {
+ Schema schema = new Schema(name, MockApplicationPackage.createEmpty());
+ SDDocumentType document = new SDDocumentType(name);
+ document.setDocumentReferences(new DocumentReferences(emptyMap()));
+ schema.addDocument(document);
+ schemas.put(schema.getName(), schema);
+ return schema;
+ }
+
+ private static void inherit(Schema inheritee, Schema inherited) {
+ inheritee.getDocument().inherit(inherited.getDocument());
+ }
+
+ private static void assertOrder(List<String> expectedSearchOrder, List<String> inputNames) {
+ Map<String, Schema> schemas = createSchemas();
+ List<Schema> inputSchemas = inputNames.stream()
+ .map(schemas::get)
+ .map(Objects::requireNonNull)
+ .collect(toList());
+ List<String> actualSearchOrder = new SearchOrderer()
+ .order(inputSchemas)
+ .stream()
+ .map(Schema::getName)
+ .collect(toList());
+ assertEquals(expectedSearchOrder, actualSearchOrder);
+ }
+
+ @SuppressWarnings("deprecation")
+ private static void createDocumentReference(Schema from, Schema to, String refFieldName) {
+ SDDocumentType fromDocument = from.getDocument();
+ SDField refField = new TemporarySDField(fromDocument, refFieldName, NewDocumentReferenceDataType.forDocumentName(to.getName()));
+ fromDocument.addField(refField);
+ Map<String, DocumentReference> originalMap = fromDocument.getDocumentReferences().get().referenceMap();
+ HashMap<String, DocumentReference> modifiedMap = new HashMap<>(originalMap);
+ modifiedMap.put(refFieldName, new DocumentReference(refField, to));
+ fromDocument.setDocumentReferences(new DocumentReferences(modifiedMap));
+ }
+
+
+ @Test
+ public void testPerfectOrderingIsKept() {
+ assertOrder(Arrays.asList("alone", "grandParent", "mother", "father", "daughter", "product", "pc", "son"),
+ Arrays.asList("grandParent", "mother", "father", "daughter", "son", "product", "pc", "alone"));
+ }
+
+ @Test
+ public void testOneLevelReordering() {
+ assertOrder(Arrays.asList("alone", "grandParent", "mother", "father", "daughter", "product", "pc", "son"),
+ Arrays.asList("grandParent", "daughter", "son", "mother", "father", "pc", "product", "alone"));
+ }
+
+ @Test
+ public void testMultiLevelReordering() {
+ assertOrder(Arrays.asList("alone", "grandParent", "mother", "father", "daughter", "product", "pc", "son"),
+ Arrays.asList("daughter", "son", "mother", "father", "grandParent", "pc", "product", "alone"));
+ }
+
+ @Test
+ public void testAloneIsKeptInPlaceWithMultiLevelReordering() {
+ assertOrder(Arrays.asList("alone", "grandParent", "mother", "father", "daughter", "product", "pc", "son"),
+ Arrays.asList("alone", "daughter", "son", "mother", "father", "grandParent", "pc", "product"));
+ }
+
+ @Test
+ public void testPartialMultiLevelReordering() {
+ assertOrder(Arrays.asList("alone", "grandParent", "mother", "father", "daughter", "product", "pc", "son"),
+ Arrays.asList("daughter", "grandParent", "mother", "son", "father", "product", "pc", "alone"));
+ }
+
+ @Test
+ public void testMultilevelReorderingAccrossHierarchies() {
+ assertOrder(Arrays.asList("alone", "grandParent", "mother", "father", "daughter", "product", "pc", "son"),
+ Arrays.asList("daughter", "pc", "son", "mother", "grandParent", "father", "product", "alone"));
+ }
+
+ @Test
+ public void referees_are_ordered_before_referrer() {
+ assertOrder(Arrays.asList("alone", "grandParent", "mother", "father", "daughter", "product", "pc", "accessory-pc", "son"),
+ Arrays.asList("accessory-pc", "daughter", "pc", "son", "mother", "grandParent", "father", "product", "alone"));
+ }
+
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/SimpleInheritTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/SimpleInheritTestCase.java
new file mode 100644
index 00000000000..d8b39bfd978
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/SimpleInheritTestCase.java
@@ -0,0 +1,47 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.Schema;
+import com.yahoo.schema.ApplicationBuilder;
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Tests really simple inheriting
+ */
+public class SimpleInheritTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testEmptyChild() throws IOException, ParseException {
+ String name = "emptychild";
+ final String expectedResultsDirName = "src/test/derived/" + name + "/";
+
+ ApplicationBuilder builder = new ApplicationBuilder();
+ builder.addSchemaFile(expectedResultsDirName + "parent.sd");
+ builder.addSchemaFile(expectedResultsDirName + "child.sd");
+ builder.build(true);
+
+ Schema schema = builder.getSchema("child");
+
+ String toDirName = "temp/" + name;
+ File toDir = new File(toDirName);
+ toDir.mkdirs();
+ deleteContent(toDir);
+
+ DerivedConfiguration config = new DerivedConfiguration(schema, builder.getRankProfileRegistry());
+ config.export(toDirName);
+
+ checkDir(toDirName, expectedResultsDirName);
+ }
+
+ private void checkDir(String toDirName, String expectedResultsDirName) throws IOException {
+ File[] files = new File(expectedResultsDirName).listFiles();
+ for (File file : files) {
+ if ( ! file.getName().endsWith(".cfg")) continue;
+ assertEqualFiles(file.getPath(), toDirName + "/" + file.getName(), false);
+ }
+ }
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/SliceTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/SliceTestCase.java
new file mode 100644
index 00000000000..2aad47dae6c
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/SliceTestCase.java
@@ -0,0 +1,23 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.component.ComponentId;
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author bratseth
+ */
+public class SliceTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testSlice() throws IOException, ParseException {
+ ComponentId.resetGlobalCountersForTests();
+ DerivedConfiguration c = assertCorrectDeriving("slice");
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/SortingTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/SortingTestCase.java
new file mode 100644
index 00000000000..0c091a7a367
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/SortingTestCase.java
@@ -0,0 +1,22 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.config.model.deploy.TestProperties;
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * Tests sort settings
+ *
+ * @author baldersheim
+ */
+public class SortingTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testDocumentDerivingNewParser() throws IOException, ParseException {
+ assertCorrectDeriving("sorting", new TestProperties());
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/StreamingStructTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/StreamingStructTestCase.java
new file mode 100755
index 00000000000..6f27930e239
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/StreamingStructTestCase.java
@@ -0,0 +1,26 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * Tests streaming search configuration deriving for structs
+ *
+ * @author bratseth
+ */
+public class StreamingStructTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testStreamingStruct() throws IOException, ParseException {
+ assertCorrectDeriving("streamingstruct");
+ }
+
+ @Test
+ public void testStreamingStructExplicitDefaultSummaryClass() throws IOException, ParseException {
+ assertCorrectDeriving("streamingstructdefault");
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/StructAnyOrderTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/StructAnyOrderTestCase.java
new file mode 100755
index 00000000000..865b5da87cf
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/StructAnyOrderTestCase.java
@@ -0,0 +1,17 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * @author Einar M R Rosenvinge
+ */
+public class StructAnyOrderTestCase extends AbstractExportingTestCase {
+ @Test
+ public void testStructAnyOrder() throws IOException, ParseException {
+ assertCorrectDeriving("structanyorder");
+ }
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/StructInheritanceTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/StructInheritanceTestCase.java
new file mode 100644
index 00000000000..092e64420e8
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/StructInheritanceTestCase.java
@@ -0,0 +1,52 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+
+import com.yahoo.schema.ApplicationBuilder;
+
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+import java.io.IOException;
+
+
+import org.junit.rules.TemporaryFolder;
+
+/**
+ * Tests struct inheritance
+ *
+ * @author arnej
+ */
+public class StructInheritanceTestCase extends AbstractExportingTestCase {
+
+ @Rule
+ public TemporaryFolder tmpDir = new TemporaryFolder();
+
+ @SuppressWarnings("deprecation")
+ @Rule
+ public final ExpectedException exceptionRule = ExpectedException.none();
+
+ @Test
+ public void requireThatStructCanInherit() throws IOException, ParseException {
+ String dir = "src/test/derived/structinheritance/";
+ ApplicationBuilder builder = new ApplicationBuilder();
+ builder.addSchemaFile(dir + "simple.sd");
+ builder.build(false);
+ derive("structinheritance", builder, builder.getSchema("simple"));
+ assertCorrectConfigFiles("structinheritance");
+ }
+
+ @Test
+ public void requireThatRedeclareIsNotAllowed() throws IOException, ParseException {
+ exceptionRule.expect(IllegalArgumentException.class);
+ exceptionRule.expectMessage("cannot inherit from base and redeclare field name");
+ String dir = "src/test/derived/structinheritance/";
+ ApplicationBuilder builder = new ApplicationBuilder();
+ builder.addSchemaFile(dir + "bad.sd");
+ builder.build(true);
+ derive("structinheritance", builder, builder.getSchema("bad"));
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/SummaryMapTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/SummaryMapTestCase.java
new file mode 100644
index 00000000000..f0fc58b97e5
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/SummaryMapTestCase.java
@@ -0,0 +1,187 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.config.model.test.MockApplicationPackage;
+import com.yahoo.schema.*;
+import com.yahoo.vespa.config.search.SummarymapConfig;
+import com.yahoo.config.model.application.provider.BaseDeployLogger;
+import com.yahoo.document.PositionDataType;
+import com.yahoo.schema.document.SDDocumentType;
+import com.yahoo.schema.document.SDField;
+import com.yahoo.schema.parser.ParseException;
+import com.yahoo.schema.processing.Processing;
+import com.yahoo.vespa.documentmodel.SummaryTransform;
+import com.yahoo.vespa.model.container.search.QueryProfiles;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Set;
+
+import static com.yahoo.config.model.test.TestUtil.joinLines;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+/**
+ * Tests summary map extraction
+ *
+ * @author bratseth
+ */
+public class SummaryMapTestCase extends AbstractSchemaTestCase {
+ @Test
+ public void testDeriving() throws IOException, ParseException {
+ Schema schema = ApplicationBuilder.buildFromFile("src/test/examples/simple.sd");
+ SummaryMap summaryMap = new SummaryMap(schema);
+
+ Iterator<FieldResultTransform> transforms = summaryMap.resultTransforms().values().iterator();
+ FieldResultTransform transform = transforms.next();
+ assertEquals("dyndesc", transform.getFieldName());
+ assertEquals(SummaryTransform.DYNAMICTEASER, transform.getTransform());
+
+ transform = transforms.next();
+ assertEquals("dynlong", transform.getFieldName());
+ assertEquals(SummaryTransform.DYNAMICTEASER, transform.getTransform());
+
+ transform = transforms.next();
+ assertEquals("dyndesc2", transform.getFieldName());
+ assertEquals(SummaryTransform.DYNAMICTEASER, transform.getTransform());
+
+ transform = transforms.next();
+ assertEquals("measurement", transform.getFieldName());
+ assertEquals(SummaryTransform.ATTRIBUTE, transform.getTransform());
+
+ transform = transforms.next();
+ assertEquals("rankfeatures", transform.getFieldName());
+ assertEquals(SummaryTransform.RANKFEATURES, transform.getTransform());
+
+ transform = transforms.next();
+ assertEquals("summaryfeatures", transform.getFieldName());
+ assertEquals(SummaryTransform.SUMMARYFEATURES, transform.getTransform());
+
+ transform = transforms.next();
+ assertEquals("popsiness", transform.getFieldName());
+ assertEquals(SummaryTransform.ATTRIBUTE, transform.getTransform());
+
+ transform = transforms.next();
+ assertEquals("popularity", transform.getFieldName());
+ assertEquals(SummaryTransform.ATTRIBUTE, transform.getTransform());
+
+ transform = transforms.next();
+ assertEquals("access", transform.getFieldName());
+ assertEquals(SummaryTransform.ATTRIBUTE, transform.getTransform());
+
+ assertFalse(transforms.hasNext());
+ }
+ @Test
+ public void testPositionDeriving() {
+ Schema schema = new Schema("store", MockApplicationPackage.createEmpty());
+ SDDocumentType document = new SDDocumentType("store");
+ schema.addDocument(document);
+ String fieldName = "location";
+ SDField field = document.addField(fieldName, PositionDataType.INSTANCE);
+ field.parseIndexingScript("{ attribute | summary }");
+ new Processing().process(schema, new BaseDeployLogger(), new RankProfileRegistry(), new QueryProfiles(),
+ true, false, Set.of());
+ SummaryMap summaryMap = new SummaryMap(schema);
+
+ Iterator<FieldResultTransform> transforms = summaryMap.resultTransforms().values().iterator();
+
+ FieldResultTransform transform = transforms.next();
+
+ assertEquals(fieldName, transform.getFieldName());
+ assertEquals(SummaryTransform.GEOPOS, transform.getTransform());
+
+ transform = transforms.next();
+ assertEquals("rankfeatures", transform.getFieldName());
+ assertEquals(SummaryTransform.RANKFEATURES, transform.getTransform());
+
+ transform = transforms.next();
+ assertEquals("summaryfeatures", transform.getFieldName());
+ assertEquals(SummaryTransform.SUMMARYFEATURES, transform.getTransform());
+
+ transform = transforms.next();
+ assertEquals("location_zcurve", transform.getFieldName());
+ assertEquals(SummaryTransform.ATTRIBUTE,transform.getTransform());
+
+ assertFalse(transforms.hasNext());
+
+ SummarymapConfig.Builder scb = new SummarymapConfig.Builder();
+ summaryMap.getConfig(scb);
+ SummarymapConfig c = scb.build();
+
+ assertEquals(-1, c.defaultoutputclass());
+ assertEquals(c.override().size(), 4);
+
+ assertEquals(c.override(0).field(), fieldName);
+ assertEquals(c.override(0).command(), "geopos");
+ assertEquals(c.override(0).arguments(), PositionDataType.getZCurveFieldName(fieldName));
+
+ assertEquals(c.override(1).field(), "rankfeatures");
+ assertEquals(c.override(1).command(), "rankfeatures");
+ assertEquals(c.override(1).arguments(), "");
+
+ assertEquals(c.override(2).field(), "summaryfeatures");
+ assertEquals(c.override(2).command(), "summaryfeatures");
+ assertEquals(c.override(2).arguments(), "");
+
+ assertEquals(c.override(3).field(), "location_zcurve");
+ assertEquals(c.override(3).command(), "attribute");
+ assertEquals(c.override(3).arguments(), "location_zcurve");
+ }
+
+ @Test
+ public void testFailOnSummaryFieldSourceCollision() {
+ try {
+ ApplicationBuilder.buildFromFile("src/test/examples/summaryfieldcollision.sd");
+ } catch (Exception e) {
+ assertTrue(e.getMessage().matches(".*equally named field.*"));
+ }
+ }
+
+ @Test
+ public void source_field_is_passed_as_argument_in_matched_elements_filter_transforms() throws ParseException {
+ assertOverride(joinLines("field my_field type map<string, string> {",
+ " indexing: summary",
+ " summary: matched-elements-only",
+ " struct-field key { indexing: attribute }",
+ "}"), "my_field", SummaryTransform.MATCHED_ELEMENTS_FILTER.getName());
+
+ assertOverride(joinLines("field my_field type map<string, string> {",
+ " indexing: summary",
+ " summary: matched-elements-only",
+ " struct-field key { indexing: attribute }",
+ " struct-field value { indexing: attribute }",
+ "}"), "my_field", SummaryTransform.MATCHED_ATTRIBUTE_ELEMENTS_FILTER.getName());
+ }
+
+ @Test
+ public void commands_that_are_dynamic_and_require_the_query() {
+ assertTrue(SummaryMap.isDynamicCommand("dynamicteaser"));
+ assertTrue(SummaryMap.isDynamicCommand(SummaryTransform.MATCHED_ELEMENTS_FILTER.getName()));
+ assertTrue(SummaryMap.isDynamicCommand(SummaryTransform.MATCHED_ATTRIBUTE_ELEMENTS_FILTER.getName()));
+ assertFalse(SummaryMap.isDynamicCommand(SummaryTransform.ATTRIBUTE.getName()));
+ }
+
+ private void assertOverride(String fieldContent, String expFieldName, String expCommand) throws ParseException {
+ var summaryMap = new SummaryMap(buildSearch(fieldContent));
+ var cfgBuilder = new SummarymapConfig.Builder();
+ summaryMap.getConfig(cfgBuilder);
+ var cfg = new SummarymapConfig(cfgBuilder);
+ var override = cfg.override(0);
+ assertEquals(expFieldName, override.field());
+ assertEquals(expCommand, override.command());
+ assertEquals(expFieldName, override.arguments());
+ }
+
+ private Schema buildSearch(String field) throws ParseException {
+ var builder = new ApplicationBuilder(new RankProfileRegistry());
+ builder.addSchema(joinLines("search test {",
+ " document test {",
+ field,
+ " }",
+ "}"));
+ builder.build(true);
+ return builder.getSchema();
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/SummaryTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/SummaryTestCase.java
new file mode 100644
index 00000000000..341d3ef7d43
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/SummaryTestCase.java
@@ -0,0 +1,182 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.config.model.application.provider.BaseDeployLogger;
+import com.yahoo.schema.Schema;
+import com.yahoo.schema.ApplicationBuilder;
+import com.yahoo.schema.AbstractSchemaTestCase;
+import com.yahoo.schema.parser.ParseException;
+import com.yahoo.vespa.config.search.SummaryConfig;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.Iterator;
+
+import static com.yahoo.config.model.test.TestUtil.joinLines;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Tests summary extraction
+ *
+ * @author bratseth
+ */
+public class SummaryTestCase extends AbstractSchemaTestCase {
+
+ @Test
+ public void deriveRawAsBase64() throws ParseException {
+ String sd = joinLines(
+ "schema s {",
+ " raw-as-base64-in-summary",
+ " document s {",
+ " field raw_field type raw {",
+ " indexing: summary",
+ " }",
+ " }",
+ "}");
+ Schema schema = ApplicationBuilder.createFromString(sd).getSchema();
+ SummaryClass summary = new SummaryClass(schema, schema.getSummary("default"), new BaseDeployLogger());
+ assertEquals(SummaryClassField.Type.RAW, summary.fields().get("raw_field").getType());
+ }
+
+ @Test
+ public void deriveRawAsLegacy() throws ParseException {
+ String sd = joinLines(
+ "schema s {",
+ " document s {",
+ " field raw_field type raw {",
+ " indexing: summary",
+ " }",
+ " }",
+ "}");
+ Schema schema = ApplicationBuilder.createFromString(sd).getSchema();
+ SummaryClass summary = new SummaryClass(schema, schema.getSummary("default"), new BaseDeployLogger());
+ assertEquals(SummaryClassField.Type.DATA, summary.fields().get("raw_field").getType());
+ }
+
+ @Test
+ public void testDeriving() throws IOException, ParseException {
+ Schema schema = ApplicationBuilder.buildFromFile("src/test/examples/simple.sd");
+ SummaryClass summary = new SummaryClass(schema, schema.getSummary("default"), new BaseDeployLogger());
+ assertEquals("default", summary.getName());
+
+ Iterator<SummaryClassField> fields = summary.fields().values().iterator();
+
+ SummaryClassField field;
+
+ assertEquals(13, summary.fields().size());
+
+ field = fields.next();
+ assertEquals("exactemento", field.getName());
+ assertEquals(SummaryClassField.Type.LONGSTRING, field.getType());
+
+ field = fields.next();
+ assertEquals("exact", field.getName());
+ assertEquals(SummaryClassField.Type.LONGSTRING, field.getType());
+
+ field = fields.next();
+ assertEquals("title", field.getName());
+ assertEquals(SummaryClassField.Type.LONGSTRING, field.getType());
+
+ field = fields.next();
+ assertEquals("description", field.getName());
+ assertEquals(SummaryClassField.Type.LONGSTRING, field.getType());
+
+ field = fields.next();
+ assertEquals("dyndesc", field.getName());
+ assertEquals(SummaryClassField.Type.LONGSTRING, field.getType());
+
+ field = fields.next();
+ assertEquals("longdesc", field.getName());
+ assertEquals(SummaryClassField.Type.LONGSTRING, field.getType());
+
+ field = fields.next();
+ assertEquals("longstat", field.getName());
+ assertEquals(SummaryClassField.Type.LONGSTRING, field.getType());
+
+ field = fields.next();
+ assertEquals("dynlong", field.getName());
+ assertEquals(SummaryClassField.Type.LONGSTRING, field.getType());
+
+ field = fields.next();
+ assertEquals("dyndesc2", field.getName());
+ assertEquals(SummaryClassField.Type.LONGSTRING, field.getType());
+
+ field = fields.next();
+ assertEquals("measurement", field.getName());
+ assertEquals(SummaryClassField.Type.INTEGER, field.getType());
+
+ field = fields.next();
+ assertEquals("rankfeatures", field.getName());
+ assertEquals(SummaryClassField.Type.FEATUREDATA, field.getType());
+
+ field = fields.next();
+ assertEquals("summaryfeatures", field.getName());
+ assertEquals(SummaryClassField.Type.FEATUREDATA, field.getType());
+
+ field = fields.next();
+ assertEquals("documentid", field.getName());
+ assertEquals(SummaryClassField.Type.LONGSTRING, field.getType());
+ }
+
+ @Test
+ public void reference_fields_can_be_part_of_summary_classes() throws ParseException {
+ Schema adSchema = buildCampaignAdModel();
+
+ SummaryClass defaultClass = new SummaryClass(adSchema, adSchema.getSummary("default"), new BaseDeployLogger());
+ assertEquals(SummaryClassField.Type.LONGSTRING, defaultClass.fields().get("campaign_ref").getType());
+ assertEquals(SummaryClassField.Type.LONGSTRING, defaultClass.fields().get("other_campaign_ref").getType());
+
+ SummaryClass myClass = new SummaryClass(adSchema, adSchema.getSummary("my_summary"), new BaseDeployLogger());
+ assertNull(myClass.fields().get("campaign_ref"));
+ assertEquals(SummaryClassField.Type.LONGSTRING, myClass.fields().get("other_campaign_ref").getType());
+ }
+
+ private static Schema buildCampaignAdModel() throws ParseException {
+ ApplicationBuilder builder = new ApplicationBuilder();
+ builder.addSchema("search campaign { document campaign {} }");
+ builder.addSchema(joinLines("search ad {",
+ " document ad {",
+ " field campaign_ref type reference<campaign> {",
+ " indexing: summary | attribute",
+ " }",
+ " field other_campaign_ref type reference<campaign> {",
+ " indexing: summary | attribute",
+ " }",
+ " }",
+ " document-summary my_summary {",
+ " summary other_campaign_ref type reference<campaign> {}",
+ " }",
+ "}"));
+ builder.build(true);
+ return builder.getSchema("ad");
+ }
+
+ @Test
+ public void omit_summary_features_specified_for_document_summary() throws ParseException {
+ String sd = joinLines(
+ "schema test {",
+ " document test {",
+ " field foo type string { indexing: summary }",
+ " }",
+ " document-summary bar {",
+ " summary foo type string {}",
+ " omit-summary-features",
+ " }",
+ " document-summary baz {",
+ " summary foo type string {}",
+ " }",
+ "}");
+ var search = ApplicationBuilder.createFromString(sd).getSchema();
+ assertOmitSummaryFeatures(true, search, "bar");
+ assertOmitSummaryFeatures(false, search, "baz");
+ }
+
+ private void assertOmitSummaryFeatures(boolean expected, Schema schema, String summaryName) {
+ var summary = new SummaryClass(schema, schema.getSummary(summaryName), new BaseDeployLogger());
+ var config = new SummaryConfig.Classes(summary.getSummaryClassConfig());
+ assertEquals(expected, config.omitsummaryfeatures());
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/TestableDeployLogger.java b/config-model/src/test/java/com/yahoo/schema/derived/TestableDeployLogger.java
new file mode 100644
index 00000000000..bcde0f6b544
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/TestableDeployLogger.java
@@ -0,0 +1,30 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.config.application.api.DeployLogger;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * @author bratseth
+ */
+public class TestableDeployLogger implements DeployLogger {
+
+ private static final Logger log = Logger.getLogger("DeployLogger");
+
+ public List<String> warnings = new ArrayList<>();
+ public List<String> info = new ArrayList<>();
+
+ @Override
+ public final void log(Level level, String message) {
+ log.log(level, message);
+ if (level.equals(Level.WARNING))
+ warnings.add(message);
+ if (level.equals(Level.INFO))
+ info.add(message);
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/TokenizationTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/TokenizationTestCase.java
new file mode 100755
index 00000000000..ac6acf172e9
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/TokenizationTestCase.java
@@ -0,0 +1,19 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * @author bratseh
+ */
+public class TokenizationTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testTokenizationScripts() throws IOException, ParseException {
+ assertCorrectDeriving("tokenization");
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/TwoStreamingStructsTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/TwoStreamingStructsTestCase.java
new file mode 100644
index 00000000000..72411fa1770
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/TwoStreamingStructsTestCase.java
@@ -0,0 +1,34 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.ApplicationBuilder;
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * Test structs for streaming with another unrelated .sd present
+ *
+ * @author arnej27959
+ */
+public class TwoStreamingStructsTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testTwoStreamingStructsExporting() throws ParseException, IOException {
+
+ String root = "src/test/derived/twostreamingstructs";
+ ApplicationBuilder builder = new ApplicationBuilder();
+ builder.addSchemaFile(root + "/streamingstruct.sd");
+ builder.addSchemaFile(root + "/whatever.sd");
+ builder.build(true);
+ assertCorrectDeriving(builder, builder.getSchema("streamingstruct"), root);
+
+ builder = new ApplicationBuilder();
+ builder.addSchemaFile(root + "/streamingstruct.sd");
+ builder.addSchemaFile(root + "/whatever.sd");
+ builder.build(true);
+ assertCorrectDeriving(builder, builder.getSchema("streamingstruct"), root);
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/TypeConversionTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/TypeConversionTestCase.java
new file mode 100644
index 00000000000..84a561924ca
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/TypeConversionTestCase.java
@@ -0,0 +1,44 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.config.model.application.provider.BaseDeployLogger;
+import com.yahoo.config.model.test.MockApplicationPackage;
+import com.yahoo.document.DataType;
+import com.yahoo.schema.RankProfileRegistry;
+import com.yahoo.schema.Schema;
+import com.yahoo.schema.AbstractSchemaTestCase;
+import com.yahoo.schema.document.SDDocumentType;
+import com.yahoo.schema.document.SDField;
+import com.yahoo.schema.processing.Processing;
+import com.yahoo.vespa.model.container.search.QueryProfiles;
+import org.junit.Test;
+
+import java.util.Set;
+
+import static org.junit.Assert.assertFalse;
+/**
+ * Tests automatic type conversion using multifield indices
+ *
+ * @author bratseth
+ */
+public class TypeConversionTestCase extends AbstractSchemaTestCase {
+
+ /** Tests that exact-string stuff is not spilled over to the default index */
+ @Test
+ public void testExactStringToStringTypeConversion() {
+ Schema schema = new Schema("test", MockApplicationPackage.createEmpty());
+ RankProfileRegistry rankProfileRegistry = RankProfileRegistry.createRankProfileRegistryWithBuiltinRankProfiles(schema);
+ SDDocumentType document = new SDDocumentType("test");
+ schema.addDocument(document);
+ SDField a = new SDField(document, "a", DataType.STRING);
+ a.parseIndexingScript("{ index }");
+ document.addField(a);
+
+ new Processing().process(schema, new BaseDeployLogger(), rankProfileRegistry, new QueryProfiles(),
+ true, false, Set.of());
+ DerivedConfiguration derived = new DerivedConfiguration(schema, rankProfileRegistry);
+ IndexInfo indexInfo = derived.getIndexInfo();
+ assertFalse(indexInfo.hasCommand("default", "compact-to-term"));
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/TypesTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/TypesTestCase.java
new file mode 100644
index 00000000000..7443ef01c95
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/TypesTestCase.java
@@ -0,0 +1,21 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.schema.parser.ParseException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * Tests deriving of various field types
+ *
+ * @author bratseth
+ */
+public class TypesTestCase extends AbstractExportingTestCase {
+
+ @Test
+ public void testTypes() throws IOException, ParseException {
+ assertCorrectDeriving("types");
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/VsmFieldsTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/VsmFieldsTestCase.java
new file mode 100644
index 00000000000..c59f82a2c12
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/schema/derived/VsmFieldsTestCase.java
@@ -0,0 +1,42 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.schema.derived;
+
+import com.yahoo.config.model.application.provider.MockFileRegistry;
+import com.yahoo.config.model.deploy.TestProperties;
+import com.yahoo.config.model.test.MockApplicationPackage;
+import com.yahoo.documentmodel.NewDocumentReferenceDataType;
+import com.yahoo.schema.Schema;
+import com.yahoo.schema.document.SDDocumentType;
+import com.yahoo.schema.document.SDField;
+import com.yahoo.schema.document.TemporarySDField;
+import com.yahoo.vespa.config.search.vsm.VsmfieldsConfig;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author geirst
+ */
+public class VsmFieldsTestCase {
+
+ @SuppressWarnings("deprecation")
+ @Test
+ public void reference_type_field_is_unsearchable() {
+ Schema schema = new Schema("test", MockApplicationPackage.createEmpty(), new MockFileRegistry(), new TestableDeployLogger(), new TestProperties());
+ var sdoc = new SDDocumentType("test");
+ schema.addDocument(sdoc);
+ SDField refField = new TemporarySDField(sdoc, "ref_field", NewDocumentReferenceDataType.forDocumentName("parent_type"));
+ refField.parseIndexingScript("{ summary }");
+ schema.getDocument().addField(refField);
+
+ VsmFields vsmFields = new VsmFields(schema);
+ VsmfieldsConfig.Builder cfgBuilder = new VsmfieldsConfig.Builder();
+ vsmFields.getConfig(cfgBuilder);
+ VsmfieldsConfig cfg = cfgBuilder.build();
+
+ assertEquals(1, cfg.fieldspec().size());
+ VsmfieldsConfig.Fieldspec fieldSpec = cfg.fieldspec().get(0);
+ assertEquals("ref_field", fieldSpec.name());
+ assertEquals(VsmfieldsConfig.Fieldspec.Searchmethod.NONE, fieldSpec.searchmethod());
+ }
+}