diff options
author | Arne H Juul <arnej@yahooinc.com> | 2022-02-24 18:01:23 +0000 |
---|---|---|
committer | Arne H Juul <arnej@yahooinc.com> | 2022-02-24 18:05:20 +0000 |
commit | cb7a195768374d422c202112bfb50487fab7cfc1 (patch) | |
tree | 655f99848c6257015533dbfd0a38e79d1358392f /config-model | |
parent | bc02c9b1906d4310ad71fb95442b7421343077c8 (diff) |
fix "summary" handling
* after closer inspection, change handling of the different
summary-to, summary: and summary { } variants, to make
new unit tests pass.
Diffstat (limited to 'config-model')
3 files changed, 46 insertions, 28 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedField.java b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedField.java index 5066da2acd0..9c7400136ab 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedField.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedField.java @@ -62,6 +62,35 @@ class ParsedField extends ParsedBlock { Optional<ParsedSorting> getSorting() { return Optional.ofNullable(sortSettings); } Map<String, String> getRankTypes() { return Map.copyOf(rankTypes); } + /** get an existing summary field for modification, or create it */ + ParsedSummaryField summaryFieldFor(String name) { + if (summaryFields.containsKey(name)) { + return summaryFields.get(name); + } + var sf = new ParsedSummaryField(name, getType()); + summaryFields.put(name, sf); + return sf; + } + + /** get an existing summary field for modification, or create it */ + ParsedSummaryField summaryFieldFor(String name, ParsedType type) { + if (summaryFields.containsKey(name)) { + var sf = summaryFields.get(name); + if (sf.getType() == null) { + sf.setType(type); + } else { + // TODO check that types are properly equal here + String oldName = sf.getType().name(); + String newName = type.name(); + verifyThat(newName.equals(oldName), "type mismatch for summary field", name, ":", oldName, "/", newName); + } + return sf; + } + var sf = new ParsedSummaryField(name, type); + summaryFields.put(name, sf); + return sf; + } + void addAlias(String from, String to) { verifyThat(! aliases.containsKey(to), "already has alias", to); aliases.put(to, from); diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedSummaryField.java b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedSummaryField.java index 2de0d402029..40e95045afd 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedSummaryField.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedSummaryField.java @@ -13,7 +13,7 @@ import java.util.List; **/ class ParsedSummaryField extends ParsedBlock { - private final ParsedType type; + private ParsedType type; private boolean isDyn = false; private boolean isMEO = false; private boolean isFull = false; @@ -30,7 +30,7 @@ class ParsedSummaryField extends ParsedBlock { this.type = type; } - ParsedType type() { return type; } + ParsedType getType() { return type; } List<String> getDestinations() { return List.copyOf(destinations); } List<String> getSources() { return List.copyOf(sources); } boolean getBolded() { return isBold; } @@ -44,4 +44,8 @@ class ParsedSummaryField extends ParsedBlock { void setDynamic() { this.isDyn = true; } void setFull() { this.isFull = true; } void setMatchedElementsOnly() { this.isMEO = true; } + void setType(ParsedType value) { + verifyThat(type == null, "Cannot change type from ", type, "to", value); + this.type = value; + } } diff --git a/config-model/src/main/javacc/IntermediateParser.jj b/config-model/src/main/javacc/IntermediateParser.jj index 67e8b84c66d..cf0ad9eb101 100644 --- a/config-model/src/main/javacc/IntermediateParser.jj +++ b/config-model/src/main/javacc/IntermediateParser.jj @@ -976,13 +976,10 @@ void summaryTo(ParsedField field) : { <SUMMARYTO> [name = identifier()] <COLON> destination = identifier() { - psf = new ParsedSummaryField(name); + psf = field.summaryFieldFor(name); psf.addDestination(destination); } ( <COMMA> destination = identifier() { psf.addDestination(destination); } )* - { - field.addSummaryField(psf); - } } /** @@ -1184,59 +1181,47 @@ void summaryInDocument(ParsedDocumentSummary docsum) : * * @param field The field to modify. */ -void summaryInField(ParsedField field) : +void summaryInField(ParsedField field) : { } { - ParsedSummaryField psf; -} -{ - ( <SUMMARY> ( LOOKAHEAD(2) psf = summaryInFieldShort(field.name()) - | psf = summaryInFieldLong(field.name())) ) - { - field.addSummaryField(psf); - } + <SUMMARY> ( LOOKAHEAD(2) summaryInFieldShort(field) + | summaryInFieldLong(field) ) } /** * This rule consumes a single-line summary field. - * - * @return The consumed summary field. */ -ParsedSummaryField summaryInFieldShort(String fieldName) : +void summaryInFieldShort(ParsedField field) : { - String name = fieldName; + String name = field.name(); ParsedSummaryField psf; } { [ name = identifier() ] { - psf = new ParsedSummaryField(name); + psf = field.summaryFieldFor(name); } <COLON> ( <DYNAMIC> { psf.setDynamic(); } | <MATCHEDELEMENTSONLY> { psf.setMatchedElementsOnly(); } | (<FULL> | <STATIC>) { psf.setFull(); } ) - { return psf; } } /** * This rule consumes a multi-line summary field. - * - * @return The consumed summary field. */ -ParsedSummaryField summaryInFieldLong(String fieldName) : +void summaryInFieldLong(ParsedField field) : { - String name = fieldName; - ParsedType type = null; + String name = field.name(); + ParsedType type = field.getType(); ParsedSummaryField psf; } { ( [ name = identifier() [ <TYPE> type = dataType() ] ] lbrace() { - psf = new ParsedSummaryField(name, type); + psf = field.summaryFieldFor(name, type); } (summaryItem(psf) (<NL>)*)* <RBRACE> ) - { return psf; } } /** |