From 65ecb02c12d3f87ee3839bdddd14ce969a40d7ce Mon Sep 17 00:00:00 2001 From: Geir Storli Date: Tue, 13 Sep 2022 11:24:10 +0000 Subject: Allow dynamic transforms on array summary fields. --- .../com/yahoo/schema/derived/SummaryClass.java | 11 +-- .../processing/AddExtraFieldsToDocument.java | 16 ++-- .../java/com/yahoo/schema/processing/Bolding.java | 9 +- .../processing/DynamicSummaryTransformUtils.java | 59 ++++++++++++ .../yahoo/schema/processing/IndexingOutputs.java | 12 ++- .../processing/SummaryDynamicStructsArrays.java | 8 +- .../bolding_dynamic_summary/documenttypes.cfg | 104 +++++++++++++++++++++ .../derived/bolding_dynamic_summary/ilscripts.cfg | 19 ++++ .../derived/bolding_dynamic_summary/summary.cfg | 92 ++++++++++++++++++ .../test/derived/bolding_dynamic_summary/test.sd | 50 ++++++++++ .../yahoo/schema/derived/ExportingTestCase.java | 5 + .../yahoo/schema/processing/BoldingTestCase.java | 14 +-- 12 files changed, 363 insertions(+), 36 deletions(-) create mode 100644 config-model/src/main/java/com/yahoo/schema/processing/DynamicSummaryTransformUtils.java create mode 100644 config-model/src/test/derived/bolding_dynamic_summary/documenttypes.cfg create mode 100644 config-model/src/test/derived/bolding_dynamic_summary/ilscripts.cfg create mode 100644 config-model/src/test/derived/bolding_dynamic_summary/summary.cfg create mode 100644 config-model/src/test/derived/bolding_dynamic_summary/test.sd (limited to 'config-model') diff --git a/config-model/src/main/java/com/yahoo/schema/derived/SummaryClass.java b/config-model/src/main/java/com/yahoo/schema/derived/SummaryClass.java index b8aa89fc82a..b9355693da8 100644 --- a/config-model/src/main/java/com/yahoo/schema/derived/SummaryClass.java +++ b/config-model/src/main/java/com/yahoo/schema/derived/SummaryClass.java @@ -5,6 +5,7 @@ import com.yahoo.config.application.api.DeployLogger; import com.yahoo.document.DataType; import com.yahoo.prelude.fastsearch.DocsumDefinitionSet; import com.yahoo.schema.Schema; +import com.yahoo.schema.processing.DynamicSummaryTransformUtils; import com.yahoo.vespa.config.search.SummaryConfig; import com.yahoo.vespa.documentmodel.DocumentSummary; import com.yahoo.vespa.documentmodel.SummaryField; @@ -158,14 +159,10 @@ public class SummaryClass extends Derived { summaryField.getTransform() == SummaryTransform.MATCHED_ATTRIBUTE_ELEMENTS_FILTER) { return summaryField.getSingleSource(); + } else if (summaryField.getTransform().isDynamic()) { + return DynamicSummaryTransformUtils.getSource(summaryField); } else { - // Note: Currently source mapping is handled in the indexing statement, - // by creating a summary field for each of the values - // This works, but is suboptimal. We could consolidate to a minimal set and - // use the right value from the minimal set as the third parameter here, - // and add "override" commands to multiple static values - boolean useFieldNameAsArgument = summaryField.getTransform().isDynamic(); - return useFieldNameAsArgument ? summaryField.getName() : ""; + return ""; } } diff --git a/config-model/src/main/java/com/yahoo/schema/processing/AddExtraFieldsToDocument.java b/config-model/src/main/java/com/yahoo/schema/processing/AddExtraFieldsToDocument.java index 3afc25131c0..77a17878840 100644 --- a/config-model/src/main/java/com/yahoo/schema/processing/AddExtraFieldsToDocument.java +++ b/config-model/src/main/java/com/yahoo/schema/processing/AddExtraFieldsToDocument.java @@ -10,6 +10,7 @@ import com.yahoo.schema.document.ImmutableSDField; import com.yahoo.schema.document.SDDocumentType; import com.yahoo.schema.document.SDField; import com.yahoo.vespa.documentmodel.SummaryField; +import com.yahoo.vespa.documentmodel.SummaryTransform; import com.yahoo.vespa.model.container.search.QueryProfiles; /** @@ -33,15 +34,14 @@ public class AddExtraFieldsToDocument extends Processor { } for (var docsum : schema.getSummaries().values()) { for (var summaryField : docsum.getSummaryFields().values()) { - switch (summaryField.getTransform()) { - case NONE: - case BOLDED: - case DYNAMICBOLDED: - case DYNAMICTEASER: - case DOCUMENT_ID: // TODO: Adding the 'documentid' field should no longer be needed when the docsum framework in the backend has been simplified and the transform is always used. + var transform = summaryField.getTransform(); + if (transform.isDynamic() && DynamicSummaryTransformUtils.summaryFieldIsRequiredInDocumentType(summaryField) || + transform == SummaryTransform.NONE || + transform == SummaryTransform.DOCUMENT_ID) + { + // TODO: Adding the 'documentid' field should no longer be needed when the docsum framework in the backend has been simplified and the transform is always used. addSummaryField(schema, document, summaryField, validate); - break; - default: + } else { // skip: generated from attribute or similar, // so does not need to be included as an extra // field in the document type diff --git a/config-model/src/main/java/com/yahoo/schema/processing/Bolding.java b/config-model/src/main/java/com/yahoo/schema/processing/Bolding.java index 53a3d462d54..73ad4225c88 100644 --- a/config-model/src/main/java/com/yahoo/schema/processing/Bolding.java +++ b/config-model/src/main/java/com/yahoo/schema/processing/Bolding.java @@ -3,7 +3,6 @@ package com.yahoo.schema.processing; import com.yahoo.config.application.api.DeployLogger; import com.yahoo.schema.RankProfileRegistry; -import com.yahoo.document.DataType; import com.yahoo.schema.document.ImmutableSDField; import com.yahoo.schema.Schema; import com.yahoo.vespa.documentmodel.SummaryField; @@ -26,16 +25,12 @@ public class Bolding extends Processor { if ( ! validate) return; for (ImmutableSDField field : schema.allConcreteFields()) { for (SummaryField summary : field.getSummaryFields().values()) { - if (summary.getTransform().isBolded() && - !((summary.getDataType() == DataType.STRING) || (summary.getDataType() == DataType.URI))) - { + if (summary.getTransform().isBolded() && !DynamicSummaryTransformUtils.hasSupportedType(summary)) { throw new IllegalArgumentException("'bolding: on' for non-text field " + "'" + field.getName() + "'" + " (" + summary.getDataType() + ")" + " is not allowed"); - } else if (summary.getTransform().isDynamic() && - !((summary.getDataType() == DataType.STRING) || (summary.getDataType() == DataType.URI))) - { + } else if (summary.getTransform().isDynamic() && !DynamicSummaryTransformUtils.hasSupportedType(summary)) { throw new IllegalArgumentException("'summary: dynamic' for non-text field " + "'" + field.getName() + "'" + " (" + summary.getDataType() + ")" + diff --git a/config-model/src/main/java/com/yahoo/schema/processing/DynamicSummaryTransformUtils.java b/config-model/src/main/java/com/yahoo/schema/processing/DynamicSummaryTransformUtils.java new file mode 100644 index 00000000000..20597eca64f --- /dev/null +++ b/config-model/src/main/java/com/yahoo/schema/processing/DynamicSummaryTransformUtils.java @@ -0,0 +1,59 @@ +package com.yahoo.schema.processing; + +import com.yahoo.document.DataType; +import com.yahoo.vespa.documentmodel.SummaryField; + +/** + * This class contains utils used when handling summary fields with dynamic transforms during processing and deriving. + * + * Originally (before Vespa 8.52), dynamic transforms where only supported for string fields. + * Due to legacy functionality in the backend docsum framework, + * such summary fields are in some cases added as extra document fields and populated in indexing scripts. + * This is something we want to avoid in the future, but it might not be entirely possible before Vespa 9. + * + * With the introduction of dynamic transform for array of string fields, + * we move in the right direction and avoid adding extra document fields with indexing script population for this type. + * Instead, we configure the dynamic transform in the backend to use the original source field directly. + * + * See SummaryTransform.isDynamic() for which transforms this applies to. + */ +public class DynamicSummaryTransformUtils { + + public static boolean hasSupportedType(SummaryField field) { + return isSupportedType(field.getDataType()); + } + + public static boolean isSupportedType(DataType type) { + return isOriginalSupportedType(type) || isNewSupportedType(type); + } + + private static boolean isOriginalSupportedType(DataType type) { + return (type == DataType.STRING) || + (type == DataType.URI); + } + + private static boolean isNewSupportedType(DataType type) { + return (type.equals(DataType.getArray(DataType.STRING))); + } + + /** + * Whether a summary field must be populated by the source field with the given type in an indexing script. + */ + public static boolean summaryFieldIsPopulatedBySourceField(DataType sourceFieldType) { + return isOriginalSupportedType(sourceFieldType); + } + + /** + * Whether a summary field is required as an extra field in the document type. + */ + public static boolean summaryFieldIsRequiredInDocumentType(SummaryField summaryField) { + return summaryFieldIsPopulatedBySourceField(summaryField.getDataType()); + } + + public static String getSource(SummaryField summaryField) { + // Summary fields with the original supported type is always present in the document type, + // and we must use that field as source at run-time. + return isOriginalSupportedType(summaryField.getDataType()) ? + summaryField.getName() : summaryField.getSingleSource(); + } +} diff --git a/config-model/src/main/java/com/yahoo/schema/processing/IndexingOutputs.java b/config-model/src/main/java/com/yahoo/schema/processing/IndexingOutputs.java index ea65a223686..2c24d3e53e1 100644 --- a/config-model/src/main/java/com/yahoo/schema/processing/IndexingOutputs.java +++ b/config-model/src/main/java/com/yahoo/schema/processing/IndexingOutputs.java @@ -68,11 +68,13 @@ public class IndexingOutputs extends Processor { } if (summaryTransform.isDynamic()) { DataType fieldType = field.getDataType(); - if (fieldType != DataType.URI && fieldType != DataType.STRING) { - warn(schema, field, "Dynamic summaries are only supported for fields of type " + - "string, ignoring summary field '" + summaryField.getName() + - "' for sd field '" + field.getName() + "' of type " + - fieldType.getName() + "."); + if (!DynamicSummaryTransformUtils.summaryFieldIsPopulatedBySourceField(fieldType)) { + if (!DynamicSummaryTransformUtils.isSupportedType(fieldType)) { + warn(schema, field, "Dynamic summaries are only supported for fields of type " + + "string and array, ignoring summary field '" + summaryField.getName() + + "' for sd field '" + field.getName() + "' of type " + + fieldType.getName() + "."); + } return; } dynamicSummary.add(summaryName); diff --git a/config-model/src/main/java/com/yahoo/schema/processing/SummaryDynamicStructsArrays.java b/config-model/src/main/java/com/yahoo/schema/processing/SummaryDynamicStructsArrays.java index ed1f47611eb..a899f5e82ab 100644 --- a/config-model/src/main/java/com/yahoo/schema/processing/SummaryDynamicStructsArrays.java +++ b/config-model/src/main/java/com/yahoo/schema/processing/SummaryDynamicStructsArrays.java @@ -13,7 +13,7 @@ import com.yahoo.vespa.model.container.search.QueryProfiles; /** * Fail if: - * An SD field explicitly says summary:dynamic , but the field is wset, array or struct. + * An SD field explicitly says summary:dynamic , but the field is non-string array, wset, or struct. * If there is an explicitly defined summary class, saying dynamic in one of its summary * fields is always legal. * @@ -31,7 +31,7 @@ public class SummaryDynamicStructsArrays extends Processor { for (SDField field : schema.allConcreteFields()) { DataType type = field.getDataType(); - if (type instanceof ArrayDataType || type instanceof WeightedSetDataType || type instanceof StructDataType) { + if (isNonStringArray(type) || type instanceof WeightedSetDataType || type instanceof StructDataType) { for (SummaryField sField : field.getSummaryFields().values()) { if (sField.getTransform().equals(SummaryTransform.DYNAMICTEASER)) { throw new IllegalArgumentException("For field '"+field.getName()+"': dynamic summary is illegal " + @@ -44,4 +44,8 @@ public class SummaryDynamicStructsArrays extends Processor { } } + private boolean isNonStringArray(DataType type) { + return (type instanceof ArrayDataType) && (!type.equals(DataType.getArray(DataType.STRING))); + } + } diff --git a/config-model/src/test/derived/bolding_dynamic_summary/documenttypes.cfg b/config-model/src/test/derived/bolding_dynamic_summary/documenttypes.cfg new file mode 100644 index 00000000000..f88a22d8979 --- /dev/null +++ b/config-model/src/test/derived/bolding_dynamic_summary/documenttypes.cfg @@ -0,0 +1,104 @@ +ignoreundefinedfields false +usev8geopositions false +doctype[].name "document" +doctype[].idx 10000 +doctype[].internalid 8 +doctype[].contentstruct 10001 +doctype[].primitivetype[].idx 10002 +doctype[].primitivetype[].name "bool" +doctype[].primitivetype[].idx 10003 +doctype[].primitivetype[].name "byte" +doctype[].primitivetype[].idx 10004 +doctype[].primitivetype[].name "double" +doctype[].primitivetype[].idx 10005 +doctype[].primitivetype[].name "float" +doctype[].primitivetype[].idx 10006 +doctype[].primitivetype[].name "float16" +doctype[].primitivetype[].idx 10007 +doctype[].primitivetype[].name "int" +doctype[].primitivetype[].idx 10008 +doctype[].primitivetype[].name "long" +doctype[].primitivetype[].idx 10010 +doctype[].primitivetype[].name "predicate" +doctype[].primitivetype[].idx 10011 +doctype[].primitivetype[].name "raw" +doctype[].primitivetype[].idx 10012 +doctype[].primitivetype[].name "string" +doctype[].primitivetype[].idx 10014 +doctype[].primitivetype[].name "uri" +doctype[].wsettype[].idx 10013 +doctype[].wsettype[].elementtype 10012 +doctype[].wsettype[].createifnonexistent true +doctype[].wsettype[].removeifzero true +doctype[].wsettype[].internalid 18 +doctype[].structtype[].idx 10001 +doctype[].structtype[].name "document.header" +doctype[].structtype[].internalid -284186494 +doctype[].structtype[].idx 10009 +doctype[].structtype[].name "position" +doctype[].structtype[].field[].name "x" +doctype[].structtype[].field[].internalid 914677694 +doctype[].structtype[].field[].type 10007 +doctype[].structtype[].field[].name "y" +doctype[].structtype[].field[].internalid 900009410 +doctype[].structtype[].field[].type 10007 +doctype[].structtype[].internalid 1381038251 +doctype[].name "test" +doctype[].idx 10015 +doctype[].internalid -877171244 +doctype[].inherits[].idx 10000 +doctype[].contentstruct 10016 +doctype[].fieldsets{[]}.fields[] "arr_1" +doctype[].fieldsets{[]}.fields[] "arr_2" +doctype[].fieldsets{[]}.fields[] "arr_3" +doctype[].fieldsets{[]}.fields[] "arr_4" +doctype[].fieldsets{[]}.fields[] "str_1" +doctype[].fieldsets{[]}.fields[] "str_2" +doctype[].fieldsets{[]}.fields[] "str_3" +doctype[].fieldsets{[]}.fields[] "str_4" +doctype[].arraytype[].idx 10017 +doctype[].arraytype[].elementtype 10012 +doctype[].arraytype[].internalid -1486737430 +doctype[].arraytype[].idx 10018 +doctype[].arraytype[].elementtype 10012 +doctype[].arraytype[].internalid -1486737430 +doctype[].arraytype[].idx 10019 +doctype[].arraytype[].elementtype 10012 +doctype[].arraytype[].internalid -1486737430 +doctype[].arraytype[].idx 10020 +doctype[].arraytype[].elementtype 10012 +doctype[].arraytype[].internalid -1486737430 +doctype[].structtype[].idx 10016 +doctype[].structtype[].name "test.header" +doctype[].structtype[].field[].name "str_1" +doctype[].structtype[].field[].internalid 91206053 +doctype[].structtype[].field[].type 10012 +doctype[].structtype[].field[].name "str_2" +doctype[].structtype[].field[].internalid 1236519725 +doctype[].structtype[].field[].type 10012 +doctype[].structtype[].field[].name "str_3" +doctype[].structtype[].field[].internalid 1257861515 +doctype[].structtype[].field[].type 10012 +doctype[].structtype[].field[].name "str_4" +doctype[].structtype[].field[].internalid 2009526185 +doctype[].structtype[].field[].type 10012 +doctype[].structtype[].field[].name "arr_1" +doctype[].structtype[].field[].internalid 618314164 +doctype[].structtype[].field[].type 10017 +doctype[].structtype[].field[].name "arr_2" +doctype[].structtype[].field[].internalid 1363829203 +doctype[].structtype[].field[].type 10018 +doctype[].structtype[].field[].name "arr_3" +doctype[].structtype[].field[].internalid 815179933 +doctype[].structtype[].field[].type 10019 +doctype[].structtype[].field[].name "arr_4" +doctype[].structtype[].field[].internalid 142340927 +doctype[].structtype[].field[].type 10020 +doctype[].structtype[].field[].name "str_3_dyn" +doctype[].structtype[].field[].internalid 1779429789 +doctype[].structtype[].field[].type 10012 +doctype[].structtype[].field[].name "str_4_bold" +doctype[].structtype[].field[].internalid 1385662257 +doctype[].structtype[].field[].type 10012 +doctype[].structtype[].internalid 306916075 + diff --git a/config-model/src/test/derived/bolding_dynamic_summary/ilscripts.cfg b/config-model/src/test/derived/bolding_dynamic_summary/ilscripts.cfg new file mode 100644 index 00000000000..f9fdab87297 --- /dev/null +++ b/config-model/src/test/derived/bolding_dynamic_summary/ilscripts.cfg @@ -0,0 +1,19 @@ +maxtermoccurrences 100 +fieldmatchmaxlength 1000000 +ilscript[].doctype "test" +ilscript[].docfield[] "str_1" +ilscript[].docfield[] "str_2" +ilscript[].docfield[] "str_3" +ilscript[].docfield[] "str_4" +ilscript[].docfield[] "arr_1" +ilscript[].docfield[] "arr_2" +ilscript[].docfield[] "arr_3" +ilscript[].docfield[] "arr_4" +ilscript[].content[] "clear_state | guard { input str_1 | tokenize normalize stem:\"BEST\" | index str_1 | summary str_1; }" +ilscript[].content[] "clear_state | guard { input str_2 | tokenize normalize stem:\"BEST\" | index str_2 | summary str_2; }" +ilscript[].content[] "clear_state | guard { input str_3 | tokenize normalize stem:\"BEST\" | index str_3 | summary str_3 | summary str_3_dyn; }" +ilscript[].content[] "clear_state | guard { input str_4 | tokenize normalize stem:\"BEST\" | index str_4 | summary str_4 | summary str_4_bold; }" +ilscript[].content[] "clear_state | guard { input arr_1 | for_each { tokenize normalize stem:\"BEST\" } | index arr_1 | summary arr_1; }" +ilscript[].content[] "clear_state | guard { input arr_2 | for_each { tokenize normalize stem:\"BEST\" } | index arr_2 | summary arr_2; }" +ilscript[].content[] "clear_state | guard { input arr_3 | for_each { tokenize normalize stem:\"BEST\" } | index arr_3 | summary arr_3; }" +ilscript[].content[] "clear_state | guard { input arr_4 | for_each { tokenize normalize stem:\"BEST\" } | index arr_4 | summary arr_4; }" diff --git a/config-model/src/test/derived/bolding_dynamic_summary/summary.cfg b/config-model/src/test/derived/bolding_dynamic_summary/summary.cfg new file mode 100644 index 00000000000..b056ada8bd5 --- /dev/null +++ b/config-model/src/test/derived/bolding_dynamic_summary/summary.cfg @@ -0,0 +1,92 @@ +defaultsummaryid 1128441658 +usev8geopositions true +classes[].id 1128441658 +classes[].name "default" +classes[].omitsummaryfeatures false +classes[].fields[].name "str_1" +classes[].fields[].type "longstring" +classes[].fields[].command "dynamicteaser" +classes[].fields[].source "str_1" +classes[].fields[].name "str_2" +classes[].fields[].type "longstring" +classes[].fields[].command "dynamicteaser" +classes[].fields[].source "str_2" +classes[].fields[].name "str_3" +classes[].fields[].type "longstring" +classes[].fields[].command "" +classes[].fields[].source "" +classes[].fields[].name "str_4" +classes[].fields[].type "longstring" +classes[].fields[].command "" +classes[].fields[].source "" +classes[].fields[].name "arr_1" +classes[].fields[].type "jsonstring" +classes[].fields[].command "dynamicteaser" +classes[].fields[].source "arr_1" +classes[].fields[].name "arr_2" +classes[].fields[].type "jsonstring" +classes[].fields[].command "dynamicteaser" +classes[].fields[].source "arr_2" +classes[].fields[].name "arr_3" +classes[].fields[].type "jsonstring" +classes[].fields[].command "" +classes[].fields[].source "" +classes[].fields[].name "arr_4" +classes[].fields[].type "jsonstring" +classes[].fields[].command "" +classes[].fields[].source "" +classes[].fields[].name "rankfeatures" +classes[].fields[].type "featuredata" +classes[].fields[].command "rankfeatures" +classes[].fields[].source "" +classes[].fields[].name "summaryfeatures" +classes[].fields[].type "featuredata" +classes[].fields[].command "summaryfeatures" +classes[].fields[].source "" +classes[].fields[].name "str_3_dyn" +classes[].fields[].type "longstring" +classes[].fields[].command "dynamicteaser" +classes[].fields[].source "str_3_dyn" +classes[].fields[].name "arr_3_dyn" +classes[].fields[].type "jsonstring" +classes[].fields[].command "dynamicteaser" +classes[].fields[].source "arr_3" +classes[].fields[].name "str_4_bold" +classes[].fields[].type "longstring" +classes[].fields[].command "dynamicteaser" +classes[].fields[].source "str_4_bold" +classes[].fields[].name "arr_4_bold" +classes[].fields[].type "jsonstring" +classes[].fields[].command "dynamicteaser" +classes[].fields[].source "arr_4" +classes[].fields[].name "documentid" +classes[].fields[].type "longstring" +classes[].fields[].command "documentid" +classes[].fields[].source "" +classes[].id 2139497711 +classes[].name "dyn" +classes[].omitsummaryfeatures false +classes[].fields[].name "str_3_dyn" +classes[].fields[].type "longstring" +classes[].fields[].command "dynamicteaser" +classes[].fields[].source "str_3_dyn" +classes[].fields[].name "arr_3_dyn" +classes[].fields[].type "jsonstring" +classes[].fields[].command "dynamicteaser" +classes[].fields[].source "arr_3" +classes[].fields[].name "str_4_bold" +classes[].fields[].type "longstring" +classes[].fields[].command "dynamicteaser" +classes[].fields[].source "str_4_bold" +classes[].fields[].name "arr_4_bold" +classes[].fields[].type "jsonstring" +classes[].fields[].command "dynamicteaser" +classes[].fields[].source "arr_4" +classes[].fields[].name "rankfeatures" +classes[].fields[].type "featuredata" +classes[].fields[].command "rankfeatures" +classes[].fields[].source "" +classes[].fields[].name "summaryfeatures" +classes[].fields[].type "featuredata" +classes[].fields[].command "summaryfeatures" +classes[].fields[].source "" diff --git a/config-model/src/test/derived/bolding_dynamic_summary/test.sd b/config-model/src/test/derived/bolding_dynamic_summary/test.sd new file mode 100644 index 00000000000..caa7ca2cd2e --- /dev/null +++ b/config-model/src/test/derived/bolding_dynamic_summary/test.sd @@ -0,0 +1,50 @@ +schema test { + document test { + field str_1 type string { + indexing: index | summary + summary: dynamic + } + field str_2 type string { + indexing: index | summary + bolding: on + } + field str_3 type string { + indexing: index | summary + } + field str_4 type string { + indexing: index | summary + } + field arr_1 type array { + indexing: index | summary + summary: dynamic + } + field arr_2 type array { + indexing: index | summary + bolding: on + } + field arr_3 type array { + indexing: index | summary + } + field arr_4 type array { + indexing: index | summary + } + } + document-summary dyn { + summary str_3_dyn type string { + source: str_3 + dynamic + } + summary arr_3_dyn type array { + source: arr_3 + dynamic + } + summary str_4_bold type string { + source: str_4 + bolding: on + } + summary arr_4_bold type array { + source: arr_4 + bolding: on + } + } +} 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 index b5b075ae260..c1e65abb5a5 100644 --- a/config-model/src/test/java/com/yahoo/schema/derived/ExportingTestCase.java +++ b/config-model/src/test/java/com/yahoo/schema/derived/ExportingTestCase.java @@ -192,4 +192,9 @@ public class ExportingTestCase extends AbstractExportingTestCase { assertCorrectDeriving("structandfieldset"); } + @Test + void testBoldingAndDynamicSummary() throws IOException, ParseException { + assertCorrectDeriving("bolding_dynamic_summary"); + } + } diff --git a/config-model/src/test/java/com/yahoo/schema/processing/BoldingTestCase.java b/config-model/src/test/java/com/yahoo/schema/processing/BoldingTestCase.java index fe38ea1f1b1..7162cf7717b 100644 --- a/config-model/src/test/java/com/yahoo/schema/processing/BoldingTestCase.java +++ b/config-model/src/test/java/com/yahoo/schema/processing/BoldingTestCase.java @@ -39,10 +39,10 @@ public class BoldingTestCase extends AbstractSchemaTestCase { } } - private final String boldonarray = - "search boldonarray {\n" + - " document boldonarray {\n" + - " field myarray type array {\n" + + private final String boldonwset = + "search test {\n" + + " document test {\n" + + " field mywset type weightedset {\n" + " indexing: summary | index\n" + " bolding: on\n" + " }\n" + @@ -50,12 +50,12 @@ public class BoldingTestCase extends AbstractSchemaTestCase { "}\n"; @Test - void testBoldOnArray() throws ParseException { + void testBoldOnWsetThrowsException() throws ParseException { try { - ApplicationBuilder.createFromString(boldonarray); + ApplicationBuilder.createFromString(boldonwset); fail("Expected exception"); } catch (IllegalArgumentException e) { - assertEquals("'bolding: on' for non-text field 'myarray' (datatype Array (code: -1486737430)) is not allowed", + assertEquals("'bolding: on' for non-text field 'mywset' (datatype WeightedSet (code: 1328286588)) is not allowed", e.getMessage()); } } -- cgit v1.2.3