diff options
author | Jon Bratseth <bratseth@verizonmedia.com> | 2020-01-03 13:28:10 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@verizonmedia.com> | 2020-01-03 13:28:10 +0100 |
commit | a6bf3edfb2584b42062254d6a3ca06e91ba2487c (patch) | |
tree | 3a1d8d47555f98427c28f6130771ca2b9ddbf4c2 /searchlib/src/main | |
parent | dbe3a67718104c4150ae770294c23d8a41f0a16c (diff) |
Validate lambdas
Diffstat (limited to 'searchlib/src/main')
-rw-r--r-- | searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/LambdaFunctionNode.java | 26 |
1 files changed, 25 insertions, 1 deletions
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 3a3410aeebb..2a6e6793bcd 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 @@ -11,10 +11,13 @@ import com.yahoo.tensor.evaluation.TypeContext; import java.util.Collections; import java.util.Deque; +import java.util.HashSet; import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.function.DoubleBinaryOperator; import java.util.function.DoubleUnaryOperator; +import java.util.stream.Collectors; /** * A free, parametrized function @@ -27,7 +30,12 @@ public class LambdaFunctionNode extends CompositeNode { private final ExpressionNode functionExpression; public LambdaFunctionNode(List<String> arguments, ExpressionNode functionExpression) { - // TODO: Verify that the function only accesses the given arguments + if ( ! arguments.containsAll(featuresAccessedIn(functionExpression))) { + throw new IllegalArgumentException("Lambda " + functionExpression + " accesses features outside its scope: " + + featuresAccessedIn(functionExpression).stream() + .filter(f -> ! arguments.contains(f)) + .collect(Collectors.joining(", "))); + } this.arguments = ImmutableList.copyOf(arguments); this.functionExpression = functionExpression; } @@ -134,6 +142,22 @@ public class LambdaFunctionNode extends CompositeNode { }); } + private static Set<String> featuresAccessedIn(ExpressionNode node) { + if (node instanceof ReferenceNode) { + return Set.of(((ReferenceNode) node).reference().toString()); + } + else if (node instanceof NameNode) { // (This clause probably not necessary) + return Set.of(((NameNode) node).getValue()); + } + else if (node instanceof CompositeNode) { + Set<String> features = new HashSet<>(); + ((CompositeNode)node).children().forEach(child -> features.addAll(featuresAccessedIn(child))); + return features; + } + return Set.of(); + } + + private class DoubleUnaryLambda implements DoubleUnaryOperator { @Override |