From 9f152d2147a7839dccd707aae0887e1309e8ae82 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Wed, 28 Sep 2022 19:43:55 +0200 Subject: Support map shorthands in both directions --- .../evaluation/DoubleCompatibleValue.java | 80 +++++++++++++++++----- 1 file changed, 64 insertions(+), 16 deletions(-) (limited to 'searchlib/src/main') 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) { -- cgit v1.2.3