summaryrefslogtreecommitdiffstats
path: root/config-model
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@broadpark.no>2019-10-24 13:49:46 +0200
committerTor Egge <Tor.Egge@broadpark.no>2019-10-24 13:49:46 +0200
commit8a89bb044db2823b84411daefe09afe65f4c13f1 (patch)
treeb84b136db74ceb85a9fe43f08a1a480a5e3de2ef /config-model
parentd36f55c5e067ebe8e929a23f236f8498144e785f (diff)
Update SummaryDiskAccessValidator for struct fields.
Diffstat (limited to 'config-model')
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/processing/SummaryDiskAccessValidator.java12
-rw-r--r--config-model/src/test/java/com/yahoo/searchdefinition/SummaryTestCase.java32
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());
+ }
+
}