aboutsummaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/search/federation/sourceref
diff options
context:
space:
mode:
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/federation/sourceref')
-rw-r--r--container-search/src/main/java/com/yahoo/search/federation/sourceref/ResolveResult.java14
-rw-r--r--container-search/src/main/java/com/yahoo/search/federation/sourceref/SearchChainResolver.java22
-rw-r--r--container-search/src/main/java/com/yahoo/search/federation/sourceref/SingleTarget.java4
-rw-r--r--container-search/src/main/java/com/yahoo/search/federation/sourceref/SourceRefResolver.java43
-rw-r--r--container-search/src/main/java/com/yahoo/search/federation/sourceref/SourcesTarget.java19
-rw-r--r--container-search/src/main/java/com/yahoo/search/federation/sourceref/Target.java3
-rw-r--r--container-search/src/main/java/com/yahoo/search/federation/sourceref/UnresolvedProviderException.java20
-rw-r--r--container-search/src/main/java/com/yahoo/search/federation/sourceref/UnresolvedSearchChainException.java12
-rw-r--r--container-search/src/main/java/com/yahoo/search/federation/sourceref/UnresolvedSourceRefException.java18
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 + "'.");
- }
-}