aboutsummaryrefslogtreecommitdiffstats
path: root/container-search/src
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2024-06-21 07:41:56 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2024-06-21 07:41:56 +0200
commit610115d0aefd3f9beb94b10276888a8bf3382583 (patch)
tree0f9eb5f61d6b3d035a9ee205f7c71aebc8e8e9c3 /container-search/src
parentf7c3c4d019522ebc4b46e51e19472959c5039058 (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')
-rw-r--r--container-search/src/main/java/com/yahoo/search/searchers/OpportunisticWeakAndSearcher.java15
-rw-r--r--container-search/src/test/java/com/yahoo/search/searchers/OpportunisticWeakAndSearcherTestCase.java49
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());
}
}