summaryrefslogtreecommitdiffstats
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/SearchChainResolver.java6
-rw-r--r--container-search/src/main/java/com/yahoo/search/federation/sourceref/SourceRefResolver.java20
-rw-r--r--container-search/src/main/java/com/yahoo/search/federation/sourceref/SourcesTarget.java1
-rw-r--r--container-search/src/main/java/com/yahoo/search/federation/sourceref/UnresolvedSearchChainException.java1
-rw-r--r--container-search/src/main/java/com/yahoo/search/federation/sourceref/UnresolvedSourceRefException.java1
-rw-r--r--container-search/src/main/java/com/yahoo/search/federation/sourceref/VirtualSourceResolver.java65
6 files changed, 75 insertions, 19 deletions
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 bfb5bf1a9ab..df91b968750 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
@@ -56,12 +56,8 @@ public class SearchChainResolver {
}
};
- public Builder addSearchChain(ComponentId searchChainId) {
- return addSearchChain(searchChainId, Collections.<String>emptyList());
- }
-
public Builder addSearchChain(ComponentId searchChainId, FederationOptions federationOptions) {
- return addSearchChain(searchChainId, federationOptions, Collections.<String>emptyList());
+ return addSearchChain(searchChainId, federationOptions, List.of());
}
public Builder addSearchChain(ComponentId searchChainId, List<String> documentTypes) {
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 7345868cae7..2e7849dd85a 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
@@ -2,11 +2,11 @@
package com.yahoo.search.federation.sourceref;
import com.yahoo.component.ComponentSpecification;
-import com.yahoo.prelude.IndexFacts;
import com.yahoo.processing.request.Properties;
import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Map;
import java.util.Set;
/**
@@ -17,30 +17,30 @@ import java.util.Set;
public class SourceRefResolver {
private final SearchChainResolver searchChainResolver;
+ private final Map<String, List<String>> schema2Clusters;
- public SourceRefResolver(SearchChainResolver searchChainResolver) {
+ public SourceRefResolver(SearchChainResolver searchChainResolver, Map<String, List<String>> schema2Clusters) {
this.searchChainResolver = searchChainResolver;
+ this.schema2Clusters = schema2Clusters;
}
public Set<SearchChainInvocationSpec> resolve(ComponentSpecification sourceRef,
- Properties sourceToProviderMap,
- IndexFacts indexFacts) throws UnresolvedSearchChainException {
+ Properties sourceToProviderMap) throws UnresolvedSearchChainException {
try {
- return new LinkedHashSet<>(List.of(searchChainResolver.resolve(sourceRef, sourceToProviderMap)));
+ return Set.of(searchChainResolver.resolve(sourceRef, sourceToProviderMap));
} catch (UnresolvedSourceRefException e) {
- return resolveClustersWithDocument(sourceRef, sourceToProviderMap, indexFacts);
+ return resolveClustersWithDocument(sourceRef, sourceToProviderMap);
}
}
private Set<SearchChainInvocationSpec> resolveClustersWithDocument(ComponentSpecification sourceRef,
- Properties sourceToProviderMap,
- IndexFacts indexFacts)
+ Properties sourceToProviderMap)
throws UnresolvedSearchChainException {
if (hasOnlyName(sourceRef)) {
Set<SearchChainInvocationSpec> clusterSearchChains = new LinkedHashSet<>();
- List<String> clusters = indexFacts.clustersHavingSearchDefinition(sourceRef.getName());
+ List<String> clusters = schema2Clusters.getOrDefault(sourceRef.getName(), List.of());
for (String cluster : clusters) {
clusterSearchChains.add(resolveClusterSearchChain(cluster, sourceRef, sourceToProviderMap));
}
@@ -48,9 +48,7 @@ public class SourceRefResolver {
if ( ! clusterSearchChains.isEmpty())
return clusterSearchChains;
}
-
throw UnresolvedSourceRefException.createForMissingSourceRef(sourceRef);
-
}
private SearchChainInvocationSpec resolveClusterSearchChain(String cluster,
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 54b022e0b97..b6d99758c7b 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
@@ -1,7 +1,6 @@
// 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.google.common.base.Joiner;
import com.yahoo.component.ComponentId;
import com.yahoo.component.ComponentSpecification;
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
index 3cf2776259c..0c8562e6032 100644
--- 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
@@ -5,7 +5,6 @@ package com.yahoo.search.federation.sourceref;
* Thrown if a search chain can not be resolved from one or more ids.
* @author Tony Vaagenes
*/
-@SuppressWarnings("serial")
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
index a7da7a7ee04..fa2c1da13f0 100644
--- 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
@@ -6,7 +6,6 @@ import com.yahoo.component.ComponentSpecification;
/**
* @author Tony Vaagenes
*/
-@SuppressWarnings("serial")
class UnresolvedSourceRefException extends UnresolvedSearchChainException {
UnresolvedSourceRefException(String msg) {
super(msg);
diff --git a/container-search/src/main/java/com/yahoo/search/federation/sourceref/VirtualSourceResolver.java b/container-search/src/main/java/com/yahoo/search/federation/sourceref/VirtualSourceResolver.java
new file mode 100644
index 00000000000..fc07d12d429
--- /dev/null
+++ b/container-search/src/main/java/com/yahoo/search/federation/sourceref/VirtualSourceResolver.java
@@ -0,0 +1,65 @@
+// 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.search.federation.FederationConfig;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * Multiple sources like contentcluster.schema1, contencluster.schema2 needs to respond
+ * when source is the prefix contentcluster. This is done by generating map from virtual source
+ * to the fully qualified ones, and resolving from there.
+ *
+ * @author baldersheim
+ */
+public class VirtualSourceResolver {
+ private final Map<String, Set<String>> virtualSources;
+ private VirtualSourceResolver(Map<String, Set<String>> virtualSources) {
+ this.virtualSources = virtualSources;
+ }
+ public static VirtualSourceResolver of() {
+ return new VirtualSourceResolver(Map.of());
+ }
+ public static VirtualSourceResolver of(Set<String> targets) {
+ return new VirtualSourceResolver(createVirtualSources(targets));
+ }
+ private static Map<String, Set<String>> createVirtualSources(Set<String> targets) {
+ Set<String> virtualSources = targets.stream()
+ .filter(id -> id.contains("."))
+ .map(id -> id.substring(0, id.indexOf('.')))
+ .collect(Collectors.toUnmodifiableSet());
+ if (virtualSources.isEmpty()) return Map.of();
+ Map<String, Set<String>> virtualSourceMap = new HashMap<>();
+ for (String virtualSource : virtualSources) {
+ String prefix = virtualSource + ".";
+ Set<String> sources = targets.stream()
+ .filter(id -> id.startsWith(prefix))
+ .collect(Collectors.toUnmodifiableSet());
+ virtualSourceMap.put(virtualSource, sources);
+ }
+ return virtualSourceMap;
+ }
+ public static VirtualSourceResolver of(FederationConfig config) {
+ return of(config.target().stream().map(FederationConfig.Target::id).collect(Collectors.toUnmodifiableSet()));
+ }
+ public Set<String> resolve(Set<String> sourcesInQuery) {
+ boolean hasMapping = sourcesInQuery.stream().anyMatch(virtualSources::containsKey);
+ if (hasMapping) {
+ Set<String> resolved = new HashSet<>();
+ for (String source : sourcesInQuery) {
+ var subSources = virtualSources.get(source);
+ if (subSources != null) {
+ resolved.addAll(subSources);
+ } else {
+ resolved.add(source);
+ }
+ }
+ return resolved;
+ }
+ return sourcesInQuery;
+ }
+}