From f2e0e1d72d30121cf1458246dacce3f85f84ddc0 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Wed, 10 Oct 2018 12:01:05 +0200 Subject: Add from-disk flag on document-summary And warn if not set and the summary accesses disk. --- .../java/com/yahoo/searchdefinition/Search.java | 8 +-- .../com/yahoo/searchdefinition/SearchBuilder.java | 6 +- .../searchdefinition/derived/SummaryClass.java | 4 +- .../yahoo/searchdefinition/derived/VsmSummary.java | 5 +- .../document/ImmutableImportedSDField.java | 6 ++ .../document/ImmutableSDField.java | 8 ++- .../yahoo/searchdefinition/document/SDField.java | 24 ++++---- .../SummaryInFieldLongOperation.java | 3 +- .../fieldoperation/SummaryInFieldOperation.java | 4 +- .../yahoo/searchdefinition/processing/Bolding.java | 2 +- .../processing/CreatePositionZCurve.java | 4 +- .../processing/ImplicitSummaries.java | 2 +- .../processing/IndexingOutputs.java | 2 +- .../searchdefinition/processing/Processing.java | 3 +- .../processing/SummaryDiskAccessValidator.java | 64 ++++++++++++++++++++++ .../processing/SummaryDynamicStructsArrays.java | 2 +- .../SummaryFieldsMustHaveValidSource.java | 4 +- .../yahoo/vespa/documentmodel/DocumentSummary.java | 7 +++ .../yahoo/vespa/documentmodel/SummaryField.java | 19 ++++--- .../search/IndexingScriptChangeMessageBuilder.java | 2 +- 20 files changed, 137 insertions(+), 42 deletions(-) create mode 100644 config-model/src/main/java/com/yahoo/searchdefinition/processing/SummaryDiskAccessValidator.java (limited to 'config-model/src/main/java/com') diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/Search.java b/config-model/src/main/java/com/yahoo/searchdefinition/Search.java index a988da9664e..d7c4c27b2b0 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/Search.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/Search.java @@ -3,6 +3,7 @@ package com.yahoo.searchdefinition; import com.yahoo.config.application.api.ApplicationPackage; import com.yahoo.document.Field; +import com.yahoo.searchdefinition.derived.SummaryClass; import com.yahoo.searchdefinition.document.Attribute; import com.yahoo.searchdefinition.document.ImmutableImportedSDField; import com.yahoo.searchdefinition.document.ImmutableSDField; @@ -46,12 +47,10 @@ public class Search implements Serializable, ImmutableSearch { private static final Logger log = Logger.getLogger(Search.class.getName()); private static final String SD_DOC_FIELD_NAME = "sddocname"; private static final List RESERVED_NAMES = Arrays.asList( - "index", "index_url", "summary", "attribute", "select_input", "host", "documentid", + "index", "index_url", "summary", "attribute", "select_input", "host", SummaryClass.DOCUMENT_ID_FIELD, "position", "split_foreach", "tokenize", "if", "else", "switch", "case", SD_DOC_FIELD_NAME, "relevancy"); - /** - * @return True if the given field name is a reserved name. - */ + /** Returns true if the given field name is a reserved name */ public static boolean isReservedName(String name) { return RESERVED_NAMES.contains(name); } @@ -99,6 +98,7 @@ public class Search implements Serializable, ImmutableSearch { /** * Creates a proper search definition + * * @param name of the the searchdefinition * @param applicationPackage the application containing this */ diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/SearchBuilder.java b/config-model/src/main/java/com/yahoo/searchdefinition/SearchBuilder.java index 151ad02a3fa..d8ec0b053ad 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/SearchBuilder.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/SearchBuilder.java @@ -332,7 +332,11 @@ public class SearchBuilder { * @throws ParseException if there was a problem parsing the file content. */ public static SearchBuilder createFromFile(String fileName) throws IOException, ParseException { - return createFromFile(fileName, new BaseDeployLogger(), new RankProfileRegistry(), new QueryProfileRegistry()); + return createFromFile(fileName, new BaseDeployLogger()); + } + + public static SearchBuilder createFromFile(String fileName, DeployLogger logger) throws IOException, ParseException { + return createFromFile(fileName, logger, new RankProfileRegistry(), new QueryProfileRegistry()); } /** diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/derived/SummaryClass.java b/config-model/src/main/java/com/yahoo/searchdefinition/derived/SummaryClass.java index dd5826e716f..56cfb2a595c 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/derived/SummaryClass.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/derived/SummaryClass.java @@ -24,6 +24,8 @@ import java.util.logging.Level; */ public class SummaryClass extends Derived { + public static final String DOCUMENT_ID_FIELD = "documentid"; + /** True if this summary class needs to access summary information on disk */ private boolean accessingDiskSummary=false; @@ -53,7 +55,7 @@ public class SummaryClass extends Derived { /** MUST be called after all other fields are added */ private void deriveImplicitFields(DocumentSummary summary) { if (summary.getName().equals("default")) { - addField("documentid", DataType.STRING); + addField(SummaryClass.DOCUMENT_ID_FIELD, DataType.STRING); } } diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/derived/VsmSummary.java b/config-model/src/main/java/com/yahoo/searchdefinition/derived/VsmSummary.java index 471234928b4..17210452b3f 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/derived/VsmSummary.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/derived/VsmSummary.java @@ -17,6 +17,7 @@ import java.util.*; * @author bratseth */ public class VsmSummary extends Derived implements VsmsummaryConfig.Producer { + private Map> summaryMap = new java.util.LinkedHashMap<>(1); public VsmSummary(Search search) { @@ -80,10 +81,10 @@ public class VsmSummary extends Derived implements VsmsummaryConfig.Producer { return true; } - private List toStringList(Iterator i) { + private List toStringList(Iterator i) { List ret = new ArrayList<>(); while (i.hasNext()) { - ret.add(i.next().toString()); + ret.add(i.next().getName()); } return ret; } diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableImportedSDField.java b/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableImportedSDField.java index ff11c2fdf22..dc2a1a2bbae 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableImportedSDField.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableImportedSDField.java @@ -5,6 +5,7 @@ import com.yahoo.document.DataType; import com.yahoo.document.Field; import com.yahoo.searchdefinition.Index; import com.yahoo.searchdefinition.Search; +import com.yahoo.vespa.documentmodel.SummaryField; import com.yahoo.vespa.indexinglanguage.expressions.Expression; import com.yahoo.vespa.indexinglanguage.expressions.ScriptExpression; @@ -149,6 +150,11 @@ public class ImmutableImportedSDField implements ImmutableSDField { throw createUnsupportedException("ranking"); } + @Override + public Map getSummaryFields() { + throw createUnsupportedException("summary fields"); + } + @Override public String getName() { return importedField.fieldName(); // Name of the imported field, not the target field diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableSDField.java b/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableSDField.java index 6fe8a4da92b..4ae7561a7bc 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableSDField.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableSDField.java @@ -5,10 +5,12 @@ import com.yahoo.document.DataType; import com.yahoo.document.Field; import com.yahoo.searchdefinition.Index; import com.yahoo.searchdefinition.Search; +import com.yahoo.vespa.documentmodel.SummaryField; import com.yahoo.vespa.indexinglanguage.expressions.Expression; import com.yahoo.vespa.indexinglanguage.expressions.ScriptExpression; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -76,9 +78,9 @@ public interface ImmutableSDField { String getName(); - /** - * @return a {@link Field} representation (which is sadly not immutable). - */ + Map getSummaryFields(); + + /** Returns a {@link Field} representation (which is sadly not immutable) */ Field asField(); boolean hasFullIndexingDocprocRights(); diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/document/SDField.java b/config-model/src/main/java/com/yahoo/searchdefinition/document/SDField.java index 6fc896b90c6..55260b6e68f 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/document/SDField.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/document/SDField.java @@ -78,10 +78,10 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, private List queryCommands=new java.util.ArrayList<>(0); /** Summary fields defined in this field */ - private Map summaryFields = new java.util.LinkedHashMap<>(0); + private Map summaryFields = new java.util.LinkedHashMap<>(0); /** The explicitly index settings on this field */ - private Map indices=new java.util.LinkedHashMap<>(); + private Map indices = new java.util.LinkedHashMap<>(); /** True if body or header is set explicitly for this field */ private boolean headerOrBodyDefined = false; @@ -254,7 +254,7 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, * to the main summary-field for the struct field. */ for (SDField structField : getStructFields()) { - for (SummaryField sumF : structField.getSummaryFields()) { + for (SummaryField sumF : structField.getSummaryFields().values()) { for (String dest : sumF.getDestinations()) { summaryField.addDestination(dest); } @@ -672,15 +672,17 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, this.stemming=stemming; } - /** - * List of static summary fields - * @return list of static summary fields - */ - public Collection getSummaryFields() { return summaryFields.values(); } + /** Returns an unmodifiable map of the summary fields defined in this */ + @Override + public Map getSummaryFields() { + return Collections.unmodifiableMap(summaryFields); + } - /** - * Add summary field - */ + public void removeSummaryFields() { + summaryFields.clear(); + } + + /** Adds a summary field */ public void addSummaryField(SummaryField summaryField) { summaryFields.put(summaryField.getName(),summaryField); } diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/SummaryInFieldLongOperation.java b/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/SummaryInFieldLongOperation.java index 4d6e077aaaa..f05873c5c6b 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/SummaryInFieldLongOperation.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/SummaryInFieldLongOperation.java @@ -11,9 +11,10 @@ import java.util.List; import java.util.Set; /** - * @author Einar M R Rosenvinge + * @author Einar M R Rosenvinge */ public class SummaryInFieldLongOperation extends SummaryInFieldOperation { + private DataType type; private Boolean bold; private Set destinations = new java.util.LinkedHashSet<>(); diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/SummaryInFieldOperation.java b/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/SummaryInFieldOperation.java index 6abbc2e9ac8..b36a1cb0cbc 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/SummaryInFieldOperation.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/SummaryInFieldOperation.java @@ -7,9 +7,10 @@ import com.yahoo.vespa.documentmodel.SummaryTransform; import java.util.Set; /** - * @author Einar M R Rosenvinge + * @author Einar M R Rosenvinge */ public abstract class SummaryInFieldOperation implements FieldOperation { + protected String name; protected SummaryTransform transform; protected Set sources = new java.util.LinkedHashSet<>(); @@ -41,4 +42,5 @@ public abstract class SummaryInFieldOperation implements FieldOperation { public void addSource(SummaryField.Source source) { sources.add(source); } + } diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/processing/Bolding.java b/config-model/src/main/java/com/yahoo/searchdefinition/processing/Bolding.java index b9be30e8485..b59d3527e87 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/processing/Bolding.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/processing/Bolding.java @@ -25,7 +25,7 @@ public class Bolding extends Processor { public void process(boolean validate, boolean documentsOnly) { if ( ! validate) return; for (SDField field : search.allConcreteFields()) { - for (SummaryField summary : field.getSummaryFields()) { + for (SummaryField summary : field.getSummaryFields().values()) { if (summary.getTransform().isBolded() && !((summary.getDataType() == DataType.STRING) || (summary.getDataType() == DataType.URI))) { diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/processing/CreatePositionZCurve.java b/config-model/src/main/java/com/yahoo/searchdefinition/processing/CreatePositionZCurve.java index ad862ef767f..c56c4f6b056 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/processing/CreatePositionZCurve.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/processing/CreatePositionZCurve.java @@ -133,11 +133,11 @@ public class CreatePositionZCurve extends Processor { private Set removeSummaryTo(SDField field) { Set summaryTo = new HashSet<>(); - Collection summaryFields = field.getSummaryFields(); + Collection summaryFields = field.getSummaryFields().values(); for (SummaryField summary : summaryFields) { summaryTo.addAll(summary.getDestinations()); } - summaryFields.clear(); + field.removeSummaryFields(); return summaryTo; } diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/processing/ImplicitSummaries.java b/config-model/src/main/java/com/yahoo/searchdefinition/processing/ImplicitSummaries.java index 1f795458875..724fb060dc2 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/processing/ImplicitSummaries.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/processing/ImplicitSummaries.java @@ -98,7 +98,7 @@ public class ImplicitSummaries extends Processor { } // Explicits - for (SummaryField summaryField : field.getSummaryFields()) { + for (SummaryField summaryField : field.getSummaryFields().values()) { // Make sure we fetch from attribute here too Attribute attribute = field.getAttributes().get(fieldName); if (attribute != null && summaryField.getTransform() == SummaryTransform.NONE) { diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/processing/IndexingOutputs.java b/config-model/src/main/java/com/yahoo/searchdefinition/processing/IndexingOutputs.java index 11d69bf6c75..4feb5b6103b 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/processing/IndexingOutputs.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/processing/IndexingOutputs.java @@ -82,7 +82,7 @@ public class IndexingOutputs extends Processor { } private static void fillSummaryToFromField(SDField field, Set dynamicSummary, Set staticSummary) { - for (SummaryField summaryField : field.getSummaryFields()) { + for (SummaryField summaryField : field.getSummaryFields().values()) { String summaryName = summaryField.getName(); if (summaryField.getTransform().isDynamic()) { dynamicSummary.add(summaryName); diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/processing/Processing.java b/config-model/src/main/java/com/yahoo/searchdefinition/processing/Processing.java index 1af2a979cb4..f744eeb82e1 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/processing/Processing.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/processing/Processing.java @@ -62,6 +62,7 @@ public class Processing { FilterFieldNames::new, MatchConsistency::new, ValidateFieldTypes::new, + SummaryDiskAccessValidator::new, DisallowComplexMapAndWsetKeyTypes::new, SortingSettings::new, FieldSetValidity::new, @@ -80,7 +81,7 @@ public class Processing { IndexingValues::new); } - /** Processors of rank profiles only (those who tolerate and so something useful when the search field is null) */ + /** Processors of rank profiles only (those who tolerate and do something useful when the search field is null) */ private Collection rankProfileProcessors() { return Arrays.asList( RankProfileTypeSettingsProcessor::new, 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 new file mode 100644 index 00000000000..8c0c6a74037 --- /dev/null +++ b/config-model/src/main/java/com/yahoo/searchdefinition/processing/SummaryDiskAccessValidator.java @@ -0,0 +1,64 @@ +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.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.model.container.search.QueryProfiles; + +import java.util.Optional; +import java.util.logging.Level; + +/** + * Emits a warning for summaries which accesses disk. + * + * @author bratseth + */ +public class SummaryDiskAccessValidator extends Processor { + + public SummaryDiskAccessValidator(Search search, + DeployLogger deployLogger, + RankProfileRegistry rankProfileRegistry, + QueryProfiles queryProfiles) { + super(search, deployLogger, rankProfileRegistry, queryProfiles); + } + + + @Override + public void process(boolean validate, boolean documentsOnly) { + if ( ! validate) return; + if (documentsOnly) return; + + for (DocumentSummary summary : search.getSummaries().values()) { + for (SummaryField summaryField : summary.getSummaryFields()) { + for (SummaryField.Source source : summaryField.getSources()) { + ImmutableSDField field = search.getField(source.getName()); + if (field == null) + field = findFieldProducingSummaryField(source.getName(), search).orElse(null); + 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()) { + deployLogger.log(Level.WARNING, summaryField + " in " + summary + " references " + + source + ", which is not an attribute: Using this " + + "summary will cause disk accesses. " + + "Set 'from-disk' on this summary class to silence this warning."); + } + } + } + } + } + + private boolean isInMemory(ImmutableSDField field) { + if (field == null) return false; // For DOCUMENT_ID_FIELD, which may be implicit, but is then not in memory + return field.doesAttributing(); + } + + private Optional findFieldProducingSummaryField(String name, Search search) { + return search.allFields().filter(field -> field.getSummaryFields().get(name) != null).findAny(); + } + +} diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/processing/SummaryDynamicStructsArrays.java b/config-model/src/main/java/com/yahoo/searchdefinition/processing/SummaryDynamicStructsArrays.java index b8d170c07f6..255e95e9667 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/processing/SummaryDynamicStructsArrays.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/processing/SummaryDynamicStructsArrays.java @@ -32,7 +32,7 @@ public class SummaryDynamicStructsArrays extends Processor { for (SDField field : search.allConcreteFields()) { DataType type = field.getDataType(); if (type instanceof ArrayDataType || type instanceof WeightedSetDataType || type instanceof StructDataType) { - for (SummaryField sField : field.getSummaryFields()) { + for (SummaryField sField : field.getSummaryFields().values()) { if (sField.getTransform().equals(SummaryTransform.DYNAMICTEASER)) { throw new IllegalArgumentException("For field '"+field.getName()+"': dynamic summary is illegal " + "for fields of type struct, array or weighted set. Use an " + diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/processing/SummaryFieldsMustHaveValidSource.java b/config-model/src/main/java/com/yahoo/searchdefinition/processing/SummaryFieldsMustHaveValidSource.java index 9b51c7c473e..c87801685bb 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/processing/SummaryFieldsMustHaveValidSource.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/processing/SummaryFieldsMustHaveValidSource.java @@ -4,6 +4,7 @@ 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.searchdefinition.derived.SummaryClass; import com.yahoo.vespa.documentmodel.DocumentSummary; import com.yahoo.vespa.documentmodel.SummaryField; import com.yahoo.vespa.documentmodel.SummaryTransform; @@ -13,7 +14,6 @@ import com.yahoo.vespa.model.container.search.QueryProfiles; * Verifies that the source fields actually refers to a valid field. * * @author baldersheim - * */ public class SummaryFieldsMustHaveValidSource extends Processor { @@ -51,7 +51,7 @@ public class SummaryFieldsMustHaveValidSource extends Processor { return isDocumentField(source) || (isNotInThisSummaryClass(summary, source) && isSummaryField(source)) || (isInThisSummaryClass(summary, source) && !source.equals(summaryField.getName())) || - ("documentid".equals(source)); + (SummaryClass.DOCUMENT_ID_FIELD.equals(source)); } private void verifySource(String source, SummaryField summaryField, DocumentSummary summary) { diff --git a/config-model/src/main/java/com/yahoo/vespa/documentmodel/DocumentSummary.java b/config-model/src/main/java/com/yahoo/vespa/documentmodel/DocumentSummary.java index 3860a1b278c..8dc5356026b 100644 --- a/config-model/src/main/java/com/yahoo/vespa/documentmodel/DocumentSummary.java +++ b/config-model/src/main/java/com/yahoo/vespa/documentmodel/DocumentSummary.java @@ -15,6 +15,8 @@ import java.util.List; */ public class DocumentSummary extends FieldView { + private boolean fromDisk = false; + /** * Creates a DocumentSummary with the given name. * @@ -24,6 +26,11 @@ public class DocumentSummary extends FieldView { super(name); } + public void setFromDisk(boolean fromDisk) { this.fromDisk = fromDisk; } + + /** Returns whether the user has noted explicitly that this summary accesses disk */ + public boolean isFromDisk() { return fromDisk; } + /** * The model is constrained to ensure that summary fields of the same name * in different classes have the same summary transform, because this is diff --git a/config-model/src/main/java/com/yahoo/vespa/documentmodel/SummaryField.java b/config-model/src/main/java/com/yahoo/vespa/documentmodel/SummaryField.java index 049c1f1318b..0f162ee9d51 100644 --- a/config-model/src/main/java/com/yahoo/vespa/documentmodel/SummaryField.java +++ b/config-model/src/main/java/com/yahoo/vespa/documentmodel/SummaryField.java @@ -18,9 +18,10 @@ import static com.yahoo.text.Lowercase.toLowerCase; public class SummaryField extends Field implements Cloneable, TypedKey { /** - * This class represents a source (field name). + * A source (field name). */ public static class Source implements Serializable { + private String name; private boolean override = false; public Source(String name) { @@ -29,9 +30,13 @@ public class SummaryField extends Field implements Cloneable, TypedKey { public String getName() { return name; } public void setOverride(boolean override) { this.override = override; } public boolean getOverride() { return override; } + + @Override public int hashCode() { return name.hashCode() + Boolean.valueOf(override).hashCode(); } + + @Override public boolean equals(Object obj) { if (!(obj instanceof Source)) { return false; @@ -40,9 +45,12 @@ public class SummaryField extends Field implements Cloneable, TypedKey { return name.equals(other.name) && override == other.override; } + + @Override public String toString() { - return name; + return "source field '" + name + "'"; } + } /** A name-value property (used for smart summary) */ @@ -267,12 +275,7 @@ public class SummaryField extends Field implements Cloneable, TypedKey { } public String toString() { - return - "summary field '" + getName() + ' ' + getDestinationString() + - "' [type: '" + getDataType().getName() + - "' transform: '" + transform + - "', source: '" + toString(sources) + - "', to '" + toString(destinations) + "']"; + return "summary field '" + getName() + "'"; } /** Returns a string which aids locating this field in the source search definition */ diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/search/IndexingScriptChangeMessageBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/search/IndexingScriptChangeMessageBuilder.java index ce430c27013..d680f6bd37c 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/search/IndexingScriptChangeMessageBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/search/IndexingScriptChangeMessageBuilder.java @@ -71,7 +71,7 @@ public class IndexingScriptChangeMessageBuilder { } private void checkSummaryTransform(ChangeMessageBuilder builder) { - for (SummaryField nextSummaryField : nextField.getSummaryFields()) { + for (SummaryField nextSummaryField : nextField.getSummaryFields().values()) { String fieldName = nextSummaryField.getName(); SummaryField currentSummaryField = currentField.getSummaryField(fieldName); if (currentSummaryField != null) { -- cgit v1.2.3