summaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/search/dispatch/InterleavedSearchInvoker.java
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2019-09-10 22:16:06 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2019-09-10 23:25:38 +0200
commit12d4fe3b5d33311e3100d5868369501c823900cd (patch)
tree81ceb2e157db21d4113d1d620ee4cda73970c081 /container-search/src/main/java/com/yahoo/search/dispatch/InterleavedSearchInvoker.java
parent47e33f7663fa76a78ccb20b1325887e7c3e3b864 (diff)
Also consider auxiliary hits.
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/dispatch/InterleavedSearchInvoker.java')
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/InterleavedSearchInvoker.java30
1 files changed, 24 insertions, 6 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/InterleavedSearchInvoker.java b/container-search/src/main/java/com/yahoo/search/dispatch/InterleavedSearchInvoker.java
index 76157175c3d..31f833a0ca9 100644
--- a/container-search/src/main/java/com/yahoo/search/dispatch/InterleavedSearchInvoker.java
+++ b/container-search/src/main/java/com/yahoo/search/dispatch/InterleavedSearchInvoker.java
@@ -95,6 +95,7 @@ public class InterleavedSearchInvoker extends SearchInvoker implements ResponseM
protected Result getSearchResult(Execution execution) throws IOException {
Result result = new Result(query);
List<Hit> merged = Collections.emptyList();
+ List<Hit> auxiliary = new ArrayList<>();
long nextTimeout = query.getTimeLeft();
try {
while (!invokers.isEmpty() && nextTimeout >= 0) {
@@ -103,7 +104,7 @@ public class InterleavedSearchInvoker extends SearchInvoker implements ResponseM
log.fine(() -> "Search timed out with " + askedNodes + " requests made, " + answeredNodes + " responses received");
break;
} else {
- merged = mergeResult(result, invoker.getSearchResult(execution), merged);
+ merged = mergeResult(result, invoker.getSearchResult(execution), merged, auxiliary);
ejectInvoker(invoker);
}
nextTimeout = nextTimeout();
@@ -115,6 +116,7 @@ public class InterleavedSearchInvoker extends SearchInvoker implements ResponseM
insertNetworkErrors(result);
result.setCoverage(createCoverage());
int needed = query.getOffset() + query.getHits();
+ result.hits().addAll(auxiliary);
for (int index = query.getOffset(); (index < merged.size()) && (index < needed); index++) {
result.hits().add(merged.get(index));
}
@@ -187,7 +189,7 @@ public class InterleavedSearchInvoker extends SearchInvoker implements ResponseM
return nextAdaptive;
}
- private List<Hit> mergeResult(Result result, Result partialResult, List<Hit> current) {
+ private List<Hit> mergeResult(Result result, Result partialResult, List<Hit> current, List<Hit> auxiliaryHits) {
collectCoverage(partialResult.getCoverage(true));
result.mergeWith(partialResult);
@@ -204,13 +206,29 @@ public class InterleavedSearchInvoker extends SearchInvoker implements ResponseM
int indexCurrent = 0;
int indexPartial = 0;
while (indexCurrent < current.size() && indexPartial < partial.size() && merged.size() < needed) {
- int cmpRes = current.get(indexCurrent).compareTo(partial.get(indexPartial));
+ Hit incommingHit = partial.get(indexPartial);
+ if (incommingHit.isAuxiliary()) {
+ auxiliaryHits.add(incommingHit);
+ indexPartial++;
+ continue;
+ }
+ Hit currentHit = current.get(indexCurrent);
+ if (currentHit.isAuxiliary()) {
+ auxiliaryHits.add(currentHit);
+ indexCurrent++;
+ continue;
+ }
+
+ int cmpRes = currentHit.compareTo(incommingHit);
if (cmpRes < 0) {
- merged.add(current.get(indexCurrent++));
+ merged.add(currentHit);
+ indexCurrent++;
} else if (cmpRes > 0) {
- merged.add(partial.get(indexPartial++));
+ merged.add(incommingHit);
+ indexPartial++;
} else { // Duplicates
- merged.add(current.get(indexCurrent++));
+ merged.add(currentHit);
+ indexCurrent++;
indexPartial++;
}
}