aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-04-12 22:22:59 +0200
committerGitHub <noreply@github.com>2023-04-12 22:22:59 +0200
commit0f64c658ff7ac6d006d286f3c765812a5003feaa (patch)
tree580928dec7ce9e615ba0364465f37f19781372e7
parentf5dea0f0c237ba8eed0d18c6a41b7a9305cbe074 (diff)
parent878a918b39185800b7720510336e589deb13c301 (diff)
Merge pull request #26668 from vespa-engine/bratseth/use-visitorv8.151.21
Replace reflection by visitor
-rw-r--r--config-model/src/main/java/com/yahoo/schema/processing/IndexingValidation.java2
-rw-r--r--config-model/src/test/derived/indexswitches/ilscripts.cfg2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionConverter.java121
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ValueTransformProvider.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ArithmeticExpression.java7
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/CatExpression.java6
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ChoiceExpression.java6
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/CompositeExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Expression.java6
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExpressionList.java6
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ForEachExpression.java6
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GuardExpression.java6
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/IfThenExpression.java10
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ParenthesisExpression.java6
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ScriptExpression.java10
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SelectInputExpression.java9
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/StatementExpression.java10
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SwitchExpression.java12
-rw-r--r--indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ExpressionConverterTestCase.java35
19 files changed, 115 insertions, 151 deletions
diff --git a/config-model/src/main/java/com/yahoo/schema/processing/IndexingValidation.java b/config-model/src/main/java/com/yahoo/schema/processing/IndexingValidation.java
index d8c1fb3125f..3c7e9b4066f 100644
--- a/config-model/src/main/java/com/yahoo/schema/processing/IndexingValidation.java
+++ b/config-model/src/main/java/com/yahoo/schema/processing/IndexingValidation.java
@@ -62,7 +62,7 @@ public class IndexingValidation extends Processor {
final Set<String> prevNames = new HashSet<>();
@Override
- protected ExpressionConverter branch() {
+ public ExpressionConverter branch() {
MyConverter ret = new MyConverter();
ret.outputs.addAll(outputs);
ret.prevNames.addAll(prevNames);
diff --git a/config-model/src/test/derived/indexswitches/ilscripts.cfg b/config-model/src/test/derived/indexswitches/ilscripts.cfg
index 77ac18e3261..5cda0a9fdc7 100644
--- a/config-model/src/test/derived/indexswitches/ilscripts.cfg
+++ b/config-model/src/test/derived/indexswitches/ilscripts.cfg
@@ -4,7 +4,7 @@ ilscript[].doctype "indexswitches"
ilscript[].docfield[] "title"
ilscript[].docfield[] "descr"
ilscript[].docfield[] "source_src"
-ilscript[].content[] "clear_state | guard { input source_src | switch { case \"theweb\": input source_src | tokenize normalize | summary source | index source; case \"amg\": input source_src | tokenize normalize | summary source; default: input source_src . \" partner\" | tokenize normalize | summary source | index source; }; }"
+ilscript[].content[] "clear_state | guard { input source_src | switch { case \"amg\": input source_src | tokenize normalize | summary source; case \"theweb\": input source_src | tokenize normalize | summary source | index source; default: input source_src . \" partner\" | tokenize normalize | summary source | index source; }; }"
ilscript[].content[] "clear_state | guard { input title | tokenize normalize stem:\"BEST\" | summary title | index title; }"
ilscript[].content[] "clear_state | guard { input descr | tokenize normalize stem:\"BEST\" | summary descr | index descr; }"
ilscript[].content[] "input source_src | passthrough source_src"
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionConverter.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionConverter.java
index ccad9d6d08b..231f6fb7598 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionConverter.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionConverter.java
@@ -1,127 +1,22 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.indexinglanguage;
-import com.yahoo.collections.Pair;
-import com.yahoo.vespa.indexinglanguage.expressions.*;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
+import com.yahoo.vespa.indexinglanguage.expressions.Expression;
/**
* @author Simon Thoresen Hult
*/
-@SuppressWarnings({ "UnusedDeclaration" })
public abstract class ExpressionConverter implements Cloneable {
- public final Expression convert(Expression exp) {
- if (exp == null) {
- return null;
- }
- if (shouldConvert(exp)) {
- return doConvert(exp);
- }
- if (!(exp instanceof CompositeExpression)) {
- return exp;
- }
- try {
- // The class.getMethod here takes 8% of the cpu time in reading the SSBE application package
- // TODO: Implement double dispatch through visitor instead?
- return (Expression)ExpressionConverter.class.getMethod("innerConvert", exp.getClass()).invoke(this, exp);
- } catch (IllegalAccessException | NoSuchMethodException e) {
- throw new UnsupportedOperationException(exp.getClass().getName(), e);
- } catch (InvocationTargetException e) {
- Throwable t = e.getTargetException();
- throw t instanceof RuntimeException ? (RuntimeException)t : new RuntimeException(t);
- }
- }
-
- public Expression innerConvert(ArithmeticExpression exp) {
- return new ArithmeticExpression(convert(exp.getLeftHandSide()),
- exp.getOperator(),
- convert(exp.getRightHandSide()));
- }
-
- public Expression innerConvert(CatExpression exp) {
- List<Expression> lst = new LinkedList<>();
- for (Expression innerExp : exp) {
- Expression next = convert(innerExp);
- if (next != null) {
- lst.add(next);
- }
- }
- return new CatExpression(lst);
- }
-
- public Expression innerConvert(ChoiceExpression exp) {
- var convertedInnerExpressions = exp.asList().stream().map(inner -> convert(inner)).toList();
- return new ChoiceExpression(convertedInnerExpressions);
- }
-
- public Expression innerConvert(ForEachExpression exp) {
- return new ForEachExpression(convert(exp.getInnerExpression()));
- }
-
- public Expression innerConvert(GuardExpression exp) {
- return new GuardExpression(convert(exp.getInnerExpression()));
- }
-
- public Expression innerConvert(IfThenExpression exp) {
- return new IfThenExpression(branch().convert(exp.getLeftHandSide()),
- exp.getComparator(),
- branch().convert(exp.getRightHandSide()),
- branch().convert(exp.getIfTrueExpression()),
- branch().convert(exp.getIfFalseExpression()));
- }
-
- public Expression innerConvert(ParenthesisExpression exp) {
- return new ParenthesisExpression(convert(exp.getInnerExpression()));
- }
-
- public Expression innerConvert(ScriptExpression exp) {
- List<StatementExpression> lst = new LinkedList<>();
- for (Expression innerExp : exp) {
- StatementExpression next = (StatementExpression)branch().convert(innerExp);
- if (next != null) {
- lst.add(next);
- }
- }
- return new ScriptExpression(lst);
- }
-
- public Expression innerConvert(SelectInputExpression exp) {
- List<Pair<String, Expression>> cases = new LinkedList<>();
- for (Pair<String, Expression> pair : exp.getCases()) {
- cases.add(new Pair<>(pair.getFirst(), branch().convert(pair.getSecond())));
- }
- return new SelectInputExpression(cases);
- }
-
- public Expression innerConvert(StatementExpression exp) {
- List<Expression> lst = new LinkedList<>();
- for (Expression innerExp : exp) {
- Expression next = convert(innerExp);
- if (next != null) {
- lst.add(next);
- }
- }
- return new StatementExpression(lst);
- }
-
- public Expression innerConvert(SwitchExpression exp) {
- Map<String, Expression> cases = new HashMap<>();
- for (Map.Entry<String, Expression> entry : exp.getCases().entrySet()) {
- Expression next = branch().convert(entry.getValue());
- if (next != null) {
- cases.put(entry.getKey(), next);
- }
- }
- return new SwitchExpression(cases, branch().convert(exp.getDefaultExpression()));
+ public final Expression convert(Expression expression) {
+ if (expression == null) return null;
+ if (shouldConvert(expression))
+ return doConvert(expression);
+ else
+ return expression.convertChildren(this);
}
- protected ExpressionConverter branch() {
+ public ExpressionConverter branch() {
return this;
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ValueTransformProvider.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ValueTransformProvider.java
index bbd8c5ebcb8..623f940b06b 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ValueTransformProvider.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ValueTransformProvider.java
@@ -20,7 +20,7 @@ public abstract class ValueTransformProvider extends ExpressionConverter {
}
@Override
- protected final ExpressionConverter branch() {
+ public final ExpressionConverter branch() {
return clone();
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ArithmeticExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ArithmeticExpression.java
index e4bc2dae965..b7ee444975f 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ArithmeticExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ArithmeticExpression.java
@@ -4,6 +4,7 @@ package com.yahoo.vespa.indexinglanguage.expressions;
import com.yahoo.document.DataType;
import com.yahoo.document.NumericDataType;
import com.yahoo.document.datatypes.*;
+import com.yahoo.vespa.indexinglanguage.ExpressionConverter;
import com.yahoo.vespa.objects.ObjectOperation;
import com.yahoo.vespa.objects.ObjectPredicate;
@@ -55,6 +56,12 @@ public final class ArithmeticExpression extends CompositeExpression {
this.rhs = rhs;
}
+ @Override
+ public ArithmeticExpression convertChildren(ExpressionConverter converter) {
+ // TODO: branch()?
+ return new ArithmeticExpression(converter.convert(lhs), op, converter.convert(rhs));
+ }
+
public Expression getLeftHandSide() {
return lhs;
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/CatExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/CatExpression.java
index 4c14c633fbf..564ab015e10 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/CatExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/CatExpression.java
@@ -9,6 +9,7 @@ import com.yahoo.document.datatypes.Array;
import com.yahoo.document.datatypes.FieldValue;
import com.yahoo.document.datatypes.StringFieldValue;
import com.yahoo.document.datatypes.WeightedSet;
+import com.yahoo.vespa.indexinglanguage.ExpressionConverter;
import java.util.*;
@@ -26,6 +27,11 @@ public final class CatExpression extends ExpressionList<Expression> {
}
@Override
+ public CatExpression convertChildren(ExpressionConverter converter) {
+ return new CatExpression(convertChildList(converter));
+ }
+
+ @Override
protected void doExecute(ExecutionContext context) {
FieldValue input = context.getValue();
DataType inputType = input != null ? input.getDataType() : null;
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ChoiceExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ChoiceExpression.java
index 4f83cbfdd8c..86826770828 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ChoiceExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ChoiceExpression.java
@@ -3,6 +3,7 @@ package com.yahoo.vespa.indexinglanguage.expressions;
import com.yahoo.document.DataType;
import com.yahoo.document.datatypes.FieldValue;
+import com.yahoo.vespa.indexinglanguage.ExpressionConverter;
import java.util.Arrays;
import java.util.Collection;
@@ -32,6 +33,11 @@ public class ChoiceExpression extends ExpressionList<Expression> {
}
@Override
+ public ChoiceExpression convertChildren(ExpressionConverter converter) {
+ return new ChoiceExpression(asList().stream().map(choice -> converter.branch().convert(choice)).toList());
+ }
+
+ @Override
protected void doExecute(ExecutionContext context) {
FieldValue input = context.getValue();
for (Expression expression : this) {
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/CompositeExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/CompositeExpression.java
index 27e5524f4ad..8c00aad6bb0 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/CompositeExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/CompositeExpression.java
@@ -2,12 +2,16 @@
package com.yahoo.vespa.indexinglanguage.expressions;
import com.yahoo.document.DataType;
+import com.yahoo.vespa.indexinglanguage.ExpressionConverter;
/**
* @author Simon Thoresen Hult
*/
public abstract class CompositeExpression extends Expression {
+ @Override
+ public abstract CompositeExpression convertChildren(ExpressionConverter converter);
+
protected CompositeExpression(DataType inputType) {
super(inputType);
}
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 bf8201ee7ee..f498b871096 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
@@ -35,6 +35,12 @@ public abstract class Expression extends Selectable {
this.inputType = inputType;
}
+ /**
+ * Returns an expression where the children of this has been converted using the given converter.
+ * This default implementation returns this as it has no children.
+ */
+ public Expression convertChildren(ExpressionConverter converter) { return this; }
+
/** Sets the document type and field the statement this expression is part of will write to */
public void setStatementOutput(DocumentType documentType, Field field) {}
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 e2ff1de7126..57de66f80a0 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
@@ -4,6 +4,7 @@ package com.yahoo.vespa.indexinglanguage.expressions;
import com.yahoo.document.DataType;
import com.yahoo.document.DocumentType;
import com.yahoo.document.Field;
+import com.yahoo.vespa.indexinglanguage.ExpressionConverter;
import com.yahoo.vespa.objects.ObjectOperation;
import com.yahoo.vespa.objects.ObjectPredicate;
@@ -11,6 +12,7 @@ import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
+import java.util.Objects;
/**
* @author Simon Thoresen Hult
@@ -26,6 +28,10 @@ public abstract class ExpressionList<T extends Expression> extends CompositeExpr
}
}
+ protected List<Expression> convertChildList(ExpressionConverter converter) {
+ return asList().stream().map(converter::convert).filter(Objects::nonNull).toList();
+ }
+
@Override
public void setStatementOutput(DocumentType documentType, Field field) {
for (Expression expression : expressions)
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ForEachExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ForEachExpression.java
index 0f3a445bcb9..3053a391823 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ForEachExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ForEachExpression.java
@@ -6,6 +6,7 @@ import com.yahoo.document.datatypes.Array;
import com.yahoo.document.datatypes.FieldValue;
import com.yahoo.document.datatypes.Struct;
import com.yahoo.document.datatypes.WeightedSet;
+import com.yahoo.vespa.indexinglanguage.ExpressionConverter;
import com.yahoo.vespa.indexinglanguage.FieldValueConverter;
import com.yahoo.vespa.objects.ObjectOperation;
import com.yahoo.vespa.objects.ObjectPredicate;
@@ -27,6 +28,11 @@ public final class ForEachExpression extends CompositeExpression {
}
@Override
+ public ForEachExpression convertChildren(ExpressionConverter converter) {
+ return new ForEachExpression(converter.convert(exp));
+ }
+
+ @Override
public void setStatementOutput(DocumentType documentType, Field field) {
exp.setStatementOutput(documentType, field);
}
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 da7cfcdcaee..38a05c3056c 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
@@ -4,6 +4,7 @@ package com.yahoo.vespa.indexinglanguage.expressions;
import com.yahoo.document.DataType;
import com.yahoo.document.DocumentType;
import com.yahoo.document.Field;
+import com.yahoo.vespa.indexinglanguage.ExpressionConverter;
import com.yahoo.vespa.indexinglanguage.ExpressionVisitor;
import com.yahoo.vespa.indexinglanguage.UpdateAdapter;
import com.yahoo.vespa.objects.ObjectOperation;
@@ -28,6 +29,11 @@ public final class GuardExpression extends CompositeExpression {
}
@Override
+ public GuardExpression convertChildren(ExpressionConverter converter) {
+ return new GuardExpression(converter.convert(exp));
+ }
+
+ @Override
public void setStatementOutput(DocumentType documentType, Field field) {
exp.setStatementOutput(documentType, field);
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/IfThenExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/IfThenExpression.java
index 8a29c8e8645..f05795aa234 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/IfThenExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/IfThenExpression.java
@@ -6,6 +6,7 @@ import com.yahoo.document.DocumentType;
import com.yahoo.document.Field;
import com.yahoo.document.datatypes.FieldValue;
import com.yahoo.document.datatypes.NumericFieldValue;
+import com.yahoo.vespa.indexinglanguage.ExpressionConverter;
import com.yahoo.vespa.objects.ObjectOperation;
import com.yahoo.vespa.objects.ObjectPredicate;
@@ -57,6 +58,15 @@ public final class IfThenExpression extends CompositeExpression {
}
@Override
+ public IfThenExpression convertChildren(ExpressionConverter converter) {
+ return new IfThenExpression(converter.branch().convert(lhs),
+ cmp,
+ converter.branch().convert(rhs),
+ converter.branch().convert(ifTrue),
+ converter.branch().convert(ifFalse));
+ }
+
+ @Override
public void setStatementOutput(DocumentType documentType, Field field) {
lhs.setStatementOutput(documentType, field);
rhs.setStatementOutput(documentType, field);
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ParenthesisExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ParenthesisExpression.java
index 60b059f3ef1..6e476f5f7e4 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ParenthesisExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ParenthesisExpression.java
@@ -4,6 +4,7 @@ package com.yahoo.vespa.indexinglanguage.expressions;
import com.yahoo.document.DataType;
import com.yahoo.document.DocumentType;
import com.yahoo.document.Field;
+import com.yahoo.vespa.indexinglanguage.ExpressionConverter;
import com.yahoo.vespa.objects.ObjectOperation;
import com.yahoo.vespa.objects.ObjectPredicate;
@@ -24,6 +25,11 @@ public class ParenthesisExpression extends CompositeExpression {
}
@Override
+ public ParenthesisExpression convertChildren(ExpressionConverter converter) {
+ return new ParenthesisExpression(converter.convert(innerExp));
+ }
+
+ @Override
public void setStatementOutput(DocumentType documentType, Field field) {
innerExp.setStatementOutput(documentType, field);
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ScriptExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ScriptExpression.java
index f0c37960a99..1a640c9924e 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ScriptExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ScriptExpression.java
@@ -6,6 +6,7 @@ import com.yahoo.document.datatypes.FieldValue;
import com.yahoo.language.Linguistics;
import com.yahoo.language.process.Embedder;
import com.yahoo.language.simple.SimpleLinguistics;
+import com.yahoo.vespa.indexinglanguage.ExpressionConverter;
import com.yahoo.vespa.indexinglanguage.ScriptParser;
import com.yahoo.vespa.indexinglanguage.ScriptParserContext;
import com.yahoo.vespa.indexinglanguage.parser.IndexingInput;
@@ -17,6 +18,7 @@ import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
/**
* @author Simon Thoresen Hult
@@ -36,6 +38,14 @@ public final class ScriptExpression extends ExpressionList<StatementExpression>
}
@Override
+ public ScriptExpression convertChildren(ExpressionConverter converter) {
+ return new ScriptExpression(asList().stream()
+ .map(child -> (StatementExpression)converter.branch().convert(child))
+ .filter(Objects::nonNull)
+ .toList());
+ }
+
+ @Override
protected void doExecute(ExecutionContext context) {
FieldValue input = context.getValue();
for (StatementExpression statement : this) {
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SelectInputExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SelectInputExpression.java
index 212b60525f9..bb8111f358e 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SelectInputExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SelectInputExpression.java
@@ -6,10 +6,12 @@ import com.yahoo.document.DataType;
import com.yahoo.document.DocumentType;
import com.yahoo.document.Field;
import com.yahoo.document.datatypes.FieldValue;
+import com.yahoo.vespa.indexinglanguage.ExpressionConverter;
import com.yahoo.vespa.objects.ObjectOperation;
import com.yahoo.vespa.objects.ObjectPredicate;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -32,6 +34,13 @@ public final class SelectInputExpression extends CompositeExpression {
}
@Override
+ public SelectInputExpression convertChildren(ExpressionConverter converter) {
+ return new SelectInputExpression(cases.stream()
+ .map(c -> new Pair<>(c.getFirst(), converter.branch().convert(c.getSecond())))
+ .toList());
+ }
+
+ @Override
public void setStatementOutput(DocumentType documentType, Field field) {
for (var casePair : cases)
casePair.getSecond().setStatementOutput(documentType, field);
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 8516ddb883d..75f206ef47d 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
@@ -5,6 +5,7 @@ import com.yahoo.document.DataType;
import com.yahoo.language.Linguistics;
import com.yahoo.language.process.Embedder;
import com.yahoo.language.simple.SimpleLinguistics;
+import com.yahoo.vespa.indexinglanguage.ExpressionConverter;
import com.yahoo.vespa.indexinglanguage.ScriptParser;
import com.yahoo.vespa.indexinglanguage.ScriptParserContext;
import com.yahoo.vespa.indexinglanguage.parser.IndexingInput;
@@ -15,6 +16,7 @@ import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.stream.Collectors;
/**
@@ -45,6 +47,14 @@ public final class StatementExpression extends ExpressionList<Expression> {
public List<String> getInputFields() { return inputFields; }
@Override
+ public StatementExpression convertChildren(ExpressionConverter converter) {
+ return new StatementExpression(asList().stream()
+ .map(child -> converter.convert(child))
+ .filter(Objects::nonNull)
+ .toList());
+ }
+
+ @Override
protected void doExecute(ExecutionContext context) {
for (Expression expression : this) {
context.execute(expression);
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SwitchExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SwitchExpression.java
index 86913d8c1ba..c7cf7066483 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SwitchExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SwitchExpression.java
@@ -7,6 +7,7 @@ import com.yahoo.document.Field;
import com.yahoo.document.datatypes.FieldValue;
import com.yahoo.document.datatypes.StringFieldValue;
import com.yahoo.text.StringUtilities;
+import com.yahoo.vespa.indexinglanguage.ExpressionConverter;
import com.yahoo.vespa.objects.ObjectOperation;
import com.yahoo.vespa.objects.ObjectPredicate;
@@ -32,6 +33,17 @@ public final class SwitchExpression extends CompositeExpression {
this.cases.putAll(cases);
}
+ @Override
+ public SwitchExpression convertChildren(ExpressionConverter converter) {
+ var convertedCases = new LinkedHashMap<String, Expression>();
+ for (var entry : cases.entrySet()) {
+ var converted = converter.branch().convert(entry.getValue());
+ if (converted != null)
+ convertedCases.put(entry.getKey(), converted);
+ }
+ return new SwitchExpression(convertedCases, converter.branch().convert(defaultExp));
+ }
+
public boolean isEmpty() {
return defaultExp == null && cases.isEmpty();
}
diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ExpressionConverterTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ExpressionConverterTestCase.java
index f1e1be0ae41..8aeaa084e1b 100644
--- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ExpressionConverterTestCase.java
+++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ExpressionConverterTestCase.java
@@ -2,7 +2,6 @@
package com.yahoo.vespa.indexinglanguage;
import com.yahoo.collections.Pair;
-import com.yahoo.document.DataType;
import com.yahoo.document.datatypes.IntegerFieldValue;
import com.yahoo.language.simple.SimpleLinguistics;
import com.yahoo.vespa.indexinglanguage.expressions.ArithmeticExpression;
@@ -11,9 +10,7 @@ import com.yahoo.vespa.indexinglanguage.expressions.Base64DecodeExpression;
import com.yahoo.vespa.indexinglanguage.expressions.Base64EncodeExpression;
import com.yahoo.vespa.indexinglanguage.expressions.CatExpression;
import com.yahoo.vespa.indexinglanguage.expressions.ClearStateExpression;
-import com.yahoo.vespa.indexinglanguage.expressions.CompositeExpression;
import com.yahoo.vespa.indexinglanguage.expressions.EchoExpression;
-import com.yahoo.vespa.indexinglanguage.expressions.ExecutionContext;
import com.yahoo.vespa.indexinglanguage.expressions.Expression;
import com.yahoo.vespa.indexinglanguage.expressions.ForEachExpression;
import com.yahoo.vespa.indexinglanguage.expressions.GetFieldExpression;
@@ -54,7 +51,6 @@ import com.yahoo.vespa.indexinglanguage.expressions.ToStringExpression;
import com.yahoo.vespa.indexinglanguage.expressions.ToWsetExpression;
import com.yahoo.vespa.indexinglanguage.expressions.TokenizeExpression;
import com.yahoo.vespa.indexinglanguage.expressions.TrimExpression;
-import com.yahoo.vespa.indexinglanguage.expressions.VerificationContext;
import com.yahoo.vespa.indexinglanguage.expressions.ZCurveExpression;
import com.yahoo.vespa.indexinglanguage.linguistics.AnnotatorConfig;
import org.junit.Test;
@@ -73,7 +69,6 @@ import static org.junit.Assert.fail;
*/
public class ExpressionConverterTestCase {
- @SuppressWarnings("unchecked")
@Test
public void requireThatAllExpressionTypesCanBeTraversed() {
assertConvertable(new ArithmeticExpression(new InputExpression("foo"), ArithmeticExpression.Operator.ADD,
@@ -167,16 +162,6 @@ public class ExpressionConverterTestCase {
}
@Test
- public void requireThatUnknownCompositeThrows() {
- try {
- new MyTraverser().convert(new MyComposite());
- fail();
- } catch (UnsupportedOperationException e) {
- assertEquals(NoSuchMethodException.class, e.getCause().getClass());
- }
- }
-
- @Test
public void requireThatConversionExceptionCanBeThrown() {
final RuntimeException expectedCause = new RuntimeException();
try {
@@ -254,24 +239,4 @@ public class ExpressionConverterTestCase {
}
}
- private static class MyComposite extends CompositeExpression {
-
- MyComposite() {
- super(null);
- }
- @Override
- protected void doExecute(ExecutionContext context) {
-
- }
-
- @Override
- protected void doVerify(VerificationContext context) {
-
- }
-
- @Override
- public DataType createdOutputType() {
- return null;
- }
- }
}