diff options
author | Jon Bratseth <bratseth@gmail.com> | 2022-03-01 10:39:52 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2022-03-01 10:39:52 +0100 |
commit | 05ab2e976349eb3016fa91020e161a8782bf00a5 (patch) | |
tree | d570863bbd636ddf908bf1d875efd21e5cbf9056 /searchlib | |
parent | 0e1e603359c9018cea86d1716903c3ce365e529e (diff) |
Compute hash without serializing to string
Diffstat (limited to 'searchlib')
18 files changed, 132 insertions, 53 deletions
diff --git a/searchlib/abi-spec.json b/searchlib/abi-spec.json index 3213b1bb2b9..ced2517ff9f 100644 --- a/searchlib/abi-spec.json +++ b/searchlib/abi-spec.json @@ -1235,8 +1235,9 @@ "public java.lang.StringBuilder toString(java.lang.StringBuilder, com.yahoo.searchlib.rankingexpression.rule.SerializationContext, java.util.Deque, com.yahoo.searchlib.rankingexpression.rule.CompositeNode)", "public com.yahoo.tensor.TensorType type(com.yahoo.tensor.evaluation.TypeContext)", "public com.yahoo.searchlib.rankingexpression.evaluation.Value evaluate(com.yahoo.searchlib.rankingexpression.evaluation.Context)", - "public static com.yahoo.searchlib.rankingexpression.rule.ArithmeticNode resolve(com.yahoo.searchlib.rankingexpression.rule.ExpressionNode, com.yahoo.searchlib.rankingexpression.rule.ArithmeticOperator, com.yahoo.searchlib.rankingexpression.rule.ExpressionNode)", - "public com.yahoo.searchlib.rankingexpression.rule.CompositeNode setChildren(java.util.List)" + "public com.yahoo.searchlib.rankingexpression.rule.CompositeNode setChildren(java.util.List)", + "public int hashCode()", + "public static com.yahoo.searchlib.rankingexpression.rule.ArithmeticNode resolve(com.yahoo.searchlib.rankingexpression.rule.ExpressionNode, com.yahoo.searchlib.rankingexpression.rule.ArithmeticOperator, com.yahoo.searchlib.rankingexpression.rule.ExpressionNode)" ], "fields": [] }, @@ -1295,6 +1296,7 @@ "public com.yahoo.tensor.TensorType type(com.yahoo.tensor.evaluation.TypeContext)", "public com.yahoo.searchlib.rankingexpression.evaluation.Value evaluate(com.yahoo.searchlib.rankingexpression.evaluation.Context)", "public com.yahoo.searchlib.rankingexpression.rule.ComparisonNode setChildren(java.util.List)", + "public int hashCode()", "public bridge synthetic com.yahoo.searchlib.rankingexpression.rule.CompositeNode setChildren(java.util.List)" ], "fields": [] @@ -1327,7 +1329,8 @@ "public java.lang.StringBuilder toString(java.lang.StringBuilder, com.yahoo.searchlib.rankingexpression.rule.SerializationContext, java.util.Deque, com.yahoo.searchlib.rankingexpression.rule.CompositeNode)", "public java.lang.String sourceString()", "public com.yahoo.tensor.TensorType type(com.yahoo.tensor.evaluation.TypeContext)", - "public com.yahoo.searchlib.rankingexpression.evaluation.Value evaluate(com.yahoo.searchlib.rankingexpression.evaluation.Context)" + "public com.yahoo.searchlib.rankingexpression.evaluation.Value evaluate(com.yahoo.searchlib.rankingexpression.evaluation.Context)", + "public int hashCode()" ], "fields": [] }, @@ -1345,7 +1348,8 @@ "public java.lang.StringBuilder toString(java.lang.StringBuilder, com.yahoo.searchlib.rankingexpression.rule.SerializationContext, java.util.Deque, com.yahoo.searchlib.rankingexpression.rule.CompositeNode)", "public com.yahoo.searchlib.rankingexpression.evaluation.Value evaluate(com.yahoo.searchlib.rankingexpression.evaluation.Context)", "public com.yahoo.tensor.TensorType type(com.yahoo.tensor.evaluation.TypeContext)", - "public com.yahoo.searchlib.rankingexpression.rule.CompositeNode setChildren(java.util.List)" + "public com.yahoo.searchlib.rankingexpression.rule.CompositeNode setChildren(java.util.List)", + "public int hashCode()" ], "fields": [] }, @@ -1360,13 +1364,13 @@ ], "methods": [ "public void <init>()", - "public int hashCode()", - "public final boolean equals(java.lang.Object)", - "public final java.lang.String toString()", - "public final java.lang.StringBuilder toString(com.yahoo.searchlib.rankingexpression.rule.SerializationContext)", "public abstract java.lang.StringBuilder toString(java.lang.StringBuilder, com.yahoo.searchlib.rankingexpression.rule.SerializationContext, java.util.Deque, com.yahoo.searchlib.rankingexpression.rule.CompositeNode)", "public abstract com.yahoo.tensor.TensorType type(com.yahoo.tensor.evaluation.TypeContext)", - "public abstract com.yahoo.searchlib.rankingexpression.evaluation.Value evaluate(com.yahoo.searchlib.rankingexpression.evaluation.Context)" + "public abstract com.yahoo.searchlib.rankingexpression.evaluation.Value evaluate(com.yahoo.searchlib.rankingexpression.evaluation.Context)", + "public final java.lang.StringBuilder toString(com.yahoo.searchlib.rankingexpression.rule.SerializationContext)", + "public final boolean equals(java.lang.Object)", + "public abstract int hashCode()", + "public final java.lang.String toString()" ], "fields": [] }, @@ -1438,6 +1442,7 @@ "public com.yahoo.tensor.TensorType type(com.yahoo.tensor.evaluation.TypeContext)", "public com.yahoo.searchlib.rankingexpression.evaluation.Value evaluate(com.yahoo.searchlib.rankingexpression.evaluation.Context)", "public com.yahoo.searchlib.rankingexpression.rule.FunctionNode setChildren(java.util.List)", + "public int hashCode()", "public bridge synthetic com.yahoo.searchlib.rankingexpression.rule.CompositeNode setChildren(java.util.List)" ], "fields": [] @@ -1472,12 +1477,13 @@ ], "methods": [ "public void <init>(com.yahoo.tensor.TensorType, com.yahoo.searchlib.rankingexpression.rule.ExpressionNode)", + "public com.yahoo.searchlib.rankingexpression.rule.GeneratorLambdaFunctionNode$LongListToDoubleLambda asLongListToDoubleOperator()", "public java.util.List children()", "public com.yahoo.searchlib.rankingexpression.rule.CompositeNode setChildren(java.util.List)", "public java.lang.StringBuilder toString(java.lang.StringBuilder, com.yahoo.searchlib.rankingexpression.rule.SerializationContext, java.util.Deque, com.yahoo.searchlib.rankingexpression.rule.CompositeNode)", "public com.yahoo.tensor.TensorType type(com.yahoo.tensor.evaluation.TypeContext)", "public com.yahoo.searchlib.rankingexpression.evaluation.Value evaluate(com.yahoo.searchlib.rankingexpression.evaluation.Context)", - "public com.yahoo.searchlib.rankingexpression.rule.GeneratorLambdaFunctionNode$LongListToDoubleLambda asLongListToDoubleOperator()" + "public int hashCode()" ], "fields": [] }, @@ -1500,6 +1506,7 @@ "public com.yahoo.tensor.TensorType type(com.yahoo.tensor.evaluation.TypeContext)", "public com.yahoo.searchlib.rankingexpression.evaluation.Value evaluate(com.yahoo.searchlib.rankingexpression.evaluation.Context)", "public com.yahoo.searchlib.rankingexpression.rule.IfNode setChildren(java.util.List)", + "public int hashCode()", "public bridge synthetic com.yahoo.searchlib.rankingexpression.rule.CompositeNode setChildren(java.util.List)" ], "fields": [] @@ -1518,7 +1525,8 @@ "public com.yahoo.tensor.TensorType type(com.yahoo.tensor.evaluation.TypeContext)", "public com.yahoo.searchlib.rankingexpression.evaluation.Value evaluate(com.yahoo.searchlib.rankingexpression.evaluation.Context)", "public java.util.function.DoubleUnaryOperator asDoubleUnaryOperator()", - "public java.util.function.DoubleBinaryOperator asDoubleBinaryOperator()" + "public java.util.function.DoubleBinaryOperator asDoubleBinaryOperator()", + "public int hashCode()" ], "fields": [] }, @@ -1534,7 +1542,8 @@ "public java.lang.String getValue()", "public java.lang.StringBuilder toString(java.lang.StringBuilder, com.yahoo.searchlib.rankingexpression.rule.SerializationContext, java.util.Deque, com.yahoo.searchlib.rankingexpression.rule.CompositeNode)", "public com.yahoo.tensor.TensorType type(com.yahoo.tensor.evaluation.TypeContext)", - "public com.yahoo.searchlib.rankingexpression.evaluation.Value evaluate(com.yahoo.searchlib.rankingexpression.evaluation.Context)" + "public com.yahoo.searchlib.rankingexpression.evaluation.Value evaluate(com.yahoo.searchlib.rankingexpression.evaluation.Context)", + "public int hashCode()" ], "fields": [] }, @@ -1552,6 +1561,7 @@ "public com.yahoo.tensor.TensorType type(com.yahoo.tensor.evaluation.TypeContext)", "public com.yahoo.searchlib.rankingexpression.evaluation.Value evaluate(com.yahoo.searchlib.rankingexpression.evaluation.Context)", "public com.yahoo.searchlib.rankingexpression.rule.NegativeNode setChildren(java.util.List)", + "public int hashCode()", "public bridge synthetic com.yahoo.searchlib.rankingexpression.rule.CompositeNode setChildren(java.util.List)" ], "fields": [] @@ -1570,6 +1580,7 @@ "public com.yahoo.tensor.TensorType type(com.yahoo.tensor.evaluation.TypeContext)", "public com.yahoo.searchlib.rankingexpression.evaluation.Value evaluate(com.yahoo.searchlib.rankingexpression.evaluation.Context)", "public com.yahoo.searchlib.rankingexpression.rule.NotNode setChildren(java.util.List)", + "public int hashCode()", "public bridge synthetic com.yahoo.searchlib.rankingexpression.rule.CompositeNode setChildren(java.util.List)" ], "fields": [] @@ -1644,6 +1655,7 @@ "public com.yahoo.tensor.TensorType type(com.yahoo.tensor.evaluation.TypeContext)", "public com.yahoo.searchlib.rankingexpression.evaluation.Value evaluate(com.yahoo.searchlib.rankingexpression.evaluation.Context)", "public com.yahoo.searchlib.rankingexpression.rule.SetMembershipNode setChildren(java.util.List)", + "public int hashCode()", "public bridge synthetic com.yahoo.searchlib.rankingexpression.rule.CompositeNode setChildren(java.util.List)" ], "fields": [] @@ -1663,6 +1675,7 @@ "public java.util.Optional asScalarFunction()", "public com.yahoo.tensor.Tensor evaluate(com.yahoo.tensor.evaluation.EvaluationContext)", "public java.lang.String toString()", + "public int hashCode()", "public java.lang.String toString(com.yahoo.tensor.functions.ToStringContext)" ], "fields": [] @@ -1685,7 +1698,8 @@ "public static java.util.Map wrapScalars(java.util.Map)", "public static void wrapScalarBlock(com.yahoo.tensor.TensorType, java.util.List, java.lang.String, java.util.List, java.util.Map)", "public static java.util.List wrapScalars(com.yahoo.tensor.TensorType, java.util.List, java.util.List)", - "public static com.yahoo.tensor.functions.ScalarFunction wrapScalar(com.yahoo.searchlib.rankingexpression.rule.ExpressionNode)" + "public static com.yahoo.tensor.functions.ScalarFunction wrapScalar(com.yahoo.searchlib.rankingexpression.rule.ExpressionNode)", + "public int hashCode()" ], "fields": [] }, diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/Value.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/Value.java index 6490c69894f..207603c5038 100644 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/Value.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/Value.java @@ -97,6 +97,7 @@ public abstract class Value { @Override public abstract boolean equals(Object other); + /** Returns a hash which only depends on the content of this value. */ @Override public abstract int hashCode(); 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 13db51c1363..c8b20e774b5 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 @@ -11,7 +11,9 @@ import com.yahoo.searchlib.rankingexpression.rule.SerializationContext; import com.yahoo.tensor.TensorType; import com.yahoo.tensor.evaluation.TypeContext; +import java.util.Arrays; import java.util.Deque; +import java.util.Objects; /** * An optimized version of a sum of consecutive decision trees. @@ -42,8 +44,12 @@ public class GBDTForestNode extends ExpressionNode { } /** Returns (optimized sum of condition trees) */ + @Override 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)"); } + @Override + public int hashCode() { return Objects.hash("gbdtForest", Arrays.hashCode(values)); } + } 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 6c6166c2869..949e1f026f7 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 @@ -11,7 +11,9 @@ import com.yahoo.searchlib.rankingexpression.rule.SerializationContext; import com.yahoo.tensor.TensorType; import com.yahoo.tensor.evaluation.TypeContext; +import java.util.Arrays; import java.util.Deque; +import java.util.Objects; /** * An optimized version of a decision tree. @@ -105,4 +107,8 @@ public final class GBDTNode extends ExpressionNode { public StringBuilder toString(StringBuilder string, SerializationContext context, Deque<String> path, CompositeNode parent) { return string.append("(optimized condition tree)"); } + + @Override + public int hashCode() { return Objects.hash("gbdtNode", Arrays.hashCode(values)); } + } 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 55fe66be69e..580f42e67cb 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 @@ -13,6 +13,7 @@ import java.util.ArrayList; import java.util.Deque; import java.util.Iterator; import java.util.List; +import java.util.Objects; /** * A binary mathematical operation @@ -115,6 +116,16 @@ public final class ArithmeticNode extends CompositeNode { lhs.value = rhs.op.evaluate(lhs.value, rhs.value); } + @Override + public CompositeNode setChildren(List<ExpressionNode> newChildren) { + if (children.size() != newChildren.size()) + throw new IllegalArgumentException("Expected " + children.size() + " children but got " + newChildren.size()); + return new ArithmeticNode(newChildren, operators); + } + + @Override + public int hashCode() { return Objects.hash(children, operators); } + public static ArithmeticNode resolve(ExpressionNode left, ArithmeticOperator op, ExpressionNode right) { if ( ! (left instanceof ArithmeticNode)) return new ArithmeticNode(left, op, right); @@ -140,12 +151,5 @@ public final class ArithmeticNode extends CompositeNode { } } - @Override - public CompositeNode setChildren(List<ExpressionNode> newChildren) { - if (children.size() != newChildren.size()) - throw new IllegalArgumentException("Expected " + children.size() + " children but got " + newChildren.size()); - return new ArithmeticNode(newChildren, operators); - } - } 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 600d3b8d408..e726a351f74 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 @@ -9,6 +9,7 @@ import com.yahoo.tensor.evaluation.TypeContext; import java.util.Deque; import java.util.List; +import java.util.Objects; /** * A node which returns the outcome of a comparison. @@ -62,4 +63,7 @@ public class ComparisonNode extends BooleanNode { return new ComparisonNode(children.get(0), operator, children.get(1)); } + @Override + public int hashCode() { return Objects.hash(operator, conditions); } + } 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 ffbeec37c78..46e833197f9 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 @@ -8,6 +8,7 @@ import com.yahoo.tensor.TensorType; import com.yahoo.tensor.evaluation.TypeContext; import java.util.Deque; +import java.util.Objects; /** * A node which holds a constant (frozen) value. @@ -55,4 +56,7 @@ public final class ConstantNode extends ExpressionNode { return value; } + @Override + public int hashCode() { return Objects.hash("constantNode", value); } + } 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 9d389a4f6e9..64a1f42a7ba 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 @@ -10,6 +10,7 @@ import com.yahoo.tensor.evaluation.TypeContext; import java.util.Collections; import java.util.Deque; import java.util.List; +import java.util.Objects; /** * This class represents another expression enclosed in braces. @@ -60,4 +61,7 @@ public final class EmbracedNode extends CompositeNode { return new EmbracedNode(newChildren.get(0)); } + @Override + public int hashCode() { return Objects.hash("embraced", value); } + } 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 8e00be3f056..51067930dd0 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 @@ -18,31 +18,13 @@ import java.util.Deque; */ public abstract class ExpressionNode implements Serializable { - @Override - public int hashCode() { - return toString().hashCode(); - } - - @Override - public final boolean equals(Object obj) { - return obj instanceof ExpressionNode && toString().equals(obj.toString()); - } - - @Override - public final String toString() { - return toString(new SerializationContext()).toString(); - } - public final StringBuilder toString(SerializationContext context) { - return toString(new StringBuilder(), context, null, null); - } - /** - * Returns a script instance of this based on the supplied script functions. + * Returns this in serialized form. * * @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 + * @param parent the parent node of this, or null if it is a root * @return the main script, referring to script instances. */ public abstract StringBuilder toString(StringBuilder builder, SerializationContext context, Deque<String> path, CompositeNode parent); @@ -63,4 +45,22 @@ public abstract class ExpressionNode implements Serializable { */ public abstract Value evaluate(Context context); + public final StringBuilder toString(SerializationContext context) { + return toString(new StringBuilder(), context, null, null); + } + + @Override + public final boolean equals(Object obj) { + return obj instanceof ExpressionNode && toString().equals(obj.toString()); + } + + /** Returns a hashcode computed from the data in this */ + @Override + public abstract int hashCode(); + + @Override + public final String toString() { + return toString(new SerializationContext()).toString(); + } + } 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 d32cfb51f95..5e8bfc245a7 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 @@ -14,6 +14,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Deque; import java.util.List; +import java.util.Objects; /** * Invocation of a native function. @@ -108,4 +109,7 @@ public final class FunctionNode extends CompositeNode { return new FunctionNode(function, children.get(0), children.get(1)); } + @Override + public int hashCode() { return Objects.hash("functionNode", function, arguments); } + } 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 7ff3a71d036..8d858341976 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 @@ -11,6 +11,7 @@ import com.yahoo.tensor.evaluation.TypeContext; import java.util.Collections; import java.util.Deque; import java.util.List; +import java.util.Objects; /** * A tensor generating function, whose arguments are determined by a tensor type @@ -31,6 +32,11 @@ public class GeneratorLambdaFunctionNode extends CompositeNode { this.generator = generator; } + /** Returns this as an operator which converts a list of integers into a double. */ + public LongListToDoubleLambda asLongListToDoubleOperator() { + return new LongListToDoubleLambda(); + } + @Override public List<ExpressionNode> children() { return Collections.singletonList(generator); @@ -57,12 +63,8 @@ public class GeneratorLambdaFunctionNode extends CompositeNode { return generator.evaluate(context); } - /** - * Returns this as an operator which converts a list of integers into a double - */ - public LongListToDoubleLambda asLongListToDoubleOperator() { - return new LongListToDoubleLambda(); - } + @Override + public int hashCode() { return Objects.hash("generator", type, generator); } private class LongListToDoubleLambda implements java.util.function.Function<List<Long>, Double> { 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 02d437e83bf..6f46222c1d8 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 @@ -9,6 +9,7 @@ import com.yahoo.tensor.evaluation.TypeContext; import java.util.Deque; import java.util.List; +import java.util.Objects; /** * A conditional branch of a ranking expression. @@ -17,8 +18,9 @@ import java.util.List; * @author bratseth */ public final class IfNode extends CompositeNode { - /** [condition, trueExpression, falseExpression]*/ - private final List<ExpressionNode> asList; + + /** [condition, trueExpression, falseExpression] */ + private final List<ExpressionNode> arguments; private final Double trueProbability; public IfNode(ExpressionNode condition, ExpressionNode trueExpression, ExpressionNode falseExpression) { @@ -39,19 +41,19 @@ public final class IfNode extends CompositeNode { if (trueProbability != null && ( trueProbability < 0.0 || trueProbability > 1.0) ) throw new IllegalArgumentException("trueProbability must be a between 0.0 and 1.0, not " + trueProbability); this.trueProbability = trueProbability; - this.asList = List.of(condition, trueExpression, falseExpression); + this.arguments = List.of(condition, trueExpression, falseExpression); } @Override public List<ExpressionNode> children() { - return asList; + return arguments; } - public ExpressionNode getCondition() { return asList.get(0); } + public ExpressionNode getCondition() { return arguments.get(0); } - public ExpressionNode getTrueExpression() { return asList.get(1); } + public ExpressionNode getTrueExpression() { return arguments.get(1); } - public ExpressionNode getFalseExpression() { return asList.get(2); } + public ExpressionNode getFalseExpression() { return arguments.get(2); } /** The average probability that the condition of this node will evaluate to true, or null if not known */ public Double getTrueProbability() { return trueProbability; } @@ -95,4 +97,7 @@ public final class IfNode extends CompositeNode { return new IfNode(children.get(0), children.get(1), children.get(2)); } + @Override + public int hashCode() { return Objects.hash("if", arguments, trueProbability); } + } 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 a2b86360923..9f07f146264 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 @@ -13,6 +13,7 @@ import java.util.Collections; import java.util.Deque; import java.util.HashSet; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.function.DoubleBinaryOperator; @@ -162,6 +163,8 @@ public class LambdaFunctionNode extends CompositeNode { return Set.of(); } + @Override + public int hashCode() { return Objects.hash("lambdaFunction", arguments, functionExpression); } private class DoubleUnaryLambda implements DoubleUnaryOperator { 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 34c8664c0cf..fec643e81df 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 @@ -8,6 +8,7 @@ import com.yahoo.tensor.TensorType; import com.yahoo.tensor.evaluation.TypeContext; import java.util.Deque; +import java.util.Objects; /** * An opaque name in a ranking expression. This is used to represent names passed to the context @@ -41,4 +42,7 @@ public final class NameNode extends ExpressionNode { throw new RuntimeException("Name nodes should never be evaluated"); } + @Override + public int hashCode() { return Objects.hash("name", name); } + } 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 9516f38a155..8d2cf7b6387 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 @@ -10,6 +10,7 @@ import com.yahoo.tensor.evaluation.TypeContext; import java.util.Collections; import java.util.Deque; import java.util.List; +import java.util.Objects; /** * A node which flips the sign of the value produced from the nested expression @@ -54,4 +55,7 @@ public class NegativeNode extends CompositeNode { return new NegativeNode(children.get(0)); } + @Override + public int hashCode() { return Objects.hash("negative", value); } + } 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 8b5ae256038..ac3566c26af 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 @@ -10,6 +10,7 @@ import com.yahoo.tensor.evaluation.TypeContext; import java.util.Collections; import java.util.Deque; import java.util.List; +import java.util.Objects; /** * A node which flips the logical value produced from the nested expression. @@ -55,5 +56,8 @@ public class NotNode extends BooleanNode { return new NotNode(children.get(0)); } + @Override + public int hashCode() { return Objects.hash("not", value); } + } 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 31f3013b756..5da2fbfe624 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 @@ -14,6 +14,7 @@ import com.yahoo.tensor.evaluation.TypeContext; import java.util.ArrayList; import java.util.Deque; import java.util.List; +import java.util.Objects; import java.util.function.Predicate; /** @@ -100,4 +101,7 @@ public class SetMembershipNode extends BooleanNode { return new SetMembershipNode(children.get(0), children.subList(1, children.size())); } + @Override + public int hashCode() { return Objects.hash("setMembership", testValue, setValues); } + } 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 ce5832027b7..7b68ad7e2af 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 @@ -144,6 +144,9 @@ public class TensorFunctionNode extends CompositeNode { return new ExpressionScalarFunction(node); } + @Override + public int hashCode() { return function.hashCode(); } + private static class ExpressionScalarFunction implements ScalarFunction<Reference> { private final ExpressionNode expression; @@ -251,6 +254,9 @@ public class TensorFunctionNode extends CompositeNode { } @Override + public int hashCode() { return expression.hashCode(); } + + @Override public String toString(ToStringContext<Reference> c) { ToStringContext<Reference> outermost = c; while (outermost.parent() != null) |