summaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/search/yql
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 /container-search/src/main/java/com/yahoo/search/yql
parentd488a7482e93ae233be571d61946caa796aba588 (diff)
avoid going Double->String->ParsedDegrees
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/yql')
-rw-r--r--container-search/src/main/java/com/yahoo/search/yql/YqlParser.java23
1 files changed, 21 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) {