aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArne H Juul <arnej27959@users.noreply.github.com>2023-07-31 19:33:55 +0200
committerGitHub <noreply@github.com>2023-07-31 19:33:55 +0200
commitfcbb761b79e89a09b6b2337fac43f658b17ba1e8 (patch)
tree6a306c236b3128c5dfc988bf8b7f93fb422eac3e
parent1060010106ba776ac5b7809fa86581a6e317099a (diff)
parenta9f71ba781f79efc9e17f5408eb9b9cd419c51e5 (diff)
Merge pull request #27933 from vespa-engine/arnej/handle-geo-degrees-small-numbersv8.204.11
avoid going Double->String->ParsedDegrees
-rw-r--r--container-search/src/main/java/com/yahoo/search/yql/YqlParser.java23
-rw-r--r--container-search/src/test/java/com/yahoo/search/yql/YqlParserTestCase.java2
2 files changed, 23 insertions, 2 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java b/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java
index 639e5b592c3..783cca0ca2d 100644
--- a/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java
+++ b/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java
@@ -409,12 +409,31 @@ public class YqlParser implements Parser {
return fillWeightedSet(ast, args.get(1), new DotProductItem(getIndex(args.get(0))));
}
+ private ParsedDegree degreesFromArg(OperatorNode<ExpressionOperator> ast, boolean first) {
+ Object arg = null;
+ switch (ast.getOperator()) {
+ case LITERAL:
+ arg = ast.getArgument(0);
+ break;
+ case READ_FIELD:
+ arg = ast.getArgument(1);
+ break;
+ default:
+ throw newUnexpectedArgumentException(ast.getOperator(),
+ ExpressionOperator.READ_FIELD, ExpressionOperator.PROPREF);
+ }
+ if (arg instanceof Number n) {
+ return new ParsedDegree(n.doubleValue(), first, !first);
+ }
+ return ParsedDegree.fromString(arg.toString(), first, !first);
+ }
+
private Item buildGeoLocation(OperatorNode<ExpressionOperator> ast) {
List<OperatorNode<ExpressionOperator>> args = ast.getArgument(1);
Preconditions.checkArgument(args.size() == 4, "Expected 4 arguments, got %s.", args.size());
String field = fetchFieldName(args.get(0));
- var coord_1 = ParsedDegree.fromString(fetchLiteral(args.get(1)), true, false);
- var coord_2 = ParsedDegree.fromString(fetchLiteral(args.get(2)), false, true);
+ var coord_1 = degreesFromArg(args.get(1), true);
+ var coord_2 = degreesFromArg(args.get(2), false);
double radius = DistanceParser.parse(fetchLiteral(args.get(3)));
var loc = new Location();
if (coord_1.isLatitude && coord_2.isLongitude) {
diff --git a/container-search/src/test/java/com/yahoo/search/yql/YqlParserTestCase.java b/container-search/src/test/java/com/yahoo/search/yql/YqlParserTestCase.java
index 33f840c7af0..911acf67daf 100644
--- a/container-search/src/test/java/com/yahoo/search/yql/YqlParserTestCase.java
+++ b/container-search/src/test/java/com/yahoo/search/yql/YqlParserTestCase.java
@@ -645,6 +645,8 @@ public class YqlParserTestCase {
"Invalid geoLocation coordinates 'Latitude: 2.0 degrees' and 'Latitude: 5.0 degrees'"));
assertParse("select foo from bar where geoLocation(workplace, -12, -34, \"-77 d\")",
"GEO_LOCATION workplace:(2,-34000000,-12000000,-1,0,1,0,4201111954)");
+ assertParse("select * from test_index where geoLocation(coordinate, 0.000010, 0.000010, \"10.000000 km\")",
+ "GEO_LOCATION coordinate:(2,10,10,90133,0,1,0,4294967294)");
}
@Test