diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-09-07 16:09:45 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2021-09-07 16:09:45 +0200 |
commit | cb9d0ba731eac799da1e60e89f18c6f3ee693ea0 (patch) | |
tree | 2b789725d345eceb4591c19f66dd42f62cd43b3d /config-model/src/main/java/com/yahoo/searchdefinition/RankProfileRegistry.java | |
parent | b47f8ea6a94051c54dfd565bb70885db5231ac68 (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.java | 66 |
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)); + } + } |