summaryrefslogtreecommitdiffstats
path: root/container-search
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@oath.com>2018-10-14 19:20:56 +0200
committerGitHub <noreply@github.com>2018-10-14 19:20:56 +0200
commit7518ce3820175680c68b4d574a1520028d663092 (patch)
treee5ff47b26436a22ab02a548f79ff29b0d02c800f /container-search
parent46e014afbe93b74b977ea1c0055df3ae063cadb3 (diff)
Revert "Simplify and correct isFilled"
Diffstat (limited to 'container-search')
-rw-r--r--container-search/src/main/java/com/yahoo/search/result/HitGroup.java62
-rw-r--r--container-search/src/test/java/com/yahoo/search/result/test/FillingTestCase.java37
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();