From a9f71ba781f79efc9e17f5408eb9b9cd419c51e5 Mon Sep 17 00:00:00 2001 From: Arne Juul Date: Mon, 31 Jul 2023 10:26:11 +0000 Subject: avoid going Double->String->ParsedDegrees --- .../main/java/com/yahoo/search/yql/YqlParser.java | 23 ++++++++++++++++++++-- .../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 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 ast) { List> 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 -- cgit v1.2.3