From aea9a784a53f04bcd6885350d0fbfc94af727cba Mon Sep 17 00:00:00 2001 From: Bjørn Christian Seime Date: Tue, 27 Jun 2023 14:34:18 +0200 Subject: Add workaround for handling of unary minus operator in combination with `Long.MIN_VALUE` --- .../yahoo/search/grouping/request/parser/GroupingParser.jj | 12 +++++++++--- .../grouping/request/parser/GroupingParserTestCase.java | 9 ++++++++- 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); } } [ 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; } { ( 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 -- cgit v1.2.3