aboutsummaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2020-09-03 14:43:55 +0200
committerJon Bratseth <bratseth@gmail.com>2020-09-03 14:43:55 +0200
commit842478eca170b3cc04408d80acafb252d7c19c26 (patch)
tree70d50d80ac146aa0791d34ccb60a81e941708a08 /container-search/src/main/java/com/yahoo/search/yql/YqlParser.java
parent9156860dab6788bb7da0387cfef22a855e5d9e7c (diff)
Continuation references
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/yql/YqlParser.java')
-rw-r--r--container-search/src/main/java/com/yahoo/search/yql/YqlParser.java29
1 files changed, 25 insertions, 4 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 3875018609e..3880ad594e3 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
@@ -810,10 +810,11 @@ public class YqlParser implements Parser {
OperatorNode<ExpressionOperator> groupingAst = ast.<List<OperatorNode<ExpressionOperator>>> getArgument(2).get(0);
GroupingOperation groupingOperation = GroupingOperation.fromString(groupingAst.<String> getArgument(0));
VespaGroupingStep groupingStep = new VespaGroupingStep(groupingOperation);
- List<String> continuations = getAnnotation(groupingAst, "continuations", List.class,
+ List<Object> continuations = getAnnotation(groupingAst, "continuations", List.class,
Collections.emptyList(), "grouping continuations");
- for (String continuation : continuations) {
- groupingStep.continuations().add(Continuation.fromString(continuation));
+
+ for (Object continuation : continuations) {
+ groupingStep.continuations().add(Continuation.fromString(dereference(continuation)));
}
groupingSteps.add(groupingStep);
ast = ast.getArgument(0);
@@ -822,6 +823,18 @@ public class YqlParser implements Parser {
return ast;
}
+ private String dereference(Object constantOrVarref) {
+ if (constantOrVarref instanceof OperatorNode) {
+ OperatorNode<?> varref = (OperatorNode<?>)constantOrVarref;
+ Preconditions.checkState(userQuery != null,
+ "properties must be available when trying to fetch user input");
+ return userQuery.properties().getString(varref.getArgument(0, String.class));
+ }
+ else {
+ return constantOrVarref.toString();
+ }
+ }
+
private OperatorNode<?> fetchSorting(OperatorNode<?> ast) {
if (ast.getOperator() != SequenceOperator.SORT) return ast;
@@ -1750,7 +1763,15 @@ public class YqlParser implements Parser {
Object value = ast.getAnnotation(key);
for (Iterator<OperatorNode<?>> i = annotationStack.iterator(); value == null
&& considerParents && i.hasNext();) {
- value = i.next().getAnnotation(key);
+ OperatorNode node = i.next();
+ if (node.getOperator() == ExpressionOperator.VARREF) {
+ Preconditions.checkState(userQuery != null,
+ "properties must be available when trying to fetch user input");
+ value = userQuery.properties().getString(ast.getArgument(0, String.class));
+ }
+ else {
+ value = node.getAnnotation(key);
+ }
}
if (value == null) return defaultValue;
Preconditions.checkArgument(expectedClass.isInstance(value),