aboutsummaryrefslogtreecommitdiffstats
path: root/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionConverter.java
diff options
context:
space:
mode:
Diffstat (limited to 'indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionConverter.java')
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionConverter.java121
1 files changed, 8 insertions, 113 deletions
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;
}