aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Bratseth <jonbratseth@yahoo.com>2017-11-14 14:01:02 +0100
committerGitHub <noreply@github.com>2017-11-14 14:01:02 +0100
commita897abcdcaad0d6bd88a043df1c6d3f147bf9717 (patch)
tree616ea8948181c4561c73723ada32eb27b9b29c50
parent3aefb034de5176d6225140312096adc37f520d93 (diff)
parent56fad78e8d03ff18348ddb34d34d5ff2431b9128 (diff)
Merge pull request #4118 from vespa-engine/lesters/tensor-modulo
Add % to Java ranking expressions to conform with C++
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/DoubleCompatibleValue.java5
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/DoubleValue.java11
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/StringValue.java5
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/TensorValue.java9
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/Value.java2
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ArithmeticOperator.java6
-rwxr-xr-xsearchlib/src/main/javacc/RankingExpressionParser.jj4
7 files changed, 40 insertions, 2 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 dab89fe8955..0ed2bdd6331 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
@@ -39,6 +39,11 @@ public abstract class DoubleCompatibleValue extends Value {
}
@Override
+ public Value modulo(Value value) {
+ return new DoubleValue(asDouble() % value.asDouble());
+ }
+
+ @Override
public Value compare(TruthOperator operator, Value value) {
return new BooleanValue(operator.evaluate(asDouble(), value.asDouble()));
}
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/DoubleValue.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/DoubleValue.java
index 28272e58c91..17157ab385f 100644
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/DoubleValue.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/DoubleValue.java
@@ -98,6 +98,17 @@ public final class DoubleValue extends DoubleCompatibleValue {
}
@Override
+ public Value modulo(Value value) {
+ try {
+ return mutable(this.value % value.asDouble());
+ }
+ catch (UnsupportedOperationException e) {
+ throw unsupported("modulo",value);
+ }
+ }
+
+
+ @Override
public Value function(Function function, Value value) {
// use the tensor implementation of max and min if the argument is a tensor
if ( (function.equals(Function.min) || function.equals(Function.max)) && value instanceof TensorValue)
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/StringValue.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/StringValue.java
index acf301f3b80..5374a9d3ce6 100644
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/StringValue.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/StringValue.java
@@ -68,6 +68,11 @@ public class StringValue extends Value {
}
@Override
+ public Value modulo(Value value) {
+ throw new UnsupportedOperationException("String values ('" + value + "') does not support modulo");
+ }
+
+ @Override
public Value compare(TruthOperator operator, Value value) {
if (operator.equals(TruthOperator.EQUAL))
return new BooleanValue(this.equals(value));
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/TensorValue.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/TensorValue.java
index 45988ef0776..b283603e713 100644
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/TensorValue.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/TensorValue.java
@@ -81,6 +81,15 @@ public class TensorValue extends Value {
return new TensorValue(value.map((value) -> value / argument.asDouble()));
}
+ @Override
+ public Value modulo(Value argument) {
+ if (argument instanceof TensorValue)
+ return new TensorValue(value.fmod(((TensorValue) argument).value));
+ else
+ return new TensorValue(value.map((value) -> value % argument.asDouble()));
+ }
+
+
private Tensor asTensor(Value value, String operationName) {
if ( ! (value instanceof TensorValue))
throw new UnsupportedOperationException("Could not perform " + operationName +
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 a63387506a0..f42082321b3 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
@@ -41,6 +41,8 @@ public abstract class Value {
public abstract Value divide(Value value);
+ public abstract Value modulo(Value value);
+
/** Perform the comparison specified by the operator between this value and the given value */
public abstract Value compare(TruthOperator operator, Value value);
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ArithmeticOperator.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ArithmeticOperator.java
index 5a5237c2608..2187a96ba4d 100644
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ArithmeticOperator.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ArithmeticOperator.java
@@ -25,8 +25,11 @@ public enum ArithmeticOperator {
}},
DIVIDE(3, "/") { public Value evaluate(Value x, Value y) {
return x.divide(y);
+ }},
+ MODULO(4, "%") { public Value evaluate(Value x, Value y) {
+ return x.modulo(y);
}};
-
+
/** A list of all the operators in this in order of decreasing precedence */
public static final List<ArithmeticOperator> operatorsByPrecedence = operatorsByPrecedence();
@@ -52,6 +55,7 @@ public enum ArithmeticOperator {
private static List<ArithmeticOperator> operatorsByPrecedence() {
List<ArithmeticOperator> operators = new ArrayList<>();
+ operators.add(MODULO);
operators.add(DIVIDE);
operators.add(MULTIPLY);
operators.add(MINUS);
diff --git a/searchlib/src/main/javacc/RankingExpressionParser.jj b/searchlib/src/main/javacc/RankingExpressionParser.jj
index c3b9235cc93..01fed00202c 100755
--- a/searchlib/src/main/javacc/RankingExpressionParser.jj
+++ b/searchlib/src/main/javacc/RankingExpressionParser.jj
@@ -65,6 +65,7 @@ TOKEN :
<DIV: "/"> |
<MUL: "*"> |
<DOT: "."> |
+ <MOD: "%"> |
<DOLLAR: "$"> |
<COMMA: ","> |
@@ -202,7 +203,8 @@ ArithmeticOperator arithmetic() : { }
( <ADD> { return ArithmeticOperator.PLUS; } |
<SUB> { return ArithmeticOperator.MINUS; } |
<DIV> { return ArithmeticOperator.DIVIDE; } |
- <MUL> { return ArithmeticOperator.MULTIPLY; } )
+ <MUL> { return ArithmeticOperator.MULTIPLY; } |
+ <MOD> { return ArithmeticOperator.MODULO; } )
{ return null; }
}