diff options
author | Jon Bratseth <bratseth@gmail.com> | 2022-05-19 12:03:06 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2022-05-19 12:03:06 +0200 |
commit | 5c24dc5c9642a8d9ed70aee4c950fd0678a1ebec (patch) | |
tree | bd9b74bf00c832456f0b83c1b2cd7010be387d68 /config-model/src/test/java/com/yahoo/schema/derived | |
parent | f17c4fe7de4c55f5c4ee61897eab8c2f588d8405 (diff) |
Rename the 'searchdefinition' package to 'schema'
Diffstat (limited to 'config-model/src/test/java/com/yahoo/schema/derived')
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()); + } +} |