diff options
author | Geir Storli <geirst@verizonmedia.com> | 2019-09-24 13:42:10 +0200 |
---|---|---|
committer | Geir Storli <geirst@verizonmedia.com> | 2019-09-24 13:43:55 +0200 |
commit | 3a58734ed37e5f5d1d44f6cba1bc7d4ccbf80357 (patch) | |
tree | 0c868113c21f33f83de8605e4e11a3eeec2f1390 /config-model/src/main/java/com/yahoo/searchdefinition/processing/MatchedElementsOnlyResolver.java | |
parent | 11ab4237312e3f52fac8f5f82553ee2598ac5eed (diff) |
Add support for "matched-elements-only" flag on complex summary fields.
Supported field types are array of simple struct, map of primitive type to simple struct
and map of primitive type to primitive type.
Diffstat (limited to 'config-model/src/main/java/com/yahoo/searchdefinition/processing/MatchedElementsOnlyResolver.java')
-rw-r--r-- | config-model/src/main/java/com/yahoo/searchdefinition/processing/MatchedElementsOnlyResolver.java | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/processing/MatchedElementsOnlyResolver.java b/config-model/src/main/java/com/yahoo/searchdefinition/processing/MatchedElementsOnlyResolver.java new file mode 100644 index 00000000000..8bb834d4697 --- /dev/null +++ b/config-model/src/main/java/com/yahoo/searchdefinition/processing/MatchedElementsOnlyResolver.java @@ -0,0 +1,64 @@ +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.searchdefinition.processing; + +import com.yahoo.config.application.api.DeployLogger; +import com.yahoo.searchdefinition.RankProfileRegistry; +import com.yahoo.searchdefinition.Search; +import com.yahoo.vespa.documentmodel.DocumentSummary; +import com.yahoo.vespa.documentmodel.SummaryField; +import com.yahoo.vespa.documentmodel.SummaryTransform; +import com.yahoo.vespa.model.container.search.QueryProfiles; + +import static com.yahoo.searchdefinition.document.ComplexAttributeFieldUtils.isComplexFieldWithOnlyStructFieldAttributes; +import static com.yahoo.searchdefinition.document.ComplexAttributeFieldUtils.isSupportedComplexField; + +/** + * Iterates all summary fields with 'matched-elements-only' and adjusts transform (if all struct-fields are attributes) + * and validates that the field type is supported. + * + * @author geirst + */ +public class MatchedElementsOnlyResolver extends Processor { + + public MatchedElementsOnlyResolver(Search search, DeployLogger deployLogger, RankProfileRegistry rankProfileRegistry, QueryProfiles queryProfiles) { + super(search, deployLogger, rankProfileRegistry, queryProfiles); + } + + @Override + public void process(boolean validate, boolean documentsOnly) { + for (var entry : search.getSummaries().entrySet()) { + var summary = entry.getValue(); + for (var field : summary.getSummaryFields()) { + if (field.getTransform().equals(SummaryTransform.MATCHED_ELEMENTS_FILTER)) { + processSummaryField(summary, field, validate); + } + } + } + } + + private void processSummaryField(DocumentSummary summary, SummaryField field, boolean validate) { + var sourceField = search.getField(field.getSingleSource()); + if (sourceField != null) { + if (isSupportedComplexField(sourceField)) { + if (isComplexFieldWithOnlyStructFieldAttributes(sourceField)) { + field.setTransform(SummaryTransform.MATCHED_ATTRIBUTE_ELEMENTS_FILTER); + } + } else if (validate) { + fail(summary, field, "'matched-elements-only' is not supported for this field type. " + + "Supported field types are array of simple struct, map of primitive type to simple struct, " + + "and map of primitive type to primitive type"); + } + } + // else case is handled in SummaryFieldsMustHaveValidSource + } + + private void fail(DocumentSummary summary, SummaryField field, String msg) { + throw new IllegalArgumentException(formatError(search, summary, field, msg)); + } + + private String formatError(Search search, DocumentSummary summary, SummaryField field, String msg) { + return "For search '" + search.getName() + "', document summary '" + summary.getName() + + "', summary field '" + field.getName() + "': " + msg; + } + +} |