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 | |
parent | 46e014afbe93b74b977ea1c0055df3ae063cadb3 (diff) |
Revert "Simplify and correct isFilled"
Diffstat (limited to 'container-search')
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/result/HitGroup.java | 62 | ||||
-rw-r--r-- | container-search/src/test/java/com/yahoo/search/result/test/FillingTestCase.java | 37 |
2 files changed, 53 insertions, 46 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() { diff --git a/container-search/src/test/java/com/yahoo/search/result/test/FillingTestCase.java b/container-search/src/test/java/com/yahoo/search/result/test/FillingTestCase.java index 8a068b7cb3b..01383ba29f2 100644 --- a/container-search/src/test/java/com/yahoo/search/result/test/FillingTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/result/test/FillingTestCase.java @@ -5,9 +5,6 @@ import com.yahoo.search.result.Hit; import com.yahoo.search.result.HitGroup; import org.junit.Test; -import java.util.Collections; - -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -53,40 +50,6 @@ public class FillingTestCase { assertTrue(group.isFilled("otherSummary")); } - @Test - public void testPartiallyFilledWith2Hits() { - Hit hit1 = new Hit("id1"); - Hit hit2 = new Hit("id2"); - - hit1.setFilled("summary"); - hit2.setFillable(); - - HitGroup hits = new HitGroup(); - hits.add(hit1); - hits.add(hit2); - - assertEquals(Collections.emptySet(), hits.getFilled()); - } - - @Test - public void testPartiallyFilledDiverse() { - Hit hit1 = new Hit("id1"); - Hit hit2 = new Hit("id2"); - Hit hit3 = new Hit("id3"); - - hit1.setFilled("summary1"); - hit1.setFilled("summary2"); - hit2.setFilled("summary1"); - hit3.setFilled("summary1"); - - HitGroup hits = new HitGroup(); - hits.add(hit1); - hits.add(hit2); - hits.add(hit3); - - assertEquals(Collections.singleton("summary1"), hits.getFilled()); - } - private Hit createNonFilled(String id) { Hit hit=new Hit(id); hit.setFillable(); |