From 240ea32c03c6b37ce6e4a623f53fceaa26307da5 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Thu, 8 Sep 2022 11:18:40 +0200 Subject: Always dealias field references --- .../main/java/com/yahoo/search/yql/YqlParser.java | 31 ++++++++++++++-------- 1 file changed, 20 insertions(+), 11 deletions(-) (limited to 'container-search/src/main/java/com/yahoo/search/yql/YqlParser.java') 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 c82cb1d5724..72cb102760a 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 @@ -413,10 +413,10 @@ public class YqlParser implements Parser { private Item buildGeoLocation(OperatorNode ast) { List> args = ast.getArgument(1); Preconditions.checkArgument(args.size() == 4, "Expected 4 arguments, got %s.", args.size()); - String field = fetchFieldRead(args.get(0)); - var coord_1 = ParsedDegree.fromString(fetchFieldRead(args.get(1)), true, false); - var coord_2 = ParsedDegree.fromString(fetchFieldRead(args.get(2)), false, true); - double radius = DistanceParser.parse(fetchFieldRead(args.get(3))); + 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); + double radius = DistanceParser.parse(fetchLiteral(args.get(3))); var loc = new Location(); if (coord_1.isLatitude && coord_2.isLongitude) { loc.setGeoCircle(coord_1.degrees, coord_2.degrees, radius); @@ -447,8 +447,8 @@ public class YqlParser implements Parser { private Item buildNearestNeighbor(OperatorNode ast) { List> args = ast.getArgument(1); Preconditions.checkArgument(args.size() == 2, "Expected 2 arguments, got %s.", args.size()); - String field = fetchFieldRead(args.get(0)); - String property = fetchFieldRead(args.get(1)); + String field = fetchFieldName(args.get(0)); + String property = fetchLiteral(args.get(1)); NearestNeighborItem item = new NearestNeighborItem(field, property); Integer targetNumHits = getAnnotation(ast, TARGET_HITS, Integer.class, null, "desired minimum hits to produce"); @@ -848,7 +848,7 @@ public class YqlParser implements Parser { List> sortArguments = ast.getArgument(1); for (OperatorNode op : sortArguments) { OperatorNode fieldNode = op.getArgument(0); - String field = fetchFieldRead(fieldNode); + String field = fetchFieldName(fieldNode); String locale = getAnnotation(fieldNode, SORTING_LOCALE, String.class, null, "locale used by sorting function"); String function = getAnnotation(fieldNode, SORTING_FUNCTION, String.class, null, @@ -945,11 +945,20 @@ public class YqlParser implements Parser { return ast.getArgument(0); } - private static String fetchFieldRead(OperatorNode ast) { + private String fetchFieldName(OperatorNode ast) { return switch (ast.getOperator()) { - case LITERAL -> ast.getArgument(0).toString(); + case LITERAL -> indexFactsSession.getCanonicName(ast.getArgument(0).toString()); case READ_FIELD -> ast.getArgument(1); - case PROPREF -> fetchFieldRead(ast.getArgument(0)) + '.' + ast.getArgument(1); + case PROPREF -> fetchLiteral(ast.getArgument(0)) + '.' + ast.getArgument(1); + default -> throw newUnexpectedArgumentException(ast.getOperator(), + ExpressionOperator.READ_FIELD, ExpressionOperator.PROPREF); + }; + } + + private static String fetchLiteral(OperatorNode ast) { + return switch (ast.getOperator()) { + case LITERAL -> ast.getArgument(0).toString(); + case READ_FIELD -> ast.getArgument(1); // TODO: Should probably remove this option default -> throw newUnexpectedArgumentException(ast.getOperator(), ExpressionOperator.READ_FIELD, ExpressionOperator.PROPREF); }; @@ -1730,7 +1739,7 @@ public class YqlParser implements Parser { } private String getIndex(OperatorNode operatorNode) { - String index = fetchFieldRead(operatorNode); + String index = fetchFieldName(operatorNode); String expanded = indexNameExpander.expand(index); Preconditions.checkArgument(indexFactsSession.isIndex(expanded), "Field '%s' does not exist.", expanded); return indexFactsSession.getCanonicName(index); -- cgit v1.2.3