aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-06-27 23:53:02 +0200
committerGitHub <noreply@github.com>2023-06-27 23:53:02 +0200
commit642713dc89d59265ffc77f2f89453e43aec1f1e5 (patch)
tree2053f9a298ffaf33c2ae54d547f258d747d343d6
parent0de329866f0a536a0a675a54af4ee84e34e50c1b (diff)
parentaea9a784a53f04bcd6885350d0fbfc94af727cba (diff)
Merge pull request #27559 from vespa-engine/bjorncs/grouping-long-minv8.185.14
Add workaround for handling of unary minus operator in combination wi…
-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