diff options
10 files changed, 184 insertions, 218 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()); } diff --git a/document/src/main/java/com/yahoo/document/annotation/RecursiveNodeIterator.java b/document/src/main/java/com/yahoo/document/annotation/RecursiveNodeIterator.java index 775ce41d303..faae78ff8ee 100644 --- a/document/src/main/java/com/yahoo/document/annotation/RecursiveNodeIterator.java +++ b/document/src/main/java/com/yahoo/document/annotation/RecursiveNodeIterator.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.document.annotation; +import java.util.ArrayDeque; +import java.util.Deque; import java.util.ListIterator; import java.util.NoSuchElementException; -import java.util.Stack; /** * ListIterator implementation which performs a depth-first traversal of SpanNodes. @@ -11,11 +12,11 @@ import java.util.Stack; * @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a> */ class RecursiveNodeIterator implements ListIterator<SpanNode> { - protected Stack<PeekableListIterator<SpanNode>> stack = new Stack<PeekableListIterator<SpanNode>>(); + protected Deque<PeekableListIterator<SpanNode>> stack = new ArrayDeque<>(); protected ListIterator<SpanNode> iteratorFromLastCallToNext = null; RecursiveNodeIterator(ListIterator<SpanNode> it) { - stack.push(new PeekableListIterator<SpanNode>(it)); + stack.push(new PeekableListIterator<>(it)); } protected RecursiveNodeIterator() { @@ -38,7 +39,7 @@ class RecursiveNodeIterator implements ListIterator<SpanNode> { if (!iterator.traversed) { //we set the traversed flag on our way down iterator.traversed = true; - stack.push(new PeekableListIterator<SpanNode>(node.childIterator())); + stack.push(new PeekableListIterator<>(node.childIterator())); return hasNext(); } diff --git a/document/src/main/java/com/yahoo/document/select/rule/ArithmeticNode.java b/document/src/main/java/com/yahoo/document/select/rule/ArithmeticNode.java index b160293440e..76de41fc39e 100644 --- a/document/src/main/java/com/yahoo/document/select/rule/ArithmeticNode.java +++ b/document/src/main/java/com/yahoo/document/select/rule/ArithmeticNode.java @@ -8,9 +8,10 @@ import com.yahoo.document.select.Context; import com.yahoo.document.select.Result; import com.yahoo.document.select.Visitor; +import java.util.ArrayDeque; +import java.util.Deque; import java.util.List; import java.util.ArrayList; -import java.util.Stack; /** * @author Simon Thoresen Hult @@ -47,7 +48,7 @@ public class ArithmeticNode implements ExpressionNode { @Override public Object evaluate(Context context) { StringBuilder ret = null; - Stack<ValueItem> buf = new Stack<>(); + Deque<ValueItem> buf = new ArrayDeque<>(); for (int i = 0; i < items.size(); ++i) { NodeItem item = items.get(i); Object val = item.node.evaluate(context); @@ -56,8 +57,7 @@ public class ArithmeticNode implements ExpressionNode { throw new IllegalArgumentException("Can not perform arithmetic on null value (referencing missing field?)"); } - if (val instanceof AttributeNode.VariableValueList) { - AttributeNode.VariableValueList value = (AttributeNode.VariableValueList)val; + if (val instanceof AttributeNode.VariableValueList value) { if (value.size() == 0) { throw new IllegalArgumentException("Can not perform arithmetic on missing field: " + item.node.toString()); @@ -102,27 +102,16 @@ public class ArithmeticNode implements ExpressionNode { return buf.pop().value; } - private void popOffTheTop(Stack<ValueItem> buf) { + private void popOffTheTop(Deque<ValueItem> buf) { ValueItem rhs = buf.pop(); ValueItem lhs = buf.pop(); switch (rhs.operator) { - case ADD: - lhs.value = lhs.value.doubleValue() + rhs.value.doubleValue(); - break; - case SUB: - lhs.value = lhs.value.doubleValue() - rhs.value.doubleValue(); - break; - case DIV: - lhs.value = lhs.value.doubleValue() / rhs.value.doubleValue(); - break; - case MUL: - lhs.value = lhs.value.doubleValue() * rhs.value.doubleValue(); - break; - case MOD: - lhs.value = lhs.value.longValue() % rhs.value.longValue(); - break; - default: - throw new IllegalStateException("Arithmetic operator " + rhs.operator + " not supported."); + case ADD -> lhs.value = lhs.value.doubleValue() + rhs.value.doubleValue(); + case SUB -> lhs.value = lhs.value.doubleValue() - rhs.value.doubleValue(); + case DIV -> lhs.value = lhs.value.doubleValue() / rhs.value.doubleValue(); + case MUL -> lhs.value = lhs.value.doubleValue() * rhs.value.doubleValue(); + case MOD -> lhs.value = lhs.value.longValue() % rhs.value.longValue(); + default -> throw new IllegalStateException("Arithmetic operator " + rhs.operator + " not supported."); } buf.push(lhs); } @@ -140,22 +129,15 @@ public class ArithmeticNode implements ExpressionNode { } public String operatorToString(int operator) { - switch (operator) { - case NOP: - return null; - case ADD: - return "+"; - case SUB: - return "-"; - case MOD: - return "%"; - case DIV: - return "/"; - case MUL: - return "*"; - default: - throw new IllegalStateException("Arithmetic operator " + operator + " not supported."); - } + return switch (operator) { + case NOP -> null; + case ADD -> "+"; + case SUB -> "-"; + case MOD -> "%"; + case DIV -> "/"; + case MUL -> "*"; + default -> throw new IllegalStateException("Arithmetic operator " + operator + " not supported."); + }; } private int stringToOperator(String operator) { @@ -192,8 +174,8 @@ public class ArithmeticNode implements ExpressionNode { } public static class NodeItem { - private int operator; - private ExpressionNode node; + private final int operator; + private final ExpressionNode node; NodeItem(int operator, ExpressionNode node) { this.operator = operator; diff --git a/document/src/main/java/com/yahoo/document/select/rule/LogicNode.java b/document/src/main/java/com/yahoo/document/select/rule/LogicNode.java index 5cfcef2a5e5..f97ebb20c28 100644 --- a/document/src/main/java/com/yahoo/document/select/rule/LogicNode.java +++ b/document/src/main/java/com/yahoo/document/select/rule/LogicNode.java @@ -7,9 +7,10 @@ import com.yahoo.document.select.Context; import com.yahoo.document.select.ResultList; import com.yahoo.document.select.Visitor; +import java.util.ArrayDeque; import java.util.ArrayList; +import java.util.Deque; import java.util.List; -import java.util.Stack; /** * This class defines a logical expression of nodes. This implementation uses a stack to evaluate its content as to @@ -56,7 +57,7 @@ public class LogicNode implements ExpressionNode { @Override public BucketSet getBucketSet(BucketIdFactory factory) { - Stack<BucketItem> buf = new Stack<>(); + Deque<BucketItem> buf = new ArrayDeque<>(); for (NodeItem item : items) { if (!buf.isEmpty()) { while (buf.peek().operator > item.operator) { @@ -76,11 +77,11 @@ public class LogicNode implements ExpressionNode { * * @param buf The stack of bucket items. */ - private void combineBuckets(Stack<BucketItem> buf) { + private void combineBuckets(Deque<BucketItem> buf) { BucketItem rhs = buf.pop(); BucketItem lhs = buf.pop(); switch (rhs.operator) { - case AND: + case AND -> { if (lhs.buckets == null) { lhs.buckets = rhs.buckets; } else if (rhs.buckets == null) { @@ -88,8 +89,8 @@ public class LogicNode implements ExpressionNode { } else { lhs.buckets = lhs.buckets.intersection(rhs.buckets); } - break; - case OR: + } + case OR -> { if (lhs.buckets == null) { // empty } else if (rhs.buckets == null) { @@ -97,16 +98,15 @@ public class LogicNode implements ExpressionNode { } else { lhs.buckets = lhs.buckets.union(rhs.buckets); } - break; - default: - throw new IllegalStateException("Arithmetic operator " + rhs.operator + " not supported."); + } + default -> throw new IllegalStateException("Arithmetic operator " + rhs.operator + " not supported."); } buf.push(lhs); } @Override public Object evaluate(Context context) { - Stack<ValueItem> buf = new Stack<>(); + Deque<ValueItem> buf = new ArrayDeque<>(); for (NodeItem item : items) { if ( buf.size() > 1) { while ((buf.peek().getOperator() >= item.operator)) { @@ -126,7 +126,7 @@ public class LogicNode implements ExpressionNode { * * @param buf The stack of values. */ - private void combineValues(Stack<ValueItem> buf) { + private void combineValues(Deque<ValueItem> buf) { ValueItem rhs = buf.pop(); ValueItem lhs = buf.pop(); buf.push(new LazyCombinedItem(lhs, rhs)); @@ -156,16 +156,12 @@ public class LogicNode implements ExpressionNode { * @return The string representation. */ private String operatorToString(int operator) { - switch (operator) { - case NOP: - return null; - case OR: - return "or"; - case AND: - return "and"; - default: - throw new IllegalStateException("Logical operator " + operator + " not supported."); - } + return switch (operator) { + case NOP -> null; + case OR -> "or"; + case AND -> "and"; + default -> throw new IllegalStateException("Logical operator " + operator + " not supported."); + }; } /** @@ -231,14 +227,10 @@ public class LogicNode implements ExpressionNode { public ResultList getResult() { if (lazyResult == null) { switch (rhs.getOperator()) { - case AND: - lazyResult = lhs.getResult().combineAND(rhs); - break; - case OR: - lazyResult = lhs.getResult().combineOR(rhs); - break; - default: - throw new IllegalStateException("Logical operator " + rhs.getOperator() + " not supported."); + case AND -> lazyResult = lhs.getResult().combineAND(rhs); + case OR -> lazyResult = lhs.getResult().combineOR(rhs); + default -> + throw new IllegalStateException("Logical operator " + rhs.getOperator() + " not supported."); } } return lazyResult; @@ -249,7 +241,7 @@ public class LogicNode implements ExpressionNode { * Private class to store bucket sets in a stack. */ private static final class BucketItem { - private int operator; + final private int operator; private BucketSet buckets; BucketItem(int operator, BucketSet buckets) { @@ -262,8 +254,8 @@ public class LogicNode implements ExpressionNode { * Private class to store expression nodes in a stack. */ public static final class NodeItem { - private int operator; - private ExpressionNode node; + final private int operator; + final private ExpressionNode node; NodeItem(int operator, ExpressionNode node) { this.operator = operator; diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/MathResolver.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/MathResolver.java index 47d4e789602..ded665b2d77 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/MathResolver.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/MathResolver.java @@ -1,10 +1,11 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.indexinglanguage.expressions; +import java.util.ArrayDeque; +import java.util.Deque; import java.util.LinkedList; import java.util.List; import java.util.Objects; -import java.util.Stack; /** * @author Simon Thoresen Hult @@ -20,7 +21,7 @@ public class MathResolver { } public Expression resolve() { - Stack<Item> stack = new Stack<>(); + Deque<Item> stack = new ArrayDeque<>(); stack.push(items.remove(0)); while (!items.isEmpty()) { Item item = items.remove(0); @@ -32,10 +33,10 @@ 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(); lhs.exp = new ArithmeticExpression(lhs.exp, rhs.op, rhs.exp); diff --git a/messagebus/src/main/java/com/yahoo/messagebus/routing/RoutingNode.java b/messagebus/src/main/java/com/yahoo/messagebus/routing/RoutingNode.java index 1f63744c205..ac8fd637646 100755 --- a/messagebus/src/main/java/com/yahoo/messagebus/routing/RoutingNode.java +++ b/messagebus/src/main/java/com/yahoo/messagebus/routing/RoutingNode.java @@ -21,7 +21,6 @@ import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; import java.util.List; -import java.util.Stack; import java.util.concurrent.atomic.AtomicInteger; /** @@ -130,7 +129,7 @@ public class RoutingNode implements ReplyHandler { * @param msg The error message to assign. */ private void notifyAbort(String msg) { - Stack<RoutingNode> stack = new Stack<>(); + Deque<RoutingNode> stack = new ArrayDeque<>(); stack.push(this); while (!stack.isEmpty()) { RoutingNode node = stack.pop(); @@ -430,8 +429,7 @@ public class RoutingNode implements ReplyHandler { private boolean lookupRoute() { RoutingTable table = mbus.getRoutingTable(msg.getProtocol()); Hop hop = route.getHop(0); - if (hop.getDirective(0) instanceof RouteDirective) { - RouteDirective dir = (RouteDirective)hop.getDirective(0); + if (hop.getDirective(0) instanceof RouteDirective dir) { if (table == null || !table.hasRoute(dir.getName())) { setError(ErrorCode.ILLEGAL_ROUTE, "Route '" + dir.getName() + "' does not exist."); return false; diff --git a/vdslib/src/test/java/com/yahoo/vdslib/distribution/DistributionTestCase.java b/vdslib/src/test/java/com/yahoo/vdslib/distribution/DistributionTestCase.java index bd1511acdbd..415c4ffe8f0 100644 --- a/vdslib/src/test/java/com/yahoo/vdslib/distribution/DistributionTestCase.java +++ b/vdslib/src/test/java/com/yahoo/vdslib/distribution/DistributionTestCase.java @@ -67,7 +67,7 @@ public class DistributionTestCase { public void testSimple() { test = new DistributionTestFactory("simple"); List<BucketId> buckets = getTestBuckets(); - Integer nodes[] = { 6, 3, 4, 8, 8, 8, 8, 8, 8, 3 }; + Integer [] nodes = { 6, 3, 4, 8, 8, 8, 8, 8, 8, 3 }; for (int i=0; i<buckets.size(); ++i) { BucketId bucket = buckets.get(i); DistributionTestFactory.Test t = test.recordResult(bucket).assertNodeCount(1); @@ -137,86 +137,89 @@ public class DistributionTestCase { public void testWriteDistribution() throws IOException, ParseException, Distribution.TooFewBucketBitsInUseException, Distribution.NoDistributorsAvailableException { String clusterState = "distributor:9"; String distributionConfig = - "redundancy 3\n" + - "group[4]\n" + - "group[0].index \"invalid\"\n" + - "group[0].name \"invalid\"\n" + - "group[0].partitions 1|2|*\n" + - "group[0].nodes[0]\n" + - "group[1].index 1\n" + - "group[1].capacity 2.0\n" + - "group[1].name group1\n" + - "group[1].partitions *\n" + - "group[1].nodes[3]\n" + - "group[1].nodes[0].index 0\n" + - "group[1].nodes[1].index 1\n" + - "group[1].nodes[2].index 2\n" + - "group[2].index 2\n" + - "group[2].capacity 3.0\n" + - "group[2].name group2\n" + - "group[2].partitions *\n" + - "group[2].nodes[3]\n" + - "group[2].nodes[0].index 3\n" + - "group[2].nodes[1].index 4\n" + - "group[2].nodes[2].index 5\n" + - "group[3].index 3\n" + - "group[3].capacity 5.0\n" + - "group[3].name group3\n" + - "group[3].partitions *\n" + - "group[3].nodes[3]\n" + - "group[3].nodes[0].index 6\n" + - "group[3].nodes[1].index 7\n" + - "group[3].nodes[2].index 8\n"; + """ + redundancy 3 + group[4] + group[0].index "invalid" + group[0].name "invalid" + group[0].partitions 1|2|* + group[0].nodes[0] + group[1].index 1 + group[1].capacity 2.0 + group[1].name group1 + group[1].partitions * + group[1].nodes[3] + group[1].nodes[0].index 0 + group[1].nodes[1].index 1 + group[1].nodes[2].index 2 + group[2].index 2 + group[2].capacity 3.0 + group[2].name group2 + group[2].partitions * + group[2].nodes[3] + group[2].nodes[0].index 3 + group[2].nodes[1].index 4 + group[2].nodes[2].index 5 + group[3].index 3 + group[3].capacity 5.0 + group[3].name group3 + group[3].partitions * + group[3].nodes[3] + group[3].nodes[0].index 6 + group[3].nodes[1].index 7 + group[3].nodes[2].index 8 + """; writeDistributionTest("depth2", clusterState, distributionConfig); clusterState = "distributor:20 storage:20"; String complexDistributionConfig = - "redundancy 5\n" + - "group[7]\n" + - "group[0].partitions \"*|*\"\n" + - "group[0].index \"invalid\"\n" + - "group[0].name \"invalid\"\n" + - "group[0].nodes[0]\n" + - "group[1].partitions \"1|*\"\n" + - "group[1].index \"0\"\n" + - "group[1].name \"switch0\"\n" + - "group[1].nodes[0]\n" + - "group[2].partitions \"\"\n" + - "group[2].index \"0.0\"\n" + - "group[2].name \"rack0\"\n" + - "group[2].nodes[4]\n" + - "group[2].nodes[0].index 0\n" + - "group[2].nodes[1].index 1\n" + - "group[2].nodes[2].index 2\n" + - "group[2].nodes[3].index 3\n" + - "group[3].partitions \"\"\n" + - "group[3].index \"0.1\"\n" + - "group[3].name \"rack1\"\n" + - "group[3].nodes[4]\n" + - "group[3].nodes[0].index 8\n" + - "group[3].nodes[1].index 9\n" + - "group[3].nodes[2].index 14\n" + - "group[3].nodes[3].index 15\n" + - "group[4].partitions \"*\"\n" + - "group[4].index \"1\"\n" + - "group[4].name \"switch1\"\n" + - "group[4].nodes[0]\n" + - "group[5].partitions \"\"\n" + - "group[5].index \"1.0\"\n" + - "group[5].name \"rack0\"\n" + - "group[5].nodes[4]\n" + - "group[5].nodes[0].index 4\n" + - "group[5].nodes[1].index 5\n" + - "group[5].nodes[2].index 6\n" + - "group[5].nodes[3].index 17\n" + - "group[6].partitions \"\"\n" + - "group[6].index \"1.1\"\n" + - "group[6].name \"rack1\"\n" + - "group[6].nodes[4]\n" + - "group[6].nodes[0].index 10\n" + - "group[6].nodes[1].index 12\n" + - "group[6].nodes[2].index 13\n" + - "group[6].nodes[3].index 7"; + """ + redundancy 5 + group[7] + group[0].partitions "*|*" + group[0].index "invalid" + group[0].name "invalid" + group[0].nodes[0] + group[1].partitions "1|*" + group[1].index "0" + group[1].name "switch0" + group[1].nodes[0] + group[2].partitions "" + group[2].index "0.0" + group[2].name "rack0" + group[2].nodes[4] + group[2].nodes[0].index 0 + group[2].nodes[1].index 1 + group[2].nodes[2].index 2 + group[2].nodes[3].index 3 + group[3].partitions "" + group[3].index "0.1" + group[3].name "rack1" + group[3].nodes[4] + group[3].nodes[0].index 8 + group[3].nodes[1].index 9 + group[3].nodes[2].index 14 + group[3].nodes[3].index 15 + group[4].partitions "*" + group[4].index "1" + group[4].name "switch1" + group[4].nodes[0] + group[5].partitions "" + group[5].index "1.0" + group[5].name "rack0" + group[5].nodes[4] + group[5].nodes[0].index 4 + group[5].nodes[1].index 5 + group[5].nodes[2].index 6 + group[5].nodes[3].index 17 + group[6].partitions "" + group[6].index "1.1" + group[6].name "rack1" + group[6].nodes[4] + group[6].nodes[0].index 10 + group[6].nodes[1].index 12 + group[6].nodes[2].index 13 + group[6].nodes[3].index 7"""; writeDistributionTest("depth3", clusterState, complexDistributionConfig); clusterState = "distributor:20 storage:20 .3.c:3 .7.c:2.5 .12.c:1.5"; @@ -269,7 +272,7 @@ public class DistributionTestCase { buckets.add(new BucketId(distbits, i)); } for (BucketId bucket : buckets) { - DistributionTestFactory.Test t = test.recordResult(bucket).assertNodeCount(1); + test.recordResult(bucket).assertNodeCount(1); } test.recordTestResults(); test = null; @@ -347,7 +350,7 @@ public class DistributionTestCase { .setDistribution(buildHierarchicalConfig(6, 3, 1, "1|2|*", 3).distributor_auto_ownership_transfer_on_whole_group_down(false)) .setNodeType(NodeType.DISTRIBUTOR) .setClusterState(new ClusterState("distributor:2 storage:9")); - int counts[] = new int[10]; + int [] counts = new int[10]; int noneExisting = 0; for (BucketId bucket : getTestBuckets()) { DistributionTestFactory.Test t = test.recordResult(bucket); @@ -393,7 +396,7 @@ public class DistributionTestCase { test = new DistributionTestFactory("group-capacity") .setNodeCount(getNodeCount(1, 3, 3)).setDistribution(config); - int counts[] = new int[9]; + int [] counts = new int[9]; for (int i=0; i<900; ++i) { BucketId bucket = new BucketId(16, i); ++counts[ test.recordResult(bucket).assertNodeCount(1).getNodes().get(0) ]; |