diff options
author | Arne H Juul <arnej27959@users.noreply.github.com> | 2023-07-31 19:33:55 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-31 19:33:55 +0200 |
commit | fcbb761b79e89a09b6b2337fac43f658b17ba1e8 (patch) | |
tree | 6a306c236b3128c5dfc988bf8b7f93fb422eac3e | |
parent | 1060010106ba776ac5b7809fa86581a6e317099a (diff) | |
parent | a9f71ba781f79efc9e17f5408eb9b9cd419c51e5 (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.java | 23 | ||||
-rw-r--r-- | container-search/src/test/java/com/yahoo/search/yql/YqlParserTestCase.java | 2 |
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 |