aboutsummaryrefslogtreecommitdiffstats
path: root/config-model
diff options
context:
space:
mode:
authorArne H Juul <arnej@yahooinc.com>2022-02-24 18:01:23 +0000
committerArne H Juul <arnej@yahooinc.com>2022-02-24 18:05:20 +0000
commitcb7a195768374d422c202112bfb50487fab7cfc1 (patch)
tree655f99848c6257015533dbfd0a38e79d1358392f /config-model
parentbc02c9b1906d4310ad71fb95442b7421343077c8 (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')
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedField.java29
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedSummaryField.java8
-rw-r--r--config-model/src/main/javacc/IntermediateParser.jj37
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; }
}
/**