summaryrefslogtreecommitdiffstats
path: root/config-model/src/main/java/com/yahoo/schema
diff options
context:
space:
mode:
authorArne Juul <arnej@yahooinc.com>2023-03-17 10:32:08 +0000
committerArne Juul <arnej@yahooinc.com>2023-03-20 10:02:55 +0000
commit8ab3f0d995666384080e9d1a44df2eac01efca31 (patch)
tree9ba74263515798dcf8367798001310041f16bf43 /config-model/src/main/java/com/yahoo/schema
parenta01b0d47680947b0b253fdfc484faf543a000cf6 (diff)
- avoid unintentionally duplicated rank-properties
- use more LinkedHashMap for deterministic behavior in unit tests - extend some unit tests
Diffstat (limited to 'config-model/src/main/java/com/yahoo/schema')
-rw-r--r--config-model/src/main/java/com/yahoo/schema/RankProfile.java21
-rw-r--r--config-model/src/main/java/com/yahoo/schema/expressiontransforms/RankProfileTransformContext.java4
2 files changed, 22 insertions, 3 deletions
diff --git a/config-model/src/main/java/com/yahoo/schema/RankProfile.java b/config-model/src/main/java/com/yahoo/schema/RankProfile.java
index f9b3bc77040..639930041c3 100644
--- a/config-model/src/main/java/com/yahoo/schema/RankProfile.java
+++ b/config-model/src/main/java/com/yahoo/schema/RankProfile.java
@@ -683,6 +683,25 @@ public class RankProfile implements Cloneable {
addRankProperty(new RankProperty(name, parameter));
}
+ /*
+ * set a rank-property that should be a single-value parameter;
+ * if the same name is used multiple times, that parameter must be identical each time.
+ */
+ public void setRankProperty(String name, String parameter) {
+ var old = rankProperties.get(name);
+ if (old != null) {
+ if (old.size() != 1) {
+ throw new IllegalStateException("setRankProperty used for multi-valued property " + name);
+ }
+ var oldVal = old.get(0).getValue();
+ if (! oldVal.equals(parameter)) {
+ throw new IllegalArgumentException("setRankProperty would change property " + name + " from " + oldVal + " to " + parameter);
+ }
+ } else {
+ addRankProperty(new RankProperty(name, parameter));
+ }
+ }
+
private void addRankProperty(RankProperty rankProperty) {
// Just the usual multimap semantics here
rankProperties.computeIfAbsent(rankProperty.getName(), (String key) -> new ArrayList<>(1)).add(rankProperty);
@@ -1091,7 +1110,7 @@ public class RankProfile implements Cloneable {
inlineFunctions);
RankingExpression expression = expressionTransforms.transform(function.function().getBody(), context);
for (Map.Entry<String, String> rankProperty : context.rankProperties().entrySet()) {
- addRankProperty(rankProperty.getKey(), rankProperty.getValue());
+ setRankProperty(rankProperty.getKey(), rankProperty.getValue());
}
return function.withExpression(expression);
}
diff --git a/config-model/src/main/java/com/yahoo/schema/expressiontransforms/RankProfileTransformContext.java b/config-model/src/main/java/com/yahoo/schema/expressiontransforms/RankProfileTransformContext.java
index cfc859345ad..890fa5e7a10 100644
--- a/config-model/src/main/java/com/yahoo/schema/expressiontransforms/RankProfileTransformContext.java
+++ b/config-model/src/main/java/com/yahoo/schema/expressiontransforms/RankProfileTransformContext.java
@@ -12,7 +12,7 @@ import com.yahoo.searchlib.rankingexpression.transform.TransformContext;
import com.yahoo.tensor.Tensor;
import com.yahoo.tensor.TensorType;
-import java.util.HashMap;
+import java.util.LinkedHashMap;
import java.util.Map;
import java.util.stream.Collectors;
@@ -27,7 +27,7 @@ public class RankProfileTransformContext extends TransformContext {
private final QueryProfileRegistry queryProfiles;
private final ImportedMlModels importedModels;
private final Map<String, RankProfile.RankingExpressionFunction> inlineFunctions;
- private final Map<String, String> rankProperties = new HashMap<>();
+ private final Map<String, String> rankProperties = new LinkedHashMap<>();
public RankProfileTransformContext(RankProfile rankProfile,
QueryProfileRegistry queryProfiles,