diff options
Diffstat (limited to 'config-model/src/main/java/com/yahoo/searchdefinition/derived/RawRankProfile.java')
-rw-r--r-- | config-model/src/main/java/com/yahoo/searchdefinition/derived/RawRankProfile.java | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/derived/RawRankProfile.java b/config-model/src/main/java/com/yahoo/searchdefinition/derived/RawRankProfile.java index c041d5c6a89..c3a2673ef2b 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/derived/RawRankProfile.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/derived/RawRankProfile.java @@ -23,6 +23,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; /** * A rank profile derived from a search definition, containing exactly the features available natively in the server @@ -180,32 +181,37 @@ public class RawRankProfile implements RankProfilesConfig.Producer { private void derivePropertiesAndSummaryFeaturesFromFunctions(Map<String, RankProfile.RankingExpressionFunction> functions) { if (functions.isEmpty()) return; - Map<String, ExpressionFunction> expressionFunctions = new LinkedHashMap<>(); - for (Map.Entry<String, RankProfile.RankingExpressionFunction> function : functions.entrySet()) { - expressionFunctions.put(function.getKey(), function.getValue().function()); - } + + List<ExpressionFunction> functionExpressions = functions.values().stream().map(f -> f.function()).collect(Collectors.toList()); Map<String, String> functionProperties = new LinkedHashMap<>(); - functionProperties.putAll(deriveFunctionProperties(expressionFunctions)); + functionProperties.putAll(deriveFunctionProperties(functions, functionExpressions)); + if (firstPhaseRanking != null) { - functionProperties.putAll(firstPhaseRanking.getRankProperties(new ArrayList<>(expressionFunctions.values()))); + functionProperties.putAll(firstPhaseRanking.getRankProperties(functionExpressions)); } if (secondPhaseRanking != null) { - functionProperties.putAll(secondPhaseRanking.getRankProperties(new ArrayList<>(expressionFunctions.values()))); + functionProperties.putAll(secondPhaseRanking.getRankProperties(functionExpressions)); } for (Map.Entry<String, String> e : functionProperties.entrySet()) { rankProperties.add(new RankProfile.RankProperty(e.getKey(), e.getValue())); } - SerializationContext context = new SerializationContext(expressionFunctions.values(), null, functionProperties); + SerializationContext context = new SerializationContext(functionExpressions, null, functionProperties); replaceFunctionSummaryFeatures(context); } - private Map<String, String> deriveFunctionProperties(Map<String, ExpressionFunction> functions) { - SerializationContext context = new SerializationContext(functions); - for (Map.Entry<String, ExpressionFunction> e : functions.entrySet()) { - String expression = e.getValue().getBody().getRoot().toString(new StringBuilder(), context, null, null).toString(); - context.addFunctionSerialization(RankingExpression.propertyName(e.getKey()), expression); + private Map<String, String> deriveFunctionProperties(Map<String, RankProfile.RankingExpressionFunction> functions, + List<ExpressionFunction> functionExpressions) { + SerializationContext context = new SerializationContext(functionExpressions); + for (Map.Entry<String, RankProfile.RankingExpressionFunction> e : functions.entrySet()) { + String expressionString = e.getValue().function().getBody().getRoot().toString(new StringBuilder(), context, null, null).toString(); + context.addFunctionSerialization(RankingExpression.propertyName(e.getKey()), expressionString); + + if (e.getValue().type().isPresent()) + context.addFunctionTypeSerialization(RankingExpression.propertyTypeName(e.getKey()), e.getValue().type().get().toString()); + else if (e.getValue().function().arguments().isEmpty()) + throw new IllegalStateException("Type of function '" + e.getKey() + "' is not resolved"); } return context.serializedFunctions(); } |