diff options
author | Jon Bratseth <bratseth@oath.com> | 2018-04-22 17:04:57 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-22 17:04:57 +0200 |
commit | ca9dde5c3a258faeb46e2cecac9d84f9daa5074f (patch) | |
tree | 1b71f760c7bdc13ce3a5010485b8ef4aa5d93997 /searchlib/src/main | |
parent | 32220e778c1aa5980f9f87c2a64e23481319a8c9 (diff) | |
parent | d60f83752a4e4507ec1dbe08474ff932ef60c110 (diff) |
Merge pull request #5639 from vespa-engine/balder/reduce-memory-footprint-for-rankprofiles
Balder/reduce memory footprint for rankprofiles
Diffstat (limited to 'searchlib/src/main')
21 files changed, 99 insertions, 82 deletions
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/expression/ExpressionNode.java b/searchlib/src/main/java/com/yahoo/searchlib/expression/ExpressionNode.java index f995f424f97..2e4519597ef 100644 --- a/searchlib/src/main/java/com/yahoo/searchlib/expression/ExpressionNode.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/expression/ExpressionNode.java @@ -13,7 +13,7 @@ import java.io.Serializable; * happens in the C++ backend. This class hierarchy is for <b>building</b> the expression tree to pass to the backend. * * @author baldersheim - * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a> + * @author Simon Thoresen */ public abstract class ExpressionNode extends Identifiable implements Serializable { 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 35974c39f69..c42d9ecc37f 100644 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/Reference.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/Reference.java @@ -21,7 +21,6 @@ import java.util.stream.Collectors; */ public class Reference extends TypeContext.Name { - private final String name; private final Arguments arguments; /** @@ -33,13 +32,10 @@ public class Reference extends TypeContext.Name { super(name); Objects.requireNonNull(name, "name cannot be null"); Objects.requireNonNull(arguments, "arguments cannot be null"); - this.name = name; this.arguments = arguments; this.output = output; } - public String name() { return name; } - public Arguments arguments() { return arguments; } public String output() { return output; } @@ -48,9 +44,7 @@ public class Reference extends TypeContext.Name { * Creates a reference to a simple feature consisting of a name and a single argument */ public static Reference simple(String name, String argumentValue) { - return new Reference(name, - new Arguments(new ReferenceNode(argumentValue)), - null); + return new Reference(name, new Arguments(new ReferenceNode(argumentValue)), null); } /** @@ -111,11 +105,11 @@ public class Reference extends TypeContext.Name { } public Reference withArguments(Arguments arguments) { - return new Reference(name, arguments, output); + return new Reference(name(), arguments, output); } public Reference withOutput(String output) { - return new Reference(name, arguments, output); + return new Reference(name(), arguments, output); } @Override @@ -123,7 +117,7 @@ public class Reference extends TypeContext.Name { if (o == this) return true; if (!(o instanceof Reference)) return false; Reference other = (Reference) o; - if (!Objects.equals(other.name, this.name)) return false; + if (!Objects.equals(other.name(), this.name())) return false; if (!Objects.equals(other.arguments, this.arguments)) return false; if (!Objects.equals(other.output, this.output)) return false; return true; @@ -131,23 +125,31 @@ public class Reference extends TypeContext.Name { @Override public int hashCode() { - return Objects.hash(name, arguments, output); + return Objects.hash(name(), arguments, output); } @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 != null && 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..a02108a8bda 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,18 +30,33 @@ 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(); } /** * Returns a script instance of this based on the supplied script functions. * + * @param builder the StringBuilder that will be appended to * @param context the serialization context * @param path the call path to this, used for cycle detection, or null if this is a root * @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 a script instance of this based on the supplied script functions. + * @deprecated use the faster one that takes and returns a StringBuilder instead. + * + * @param context the serialization context + * @param path the call path to this, used for cycle detection, or null if this is a root + * @param parent the parent node of this, or null if it a root + * @return the main script, referring to script instances. + */ + @Deprecated + public String toString(SerializationContext context, Deque<String> path, CompositeNode parent) { + return toString(new StringBuilder(), context, path, parent).toString(); + } /** * 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(); |