diff options
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/federation/sourceref')
9 files changed, 47 insertions, 108 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/federation/sourceref/ResolveResult.java b/container-search/src/main/java/com/yahoo/search/federation/sourceref/ResolveResult.java new file mode 100644 index 00000000000..d9681140ae9 --- /dev/null +++ b/container-search/src/main/java/com/yahoo/search/federation/sourceref/ResolveResult.java @@ -0,0 +1,14 @@ +// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.search.federation.sourceref; + +/** + * @author baldersheim + */ +public record ResolveResult(SearchChainInvocationSpec invocationSpec, String errorMsg) { + ResolveResult(SearchChainInvocationSpec invocationSpec) { + this(invocationSpec, null); + } + ResolveResult(String errorMsg) { + this(null, errorMsg); + } +} diff --git a/container-search/src/main/java/com/yahoo/search/federation/sourceref/SearchChainResolver.java b/container-search/src/main/java/com/yahoo/search/federation/sourceref/SearchChainResolver.java index 7dc65c819e4..9e45b6576a6 100644 --- a/container-search/src/main/java/com/yahoo/search/federation/sourceref/SearchChainResolver.java +++ b/container-search/src/main/java/com/yahoo/search/federation/sourceref/SearchChainResolver.java @@ -46,16 +46,6 @@ public class SearchChainResolver { public static class Builder { - public interface InvocationSpecFactory { - SearchChainInvocationSpec create(ComponentId searchChainId, FederationOptions federationOptions, List<String> schemas); - } - - private class DefaultInvocationSpecFactory implements InvocationSpecFactory { - public SearchChainInvocationSpec create(ComponentId searchChainId, FederationOptions federationOptions, List<String> schemas) { - return new SearchChainInvocationSpec(searchChainId, federationOptions, schemas); - } - } - private final SortedSet<Target> defaultTargets = new TreeSet<>(); private final ComponentRegistry<Target> targets = new ComponentRegistry<>() { @@ -137,19 +127,13 @@ public class SearchChainResolver { this.defaultTargets = Collections.unmodifiableSortedSet(defaultTargets); } - public SearchChainInvocationSpec resolve(ComponentSpecification sourceRef, Properties sourceToProviderMap) - throws UnresolvedSearchChainException { + public ResolveResult resolve(ComponentSpecification sourceRef, Properties sourceToProviderMap) { - Target target = resolveTarget(sourceRef); - return target.responsibleSearchChain(sourceToProviderMap); - } - - private Target resolveTarget(ComponentSpecification sourceRef) throws UnresolvedSearchChainException { Target target = targets.getComponent(sourceRef); if (target == null) { - throw UnresolvedSourceRefException.createForMissingSourceRef(sourceRef); + return new ResolveResult(SourceRefResolver.createForMissingSourceRef(sourceRef)); } - return target; + return target.responsibleSearchChain(sourceToProviderMap); } public SortedSet<Target> allTopLevelTargets() { diff --git a/container-search/src/main/java/com/yahoo/search/federation/sourceref/SingleTarget.java b/container-search/src/main/java/com/yahoo/search/federation/sourceref/SingleTarget.java index 608566552cd..3de67908217 100644 --- a/container-search/src/main/java/com/yahoo/search/federation/sourceref/SingleTarget.java +++ b/container-search/src/main/java/com/yahoo/search/federation/sourceref/SingleTarget.java @@ -17,8 +17,8 @@ public class SingleTarget extends Target { } @Override - public SearchChainInvocationSpec responsibleSearchChain(Properties queryProperties) { - return searchChainInvocationSpec; + public ResolveResult responsibleSearchChain(Properties queryProperties) { + return new ResolveResult(searchChainInvocationSpec); } @Override diff --git a/container-search/src/main/java/com/yahoo/search/federation/sourceref/SourceRefResolver.java b/container-search/src/main/java/com/yahoo/search/federation/sourceref/SourceRefResolver.java index 2e7849dd85a..b5c40db01f8 100644 --- a/container-search/src/main/java/com/yahoo/search/federation/sourceref/SourceRefResolver.java +++ b/container-search/src/main/java/com/yahoo/search/federation/sourceref/SourceRefResolver.java @@ -4,10 +4,9 @@ package com.yahoo.search.federation.sourceref; import com.yahoo.component.ComponentSpecification; import com.yahoo.processing.request.Properties; -import java.util.LinkedHashSet; +import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Set; /** * Maps a source reference to search chain invocation specs. @@ -24,21 +23,18 @@ public class SourceRefResolver { this.schema2Clusters = schema2Clusters; } - public Set<SearchChainInvocationSpec> resolve(ComponentSpecification sourceRef, - Properties sourceToProviderMap) throws UnresolvedSearchChainException { - try { - return Set.of(searchChainResolver.resolve(sourceRef, sourceToProviderMap)); - } catch (UnresolvedSourceRefException e) { + public List<ResolveResult> resolve(ComponentSpecification sourceRef, Properties sourceToProviderMap) { + ResolveResult searchChainResolveResult = searchChainResolver.resolve(sourceRef, sourceToProviderMap); + if (searchChainResolveResult.invocationSpec() == null) { return resolveClustersWithDocument(sourceRef, sourceToProviderMap); } + return List.of(searchChainResolveResult); } - private Set<SearchChainInvocationSpec> resolveClustersWithDocument(ComponentSpecification sourceRef, - Properties sourceToProviderMap) - throws UnresolvedSearchChainException { + private List<ResolveResult> resolveClustersWithDocument(ComponentSpecification sourceRef, Properties sourceToProviderMap) { if (hasOnlyName(sourceRef)) { - Set<SearchChainInvocationSpec> clusterSearchChains = new LinkedHashSet<>(); + List<ResolveResult> clusterSearchChains = new ArrayList<>(); List<String> clusters = schema2Clusters.getOrDefault(sourceRef.getName(), List.of()); for (String cluster : clusters) { @@ -48,21 +44,22 @@ public class SourceRefResolver { if ( ! clusterSearchChains.isEmpty()) return clusterSearchChains; } - throw UnresolvedSourceRefException.createForMissingSourceRef(sourceRef); + return List.of(new ResolveResult(createForMissingSourceRef(sourceRef))); } - private SearchChainInvocationSpec resolveClusterSearchChain(String cluster, - ComponentSpecification sourceRef, - Properties sourceToProviderMap) - throws UnresolvedSearchChainException { - try { - return searchChainResolver.resolve(new ComponentSpecification(cluster), sourceToProviderMap); - } - catch (UnresolvedSearchChainException e) { - throw new UnresolvedSearchChainException("Failed to resolve cluster search chain '" + cluster + - "' when using source ref '" + sourceRef + - "' as a document name."); + static String createForMissingSourceRef(ComponentSpecification source) { + return "Could not resolve source ref '" + source + "'."; + } + + private ResolveResult resolveClusterSearchChain(String cluster, + ComponentSpecification sourceRef, + Properties sourceToProviderMap) { + var resolveResult = searchChainResolver.resolve(new ComponentSpecification(cluster), sourceToProviderMap); + if (resolveResult.invocationSpec() == null) { + return new ResolveResult("Failed to resolve cluster search chain '" + cluster + + "' when using source ref '" + sourceRef + "' as a document name."); } + return resolveResult; } private boolean hasOnlyName(ComponentSpecification sourceSpec) { diff --git a/container-search/src/main/java/com/yahoo/search/federation/sourceref/SourcesTarget.java b/container-search/src/main/java/com/yahoo/search/federation/sourceref/SourcesTarget.java index b6d99758c7b..a3c0328290d 100644 --- a/container-search/src/main/java/com/yahoo/search/federation/sourceref/SourcesTarget.java +++ b/container-search/src/main/java/com/yahoo/search/federation/sourceref/SourcesTarget.java @@ -16,7 +16,7 @@ import java.util.TreeSet; public class SourcesTarget extends Target { - private ComponentRegistry<ComponentAdaptor<SearchChainInvocationSpec>> providerSources = new ComponentRegistry<>() {}; + private final ComponentRegistry<ComponentAdaptor<SearchChainInvocationSpec>> providerSources = new ComponentRegistry<>() {}; private SearchChainInvocationSpec defaultProviderSource; @@ -25,10 +25,10 @@ public class SourcesTarget extends Target { } @Override - public SearchChainInvocationSpec responsibleSearchChain(Properties queryProperties) throws UnresolvedSearchChainException { + public ResolveResult responsibleSearchChain(Properties queryProperties) { ComponentSpecification providerSpecification = providerSpecificationForSource(queryProperties); if (providerSpecification == null) { - return defaultProviderSource; + return new ResolveResult(defaultProviderSource); } else { return lookupProviderSource(providerSpecification); } @@ -36,11 +36,7 @@ public class SourcesTarget extends Target { @Override public String searchRefDescription() { - StringBuilder builder = new StringBuilder(sourceId().stringValue()); - builder.append("[provider = "). - append(Joiner.on(", ").join(allProviderIdsStringValue())). - append("]"); - return builder.toString(); + return sourceId().stringValue() + "[provider = " + Joiner.on(", ").join(allProviderIdsStringValue()) + "]"; } private SortedSet<String> allProviderIdsStringValue() { @@ -51,14 +47,13 @@ public class SourcesTarget extends Target { return result; } - private SearchChainInvocationSpec lookupProviderSource(ComponentSpecification providerSpecification) - throws UnresolvedSearchChainException { + private ResolveResult lookupProviderSource(ComponentSpecification providerSpecification) { ComponentAdaptor<SearchChainInvocationSpec> providerSource = providerSources.getComponent(providerSpecification); if (providerSource == null) - throw UnresolvedProviderException.createForMissingProvider(sourceId(), providerSpecification); + return new ResolveResult("No provider '" + sourceId() + "' for source '" + providerSpecification + "'."); - return providerSource.model; + return new ResolveResult(providerSource.model); } public void freeze() { diff --git a/container-search/src/main/java/com/yahoo/search/federation/sourceref/Target.java b/container-search/src/main/java/com/yahoo/search/federation/sourceref/Target.java index 38baf084d97..d35f7f7b181 100644 --- a/container-search/src/main/java/com/yahoo/search/federation/sourceref/Target.java +++ b/container-search/src/main/java/com/yahoo/search/federation/sourceref/Target.java @@ -23,9 +23,8 @@ public abstract class Target extends AbstractComponent { this(localId, false); } - public abstract SearchChainInvocationSpec responsibleSearchChain(Properties queryProperties) throws UnresolvedSearchChainException; + public abstract ResolveResult responsibleSearchChain(Properties queryProperties); public abstract String searchRefDescription(); abstract void freeze(); - } diff --git a/container-search/src/main/java/com/yahoo/search/federation/sourceref/UnresolvedProviderException.java b/container-search/src/main/java/com/yahoo/search/federation/sourceref/UnresolvedProviderException.java deleted file mode 100644 index aa21ad3b369..00000000000 --- a/container-search/src/main/java/com/yahoo/search/federation/sourceref/UnresolvedProviderException.java +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.search.federation.sourceref; - -import com.yahoo.component.ComponentId; -import com.yahoo.component.ComponentSpecification; - -/** - * @author Tony Vaagenes - */ -@SuppressWarnings("serial") -class UnresolvedProviderException extends UnresolvedSearchChainException { - UnresolvedProviderException(String msg) { - super(msg); - } - - static UnresolvedSearchChainException createForMissingProvider(ComponentId source, - ComponentSpecification provider) { - return new UnresolvedProviderException("No provider '" + provider + "' for source '" + source + "'."); - } -} diff --git a/container-search/src/main/java/com/yahoo/search/federation/sourceref/UnresolvedSearchChainException.java b/container-search/src/main/java/com/yahoo/search/federation/sourceref/UnresolvedSearchChainException.java deleted file mode 100644 index 0c8562e6032..00000000000 --- a/container-search/src/main/java/com/yahoo/search/federation/sourceref/UnresolvedSearchChainException.java +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.search.federation.sourceref; - -/** - * Thrown if a search chain can not be resolved from one or more ids. - * @author Tony Vaagenes - */ -public class UnresolvedSearchChainException extends Exception { - public UnresolvedSearchChainException(String msg) { - super(msg); - } -} diff --git a/container-search/src/main/java/com/yahoo/search/federation/sourceref/UnresolvedSourceRefException.java b/container-search/src/main/java/com/yahoo/search/federation/sourceref/UnresolvedSourceRefException.java deleted file mode 100644 index fa2c1da13f0..00000000000 --- a/container-search/src/main/java/com/yahoo/search/federation/sourceref/UnresolvedSourceRefException.java +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.search.federation.sourceref; - -import com.yahoo.component.ComponentSpecification; - -/** - * @author Tony Vaagenes - */ -class UnresolvedSourceRefException extends UnresolvedSearchChainException { - UnresolvedSourceRefException(String msg) { - super(msg); - } - - - static UnresolvedSearchChainException createForMissingSourceRef(ComponentSpecification source) { - return new UnresolvedSourceRefException("Could not resolve source ref '" + source + "'."); - } -} |