aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/main
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@oath.com>2018-04-22 17:04:57 +0200
committerGitHub <noreply@github.com>2018-04-22 17:04:57 +0200
commitca9dde5c3a258faeb46e2cecac9d84f9daa5074f (patch)
tree1b71f760c7bdc13ce3a5010485b8ef4aa5d93997 /searchlib/src/main
parent32220e778c1aa5980f9f87c2a64e23481319a8c9 (diff)
parentd60f83752a4e4507ec1dbe08474ff932ef60c110 (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')
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/expression/ExpressionNode.java2
-rwxr-xr-xsearchlib/src/main/java/com/yahoo/searchlib/rankingexpression/ExpressionFunction.java6
-rwxr-xr-xsearchlib/src/main/java/com/yahoo/searchlib/rankingexpression/RankingExpression.java2
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/Reference.java40
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/gbdtoptimization/GBDTForestNode.java4
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/gbdtoptimization/GBDTNode.java4
-rwxr-xr-xsearchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ArithmeticNode.java11
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ComparisonNode.java6
-rwxr-xr-xsearchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ConstantNode.java4
-rwxr-xr-xsearchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/EmbracedNode.java8
-rwxr-xr-xsearchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ExpressionNode.java19
-rwxr-xr-xsearchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/FunctionNode.java10
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/GeneratorLambdaFunctionNode.java4
-rwxr-xr-xsearchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/IfNode.java15
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/LambdaFunctionNode.java5
-rwxr-xr-xsearchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NameNode.java4
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NegativeNode.java4
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NotNode.java5
-rwxr-xr-xsearchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ReferenceNode.java8
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/SetMembershipNode.java14
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/TensorFunctionNode.java6
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();