diff options
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/federation/FederationSearcher.java')
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/federation/FederationSearcher.java | 52 |
1 files changed, 38 insertions, 14 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/federation/FederationSearcher.java b/container-search/src/main/java/com/yahoo/search/federation/FederationSearcher.java index 000fef9b14b..72184c5ea32 100644 --- a/container-search/src/main/java/com/yahoo/search/federation/FederationSearcher.java +++ b/container-search/src/main/java/com/yahoo/search/federation/FederationSearcher.java @@ -18,6 +18,7 @@ import com.yahoo.search.Result; import com.yahoo.search.Searcher; import com.yahoo.search.federation.selection.FederationTarget; import com.yahoo.search.federation.selection.TargetSelector; +import com.yahoo.search.federation.sourceref.ModifyQueryAndResult; import com.yahoo.search.federation.sourceref.SearchChainInvocationSpec; import com.yahoo.search.federation.sourceref.SearchChainResolver; import com.yahoo.search.federation.sourceref.SingleTarget; @@ -54,6 +55,7 @@ import java.util.Optional; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.logging.Logger; +import java.util.stream.Collectors; import static com.google.common.base.Preconditions.checkNotNull; import static com.yahoo.collections.CollectionUtil.first; @@ -88,7 +90,7 @@ public class FederationSearcher extends ForkingSearcher { public FederationSearcher(FederationConfig config, SchemaInfo schemaInfo, ComponentRegistry<TargetSelector> targetSelectors) { this(createResolver(config), - VirtualSourceResolver.of(config), + createVirtualSourceResolver(config), resolveSelector(config.targetSelector(), targetSelectors), createSchema2Clusters(schemaInfo)); } @@ -109,6 +111,10 @@ public class FederationSearcher extends ForkingSearcher { this.virtualSourceResolver = virtualSourceResolver; } + private static VirtualSourceResolver createVirtualSourceResolver(FederationConfig config) { + return VirtualSourceResolver.of(config.target().stream().map(FederationConfig.Target::id).collect(Collectors.toUnmodifiableSet())); + } + private static TargetSelector resolveSelector(String selectorId, ComponentRegistry<TargetSelector> targetSelectors) { if (selectorId.isEmpty()) return null; @@ -149,15 +155,36 @@ public class FederationSearcher extends ForkingSearcher { return builder.build(); } + private static class SearchChaininvocationProxy extends SearchChainInvocationSpec { + SearchChaininvocationProxy(ComponentId searchChainId, FederationOptions federationOptions, String schema) { + super(searchChainId, federationOptions, List.of(schema)); + } + + @Override + public void modifyTargetQuery(Query query) { + query.getModel().setSources(searchChainId.getName()); + query.getModel().setRestrict(schemas.get(0)); + } + } + private static void addSearchChain(SearchChainResolver.Builder builder, FederationConfig.Target target, FederationConfig.Target.SearchChain searchChain) { - if (!target.id().equals(searchChain.searchChainId())) - throw new RuntimeException("Invalid federation config, " + target.id() + " != " + searchChain.searchChainId()); - - builder.addSearchChain(ComponentId.fromString(searchChain.searchChainId()), - federationOptions(searchChain), searchChain.documentTypes()); + String id = target.id(); + if (!id.equals(searchChain.searchChainId())) + throw new RuntimeException("Invalid federation config, " + id + " != " + searchChain.searchChainId()); + + ComponentId searchChainId = ComponentId.fromString(id); + builder.addSearchChain(searchChainId, federationOptions(searchChain), searchChain.documentTypes()); + // Here we make synthetic SearchChain proxies for all cluster.schema combinations possible + // Given a source on the form saerchcluster.schema will rewrite it to source=searchcluster and restrict to schema. + // TODO Consider solving this in the config model by making many synthetic search clusters + for (String schema : searchChain.documentTypes()) { + String virtualChainId = id + "." + schema; + builder.addSearchChain(ComponentId.fromString(virtualChainId), + new SearchChaininvocationProxy(searchChainId, federationOptions(searchChain).setUseByDefault(false), schema)); + } } private static void addSourceForProvider(SearchChainResolver.Builder builder, FederationConfig.Target target, @@ -209,7 +236,6 @@ public class FederationSearcher extends ForkingSearcher { private void search(Query query, Execution execution, Target target, Result mergedResults) { mergeResult(query, target, mergedResults, search(query, execution, target).orElse(createSearchChainTimedOutResult(query, target))); - } private void search(Query query, Execution execution, Collection<Target> targets, Result mergedResults) { @@ -577,7 +603,7 @@ public class FederationSearcher extends ForkingSearcher { Collection<SearchChainInvocationSpec> prunedTargets = new ArrayList<>(); for (SearchChainInvocationSpec target : targets) { - if (target.documentTypes.isEmpty() || documentTypeIntersectionIsNonEmpty(restrict, target)) + if (target.schemas.isEmpty() || documentTypeIntersectionIsNonEmpty(restrict, target)) prunedTargets.add(target); } @@ -585,7 +611,7 @@ public class FederationSearcher extends ForkingSearcher { } private boolean documentTypeIntersectionIsNonEmpty(Set<String> restrict, SearchChainInvocationSpec target) { - for (String documentType : target.documentTypes) { + for (String documentType : target.schemas) { if (restrict.contains(documentType)) return true; } @@ -615,11 +641,9 @@ public class FederationSearcher extends ForkingSearcher { } /** A target for federation, containing a chain to which a federation query can be forwarded. */ - static abstract class Target { + static abstract class Target implements ModifyQueryAndResult { abstract Chain<Searcher> getChain(); - abstract void modifyTargetQuery(Query query); - abstract void modifyTargetResult(Result result); ComponentId getId() { return getChain().getId(); @@ -650,9 +674,9 @@ public class FederationSearcher extends ForkingSearcher { Chain<Searcher> getChain() { return chain; } @Override - void modifyTargetQuery(Query query) {} + public void modifyTargetQuery(Query query) { target.modifyTargetQuery(query); } @Override - void modifyTargetResult(Result result) {} + public void modifyTargetResult(Result result) { target.modifyTargetResult(result); } @Override public FederationOptions federationOptions() { return target.federationOptions; } |