diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2018-10-17 09:47:14 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2018-10-17 09:47:14 +0200 |
commit | 6b8ad3500d95f6e0ba6330f44a1630fb7d349235 (patch) | |
tree | 3e572cb58c1ead4b705dabe873487752ea8dbfdc /indexinglanguage/src/main | |
parent | 6a87e097ffd13579ae1af6b1b3c5376381229cb9 (diff) |
Make inputDataType final to ensure complete at construction time.
Diffstat (limited to 'indexinglanguage/src/main')
8 files changed, 54 insertions, 43 deletions
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 02c68bdf967..68b9e79e092 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 @@ -46,8 +46,7 @@ public final class ArithmeticExpression extends CompositeExpression { private final Expression rhs; public ArithmeticExpression(Expression lhs, Operator op, Expression rhs) { - super(null); - setInputType(requiredInputType(lhs, rhs)); + super(requiredInputType(lhs, rhs)); lhs.getClass(); // throws NullPointerException op.getClass(); rhs.getClass(); @@ -82,7 +81,7 @@ public final class ArithmeticExpression extends CompositeExpression { context.setValue(input).execute(rhs).getValue())); } - private DataType requiredInputType(Expression lhs, Expression rhs) { + private static DataType requiredInputType(Expression lhs, Expression rhs) { DataType lhsType = lhs.requiredInputType(); DataType rhsType = rhs.requiredInputType(); if (lhsType == null) { @@ -92,7 +91,7 @@ public final class ArithmeticExpression extends CompositeExpression { return lhsType; } if (!lhsType.equals(rhsType)) { - throw new VerificationException(this, "Operands require conflicting input types, " + + throw new VerificationException(ArithmeticExpression.class, "Operands require conflicting input types, " + lhsType.getName() + " vs " + rhsType.getName() + "."); } return lhsType; 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 be6b6db6a9a..f395446cb10 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 @@ -18,12 +18,11 @@ import java.util.*; public final class CatExpression extends ExpressionList<Expression> { public CatExpression(Expression... lst) { - super(Arrays.asList(lst)); - setInputType(resolveInputType()); + this(Arrays.asList(lst)); } public CatExpression(Collection<? extends Expression> lst) { - super(lst); + super(lst, resolveInputType(lst)); } @Override @@ -63,17 +62,17 @@ public final class CatExpression extends ExpressionList<Expression> { context.setValue(resolveOutputType(types)); } - private DataType resolveInputType() { + private static DataType resolveInputType(Collection<? extends Expression> list) { DataType prev = null; - for (Expression exp : this) { + for (Expression exp : list) { DataType next = exp.requiredInputType(); if (next == null) { // ignore } else if (prev == null) { prev = next; } else if (!prev.isAssignableFrom(next)) { - throw new VerificationException(this, "Operands require conflicting input types, " + - prev.getName() + " vs " + next.getName() + "."); + throw new VerificationException(CatExpression.class, "Operands require conflicting input types, " + + prev.getName() + " vs " + next.getName() + "."); } } return prev; 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 3d8da1a8b77..231446b9c62 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 @@ -17,14 +17,12 @@ import com.yahoo.vespa.objects.Selectable; */ public abstract class Expression extends Selectable { - private DataType inputType; + private final DataType inputType; protected Expression(DataType inputType) { this.inputType = inputType; } - protected void setInputType(DataType inputType) { - this.inputType = inputType; - } + 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 6c83835559c..ca929773a4c 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 @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.indexinglanguage.expressions; +import com.yahoo.document.DataType; import com.yahoo.document.DocumentType; import com.yahoo.vespa.objects.ObjectOperation; import com.yahoo.vespa.objects.ObjectPredicate; @@ -17,12 +18,8 @@ public abstract class ExpressionList<T extends Expression> extends CompositeExpr private final List<T> expressions = new LinkedList<T>(); - protected ExpressionList() { - super(null); - } - - protected ExpressionList(Iterable<? extends T> lst) { - super(null); + protected ExpressionList(Iterable<? extends T> lst, DataType inputType) { + super(inputType); for (T exp : lst) { this.expressions.add(exp); } 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 16365e1264b..9e7f60aa3e3 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 @@ -46,13 +46,12 @@ public final class IfThenExpression extends CompositeExpression { } public IfThenExpression(Expression lhs, Comparator cmp, Expression rhs, Expression ifTrue, Expression ifFalse) { - super(null); + super(resolveInputType(lhs, rhs, ifTrue, ifFalse)); this.lhs = lhs; this.cmp = cmp; this.rhs = rhs; this.ifTrue = ifTrue; this.ifFalse = ifFalse; - setInputType(resolveInputType()); } public Expression getLeftHandSide() { @@ -114,7 +113,7 @@ public final class IfThenExpression extends CompositeExpression { select(ifFalse, predicate, operation); } - private DataType resolveInputType() { + private static DataType resolveInputType(Expression lhs, Expression rhs, Expression ifTrue, Expression ifFalse) { DataType input = null; input = resolveRequiredInputType(input, lhs.requiredInputType()); input = resolveRequiredInputType(input, rhs.requiredInputType()); @@ -174,7 +173,7 @@ public final class IfThenExpression extends CompositeExpression { return ret; } - private DataType resolveRequiredInputType(DataType prev, DataType next) { + private static DataType resolveRequiredInputType(DataType prev, DataType next) { if (next == null) { return prev; } @@ -182,7 +181,7 @@ public final class IfThenExpression extends CompositeExpression { return next; } if (!prev.equals(next)) { - throw new VerificationException(this, "Operands require conflicting input types, " + + throw new VerificationException(IfThenExpression.class, "Operands require conflicting input types, " + prev.getName() + " vs " + next.getName() + "."); } return prev; 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 275ca58d4db..3e9f6ad5032 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 @@ -12,6 +12,7 @@ import com.yahoo.vespa.indexinglanguage.parser.ParseException; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.Iterator; /** @@ -20,18 +21,15 @@ import java.util.Iterator; public final class ScriptExpression extends ExpressionList<StatementExpression> { public ScriptExpression() { - super(); - setInputType(resolveInputType()); + this(Collections.emptyList()); } public ScriptExpression(StatementExpression... lst) { - super(Arrays.asList(lst)); - setInputType(resolveInputType()); + this(Arrays.asList(lst)); } public ScriptExpression(Collection<? extends StatementExpression> lst) { - super(lst); - setInputType(resolveInputType()); + super(lst, resolveInputType(lst)); } @Override @@ -52,14 +50,14 @@ public final class ScriptExpression extends ExpressionList<StatementExpression> context.setValue(input); } - private DataType resolveInputType() { + private static DataType resolveInputType(Collection<? extends StatementExpression> list) { DataType prev = null; - for (Expression exp : this) { + for (Expression exp : list) { DataType next = exp.requiredInputType(); if (prev == null) { prev = next; } else if (next != null && !prev.isAssignableFrom(next)) { - throw new VerificationException(this, "Statements require conflicting input types, " + + throw new VerificationException(ScriptExpression.class, "Statements require conflicting input types, " + prev.getName() + " vs " + next.getName() + "."); } } 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 eb6b5563584..422457d18fa 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 @@ -10,6 +10,7 @@ import com.yahoo.vespa.indexinglanguage.parser.IndexingInput; import com.yahoo.vespa.indexinglanguage.parser.ParseException; import java.util.Arrays; +import java.util.Collection; import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -21,12 +22,14 @@ public final class StatementExpression extends ExpressionList<Expression> { public StatementExpression(Expression... lst) { this(Arrays.asList(lst)); - setInputType(resolveInputType()); } public StatementExpression(Iterable<Expression> lst) { - super(filterList(lst)); - setInputType(resolveInputType()); + this(filterList(lst), null); + } + + private StatementExpression(Iterable<Expression> list, Object unused) { + super(list, resolveInputType(list)); } @Override @@ -43,12 +46,13 @@ public final class StatementExpression extends ExpressionList<Expression> { } } - private DataType resolveInputType() { - for (Expression exp : this) { + private static DataType resolveInputType(Iterable<Expression> lst) { + for (Expression exp : lst) { DataType type = exp.requiredInputType(); if (type != null) { return type; } + type = exp.createdOutputType(); if (type != null) { return null; diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/VerificationException.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/VerificationException.java index 32f337f500c..836600caa2b 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/VerificationException.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/VerificationException.java @@ -6,16 +6,33 @@ package com.yahoo.vespa.indexinglanguage.expressions; */ public class VerificationException extends RuntimeException { - private final Expression exp; + private final Class<?> type; + private final String exp; public VerificationException(Expression exp, String msg) { super(msg); - this.exp = exp; + if (exp != null) { + this.type = exp.getClass(); + this.exp = exp.toString(); + } else { + this.type = null; + this.exp = "null"; + } } - public Expression getExpression() { + + public VerificationException(Class<?> exp, String msg) { + super(msg); + this.type = exp; + this.exp = exp.getName(); + } + + public String getExpression() { return exp; } + public Class<?> getExpressionType() { + return type; + } @Override public String toString() { |