diff options
2 files changed, 24 insertions, 9 deletions
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExecutionContext.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExecutionContext.java index a4f1e3a5ca4..6be1f78d376 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExecutionContext.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExecutionContext.java @@ -20,6 +20,7 @@ public class ExecutionContext implements FieldTypeAdapter, FieldValueAdapter, Cl private final FieldValueAdapter adapter; private FieldValue value; private Language language; + private DataType outputType = null; public ExecutionContext() { this(null); @@ -63,6 +64,14 @@ public class ExecutionContext implements FieldTypeAdapter, FieldValueAdapter, Cl adapter.tryOutputType(exp, fieldName, valueType); } + /** Sets the output type created by this execution */ + public void setOutputType(DataType type) { + this.outputType = type; + } + + /** Returns the output type created by this execution, or null if none */ + public DataType getOutputType() { return outputType; } + @Override public ExecutionContext setOutputValue(Expression exp, String fieldName, FieldValue fieldValue) { if (adapter == null) { diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/StatementExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/StatementExpression.java index 599ab6cb755..b640c43f3b2 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/StatementExpression.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/StatementExpression.java @@ -20,6 +20,9 @@ import java.util.List; */ public final class StatementExpression extends ExpressionList<Expression> { + /** The type of the output created by this statement, or null if no output */ + private final DataType outputType; + public StatementExpression(Expression... lst) { this(Arrays.asList(lst)); } @@ -30,10 +33,12 @@ public final class StatementExpression extends ExpressionList<Expression> { private StatementExpression(Iterable<Expression> list, Object unused) { super(list, resolveInputType(list)); + outputType = resolveOutputType(list); } @Override protected void doExecute(ExecutionContext context) { + context.setOutputType(createdOutputType()); for (Expression exp : this) { context.execute(exp); } @@ -61,18 +66,20 @@ public final class StatementExpression extends ExpressionList<Expression> { return null; } - @Override - public DataType createdOutputType() { - for (int i = size(); --i >= 0; ) { - DataType type = get(i).createdOutputType(); - if (type != null) { - return type; - } + private static DataType resolveOutputType(Iterable<Expression> expressions) { + DataType lastOutput = null; + for (var expression : expressions) { + DataType output = expression.createdOutputType(); + if (output != null) + lastOutput = output; } - return null; + return lastOutput; } @Override + public DataType createdOutputType() { return outputType; } + + @Override public String toString() { StringBuilder ret = new StringBuilder(); for (Iterator<Expression> it = iterator(); it.hasNext();) { @@ -90,7 +97,6 @@ public final class StatementExpression extends ExpressionList<Expression> { } /** Creates an expression with simple lingustics for testing */ - @SuppressWarnings("deprecation") public static StatementExpression fromString(String expression) throws ParseException { return fromString(expression, new SimpleLinguistics()); } |