diff options
6 files changed, 49 insertions, 2 deletions
diff --git a/docprocs/src/main/java/com/yahoo/docprocs/indexing/ScriptManager.java b/docprocs/src/main/java/com/yahoo/docprocs/indexing/ScriptManager.java index 8f3f75af795..cf03cf9f75a 100644 --- a/docprocs/src/main/java/com/yahoo/docprocs/indexing/ScriptManager.java +++ b/docprocs/src/main/java/com/yahoo/docprocs/indexing/ScriptManager.java @@ -10,13 +10,13 @@ import com.yahoo.language.process.Encoder; import com.yahoo.vespa.configdefinition.IlscriptsConfig; import com.yahoo.vespa.indexinglanguage.ScriptParserContext; import com.yahoo.vespa.indexinglanguage.expressions.InputExpression; +import com.yahoo.vespa.indexinglanguage.expressions.OutputExpression; import com.yahoo.vespa.indexinglanguage.expressions.ScriptExpression; import com.yahoo.vespa.indexinglanguage.expressions.StatementExpression; import com.yahoo.vespa.indexinglanguage.parser.IndexingInput; import com.yahoo.vespa.indexinglanguage.parser.ParseException; import java.util.*; -import java.util.logging.Level; /** * @author Simon Thoresen Hult @@ -86,11 +86,17 @@ public class ScriptManager { List<StatementExpression> expressions = new ArrayList<>(ilscript.content().size()); Map<String, DocumentScript> fieldScripts = new HashMap<>(ilscript.content().size()); for (String content : ilscript.content()) { - expressions.add(parse(ilscript.doctype(), parserContext, content)); StatementExpression statement = parse(ilscript.doctype(), parserContext, content); + expressions.add(statement); InputExpression.InputFieldNameExtractor inputFieldNameExtractor = new InputExpression.InputFieldNameExtractor(); statement.select(inputFieldNameExtractor, inputFieldNameExtractor); + OutputExpression.OutputFieldNameExtractor outputFieldNameExtractor = new OutputExpression.OutputFieldNameExtractor(); + statement.select(outputFieldNameExtractor, outputFieldNameExtractor); statement.select(fieldPathOptimizer, fieldPathOptimizer); + if ( ! outputFieldNameExtractor.getOutputFieldNames().isEmpty()) { + String outputFieldName = outputFieldNameExtractor.getOutputFieldNames().get(0); + statement.setStatementOutputType(docTypeMgr.getDocumentType(ilscript.doctype()).getField(outputFieldName).getDataType()); + } if (inputFieldNameExtractor.getInputFieldNames().size() == 1) { String fieldName = inputFieldNameExtractor.getInputFieldNames().get(0); ScriptExpression script; diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EncodeExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EncodeExpression.java index 09034659ad0..f84da9ddef8 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EncodeExpression.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EncodeExpression.java @@ -27,6 +27,11 @@ public class EncodeExpression extends Expression { } @Override + public void setStatementOutputType(DataType type) { + targetType = ((TensorDataType)type).getTensorType(); + } + + @Override protected void doExecute(ExecutionContext context) { StringFieldValue input = (StringFieldValue) context.getValue(); Tensor tensor = encoder.encode(input.getString(), context.getLanguage(), targetType); diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Expression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Expression.java index a121df8e5a8..67459c2b035 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Expression.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Expression.java @@ -31,6 +31,8 @@ public abstract class Expression extends Selectable { this.inputType = inputType; } + public void setStatementOutputType(DataType type) {} + public final FieldValue execute(FieldValue val) { return execute(new ExecutionContext().setValue(val)); } diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExpressionList.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExpressionList.java index 0ac195efb5d..0f7c2a411de 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExpressionList.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExpressionList.java @@ -24,6 +24,12 @@ public abstract class ExpressionList<T extends Expression> extends CompositeExpr } } + @Override + public void setStatementOutputType(DataType type) { + for (Expression expression : expressions) + expression.setStatementOutputType(type); + } + public int size() { return expressions.size(); } diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GuardExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GuardExpression.java index 179f202788c..78c261caccb 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GuardExpression.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GuardExpression.java @@ -27,6 +27,11 @@ public final class GuardExpression extends CompositeExpression { } @Override + public void setStatementOutputType(DataType type) { + exp.setStatementOutputType(type); + } + + @Override protected void doExecute(ExecutionContext context) { if (!shouldExecute && context.getAdapter() instanceof UpdateAdapter) { context.setValue(null); diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/OutputExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/OutputExpression.java index 398c2751bd8..267fb6fc51b 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/OutputExpression.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/OutputExpression.java @@ -2,6 +2,11 @@ package com.yahoo.vespa.indexinglanguage.expressions; import com.yahoo.document.DataType; +import com.yahoo.vespa.objects.ObjectOperation; +import com.yahoo.vespa.objects.ObjectPredicate; + +import java.util.ArrayList; +import java.util.List; /** * @author Simon Thoresen Hult @@ -58,4 +63,22 @@ public abstract class OutputExpression extends Expression { return getClass().hashCode() + (fieldName != null ? fieldName.hashCode() : 0); } + public static class OutputFieldNameExtractor implements ObjectOperation, ObjectPredicate { + + private final List<String> outputFieldNames = new ArrayList<>(1); + + public List<String> getOutputFieldNames() { return outputFieldNames; } + + @Override + public void execute(Object obj) { + outputFieldNames.add(((OutputExpression) obj).getFieldName()); + } + + @Override + public boolean check(Object obj) { + return obj instanceof OutputExpression; + } + + } + } |