diff options
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.java | 74 |
1 files changed, 49 insertions, 25 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 84e5e7d747f..388a31d1482 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 @@ -93,9 +93,10 @@ public class InterleavedSearchInvoker extends SearchInvoker implements ResponseM } @Override - protected InvokerResult getSearchResult(Execution execution) throws IOException { - InvokerResult result = new InvokerResult(query, query.getHits()); - List<LeanHit> merged = Collections.emptyList(); + 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) { @@ -104,7 +105,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.getResult(), invoker.getSearchResult(execution), merged); + merged = mergeResult(result, invoker.getSearchResult(execution), merged, auxiliary); ejectInvoker(invoker); } nextTimeout = nextTimeout(); @@ -113,11 +114,12 @@ public class InterleavedSearchInvoker extends SearchInvoker implements ResponseM throw new RuntimeException("Interrupted while waiting for search results", e); } - insertNetworkErrors(result.getResult()); - result.getResult().setCoverage(createCoverage()); + 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.getLeanHits().add(merged.get(index)); + result.hits().add(merged.get(index)); } query.setOffset(0); // Now we are all trimmed down return result; @@ -189,31 +191,43 @@ public class InterleavedSearchInvoker extends SearchInvoker implements ResponseM return nextAdaptive; } - private List<LeanHit> mergeResult(Result result, InvokerResult partialResult, List<LeanHit> current) { - collectCoverage(partialResult.getResult().getCoverage(true)); + private List<Hit> mergeResult(Result result, Result partialResult, List<Hit> current, List<Hit> auxiliaryHits) { + collectCoverage(partialResult.getCoverage(true)); - result.mergeWith(partialResult.getResult()); - List<Hit> partialNonLean = partialResult.getResult().hits().asUnorderedHits(); - for(Hit hit : partialNonLean) { - if (hit.isAuxiliary()) { - result.hits().add(hit); - } - } + result.mergeWith(partialResult); + List<Hit> partial = partialResult.hits().asUnorderedHits(); if (current.isEmpty() ) { - return partialResult.getLeanHits(); + boolean hasAuxillary = false; + for(Hit hit : partial) { + if (hit.isAuxiliary()) { + hasAuxillary = true; + break; + } + } + if ( ! hasAuxillary) + return partial; } - List<LeanHit> partial = partialResult.getLeanHits(); if (partial.isEmpty()) { return current; } int needed = query.getOffset() + query.getHits(); - List<LeanHit> merged = new ArrayList<>(needed); + List<Hit> merged = new ArrayList<>(needed); int indexCurrent = 0; int indexPartial = 0; while (indexCurrent < current.size() && indexPartial < partial.size() && merged.size() < needed) { - LeanHit incommingHit = partial.get(indexPartial); - LeanHit currentHit = current.get(indexCurrent); + 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) { @@ -228,11 +242,21 @@ public class InterleavedSearchInvoker extends SearchInvoker implements ResponseM indexPartial++; } } - while ((indexCurrent < current.size()) && (merged.size() < needed)) { - merged.add(current.get(indexCurrent++)); + while (indexCurrent < current.size()) { + Hit h = current.get(indexCurrent++); + if (h.isAuxiliary()) { + auxiliaryHits.add(h); + } else if (merged.size() < needed) { + merged.add(h); + } } - while ((indexPartial < partial.size()) && (merged.size() < needed)) { - merged.add(partial.get(indexPartial++)); + while (indexPartial < partial.size()) { + Hit h = partial.get(indexPartial++); + if (h.isAuxiliary()) { + auxiliaryHits.add(h); + } else if (merged.size() < needed) { + merged.add(h); + } } return merged; } |