summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArne Juul <arnej@yahooinc.com>2023-07-31 10:26:11 +0000
committerArne Juul <arnej@yahooinc.com>2023-07-31 10:26:11 +0000
commita9f71ba781f79efc9e17f5408eb9b9cd419c51e5 (patch)
tree30f9abffe65f36820b7df17713b4dfbcd0fb3471
parentd488a7482e93ae233be571d61946caa796aba588 (diff)
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