aboutsummaryrefslogtreecommitdiffstats
path: root/config-model/src/main/java/com/yahoo/searchdefinition/RankProfileRegistry.java
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-09-07 16:09:45 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2021-09-07 16:09:45 +0200
commitcb9d0ba731eac799da1e60e89f18c6f3ee693ea0 (patch)
tree2b789725d345eceb4591c19f66dd42f62cd43b3d /config-model/src/main/java/com/yahoo/searchdefinition/RankProfileRegistry.java
parentb47f8ea6a94051c54dfd565bb70885db5231ac68 (diff)
Verify that rank profile inheritance is correct and sound. The rank profile must exist and be visible in the inheritance tree of the searchdefinition.
Diffstat (limited to 'config-model/src/main/java/com/yahoo/searchdefinition/RankProfileRegistry.java')
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/RankProfileRegistry.java66
1 files changed, 53 insertions, 13 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/RankProfileRegistry.java b/config-model/src/main/java/com/yahoo/searchdefinition/RankProfileRegistry.java
index 271442768a8..d8fca37c6b7 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/RankProfileRegistry.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/RankProfileRegistry.java
@@ -1,11 +1,15 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.searchdefinition;
+import com.yahoo.searchdefinition.document.SDDocumentType;
+
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashMap;
+import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -20,8 +24,8 @@ import java.util.Set;
*/
public class RankProfileRegistry {
- private final Map<RankProfile, ImmutableSearch> rankProfileToSearch = new LinkedHashMap<>();
- private final Map<ImmutableSearch, Map<String, RankProfile>> rankProfiles = new LinkedHashMap<>();
+ private final Map<String, Map<String, RankProfile>> rankProfiles = new LinkedHashMap<>();
+ private final String MAGIC_GLOBAL_RANKPROFILES = "[MAGIC_GLOBAL_RANKPROFILES]";
/* These rank profiles can be overridden: 'default' rank profile, as that is documented to work. And 'unranked'. */
static final Set<String> overridableRankProfileNames = new HashSet<>(Arrays.asList("default", "unranked"));
@@ -33,24 +37,28 @@ public class RankProfileRegistry {
return rankProfileRegistry;
}
+ private String extractName(ImmutableSearch search) {
+ return search != null ? search.getName() : MAGIC_GLOBAL_RANKPROFILES;
+ }
+
/**
* Adds a rank profile to this registry
*
* @param rankProfile the rank profile to add
*/
public void add(RankProfile rankProfile) {
- if ( ! rankProfiles.containsKey(rankProfile.getSearch())) {
- rankProfiles.put(rankProfile.getSearch(), new LinkedHashMap<>());
+ String searchName = extractName(rankProfile.getSearch());
+ if ( ! rankProfiles.containsKey(searchName)) {
+ rankProfiles.put(searchName, new LinkedHashMap<>());
}
checkForDuplicate(rankProfile);
- rankProfiles.get(rankProfile.getSearch()).put(rankProfile.getName(), rankProfile);
- rankProfileToSearch.put(rankProfile, rankProfile.getSearch());
+ rankProfiles.get(searchName).put(rankProfile.getName(), rankProfile);
}
private void checkForDuplicate(RankProfile rankProfile) {
String rankProfileName = rankProfile.getName();
- RankProfile existingRangProfileWithSameName = rankProfiles.get(rankProfile.getSearch()).get(rankProfileName);
- if (existingRangProfileWithSameName == null) return;
+ RankProfile existingRankProfileWithSameName = rankProfiles.get(extractName(rankProfile.getSearch())).get(rankProfileName);
+ if (existingRankProfileWithSameName == null) return;
if ( ! overridableRankProfileNames.contains(rankProfileName)) {
throw new IllegalArgumentException("Duplicate rank profile '" + rankProfileName + "' in " +
@@ -65,27 +73,50 @@ public class RankProfileRegistry {
* @param name the name of the rank profile
* @return the RankProfile to return.
*/
- public RankProfile get(ImmutableSearch search, String name) {
+ public RankProfile get(String search, String name) {
Map<String, RankProfile> profiles = rankProfiles.get(search);
if (profiles == null) return null;
return profiles.get(name);
}
+ public RankProfile get(ImmutableSearch search, String name) {
+ return get(search.getName(), name);
+ }
+
+ public RankProfile getGlobal(String name) {
+ Map<String, RankProfile> profiles = rankProfiles.get(MAGIC_GLOBAL_RANKPROFILES);
+ if (profiles == null) return null;
+ return profiles.get(name);
+ }
+
+ public RankProfile resolve(SDDocumentType docType, String name) {
+ RankProfile rankProfile = get(docType.getName(), name);
+ if (rankProfile != null) return rankProfile;
+ for (var parent : docType.getInheritedTypes()) {
+ RankProfile parentProfile = resolve(parent, name);
+ if (parentProfile != null) return parentProfile;
+ }
+ return get(MAGIC_GLOBAL_RANKPROFILES, name);
+ }
/**
* Rank profiles that are collected across clusters.
* @return A set of global {@link RankProfile} instances.
*/
- public Set<RankProfile> all() {
- return rankProfileToSearch.keySet();
+ public Collection<RankProfile> all() {
+ List<RankProfile> all = new ArrayList<>();
+ for (var entry : rankProfiles.values()) {
+ all.addAll(entry.values());
+ }
+ return all;
}
/**
* Returns the rank profiles of a given search definition.
*
- * @param search {@link Search} to get rank profiles for
+ * @param search the searchdefinition to get rank profiles for
* @return a collection of {@link RankProfile} instances
*/
- public Collection<RankProfile> rankProfilesOf(ImmutableSearch search) {
+ public Collection<RankProfile> rankProfilesOf(String search) {
Map<String, RankProfile> mapping = rankProfiles.get(search);
if (mapping == null) {
return Collections.emptyList();
@@ -93,4 +124,13 @@ public class RankProfileRegistry {
return mapping.values();
}
+ /**
+ * Retrieve all rank profiles for a search definition
+ * @param search search definition to fetch rank profiles for, or null for the global ones
+ * @return Collection of RankProfiles
+ */
+ public Collection<RankProfile> rankProfilesOf(ImmutableSearch search) {
+ return rankProfilesOf(extractName(search));
+ }
+
}