diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2018-04-20 00:01:19 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2018-04-20 00:01:19 +0200 |
commit | 3ab51064cae4240e24afd4cba7f55c39942127b1 (patch) | |
tree | de9a2a9bda8906deb1bddfaca4cfdb33a1cc418a /searchlib | |
parent | da0538283229367a933cc2ae9e8096838db03476 (diff) |
Wire in a StringBuilder to avoid string concatenation.
Diffstat (limited to 'searchlib')
20 files changed, 78 insertions, 70 deletions
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/ExpressionFunction.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/ExpressionFunction.java index 262aba89f27..a3ab21a5966 100755 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/ExpressionFunction.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/ExpressionFunction.java @@ -55,10 +55,10 @@ public class ExpressionFunction { */ public Instance expand(SerializationContext context, List<ExpressionNode> argumentValues, Deque<String> path) { Map<String, String> argumentBindings = new HashMap<>(); - for (int i = 0; i < arguments.size() && i < arguments.size(); ++i) { - argumentBindings.put(arguments.get(i), argumentValues.get(i).toString(context, path, null)); + for (int i = 0; i < arguments.size() && i < argumentValues.size(); ++i) { + argumentBindings.put(arguments.get(i), argumentValues.get(i).toString(new StringBuilder(), context, path, null).toString()); } - return new Instance(toSymbol(argumentBindings), body.getRoot().toString(context.withBindings(argumentBindings), path, null)); + return new Instance(toSymbol(argumentBindings), body.getRoot().toString(new StringBuilder(), context.withBindings(argumentBindings), path, null).toString()); } /** diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/RankingExpression.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/RankingExpression.java index 6b2422d7cb2..6fa5b1196fa 100755 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/RankingExpression.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/RankingExpression.java @@ -246,7 +246,7 @@ public class RankingExpression implements Serializable { public Map<String, String> getRankProperties(List<ExpressionFunction> macros) { Deque<String> path = new LinkedList<>(); SerializationContext context = new SerializationContext(macros); - String serializedRoot = root.toString(context, path, null); + String serializedRoot = root.toString(new StringBuilder(), context, path, null).toString(); Map<String, String> serializedExpressions = context.serializedFunctions(); serializedExpressions.put(propertyName(name), serializedRoot); return serializedExpressions; diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/Reference.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/Reference.java index 07ba0862f1d..c42d9ecc37f 100644 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/Reference.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/Reference.java @@ -130,18 +130,26 @@ public class Reference extends TypeContext.Name { @Override public String toString() { - return toString(new SerializationContext(), null, null); + return toString(new StringBuilder(), new SerializationContext(), null, null).toString(); } - public String toString(SerializationContext context, Deque<String> path, CompositeNode parent) { - StringBuilder b = new StringBuilder(name()); - if (arguments.expressions().size() > 0) - b.append("(").append(arguments.expressions().stream() - .map(node -> node.toString(context, path, parent)) - .collect(Collectors.joining(","))).append(")"); + public StringBuilder toString(StringBuilder b, SerializationContext context, Deque<String> path, CompositeNode parent) { + b.append(name()); + if (arguments.expressions().size() > 0) { + b.append("("); + for (int i = 0; i < arguments.expressions().size(); i++) { + ExpressionNode e = arguments.expressions().get(i); + e.toString(b, context, path, parent); + if (i+1 < arguments.expressions().size()) { + b.append(','); + } + + } + b.append(")"); + } if (output != null) b.append(".").append(output); - return b.toString(); + return b; } } diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/gbdtoptimization/GBDTForestNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/gbdtoptimization/GBDTForestNode.java index 649c70122f1..579162196dc 100644 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/gbdtoptimization/GBDTForestNode.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/gbdtoptimization/GBDTForestNode.java @@ -42,8 +42,8 @@ public class GBDTForestNode extends ExpressionNode { } /** Returns (optimized sum of condition trees) */ - public String toString(SerializationContext context, Deque<String> path, CompositeNode parent) { - return "(optimized sum of condition trees of size " + (values.length*8) + " bytes)"; + public StringBuilder toString(StringBuilder string, SerializationContext context, Deque<String> path, CompositeNode parent) { + return string.append("(optimized sum of condition trees of size ").append(values.length*8).append(" bytes)"); } } diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/gbdtoptimization/GBDTNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/gbdtoptimization/GBDTNode.java index 53a286f09f6..3c0898b5d4f 100644 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/gbdtoptimization/GBDTNode.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/gbdtoptimization/GBDTNode.java @@ -98,7 +98,7 @@ public final class GBDTNode extends ExpressionNode { /** Returns "(optimized condition tree)" */ @Override - public String toString(SerializationContext context, Deque<String> path, CompositeNode parent) { - return "(optimized condition tree)"; + public StringBuilder toString(StringBuilder string, SerializationContext context, Deque<String> path, CompositeNode parent) { + return string.append("(optimized condition tree)"); } } diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ArithmeticNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ArithmeticNode.java index 49c49bed9bd..575b9b5b3fb 100755 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ArithmeticNode.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ArithmeticNode.java @@ -41,26 +41,23 @@ public final class ArithmeticNode extends CompositeNode { public List<ExpressionNode> children() { return children; } @Override - public String toString(SerializationContext context, Deque<String> path, CompositeNode parent) { - StringBuilder string = new StringBuilder(); - + public StringBuilder toString(StringBuilder string, SerializationContext context, Deque<String> path, CompositeNode parent) { boolean nonDefaultPrecedence = nonDefaultPrecedence(parent); if (nonDefaultPrecedence) string.append("("); Iterator<ExpressionNode> child = children.iterator(); - string.append(child.next().toString(context, path, this)).append(" "); + child.next().toString(string, context, path, this).append(" "); for (Iterator<ArithmeticOperator> op = operators.iterator(); op.hasNext() && child.hasNext();) { string.append(op.next().toString()).append(" "); - string.append(child.next().toString(context, path, this)); + child.next().toString(string, context, path, this); if (op.hasNext()) string.append(" "); } if (nonDefaultPrecedence) string.append(")"); - string.append(" "); - return string.toString().trim(); + return string; } /** diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ComparisonNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ComparisonNode.java index eb328486045..c4ecea22f7e 100644 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ComparisonNode.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ComparisonNode.java @@ -44,9 +44,9 @@ public class ComparisonNode extends BooleanNode { public ExpressionNode getRightCondition() { return rightCondition; } @Override - public String toString(SerializationContext context, Deque<String> path, CompositeNode parent) { - return leftCondition.toString(context, path, this) + " " + operator + " " + - rightCondition.toString(context, path, this); + public StringBuilder toString(StringBuilder string, SerializationContext context, Deque<String> path, CompositeNode parent) { + leftCondition.toString(string, context, path, this).append(' ').append(operator).append(' '); + return rightCondition.toString(string, context, path, this); } @Override diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ConstantNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ConstantNode.java index 3ddd7223349..64ad4d1ffce 100755 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ConstantNode.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ConstantNode.java @@ -39,8 +39,8 @@ public final class ConstantNode extends ExpressionNode { public Value getValue() { return value; } @Override - public String toString(SerializationContext context, Deque<String> path, CompositeNode parent) { - return sourceString(); + public StringBuilder toString(StringBuilder string, SerializationContext context, Deque<String> path, CompositeNode parent) { + return string.append(sourceString()); } /** Returns the string which created this, or the value.toString() if not known */ diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/EmbracedNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/EmbracedNode.java index 47c2897e4a4..4844ad82b27 100755 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/EmbracedNode.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/EmbracedNode.java @@ -39,10 +39,10 @@ public final class EmbracedNode extends CompositeNode { } @Override - public String toString(SerializationContext context, Deque<String> path, CompositeNode parent) { - String expression = value.toString(context, path, this); - if (value instanceof ReferenceNode) return expression; - return "(" + expression + ")"; + public StringBuilder toString(StringBuilder string, SerializationContext context, Deque<String> path, CompositeNode parent) { + if (value instanceof ReferenceNode) + return value.toString(string, context, path, this); + return value.toString(string.append('('), context, path, this).append(')'); } @Override diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ExpressionNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ExpressionNode.java index 6bb163590de..c74b90d2ea5 100755 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ExpressionNode.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ExpressionNode.java @@ -30,7 +30,7 @@ public abstract class ExpressionNode implements Serializable { @Override public final String toString() { - return toString(new SerializationContext(), null, null); + return toString(new StringBuilder(), new SerializationContext(), null, null).toString(); } /** @@ -41,7 +41,7 @@ public abstract class ExpressionNode implements Serializable { * @param parent the parent node of this, or null if it a root * @return the main script, referring to script instances. */ - public abstract String toString(SerializationContext context, Deque<String> path, CompositeNode parent); + public abstract StringBuilder toString(StringBuilder builder, SerializationContext context, Deque<String> path, CompositeNode parent); /** * Returns the type this will return if evaluated with the given context. diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/FunctionNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/FunctionNode.java index 1da2210a39c..07efd46e02c 100755 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/FunctionNode.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/FunctionNode.java @@ -54,17 +54,15 @@ public final class FunctionNode extends CompositeNode { } @Override - public String toString(SerializationContext context, Deque<String> path, CompositeNode parent) { - StringBuilder b=new StringBuilder(function.toString()); - b.append("("); + public StringBuilder toString(StringBuilder b, SerializationContext context, Deque<String> path, CompositeNode parent) { + b.append(function.toString()).append("("); for (int i = 0; i < this.arguments.expressions().size(); ++i) { - b.append(this.arguments.expressions().get(i).toString(context, path, this)); + this.arguments.expressions().get(i).toString(b, context, path, this); if (i < this.arguments.expressions().size() - 1) { b.append(","); } } - b.append(")"); - return b.toString(); + return b.append(")"); } @Override diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/GeneratorLambdaFunctionNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/GeneratorLambdaFunctionNode.java index c87eb0ace39..886e179b838 100644 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/GeneratorLambdaFunctionNode.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/GeneratorLambdaFunctionNode.java @@ -44,8 +44,8 @@ public class GeneratorLambdaFunctionNode extends CompositeNode { } @Override - public String toString(SerializationContext context, Deque<String> path, CompositeNode parent) { - return generator.toString(context, path, this); + public StringBuilder toString(StringBuilder string, SerializationContext context, Deque<String> path, CompositeNode parent) { + return generator.toString(string, context, path, this); } @Override diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/IfNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/IfNode.java index ee4edac4941..06b899d45ab 100755 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/IfNode.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/IfNode.java @@ -67,12 +67,15 @@ public final class IfNode extends CompositeNode { public Double getTrueProbability() { return trueProbability; } @Override - public String toString(SerializationContext context, Deque<String> path, CompositeNode parent) { - return "if (" + - condition.toString(context, path, this) + ", " + - trueExpression.toString(context, path, this) + ", " + - falseExpression.toString(context, path, this) + - (trueProbability != null ? ", " + trueProbability : "") + ")"; + public StringBuilder toString(StringBuilder string, SerializationContext context, Deque<String> path, CompositeNode parent) { + string.append("if ("); + condition.toString(string, context, path, this).append(", "); + trueExpression.toString(string, context, path, this).append(", "); + falseExpression.toString(string, context, path, this); + if (trueProbability != null) { + string.append(", ").append(trueProbability); + } + return string.append(')'); } @Override diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/LambdaFunctionNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/LambdaFunctionNode.java index 61086f8182a..de98b01287e 100644 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/LambdaFunctionNode.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/LambdaFunctionNode.java @@ -44,8 +44,9 @@ public class LambdaFunctionNode extends CompositeNode { } @Override - public String toString(SerializationContext context, Deque<String> path, CompositeNode parent) { - return ("f(" + commaSeparated(arguments) + ")(" + functionExpression.toString(context, path, this)) + ")"; + public StringBuilder toString(StringBuilder string, SerializationContext context, Deque<String> path, CompositeNode parent) { + string.append("f(").append(commaSeparated(arguments)).append(")("); + return functionExpression.toString(string, context, path, this).append(")"); } private String commaSeparated(List<String> list) { diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NameNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NameNode.java index f1adf331630..6fc1091c557 100755 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NameNode.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NameNode.java @@ -29,8 +29,8 @@ public final class NameNode extends ExpressionNode { } @Override - public String toString(SerializationContext context, Deque<String> path, CompositeNode parent) { - return name; + public StringBuilder toString(StringBuilder string, SerializationContext context, Deque<String> path, CompositeNode parent) { + return string.append(name); } @Override diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NegativeNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NegativeNode.java index fcc03dc4862..a71034e022b 100644 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NegativeNode.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NegativeNode.java @@ -34,8 +34,8 @@ public class NegativeNode extends CompositeNode { } @Override - public String toString(SerializationContext context, Deque<String> path, CompositeNode parent) { - return "-" + value.toString(context, path, parent); + public StringBuilder toString(StringBuilder string, SerializationContext context, Deque<String> path, CompositeNode parent) { + return value.toString(string.append('-'), context, path, parent); } @Override diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NotNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NotNode.java index a539f496ff5..0a75ba78df6 100644 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NotNode.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NotNode.java @@ -34,8 +34,9 @@ public class NotNode extends BooleanNode { } @Override - public String toString(SerializationContext context, Deque<String> path, CompositeNode parent) { - return "!" + value.toString(context, path, parent); + public StringBuilder toString(StringBuilder string, SerializationContext context, Deque<String> path, CompositeNode parent) { + string.append("!"); + return value.toString(string, context, path, parent); } @Override diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ReferenceNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ReferenceNode.java index 639c5d22d9e..e2dc170c168 100755 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ReferenceNode.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ReferenceNode.java @@ -63,11 +63,11 @@ public final class ReferenceNode extends CompositeNode { public List<ExpressionNode> children() { return reference.arguments().expressions(); } @Override - public String toString(SerializationContext context, Deque<String> path, CompositeNode parent) { + public StringBuilder toString(StringBuilder string, SerializationContext context, Deque<String> path, CompositeNode parent) { // A reference to a macro argument? if (reference.isIdentifier() && context.getBinding(getName()) != null) { // a bound identifier: replace by the value it is bound to - return context.getBinding(getName()); + return string.append(context.getBinding(getName())); } // A reference to a function? @@ -83,11 +83,11 @@ public final class ReferenceNode extends CompositeNode { ExpressionFunction.Instance instance = function.expand(context, getArguments().expressions(), path); path.removeLast(); context.addFunctionSerialization(RankingExpression.propertyName(instance.getName()), instance.getExpressionString()); - return "rankingExpression(" + instance.getName() + ")"; + return string.append("rankingExpression(").append(instance.getName()).append(')'); } // Not resolved in this context: output as-is - return reference.toString(context, path, parent); + return reference.toString(string, context, path, parent); } /** Returns the reference of this node */ diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/SetMembershipNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/SetMembershipNode.java index cb31219579a..9b3bd674814 100644 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/SetMembershipNode.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/SetMembershipNode.java @@ -47,17 +47,17 @@ public class SetMembershipNode extends BooleanNode { } @Override - public String toString(SerializationContext context, Deque<String> path, CompositeNode parent) { - StringBuilder b = new StringBuilder(testValue.toString(context, path, this)); - b.append(" in ["); + public StringBuilder toString(StringBuilder string, SerializationContext context, Deque<String> path, CompositeNode parent) { + testValue.toString(string, context, path, this); + string.append(" in ["); for (int i = 0, len = setValues.size(); i < len; ++i) { - b.append(setValues.get(i).toString(context, path, this)); + setValues.get(i).toString(string, context, path, this); if (i < len - 1) { - b.append(", "); + string.append(", "); } } - b.append("]"); - return b.toString(); + string.append("]"); + return string; } @Override diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/TensorFunctionNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/TensorFunctionNode.java index 6c9b6bb4a98..c1732aabf0b 100644 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/TensorFunctionNode.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/TensorFunctionNode.java @@ -59,9 +59,9 @@ public class TensorFunctionNode extends CompositeNode { } @Override - public String toString(SerializationContext context, Deque<String> path, CompositeNode parent) { + public StringBuilder toString(StringBuilder string, SerializationContext context, Deque<String> path, CompositeNode parent) { // Serialize as primitive - return function.toPrimitive().toString(new ExpressionNodeToStringContext(context, path, this)); + return string.append(function.toPrimitive().toString(new ExpressionNodeToStringContext(context, path, this))); } @Override @@ -131,7 +131,7 @@ public class TensorFunctionNode extends CompositeNode { public String toString(ToStringContext c) { if (c instanceof ExpressionNodeToStringContext) { ExpressionNodeToStringContext context = (ExpressionNodeToStringContext) c; - return expression.toString(context.context, context.path, context.parent); + return expression.toString(new StringBuilder(),context.context, context.path, context.parent).toString(); } else { return expression.toString(); |