diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-01-25 16:48:26 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2023-01-25 17:05:48 +0100 |
commit | 7e8209d06e1b67c3d1f5c05acc8c3f0a19234380 (patch) | |
tree | e1d386dd1b9646a302b98781005f6b364b291065 /container-search | |
parent | 9a85de6ca1badd76e04a2315b693a8e512c0d6d1 (diff) |
Replace synchronized Stack with Deque in feed and query path.
Diffstat (limited to 'container-search')
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()); } |