summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2022-09-28 19:43:55 +0200
committerJon Bratseth <bratseth@gmail.com>2022-09-28 19:43:55 +0200
commit9f152d2147a7839dccd707aae0887e1309e8ae82 (patch)
treef12d456bcfa2a5ecd69089bcce305236565ab033
parent2c0bc69f71a422a6ac10d34b7d965d0dd835a6cc (diff)
Support map shorthands in both directions
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/DoubleCompatibleValue.java80
-rw-r--r--searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java5
2 files changed, 69 insertions, 16 deletions
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/DoubleCompatibleValue.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/DoubleCompatibleValue.java
index 186208e036f..2405d1bd528 100644
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/DoubleCompatibleValue.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/DoubleCompatibleValue.java
@@ -33,82 +33,130 @@ public abstract class DoubleCompatibleValue extends Value {
@Override
public Value or(Value value) {
- return new BooleanValue(asBoolean() || value.asBoolean());
+ if (value instanceof TensorValue tensor)
+ return tensor.or(this);
+ else
+ return new BooleanValue(asBoolean() || value.asBoolean());
}
@Override
public Value and(Value value) {
- return new BooleanValue(asBoolean() && value.asBoolean());
+ if (value instanceof TensorValue tensor)
+ return tensor.and(this);
+ else
+ return new BooleanValue(asBoolean() && value.asBoolean());
}
@Override
public Value largerOrEqual(Value value) {
- return new BooleanValue(this.asDouble() >= value.asDouble());
+ if (value instanceof TensorValue tensor)
+ return tensor.largerOrEqual(this);
+ else
+ return new BooleanValue(this.asDouble() >= value.asDouble());
}
@Override
public Value larger(Value value) {
- return new BooleanValue(this.asDouble() > value.asDouble());
+ if (value instanceof TensorValue tensor)
+ return tensor.larger(this);
+ else
+ return new BooleanValue(this.asDouble() > value.asDouble());
}
@Override
public Value smallerOrEqual(Value value) {
- return new BooleanValue(this.asDouble() <= value.asDouble());
+ if (value instanceof TensorValue tensor)
+ return tensor.smallerOrEqual(this);
+ else
+ return new BooleanValue(this.asDouble() <= value.asDouble());
}
@Override
public Value smaller(Value value) {
- return new BooleanValue(this.asDouble() < value.asDouble());
+ if (value instanceof TensorValue tensor)
+ return tensor.smaller(this);
+ else
+ return new BooleanValue(this.asDouble() < value.asDouble());
}
@Override
public Value approxEqual(Value value) {
- return new BooleanValue(approxEqual(this.asDouble(), value.asDouble()));
+ if (value instanceof TensorValue tensor)
+ return tensor.approxEqual(this);
+ else
+ return new BooleanValue(approxEqual(this.asDouble(), value.asDouble()));
}
@Override
public Value notEqual(Value value) {
- return new BooleanValue(this.asDouble() != value.asDouble());
+ if (value instanceof TensorValue tensor)
+ return tensor.notEqual(this);
+ else
+ return new BooleanValue(this.asDouble() != value.asDouble());
}
@Override
public Value equal(Value value) {
- return new BooleanValue(this.asDouble() == value.asDouble());
+ if (value instanceof TensorValue tensor)
+ return tensor.equal(this);
+ else
+ return new BooleanValue(this.asDouble() == value.asDouble());
}
@Override
public Value add(Value value) {
- return new DoubleValue(asDouble() + value.asDouble());
+ if (value instanceof TensorValue tensor)
+ return tensor.add(this);
+ else
+ return new DoubleValue(asDouble() + value.asDouble());
}
@Override
public Value subtract(Value value) {
- return new DoubleValue(asDouble() - value.asDouble());
+ if (value instanceof TensorValue tensor)
+ return tensor.subtract(this);
+ else
+ return new DoubleValue(asDouble() - value.asDouble());
}
@Override
public Value multiply(Value value) {
- return new DoubleValue(asDouble() * value.asDouble());
+ if (value instanceof TensorValue tensor)
+ return tensor.multiply(this);
+ else
+ return new DoubleValue(asDouble() * value.asDouble());
}
@Override
public Value divide(Value value) {
- return new DoubleValue(asDouble() / value.asDouble());
+ if (value instanceof TensorValue tensor)
+ return tensor.divide(this);
+ else
+ return new DoubleValue(asDouble() / value.asDouble());
}
@Override
public Value modulo(Value value) {
- return new DoubleValue(asDouble() % value.asDouble());
+ if (value instanceof TensorValue tensor)
+ return tensor.modulo(this);
+ else
+ return new DoubleValue(asDouble() % value.asDouble());
}
@Override
public Value power(Value value) {
- return new DoubleValue(Function.pow.evaluate(asDouble(), value.asDouble()));
+ if (value instanceof TensorValue tensor)
+ return tensor.power(this);
+ else
+ return new DoubleValue(Function.pow.evaluate(asDouble(), value.asDouble()));
}
@Override
public Value function(Function function, Value value) {
- return new DoubleValue(function.evaluate(asDouble(),value.asDouble()));
+ if (value instanceof TensorValue tensor)
+ return tensor.function(function, this);
+ else
+ return new DoubleValue(function.evaluate(asDouble(), value.asDouble()));
}
static boolean approxEqual(double x, double y) {
diff --git a/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java b/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java
index 2986c8b8808..acab7bb38c6 100644
--- a/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java
+++ b/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java
@@ -186,6 +186,11 @@ public class EvaluationTestCase {
"map(tensor0, f(x) (log10(x)))", "{ {d1:0}:10, {d1:1}:100, {d1:2}:1000 }");
tester.assertEvaluates("{ {d1:0}:4, {d1:1}:9, {d1:2 }:16 }",
"map(tensor0, f(x) (x * x))", "{ {d1:0}:2, {d1:1}:3, {d1:2}:4 }");
+ // -- tensor map shorthands
+ tester.assertEvaluates("{ {d1:0}:0, {d1:1}:1, {d1:2 }:0 }",
+ "tensor0 == 3", "{ {d1:0}:2, {d1:1}:3, {d1:2}:4 }");
+ tester.assertEvaluates("{ {d1:0}:0, {d1:1}:1, {d1:2 }:0 }",
+ "3 == tensor0", "{ {d1:0}:2, {d1:1}:3, {d1:2}:4 }");
// -- tensor map composites
tester.assertEvaluates("{ {d1:0}:1, {d1:1}:2, {d1:2 }:3 }",
"log10(tensor0)", "{ {d1:0}:10, {d1:1}:100, {d1:2}:1000 }");