diff options
author | Jon Bratseth <bratseth@oath.com> | 2018-10-14 19:20:56 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-14 19:20:56 +0200 |
commit | 7518ce3820175680c68b4d574a1520028d663092 (patch) | |
tree | e5ff47b26436a22ab02a548f79ff29b0d02c800f /container-search/src/main/java/com/yahoo/search/result/HitGroup.java | |
parent | 46e014afbe93b74b977ea1c0055df3ae063cadb3 (diff) |
Revert "Simplify and correct isFilled"
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/result/HitGroup.java')
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/result/HitGroup.java | 62 |
1 files changed, 53 insertions, 9 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/result/HitGroup.java b/container-search/src/main/java/com/yahoo/search/result/HitGroup.java index c008b133595..cc0aea74d70 100644 --- a/container-search/src/main/java/com/yahoo/search/result/HitGroup.java +++ b/container-search/src/main/java/com/yahoo/search/result/HitGroup.java @@ -844,18 +844,62 @@ public class HitGroup extends Hit implements DataList<Hit>, Cloneable, Iterable< return fillableHits().iterator().hasNext(); } - /** Returns the set of summaries for which all concrete hits recursively below this is filled. */ @Override public Set<String> getFilled() { - Set<String> filled = null; - for (Hit hit : hits) { - if (hit.getFilled() == null) continue; - if (filled == null) - filled = new HashSet<>(hit.getFilled()); - else - filled.retainAll(hit.getFilled()); + Iterator<Hit> hitIterator = hits.iterator(); + Set<String> firstSummaryNames = getSummaryNamesNextFilledHit(hitIterator); + if (firstSummaryNames == null || firstSummaryNames.isEmpty()) + return firstSummaryNames; + + Set<String> intersection = firstSummaryNames; + while (true) { + Set<String> summaryNames = getSummaryNamesNextFilledHit(hitIterator); + if (summaryNames == null) + break; + + if (intersection.size() == 1) + return getFilledSingle(first(intersection), hitIterator); + + + boolean notInSet = false; + if (intersection == firstSummaryNames) { + if (intersection.size() == summaryNames.size()) { + for(String s : summaryNames) { + if ( ! intersection.contains(s)) { + intersection = new HashSet<>(firstSummaryNames); + notInSet = true; + break; + } + } + } + } + if (notInSet) { + intersection.retainAll(summaryNames); + } + + } + + return intersection; + } + + private Set<String> getSummaryNamesNextFilledHit(Iterator<Hit> hitIterator) { + while (hitIterator.hasNext()) { + Set<String> filled = hitIterator.next().getFilled(); + if (filled != null) + return filled; + } + return null; + } + + private Set<String> getFilledSingle(String summaryName, Iterator<Hit> hitIterator) { + while (true) { + Set<String> summaryNames = getSummaryNamesNextFilledHit(hitIterator); + if (summaryNames == null) { + return Collections.singleton(summaryName); + } else if (!summaryNames.contains(summaryName)) { + return Collections.emptySet(); + } } - return filled; } private Iterable<Hit> fillableHits() { |