aboutsummaryrefslogtreecommitdiffstats
path: root/indexinglanguage/src/main
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2018-10-17 09:47:14 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2018-10-17 09:47:14 +0200
commit6b8ad3500d95f6e0ba6330f44a1630fb7d349235 (patch)
tree3e572cb58c1ead4b705dabe873487752ea8dbfdc /indexinglanguage/src/main
parent6a87e097ffd13579ae1af6b1b3c5376381229cb9 (diff)
Make inputDataType final to ensure complete at construction time.
Diffstat (limited to 'indexinglanguage/src/main')
-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.java13
-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.java9
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/IfThenExpression.java9
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ScriptExpression.java16
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/StatementExpression.java14
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/VerificationException.java23
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() {