diff options
author | Jon Bratseth <bratseth@gmail.com> | 2022-04-05 21:28:52 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2022-04-05 21:28:52 +0200 |
commit | a9e01024cd979c748ba7f60560549f3dda9113ab (patch) | |
tree | 1a9a8a8c9de5608781bb75bfe94c038027c5e8e8 /config-model/src | |
parent | 1f55e277b55215f00fc1bafccb851369e28e4cd5 (diff) |
Support input in intermediate parser
Diffstat (limited to 'config-model/src')
5 files changed, 46 insertions, 7 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertParsedRanking.java b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertParsedRanking.java index 4b8830ca811..d151776dd85 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertParsedRanking.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertParsedRanking.java @@ -54,6 +54,10 @@ public class ConvertParsedRanking { } } + for (var input : parsed.getInputs().entrySet()) { + profile.addInput(input.getKey(), input.getValue()); + } + for (var func : parsed.getFunctions()) { String name = func.name(); List<String> parameters = func.getParameters(); diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedRankProfile.java b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedRankProfile.java index f028685b71a..fcb5426de87 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedRankProfile.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedRankProfile.java @@ -4,8 +4,10 @@ package com.yahoo.searchdefinition.parser; import com.yahoo.searchdefinition.RankProfile.MatchPhaseSettings; import com.yahoo.searchdefinition.RankProfile.MutateOperation; import com.yahoo.searchlib.rankingexpression.FeatureList; +import com.yahoo.searchlib.rankingexpression.Reference; import com.yahoo.searchlib.rankingexpression.evaluation.TensorValue; import com.yahoo.searchlib.rankingexpression.evaluation.Value; +import com.yahoo.tensor.TensorType; import java.util.ArrayList; import java.util.LinkedHashMap; @@ -25,9 +27,9 @@ class ParsedRankProfile extends ParsedBlock { private boolean ignoreDefaultRankFeatures = false; private Double rankScoreDropLimit = null; private Double termwiseLimit = null; - private List<FeatureList> matchFeatures = new ArrayList<>(); - private List<FeatureList> rankFeatures = new ArrayList<>(); - private List<FeatureList> summaryFeatures = new ArrayList<>(); + private final List<FeatureList> matchFeatures = new ArrayList<>(); + private final List<FeatureList> rankFeatures = new ArrayList<>(); + private final List<FeatureList> summaryFeatures = new ArrayList<>(); private Integer keepRankCount = null; private Integer minHitsPerThread = null; private Integer numSearchPartitions = null; @@ -47,6 +49,7 @@ class ParsedRankProfile extends ParsedBlock { private final Map<String, String> fieldsRankType = new LinkedHashMap<>(); private final Map<String, List<String>> rankProperties = new LinkedHashMap<>(); private final Map<String, Value> constants = new LinkedHashMap<>(); + private final Map<Reference, TensorType> inputs = new LinkedHashMap<>(); ParsedRankProfile(String name) { super(name, "rank-profile"); @@ -74,6 +77,7 @@ class ParsedRankProfile extends ParsedBlock { Map<String, String> getFieldsWithRankType() { return Map.copyOf(fieldsRankType); } Map<String, List<String>> getRankProperties() { return Map.copyOf(rankProperties); } Map<String, Value> getConstants() { return Map.copyOf(constants); } + Map<Reference, TensorType> getInputs() { return Map.copyOf(inputs); } Optional<String> getInheritedSummaryFeatures() { return Optional.ofNullable(this.inheritedSummaryFeatures); } Optional<String> getSecondPhaseExpression() { return Optional.ofNullable(this.secondPhaseExpression); } Optional<Boolean> isStrict() { return Optional.ofNullable(this.strict); } @@ -99,6 +103,11 @@ class ParsedRankProfile extends ParsedBlock { constants.put(name, value); } + void addInput(Reference name, TensorType type) { + verifyThat(! inputs.containsKey(name), "already has input", name); + inputs.put(name, type); + } + void addFieldRankFilter(String field, boolean filter) { fieldsRankFilter.put(field, filter); } diff --git a/config-model/src/main/javacc/IntermediateParser.jj b/config-model/src/main/javacc/IntermediateParser.jj index 6119eb5e2ce..68b11178cc2 100644 --- a/config-model/src/main/javacc/IntermediateParser.jj +++ b/config-model/src/main/javacc/IntermediateParser.jj @@ -39,6 +39,7 @@ import com.yahoo.searchdefinition.document.Stemming; import com.yahoo.searchdefinition.document.SDField; import com.yahoo.searchdefinition.fieldoperation.IndexingOperation; import com.yahoo.searchlib.rankingexpression.FeatureList; +import com.yahoo.searchlib.rankingexpression.Reference; import com.yahoo.searchlib.rankingexpression.evaluation.TensorValue; import com.yahoo.searchlib.rankingexpression.evaluation.Value; import com.yahoo.tensor.Tensor; @@ -174,6 +175,7 @@ TOKEN : | < WEIGHT: "weight" > | < TYPE: "type" > | < INDEX: "index" > +| < INPUTS: "inputs"> | < MTOKEN: "token" > | < TEXT: "text" > | < WORD: "word" > @@ -187,6 +189,7 @@ TOKEN : | < ONNXMODEL: "onnx-model"> | < MODEL: "model" > | < MUTATE: "mutate" > +| < QUERY: "query" > | < RANKPROFILE: "rank-profile" > | < RANKDEGRADATIONFREQ: "rank-degradation-frequency" > | < RANKDEGRADATION: "rank-degradation" > @@ -1832,6 +1835,7 @@ void rankProfileItem(ParsedRankProfile profile) : { } | rankProperties(profile) | secondPhase(profile) | rankDegradation() + | inputs(profile) | constants(profile) | matchFeatures(profile) | summaryFeatures(profile) @@ -2048,6 +2052,26 @@ void secondPhaseItem(ParsedRankProfile profile) : ) } +/** Consumes an inputs block of a rank profile. */ +void inputs(ParsedRankProfile profile) : +{ + Reference reference; + TensorType type; +} +{ + <INPUTS> <LBRACE> (<NL>)* + ( reference = queryFeature() <COLON> type = tensorType("Type of " + reference) { profile.addInput(reference, type); } (<NL>)*) * + <RBRACE> +} + +Reference queryFeature() : +{ + String argument; +} +{ + <QUERY> "(" argument = identifier() ")" + { return Reference.simple("query", argument); } +} /** * This rule consumes a summary-features block of a rank profile. @@ -2488,6 +2512,8 @@ String identifier() : { } | <COMPRESSION> | <COMPRESSIONLEVEL> | <COMPRESSIONTHRESHOLD> + | <CONSTANT> + | <CONSTANTS> | <CONTEXT> | <CREATEIFNONEXISTENT> | <DENSEPOSTINGLISTTHRESHOLD> @@ -2526,6 +2552,8 @@ String identifier() : { } | <INDEXING> | <INDEXINGREWRITE> | <INHERITS> + | <INLINE> + | <INPUTS> | <INTEGER> | <KEEPRANKCOUNT> | <LITERAL> @@ -2601,8 +2629,6 @@ String identifier() : { } | <WEIGHT> | <WEIGHTEDSET> | <WORD> - | <INLINE> - | <CONSTANTS> ) { return token.image; } } diff --git a/config-model/src/main/javacc/SDParser.jj b/config-model/src/main/javacc/SDParser.jj index 724239fc9b7..c0a7113239e 100644 --- a/config-model/src/main/javacc/SDParser.jj +++ b/config-model/src/main/javacc/SDParser.jj @@ -44,9 +44,9 @@ import com.yahoo.searchdefinition.DocumentOnlySchema; import com.yahoo.searchdefinition.UnrankedRankProfile; import com.yahoo.searchdefinition.fieldoperation.*; import com.yahoo.searchlib.rankingexpression.FeatureList; +import com.yahoo.searchlib.rankingexpression.Reference; import com.yahoo.searchlib.rankingexpression.evaluation.Value; import com.yahoo.searchlib.rankingexpression.evaluation.TensorValue; -import com.yahoo.searchlib.rankingexpression.Reference; import com.yahoo.tensor.Tensor; import com.yahoo.tensor.TensorType; import com.yahoo.vespa.documentmodel.DocumentSummary; diff --git a/config-model/src/test/java/com/yahoo/vespa/model/search/test/DocumentDatabaseTestCase.java b/config-model/src/test/java/com/yahoo/vespa/model/search/test/DocumentDatabaseTestCase.java index dbffd4dde37..1079f1986b2 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/search/test/DocumentDatabaseTestCase.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/search/test/DocumentDatabaseTestCase.java @@ -229,7 +229,7 @@ public class DocumentDatabaseTestCase { assertEquals(attributeField, acfg.attribute(0).name()); assertEquals(attributeField+"_nfa", acfg.attribute(1).name()); RankProfilesConfig rcfg = model.getConfig(RankProfilesConfig.class, configId); - assertEquals(6, rcfg.rankprofile().size()); + assertEquals(7, rcfg.rankprofile().size()); } @Test |