aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@yahooinc.com>2023-06-27 14:34:18 +0200
committerBjørn Christian Seime <bjorncs@yahooinc.com>2023-06-27 14:34:18 +0200
commitaea9a784a53f04bcd6885350d0fbfc94af727cba (patch)
treefcbf07ca9ccbbf8eb330c172a7c193f01bbe083f
parent0361837883a3b5c02db3c215880ce90ba3ad8c65 (diff)
Add workaround for handling of unary minus operator in combination with `Long.MIN_VALUE`
-rw-r--r--container-search/src/main/javacc/com/yahoo/search/grouping/request/parser/GroupingParser.jj12
-rw-r--r--container-search/src/test/java/com/yahoo/search/grouping/request/parser/GroupingParserTestCase.java9
2 files changed, 17 insertions, 4 deletions
diff --git a/container-search/src/main/javacc/com/yahoo/search/grouping/request/parser/GroupingParser.jj b/container-search/src/main/javacc/com/yahoo/search/grouping/request/parser/GroupingParser.jj
index 8d7ad7a3ffd..8059a397bc7 100644
--- a/container-search/src/main/javacc/com/yahoo/search/grouping/request/parser/GroupingParser.jj
+++ b/container-search/src/main/javacc/com/yahoo/search/grouping/request/parser/GroupingParser.jj
@@ -35,8 +35,14 @@ public class GroupingParser {
if (str.indexOf('.') >= 0) {
return Double.valueOf(str);
}
+ if (str.equals(Long.toString(Long.MIN_VALUE).substring(1))) return Double.NaN;
return Long.valueOf(str);
}
+
+ private static GroupingExpression resolveNegation(GroupingExpression exp) {
+ if (exp instanceof DoubleValue && ((DoubleValue)exp).getValue().isNaN()) return new LongValue(Long.MIN_VALUE);
+ return new NegFunction(exp);
+ }
}
PARSER_END(GroupingParser)
@@ -299,7 +305,7 @@ GroupingExpression exp(GroupingOperation grp) :
}
{
( [ add() | sub() { neg = true; } ]
- exp = expAlias(grp) { if (neg) { exp = new NegFunction(exp); } }
+ exp = expAlias(grp) { if (neg) { exp = resolveNegation(exp); } }
[ <AS> lbrace() str = string() rbrace() { exp.setLabel(str); } ] )
{ return exp; }
}
@@ -623,13 +629,13 @@ MulFunction mulFunction(GroupingOperation grp) :
return new MulFunction(arg1, arg2, argN.toArray(new GroupingExpression[argN.size()])); }
}
-NegFunction negFunction(GroupingOperation grp) :
+GroupingExpression negFunction(GroupingOperation grp) :
{
GroupingExpression exp;
}
{
( <NEG> lbrace() exp = exp(grp) rbrace() )
- { return new NegFunction(exp); }
+ { return resolveNegation(exp); }
}
NormalizeSubjectFunction normalizeSubjectFunction(GroupingOperation grp) :
diff --git a/container-search/src/test/java/com/yahoo/search/grouping/request/parser/GroupingParserTestCase.java b/container-search/src/test/java/com/yahoo/search/grouping/request/parser/GroupingParserTestCase.java
index dd55dd46e5e..ad7a640135d 100644
--- a/container-search/src/test/java/com/yahoo/search/grouping/request/parser/GroupingParserTestCase.java
+++ b/container-search/src/test/java/com/yahoo/search/grouping/request/parser/GroupingParserTestCase.java
@@ -5,6 +5,7 @@ import com.yahoo.search.grouping.request.AllOperation;
import com.yahoo.search.grouping.request.AttributeMapLookupValue;
import com.yahoo.search.grouping.request.EachOperation;
import com.yahoo.search.grouping.request.GroupingOperation;
+import com.yahoo.search.grouping.request.LongValue;
import com.yahoo.search.query.parser.Parsable;
import com.yahoo.search.query.parser.ParserEnvironment;
import com.yahoo.search.yql.VespaGroupingStep;
@@ -15,7 +16,11 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
/**
* @author Simon Thoresen Hult
@@ -581,6 +586,8 @@ public class GroupingParserTestCase {
assertTrue(assertParse("all(group(artist) max(inf))").get(0).hasUnlimitedMax());
assertEquals(1, assertParse("all(group(artist) max(1))").get(0).getMax());
assertFalse(assertParse("all(group(artist))").get(0).hasMax());
+ var res = assertParse("all(group(-9223372036854775808))");
+ assertEquals(Long.MIN_VALUE, ((LongValue)res.get(0).getGroupBy()).getValue());
}
@Test