summaryrefslogtreecommitdiffstats
path: root/container-search
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-01-25 16:48:26 +0100
committerHenning Baldersheim <balder@yahoo-inc.com>2023-01-25 17:05:48 +0100
commit7e8209d06e1b67c3d1f5c05acc8c3f0a19234380 (patch)
treee1d386dd1b9646a302b98781005f6b364b291065 /container-search
parent9a85de6ca1badd76e04a2315b693a8e512c0d6d1 (diff)
Replace synchronized Stack with Deque in feed and query path.
Diffstat (limited to 'container-search')
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/querytransform/RecallSearcher.java28
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/request/MathResolver.java34
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/vespa/RequestBuilder.java11
-rwxr-xr-xcontainer-search/src/test/java/com/yahoo/prelude/querytransform/test/RecallSearcherTestCase.java24
4 files changed, 43 insertions, 54 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/querytransform/RecallSearcher.java b/container-search/src/main/java/com/yahoo/prelude/querytransform/RecallSearcher.java
index f0a18954e40..98a8e5af00d 100644
--- a/container-search/src/main/java/com/yahoo/prelude/querytransform/RecallSearcher.java
+++ b/container-search/src/main/java/com/yahoo/prelude/querytransform/RecallSearcher.java
@@ -3,7 +3,11 @@ package com.yahoo.prelude.querytransform;
import com.yahoo.component.chain.dependencies.After;
import com.yahoo.component.chain.dependencies.Before;
-import com.yahoo.prelude.query.*;
+import com.yahoo.prelude.query.CompositeItem;
+import com.yahoo.prelude.query.Item;
+import com.yahoo.prelude.query.NullItem;
+import com.yahoo.prelude.query.RankItem;
+import com.yahoo.prelude.query.WordItem;
import com.yahoo.prelude.query.parser.AnyParser;
import com.yahoo.search.Query;
import com.yahoo.search.Result;
@@ -14,10 +18,10 @@ import com.yahoo.search.query.parser.Parsable;
import com.yahoo.search.query.parser.ParserEnvironment;
import com.yahoo.search.result.ErrorMessage;
import com.yahoo.search.searchchain.Execution;
-import com.yahoo.search.searchchain.PhaseNames;
+import java.util.ArrayDeque;
+import java.util.Deque;
import java.util.Iterator;
-import java.util.Stack;
import static com.yahoo.prelude.querytransform.NormalizingSearcher.ACCENT_REMOVAL;
import static com.yahoo.prelude.querytransform.StemmingSearcher.STEMMING;
@@ -76,15 +80,14 @@ public class RecallSearcher extends Searcher {
* @return True if a rank item was found.
*/
private static boolean hasRankItem(Item root) {
- Stack<Item> stack = new Stack<>();
+ Deque<Item> stack = new ArrayDeque<>();
stack.push(root);
while (!stack.isEmpty()) {
Item item = stack.pop();
if (item instanceof RankItem) {
return true;
}
- if (item instanceof CompositeItem) {
- CompositeItem lst = (CompositeItem)item;
+ if (item instanceof CompositeItem lst) {
for (Iterator<Item> it = lst.getItemIterator(); it.hasNext();) {
stack.push(it.next());
}
@@ -102,20 +105,18 @@ public class RecallSearcher extends Searcher {
* @return The first node found.
*/
private static WordItem findOrigWordItem(Item root, String value) {
- Stack<Item> stack = new Stack<>();
+ Deque<Item> stack = new ArrayDeque<>();
stack.push(root);
while (!stack.isEmpty()) {
Item item = stack.pop();
if (item.getCreator() == Item.ItemCreator.ORIG &&
- item instanceof WordItem)
+ item instanceof WordItem word)
{
- WordItem word = (WordItem)item;
if (word.getWord().equals(value)) {
return word;
}
}
- if (item instanceof CompositeItem) {
- CompositeItem lst = (CompositeItem)item;
+ if (item instanceof CompositeItem lst) {
for (Iterator<Item> it = lst.getItemIterator(); it.hasNext();) {
stack.push(it.next());
}
@@ -130,15 +131,14 @@ public class RecallSearcher extends Searcher {
* @param root The root of the tree to update.
*/
private static void updateFilterTerms(Item root) {
- Stack<Item> stack = new Stack<>();
+ Deque<Item> stack = new ArrayDeque<>();
stack.push(root);
while (!stack.isEmpty()) {
Item item = stack.pop();
if (item.getCreator() == Item.ItemCreator.FILTER) {
item.setRanked(false);
}
- if (item instanceof CompositeItem) {
- CompositeItem lst = (CompositeItem)item;
+ if (item instanceof CompositeItem lst) {
for (Iterator<Item> it = lst.getItemIterator(); it.hasNext();) {
stack.push(it.next());
}
diff --git a/container-search/src/main/java/com/yahoo/search/grouping/request/MathResolver.java b/container-search/src/main/java/com/yahoo/search/grouping/request/MathResolver.java
index 98dd2ee3c88..fd3651e6787 100644
--- a/container-search/src/main/java/com/yahoo/search/grouping/request/MathResolver.java
+++ b/container-search/src/main/java/com/yahoo/search/grouping/request/MathResolver.java
@@ -1,9 +1,10 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.search.grouping.request;
+import java.util.ArrayDeque;
+import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
-import java.util.Stack;
/**
* This is a helper class for resolving arithmetic operations over {@link GroupingExpression} objects. To resolve an
@@ -25,7 +26,7 @@ public class MathResolver {
private final int pre;
private final String image;
- private Type(int pre, String image) {
+ Type(int pre, String image) {
this.pre = pre;
this.image = image;
}
@@ -57,7 +58,7 @@ public class MathResolver {
if (items.size() == 1) {
return items.remove(0).exp; // optimize common case
}
- Stack<Item> stack = new Stack<>();
+ Deque<Item> stack = new ArrayDeque<>();
stack.push(items.remove(0));
while (!items.isEmpty()) {
Item item = items.remove(0);
@@ -69,30 +70,19 @@ public class MathResolver {
while (stack.size() > 1) {
pop(stack);
}
- return stack.remove(0).exp;
+ return stack.pop().exp;
}
- private void pop(Stack<Item> stack) {
+ private void pop(Deque<Item> stack) {
Item rhs = stack.pop();
Item lhs = stack.peek();
switch (rhs.type) {
- case ADD:
- lhs.exp = new AddFunction(lhs.exp, rhs.exp);
- break;
- case DIV:
- lhs.exp = new DivFunction(lhs.exp, rhs.exp);
- break;
- case MOD:
- lhs.exp = new ModFunction(lhs.exp, rhs.exp);
- break;
- case MUL:
- lhs.exp = new MulFunction(lhs.exp, rhs.exp);
- break;
- case SUB:
- lhs.exp = new SubFunction(lhs.exp, rhs.exp);
- break;
- default:
- throw new UnsupportedOperationException("Operator " + rhs.type + " not supported.");
+ case ADD -> lhs.exp = new AddFunction(lhs.exp, rhs.exp);
+ case DIV -> lhs.exp = new DivFunction(lhs.exp, rhs.exp);
+ case MOD -> lhs.exp = new ModFunction(lhs.exp, rhs.exp);
+ case MUL -> lhs.exp = new MulFunction(lhs.exp, rhs.exp);
+ case SUB -> lhs.exp = new SubFunction(lhs.exp, rhs.exp);
+ default -> throw new UnsupportedOperationException("Operator " + rhs.type + " not supported.");
}
}
diff --git a/container-search/src/main/java/com/yahoo/search/grouping/vespa/RequestBuilder.java b/container-search/src/main/java/com/yahoo/search/grouping/vespa/RequestBuilder.java
index e5b45373370..958f343fac5 100644
--- a/container-search/src/main/java/com/yahoo/search/grouping/vespa/RequestBuilder.java
+++ b/container-search/src/main/java/com/yahoo/search/grouping/vespa/RequestBuilder.java
@@ -18,11 +18,13 @@ import com.yahoo.searchlib.aggregation.HitsAggregationResult;
import com.yahoo.searchlib.expression.ExpressionNode;
import com.yahoo.searchlib.expression.RangeBucketPreDefFunctionNode;
+import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
+import java.util.Objects;
import java.util.OptionalLong;
-import java.util.Stack;
+import java.util.Deque;
import java.util.TimeZone;
/**
@@ -61,7 +63,7 @@ class RequestBuilder {
* @return This, to allow chaining.
*/
public RequestBuilder setRootOperation(GroupingOperation root) {
- root.getClass(); // throws NullPointerException
+ Objects.requireNonNull(root, "Root must be non-null");
this.root = root;
return this;
}
@@ -125,7 +127,7 @@ class RequestBuilder {
Grouping grouping = new Grouping();
grouping.getRoot().setTag(++tag);
grouping.setForceSinglePass(root.getForceSinglePass() || root.containsHint("singlepass"));
- Stack<BuildFrame> stack = new Stack<>();
+ Deque<BuildFrame> stack = new ArrayDeque<>();
stack.push(new BuildFrame(grouping, new BuildState(), root));
while (!stack.isEmpty()) {
BuildFrame frame = stack.pop();
@@ -317,11 +319,10 @@ class RequestBuilder {
result.setTag(++tag);
String label = exp.getLabel();
- if (result instanceof HitsAggregationResult) {
+ if (result instanceof HitsAggregationResult hits) {
if (label != null) {
throw new UnsupportedOperationException("Can not label expression '" + exp + "'.");
}
- HitsAggregationResult hits = (HitsAggregationResult)result;
if (frame.state.max != null) {
transform.putMax(tag, frame.state.max, "hit list");
int offset = transform.getOffset(tag);
diff --git a/container-search/src/test/java/com/yahoo/prelude/querytransform/test/RecallSearcherTestCase.java b/container-search/src/test/java/com/yahoo/prelude/querytransform/test/RecallSearcherTestCase.java
index e2d1555701c..a879f142bcc 100755
--- a/container-search/src/test/java/com/yahoo/prelude/querytransform/test/RecallSearcherTestCase.java
+++ b/container-search/src/test/java/com/yahoo/prelude/querytransform/test/RecallSearcherTestCase.java
@@ -1,13 +1,12 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.prelude.querytransform.test;
+import java.util.ArrayDeque;
import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.Deque;
import java.util.Iterator;
import java.util.List;
-import java.util.Stack;
-import com.yahoo.prelude.IndexFacts;
import com.yahoo.search.Query;
import com.yahoo.search.Result;
import com.yahoo.prelude.query.CompositeItem;
@@ -45,13 +44,13 @@ public class RecallSearcherTestCase {
@Test
void testParse() {
List<String> empty = new ArrayList<>();
- assertQueryTree("?query=foo", Arrays.asList("foo"), empty);
- assertQueryTree("?recall=%2bfoo", empty, Arrays.asList("foo"));
- assertQueryTree("?query=foo&filter=bar&recall=%2bbaz", Arrays.asList("foo", "bar"), Arrays.asList("baz"));
- assertQueryTree("?query=foo+bar&filter=baz&recall=%2bcox", Arrays.asList("foo", "bar", "baz"), Arrays.asList("cox"));
- assertQueryTree("?query=foo&filter=bar+baz&recall=%2bcox", Arrays.asList("foo", "bar", "baz"), Arrays.asList("cox"));
- assertQueryTree("?query=foo&filter=bar&recall=-baz+%2bcox", Arrays.asList("foo", "bar"), Arrays.asList("baz", "cox"));
- assertQueryTree("?query=foo%20bar&recall=%2bbaz%20-cox", Arrays.asList("foo", "bar"), Arrays.asList("baz", "cox"));
+ assertQueryTree("?query=foo", List.of("foo"), empty);
+ assertQueryTree("?recall=%2bfoo", empty, List.of("foo"));
+ assertQueryTree("?query=foo&filter=bar&recall=%2bbaz", List.of("foo", "bar"), List.of("baz"));
+ assertQueryTree("?query=foo+bar&filter=baz&recall=%2bcox", List.of("foo", "bar", "baz"), List.of("cox"));
+ assertQueryTree("?query=foo&filter=bar+baz&recall=%2bcox", List.of("foo", "bar", "baz"), List.of("cox"));
+ assertQueryTree("?query=foo&filter=bar&recall=-baz+%2bcox", List.of("foo", "bar"), List.of("baz", "cox"));
+ assertQueryTree("?query=foo%20bar&recall=%2bbaz%20-cox", List.of("foo", "bar"), List.of("baz", "cox"));
}
private static void assertQueryTree(String query, List<String> ranked, List<String> unranked) {
@@ -65,7 +64,7 @@ public class RecallSearcherTestCase {
List<String> myRanked = new ArrayList<>(ranked);
List<String> myUnranked = new ArrayList<>(unranked);
- Stack<Item> stack = new Stack<>();
+ Deque<Item> stack = new ArrayDeque<>();
stack.push(obj.getModel().getQueryTree().getRoot());
while (!stack.isEmpty()) {
Item item = stack.pop();
@@ -85,8 +84,7 @@ public class RecallSearcherTestCase {
myUnranked.remove(idx);
}
}
- if (item instanceof CompositeItem) {
- CompositeItem lst = (CompositeItem)item;
+ if (item instanceof CompositeItem lst) {
for (Iterator<?> it = lst.getItemIterator(); it.hasNext();) {
stack.push((Item)it.next());
}