diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2024-06-21 07:41:56 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2024-06-21 07:41:56 +0200 |
commit | 610115d0aefd3f9beb94b10276888a8bf3382583 (patch) | |
tree | 0f9eb5f61d6b3d035a9ee205f7c71aebc8e8e9c3 /container-search/src | |
parent | f7c3c4d019522ebc4b46e51e19472959c5039058 (diff) |
If hits has been set higher than default weakand targethits, adjust all weakand with not explicit set heap size up to hits.
Diffstat (limited to 'container-search/src')
2 files changed, 55 insertions, 9 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/searchers/OpportunisticWeakAndSearcher.java b/container-search/src/main/java/com/yahoo/search/searchers/OpportunisticWeakAndSearcher.java index c56b161edeb..1833df4631e 100644 --- a/container-search/src/main/java/com/yahoo/search/searchers/OpportunisticWeakAndSearcher.java +++ b/container-search/src/main/java/com/yahoo/search/searchers/OpportunisticWeakAndSearcher.java @@ -32,6 +32,9 @@ public class OpportunisticWeakAndSearcher extends Searcher { @Override public Result search(Query query, Execution execution) { + if (query.getHits() > WeakAndItem.defaultN) { + adjustWeakAndHeap(query.getModel().getQueryTree().getRoot(), query.getHits()); + } if (!query.properties().getBoolean(OPPORTUNISTIC_AND)) { return execution.search(query); } @@ -52,6 +55,18 @@ public class OpportunisticWeakAndSearcher extends Searcher { return execution.search(query); } + static Item adjustWeakAndHeap(Item item, int hits) { + if (item instanceof WeakAndItem weakAnd && hits > weakAnd.getN() && !weakAnd.isNExplicit()) { + weakAnd.setN(hits); + } + if (item instanceof CompositeItem compositeItem) { + for (int i = 0; i < compositeItem.getItemCount(); i++) { + adjustWeakAndHeap(compositeItem.getItem(i), hits); + } + } + return item; + } + // returns targetHits for the first WeakAndItem found, -1 if none found. static int targetHits(Item item) { if (!(item instanceof CompositeItem compositeItem)) return -1; diff --git a/container-search/src/test/java/com/yahoo/search/searchers/OpportunisticWeakAndSearcherTestCase.java b/container-search/src/test/java/com/yahoo/search/searchers/OpportunisticWeakAndSearcherTestCase.java index f41c74a4b8e..4aba8becf98 100644 --- a/container-search/src/test/java/com/yahoo/search/searchers/OpportunisticWeakAndSearcherTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/searchers/OpportunisticWeakAndSearcherTestCase.java @@ -11,7 +11,12 @@ import com.yahoo.prelude.query.WeakAndItem; import com.yahoo.prelude.query.WordItem; import org.junit.jupiter.api.Test; +import static com.yahoo.search.searchers.OpportunisticWeakAndSearcher.targetHits; +import static com.yahoo.search.searchers.OpportunisticWeakAndSearcher.weakAnd2AndRecurse; +import static com.yahoo.search.searchers.OpportunisticWeakAndSearcher.adjustWeakAndHeap; + import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; public class OpportunisticWeakAndSearcherTestCase { @@ -30,21 +35,47 @@ public class OpportunisticWeakAndSearcherTestCase { @Test public void requireThatWeakAndIsDetected() { - assertEquals(-1, OpportunisticWeakAndSearcher.targetHits(new OrItem())); - assertEquals(-1, OpportunisticWeakAndSearcher.targetHits(new WeakAndItem(33))); - assertEquals(-1, OpportunisticWeakAndSearcher.targetHits(addItem(new WeakAndItem(33), new TrueItem()))); - assertEquals(33, OpportunisticWeakAndSearcher.targetHits(addItem(addItem(new WeakAndItem(33), new TrueItem()), new TrueItem()))); - assertEquals(77, OpportunisticWeakAndSearcher.targetHits(buildQueryItem(new OrItem(), new WeakAndItem(77)))); - assertEquals(77, OpportunisticWeakAndSearcher.targetHits(buildQueryItem(new AndItem(), new WeakAndItem(77)))); - assertEquals(-1, OpportunisticWeakAndSearcher.targetHits(buildQueryItem(new OrItem(), new AndItem()))); + assertEquals(-1, targetHits(new OrItem())); + assertEquals(-1, targetHits(new WeakAndItem(33))); + assertEquals(-1, targetHits(addItem(new WeakAndItem(33), new TrueItem()))); + assertEquals(33, targetHits(addItem(addItem(new WeakAndItem(33), new TrueItem()), new TrueItem()))); + assertEquals(77, targetHits(buildQueryItem(new OrItem(), new WeakAndItem(77)))); + assertEquals(77, targetHits(buildQueryItem(new AndItem(), new WeakAndItem(77)))); + assertEquals(-1, targetHits(buildQueryItem(new OrItem(), new AndItem()))); } @Test public void requireThatWeakAndIsReplacedWithAnd() { assertEquals(buildQueryItem(new OrItem(), new AndItem()), - OpportunisticWeakAndSearcher.weakAnd2AndRecurse(buildQueryItem(new OrItem(), new WeakAndItem()))); + weakAnd2AndRecurse(buildQueryItem(new OrItem(), new WeakAndItem()))); assertEquals(buildQueryItem(new AndItem(), new AndItem()), - OpportunisticWeakAndSearcher.weakAnd2AndRecurse(buildQueryItem(new AndItem(), new WeakAndItem()))); + weakAnd2AndRecurse(buildQueryItem(new AndItem(), new WeakAndItem()))); + } + + private static WeakAndItem try2Adjust(WeakAndItem item, int hits) { + adjustWeakAndHeap(item, hits); + return item; + } + + private static WeakAndItem try2Adjust(WeakAndItem item, CompositeItem parent, int hits) { + parent.addItem(item); + adjustWeakAndHeap(parent, hits); + return item; + } + + @Test + public void requireThatDefaultWeakAndHeapIsAdjustedUpToHits() { + assertEquals(1000, try2Adjust(new WeakAndItem(), 1000).getN()); + assertFalse(try2Adjust(new WeakAndItem(), 10).isNExplicit()); + + assertEquals(1000, try2Adjust(new WeakAndItem(), new OrItem(), 1000).getN()); + assertFalse(try2Adjust(new WeakAndItem(), new OrItem(), 10).isNExplicit()); + } + @Test + public void requireThatNonDefaultWeakAndHeapIsNotAdjustedUpToHits() { + assertEquals(33, try2Adjust(new WeakAndItem(33), 1000).getN()); + assertEquals(33, try2Adjust(new WeakAndItem(33), 11).getN()); + assertEquals(WeakAndItem.defaultN, try2Adjust(new WeakAndItem(WeakAndItem.defaultN), 1000).getN()); } } |