From 56fad78e8d03ff18348ddb34d34d5ff2431b9128 Mon Sep 17 00:00:00 2001 From: Lester Solbakken Date: Tue, 14 Nov 2017 13:53:31 +0100 Subject: Add % to Java ranking expressions to conform with C++ --- .../rankingexpression/evaluation/DoubleCompatibleValue.java | 5 +++++ .../searchlib/rankingexpression/evaluation/DoubleValue.java | 11 +++++++++++ .../searchlib/rankingexpression/evaluation/StringValue.java | 5 +++++ .../searchlib/rankingexpression/evaluation/TensorValue.java | 9 +++++++++ .../yahoo/searchlib/rankingexpression/evaluation/Value.java | 2 ++ .../searchlib/rankingexpression/rule/ArithmeticOperator.java | 6 +++++- searchlib/src/main/javacc/RankingExpressionParser.jj | 4 +++- 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 @@ -38,6 +38,11 @@ public abstract class DoubleCompatibleValue extends Value { return new DoubleValue(asDouble() / value.asDouble()); } + @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 @@ -97,6 +97,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 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 @@ -67,6 +67,11 @@ public class StringValue extends Value { throw new UnsupportedOperationException("String values ('" + value + "') does not support division"); } + @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)) 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 operatorsByPrecedence = operatorsByPrecedence(); @@ -52,6 +55,7 @@ public enum ArithmeticOperator { private static List operatorsByPrecedence() { List 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 : | | | + | | | @@ -202,7 +203,8 @@ ArithmeticOperator arithmetic() : { } ( { return ArithmeticOperator.PLUS; } | { return ArithmeticOperator.MINUS; } |
{ return ArithmeticOperator.DIVIDE; } | - { return ArithmeticOperator.MULTIPLY; } ) + { return ArithmeticOperator.MULTIPLY; } | + { return ArithmeticOperator.MODULO; } ) { return null; } } -- cgit v1.2.3