diff options
author | Geir Storli <geirst@verizonmedia.com> | 2019-10-24 16:33:56 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-10-24 16:33:56 +0200 |
commit | a51c511c0e1043acfcc7e1196cc8ead2829d7245 (patch) | |
tree | 7d8f0152f1273b753f56576ec8c6fcc9a9890557 | |
parent | b5e789393f052d55378c09118c1bb64e39563c99 (diff) | |
parent | 8a89bb044db2823b84411daefe09afe65f4c13f1 (diff) |
Merge pull request #11084 from vespa-engine/toregge/update-summary-disk-access-validator-for-struct-fields
Update SummaryDiskAccessValidator for struct fields.
-rw-r--r-- | config-model/src/main/java/com/yahoo/searchdefinition/processing/SummaryDiskAccessValidator.java | 12 | ||||
-rw-r--r-- | config-model/src/test/java/com/yahoo/searchdefinition/SummaryTestCase.java | 32 |
2 files changed, 42 insertions, 2 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/processing/SummaryDiskAccessValidator.java b/config-model/src/main/java/com/yahoo/searchdefinition/processing/SummaryDiskAccessValidator.java index 8c0c6a74037..2fab941b10e 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/processing/SummaryDiskAccessValidator.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/processing/SummaryDiskAccessValidator.java @@ -7,11 +7,14 @@ import com.yahoo.searchdefinition.derived.SummaryClass; import com.yahoo.searchdefinition.document.ImmutableSDField; 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 java.util.Optional; import java.util.logging.Level; +import static com.yahoo.searchdefinition.document.ComplexAttributeFieldUtils.isComplexFieldWithOnlyStructFieldAttributes; + /** * Emits a warning for summaries which accesses disk. * @@ -41,7 +44,7 @@ public class SummaryDiskAccessValidator extends Processor { if (field == null && ! source.getName().equals(SummaryClass.DOCUMENT_ID_FIELD)) throw new IllegalArgumentException(summaryField + " in " + summary + " references " + source + ", but this field does not exist"); - if ( ! isInMemory(field) && ! summary.isFromDisk()) { + if ( ! isInMemory(field, summaryField) && ! summary.isFromDisk()) { deployLogger.log(Level.WARNING, summaryField + " in " + summary + " references " + source + ", which is not an attribute: Using this " + "summary will cause disk accesses. " + @@ -52,8 +55,13 @@ public class SummaryDiskAccessValidator extends Processor { } } - private boolean isInMemory(ImmutableSDField field) { + private boolean isInMemory(ImmutableSDField field, SummaryField summaryField) { if (field == null) return false; // For DOCUMENT_ID_FIELD, which may be implicit, but is then not in memory + if (isComplexFieldWithOnlyStructFieldAttributes(field) && + (summaryField.getTransform() == SummaryTransform.ATTRIBUTECOMBINER || + summaryField.getTransform() == SummaryTransform.MATCHED_ATTRIBUTE_ELEMENTS_FILTER)) { + return true; + } return field.doesAttributing(); } diff --git a/config-model/src/test/java/com/yahoo/searchdefinition/SummaryTestCase.java b/config-model/src/test/java/com/yahoo/searchdefinition/SummaryTestCase.java index f94ac1c285c..6fbd80adaa9 100644 --- a/config-model/src/test/java/com/yahoo/searchdefinition/SummaryTestCase.java +++ b/config-model/src/test/java/com/yahoo/searchdefinition/SummaryTestCase.java @@ -97,4 +97,36 @@ public class SummaryTestCase { assertTrue(logger.entries.isEmpty()); } + @Test + public void testStructMemorySummary() throws ParseException { + String sd = + "search structmemorysummary {\n" + + " document structmemorysummary {\n" + + " struct elem {\n" + + " field name type string {}\n" + + " field weight type int {}\n" + + " }\n" + + " field elem_array type array<elem> {\n" + + " indexing: summary\n" + + " struct-field name {\n" + + " indexing: attribute\n" + + " }\n" + + " struct-field weight {\n" + + " indexing: attribute\n" + + " }\n" + + " }\n" + + " }\n" + + " document-summary filtered {\n" + + " summary elem_array_filtered type array<elem> {\n" + + " source: elem_array\n" + + " matched-elements-only\n" + + " }\n" + + " }\n" + + "\n" + + "}"; + DeployLoggerStub logger = new DeployLoggerStub(); + SearchBuilder.createFromString(sd, logger); + assertTrue(logger.entries.isEmpty()); + } + } |