summaryrefslogtreecommitdiffstats
path: root/indexinglanguage/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'indexinglanguage/src/main')
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/DocumentAdapter.java3
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldPathUpdateHelper.java8
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateAdapter.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateHelper.java125
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldValueConverter.java12
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ScriptParser.java32
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/SimpleAdapterFactory.java32
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/UpdateAdapter.java3
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ChoiceExpression.java88
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ClearStateExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/CompositeExpression.java1
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExecutionContext.java16
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Expression.java23
-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/FieldValueAdapter.java3
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/FlattenExpression.java7
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ForEachExpression.java10
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GetFieldExpression.java13
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GetVarExpression.java9
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GuardExpression.java10
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexDecodeExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexEncodeExpression.java1
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HostNameExpression.java1
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/IfThenExpression.java33
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/IndexExpression.java1
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/InputExpression.java28
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/JoinExpression.java11
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/LowerCaseExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/MathResolver.java10
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NGramExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NormalizeExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NowExpression.java9
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/OptimizePredicateExpression.java1
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/OutputExpression.java9
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ParenthesisExpression.java9
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/PassthroughExpression.java1
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/RandomExpression.java16
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ScriptExpression.java18
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SelectInputExpression.java12
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetLanguageExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetValueExpression.java12
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetVarExpression.java10
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SplitExpression.java9
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/StatementExpression.java36
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SubstringExpression.java14
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SummaryExpression.java1
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SwitchExpression.java18
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ThisExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToArrayExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToByteExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToDoubleExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToFloatExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToIntegerExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToLongExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToPositionExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToStringExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToWsetExpression.java5
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/TokenizeExpression.java10
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/TrimExpression.java1
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/UnresolvedFieldValue.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/VerificationException.java1
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ZCurveExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/linguistics/AnnotatorConfig.java3
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/parser/IndexingInput.java1
-rw-r--r--indexinglanguage/src/main/javacc/IndexingParser.jj25
65 files changed, 392 insertions, 362 deletions
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/DocumentAdapter.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/DocumentAdapter.java
index db0c470797e..4c64809c546 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/DocumentAdapter.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/DocumentAdapter.java
@@ -13,4 +13,7 @@ public interface DocumentAdapter extends FieldValueAdapter {
Document getUpdatableOutput();
+ @Override
+ default boolean isComplete() { return true; }
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldPathUpdateHelper.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldPathUpdateHelper.java
index 8050efd51f9..2074a157022 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldPathUpdateHelper.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldPathUpdateHelper.java
@@ -16,10 +16,9 @@ import com.yahoo.document.fieldpathupdate.RemoveFieldPathUpdate;
*/
public abstract class FieldPathUpdateHelper {
+ /** Returns true if this update completely replaces the value of the field, false otherwise. */
public static boolean isComplete(FieldPathUpdate update) {
- if (!(update instanceof AssignFieldPathUpdate)) {
- return false;
- }
+ if (!(update instanceof AssignFieldPathUpdate)) return false;
// Only consider field path updates that touch a top-level field as 'complete',
// as these may be converted to regular field value updates.
return ((update.getFieldPath().size() == 1)
@@ -29,8 +28,7 @@ public abstract class FieldPathUpdateHelper {
public static void applyUpdate(FieldPathUpdate update, Document doc) {
if (update instanceof AddFieldPathUpdate) {
update.applyTo(doc);
- } else if (update instanceof AssignFieldPathUpdate) {
- AssignFieldPathUpdate assign = (AssignFieldPathUpdate)update;
+ } else if (update instanceof AssignFieldPathUpdate assign) {
boolean createMissingPath = assign.getCreateMissingPath();
boolean removeIfZero = assign.getRemoveIfZero();
assign.setCreateMissingPath(true);
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateAdapter.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateAdapter.java
index 4182c133000..2601c5d0f71 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateAdapter.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateAdapter.java
@@ -192,7 +192,6 @@ public class FieldUpdateAdapter implements UpdateAdapter {
return ret;
}
- @SuppressWarnings({ "unchecked" })
private List<ValueUpdate> createRemoveValueUpdateForEachElement(Iterator<FieldValue> it) {
List<ValueUpdate> ret = new ArrayList<>();
while (it.hasNext()) {
@@ -215,7 +214,6 @@ public class FieldUpdateAdapter implements UpdateAdapter {
return ret;
}
- @SuppressWarnings({ "unchecked" })
private List<ValueUpdate> createMapValueUpdatesForStruct(StructuredFieldValue struct, MapValueUpdate upd) {
List<ValueUpdate> ret = new ArrayList<>();
for (Iterator<Map.Entry<Field, FieldValue>> it = struct.iterator(); it.hasNext();) {
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateHelper.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateHelper.java
index fd0642e27ea..8c32f2e451d 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateHelper.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateHelper.java
@@ -30,26 +30,22 @@ import com.yahoo.document.update.ValueUpdate;
@SuppressWarnings("rawtypes")
public abstract class FieldUpdateHelper {
+ /** Returns true if this update completely replaces the value of the field, false otherwise. */
public static boolean isComplete(Field field, ValueUpdate update) {
- if (update instanceof AssignValueUpdate) {
- return true;
- }
- if (!(update instanceof MapValueUpdate)) {
- return false;
- }
+ if (update instanceof AssignValueUpdate) return true;
+ if (!(update instanceof MapValueUpdate)) return false;
+
DataType fieldType = field.getDataType();
- if (!(fieldType instanceof StructuredDataType)) {
- return false;
- }
+ if (!(fieldType instanceof StructuredDataType)) return false;
+
field = ((StructuredDataType)fieldType).getField(String.valueOf(update.getValue()));
- if (field == null) {
- return false;
- }
+ if (field == null) return false;
+
return isComplete(field, ((MapValueUpdate)update).getUpdate());
}
public static void applyUpdate(Field field, ValueUpdate update, Document doc) {
- doc.setFieldValue(field, createFieldValue(field.getDataType().createFieldValue(), update));
+ doc.setFieldValue(field, applyUpdate(update, field.getDataType().createFieldValue()));
}
public static Document newPartialDocument(DocumentType docType, DocumentId docId, Field field, ValueUpdate update) {
@@ -58,73 +54,74 @@ public abstract class FieldUpdateHelper {
return doc;
}
+ /** Applies the given update to the given (empty) field value. */
@SuppressWarnings({ "unchecked" })
- private static FieldValue createFieldValue(FieldValue val, ValueUpdate upd) {
- if (upd instanceof ClearValueUpdate) {
- return val;
- } else if (upd instanceof AssignValueUpdate) {
- val.assign(upd.getValue());
- return val;
- } else if (upd instanceof AddValueUpdate) {
- if (val instanceof Array) {
- ((Array)val).add(upd.getValue());
- } else if (val instanceof WeightedSet) {
- ((WeightedSet)val).put(upd.getValue(), ((AddValueUpdate)upd).getWeight());
+ private static FieldValue applyUpdate(ValueUpdate update, FieldValue value) {
+ if (update instanceof ClearValueUpdate) {
+ return value;
+ } else if (update instanceof AssignValueUpdate) {
+ value.assign(update.getValue());
+ return value;
+ } else if (update instanceof AddValueUpdate) {
+ if (value instanceof Array) {
+ ((Array)value).add(update.getValue());
+ } else if (value instanceof WeightedSet) {
+ ((WeightedSet)value).put(update.getValue(), ((AddValueUpdate)update).getWeight());
}
- return val;
- } else if (upd instanceof ArithmeticValueUpdate) {
- if (((ArithmeticValueUpdate)upd).getOperator() == ArithmeticValueUpdate.Operator.DIV &&
- ((ArithmeticValueUpdate)upd).getOperand().doubleValue() == 0) {
- throw new IllegalArgumentException("Division by zero.");
+ return value;
+ } else if (update instanceof ArithmeticValueUpdate) {
+ if (((ArithmeticValueUpdate)update).getOperator() == ArithmeticValueUpdate.Operator.DIV &&
+ ((ArithmeticValueUpdate)update).getOperand().doubleValue() == 0) {
+ throw new IllegalArgumentException("Division by zero");
}
- val.assign(upd.getValue());
- return val;
- } else if (upd instanceof RemoveValueUpdate) {
- if (val instanceof Array) {
- ((Array)val).add(upd.getValue());
- } else if (val instanceof WeightedSet) {
- ((WeightedSet)val).put(upd.getValue(), 1);
+ value.assign(update.getValue());
+ return value;
+ } else if (update instanceof RemoveValueUpdate) {
+ if (value instanceof Array) {
+ ((Array)value).add(update.getValue());
+ } else if (value instanceof WeightedSet) {
+ ((WeightedSet)value).put(update.getValue(), 1);
}
- return val;
- } else if (upd instanceof MapValueUpdate) {
- if (val instanceof Array) {
- var nestedUpdate = ((MapValueUpdate)upd).getUpdate();
+ return value;
+ } else if (update instanceof MapValueUpdate) {
+ if (value instanceof Array) {
+ var nestedUpdate = ((MapValueUpdate)update).getUpdate();
if (nestedUpdate instanceof AssignValueUpdate) {
// Can't assign an array's value type directly to the array, so we have to add it as a
// singular element to the partial document.
- ((Array)val).add(nestedUpdate.getValue());
- return val;
+ ((Array)value).add(nestedUpdate.getValue());
+ return value;
} else {
- return createFieldValue(val, nestedUpdate);
+ return applyUpdate(nestedUpdate, value);
}
- } else if (val instanceof MapFieldValue) {
- throw new UnsupportedOperationException("Can not map into a " + val.getClass().getName() + ".");
- } else if (val instanceof StructuredFieldValue) {
- Field field = ((StructuredFieldValue)val).getField(String.valueOf(upd.getValue()));
+ } else if (value instanceof MapFieldValue) {
+ throw new UnsupportedOperationException("Can not map into a " + value.getClass().getName() + ".");
+ } else if (value instanceof StructuredFieldValue) {
+ Field field = ((StructuredFieldValue)value).getField(String.valueOf(update.getValue()));
if (field == null) {
- throw new IllegalArgumentException("Field '" + upd.getValue() + "' not found.");
+ throw new IllegalArgumentException("Field '" + update.getValue() + "' not found");
}
- ((StructuredFieldValue)val).setFieldValue(field, createFieldValue(field.getDataType().createFieldValue(),
- ((MapValueUpdate)upd).getUpdate()));
- return val;
- } else if (val instanceof WeightedSet) {
- FieldValue weight = createFieldValue(new IntegerFieldValue(), ((MapValueUpdate)upd).getUpdate());
+ ((StructuredFieldValue)value).setFieldValue(field, applyUpdate(((MapValueUpdate)update).getUpdate(), field.getDataType().createFieldValue()
+ ));
+ return value;
+ } else if (value instanceof WeightedSet) {
+ FieldValue weight = applyUpdate(((MapValueUpdate)update).getUpdate(), new IntegerFieldValue());
if (!(weight instanceof IntegerFieldValue)) {
- throw new IllegalArgumentException("Expected integer, got " + weight.getClass().getName() + ".");
+ throw new IllegalArgumentException("Expected integer, got " + weight.getClass().getName());
}
- ((WeightedSet)val).put(upd.getValue(), ((IntegerFieldValue)weight).getInteger());
- return val;
+ ((WeightedSet)value).put(update.getValue(), ((IntegerFieldValue)weight).getInteger());
+ return value;
} else {
- throw new IllegalArgumentException("Expected multi-value data type, got " + val.getDataType().getName() + ".");
+ throw new IllegalArgumentException("Expected multi-value data type, got " + value.getDataType().getName());
}
- } else if (upd instanceof TensorModifyUpdate) {
- return val;
- } else if (upd instanceof TensorAddUpdate) {
- return val;
- } else if (upd instanceof TensorRemoveUpdate) {
- return val;
+ } else if (update instanceof TensorModifyUpdate) {
+ return value;
+ } else if (update instanceof TensorAddUpdate) {
+ return value;
+ } else if (update instanceof TensorRemoveUpdate) {
+ return value;
}
- throw new UnsupportedOperationException("Value update type " + upd.getClass().getName() + " not supported.");
+ throw new UnsupportedOperationException("Value update type " + update.getClass().getName() + " not supported");
}
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldValueConverter.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldValueConverter.java
index 4900574f549..4f96f2b7a31 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldValueConverter.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldValueConverter.java
@@ -57,9 +57,7 @@ public abstract class FieldValueConverter {
return null;
}
Array ret = DataType.getArray(nextType).createFieldValue();
- for (FieldValue nextVal : next) {
- ret.add(nextVal);
- }
+ ret.addAll(next);
return ret;
}
@@ -96,9 +94,7 @@ public abstract class FieldValueConverter {
return null;
}
MapFieldValue ret = DataType.getMap(nextKeyType, nextValType).createFieldValue();
- for (Map.Entry<FieldValue, FieldValue> entry : next.entrySet()) {
- ret.put(entry.getKey(), entry.getValue());
- }
+ ret.putAll(next);
return ret;
}
@@ -128,9 +124,7 @@ public abstract class FieldValueConverter {
WeightedSet ret = DataType.getWeightedSet(nextType, val.getDataType().createIfNonExistent(),
val.getDataType().removeIfZero()).createFieldValue();
- for (Map.Entry<FieldValue, Integer> entry : next.entrySet()) {
- ret.put(entry.getKey(), entry.getValue());
- }
+ ret.putAll(next);
return ret;
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ScriptParser.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ScriptParser.java
index 2b4e0db699b..ec9329c3c29 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ScriptParser.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ScriptParser.java
@@ -16,36 +16,20 @@ import com.yahoo.vespa.indexinglanguage.parser.TokenMgrException;
public final class ScriptParser {
public static Expression parseExpression(ScriptParserContext config) throws ParseException {
- return parse(config, new ParserMethod<Expression>() {
-
- @Override
- public Expression call(IndexingParser parser) throws ParseException {
- return parser.root();
- }
- });
+ return parse(config, parser -> parser.root());
}
public static ScriptExpression parseScript(ScriptParserContext config) throws ParseException {
- return parse(config, new ParserMethod<ScriptExpression>() {
-
- @Override
- public ScriptExpression call(IndexingParser parser) throws ParseException {
- return parser.script();
- }
- });
+ return parse(config, parser -> parser.script());
}
public static StatementExpression parseStatement(ScriptParserContext config) throws ParseException {
- return parse(config, new ParserMethod<StatementExpression>() {
-
- @Override
- public StatementExpression call(IndexingParser parser) throws ParseException {
- try {
- return parser.statement();
- }
- catch (TokenMgrException e) {
- throw new ParseException(e.getMessage());
- }
+ return parse(config, parser -> {
+ try {
+ return parser.statement();
+ }
+ catch (TokenMgrException e) {
+ throw new ParseException(e.getMessage());
}
});
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/SimpleAdapterFactory.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/SimpleAdapterFactory.java
index f45fe7f97c3..bba41240fb4 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/SimpleAdapterFactory.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/SimpleAdapterFactory.java
@@ -44,12 +44,12 @@ public class SimpleAdapterFactory implements AdapterFactory {
}
@Override
- public List<UpdateAdapter> newUpdateAdapterList(DocumentUpdate upd) {
+ public List<UpdateAdapter> newUpdateAdapterList(DocumentUpdate update) {
List<UpdateAdapter> ret = new ArrayList<>();
- DocumentType docType = upd.getDocumentType();
- DocumentId docId = upd.getId();
- Document complete = new Document(docType, upd.getId());
- for (FieldPathUpdate fieldUpd : upd) {
+ DocumentType docType = update.getDocumentType();
+ DocumentId docId = update.getId();
+ Document complete = new Document(docType, update.getId());
+ for (FieldPathUpdate fieldUpd : update) {
try {
if (FieldPathUpdateHelper.isComplete(fieldUpd)) {
// A 'complete' field path update is basically a regular top-level field update
@@ -60,21 +60,25 @@ public class SimpleAdapterFactory implements AdapterFactory {
ret.add(new IdentityFieldPathUpdateAdapter(fieldUpd, newDocumentAdapter(complete, true)));
}
} catch (NullPointerException e) {
- throw new IllegalArgumentException("Exception during handling of update '" + fieldUpd + "' to field '" + fieldUpd.getFieldPath() + "'", e);
+ throw new IllegalArgumentException("Exception during handling of update '" + fieldUpd +
+ "' to field '" + fieldUpd.getFieldPath() + "'", e);
}
}
- for (FieldUpdate fieldUpd : upd.fieldUpdates()) {
- Field field = fieldUpd.getField();
- for (ValueUpdate valueUpd : fieldUpd.getValueUpdates()) {
+ for (FieldUpdate fieldUpdate : update.fieldUpdates()) {
+ Field field = fieldUpdate.getField();
+ for (ValueUpdate valueUpdate : fieldUpdate.getValueUpdates()) {
try {
- if (FieldUpdateHelper.isComplete(field, valueUpd)) {
- FieldUpdateHelper.applyUpdate(field, valueUpd, complete);
+ if (FieldUpdateHelper.isComplete(field, valueUpdate)) {
+ FieldUpdateHelper.applyUpdate(field, valueUpdate, complete);
} else {
- Document partial = FieldUpdateHelper.newPartialDocument(docType, docId, field, valueUpd);
- ret.add(FieldUpdateAdapter.fromPartialUpdate(expressionSelector.selectExpression(docType, field.getName()), newDocumentAdapter(partial, true), valueUpd));
+ Document partial = FieldUpdateHelper.newPartialDocument(docType, docId, field, valueUpdate);
+ ret.add(FieldUpdateAdapter.fromPartialUpdate(expressionSelector.selectExpression(docType, field.getName()),
+ newDocumentAdapter(partial, true),
+ valueUpdate));
}
} catch (NullPointerException e) {
- throw new IllegalArgumentException("Exception during handling of update '" + valueUpd + "' to field '" + field + "'", e);
+ throw new IllegalArgumentException("Exception during handling of update '" + valueUpdate +
+ "' to field '" + field + "'", e);
}
}
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/UpdateAdapter.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/UpdateAdapter.java
index c6c0b6d9226..d4de467b25d 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/UpdateAdapter.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/UpdateAdapter.java
@@ -13,4 +13,7 @@ public interface UpdateAdapter extends FieldValueAdapter {
DocumentUpdate getOutput();
Expression getExpression(Expression expression);
+ @Override
+ default boolean isComplete() { return false; }
+
}
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
new file mode 100644
index 00000000000..4f83cbfdd8c
--- /dev/null
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ChoiceExpression.java
@@ -0,0 +1,88 @@
+// Copyright Yahoo. 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.datatypes.FieldValue;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * An expression which returns the value of the first of a list of subexpressions which
+ * returns a non-null value.
+ *
+ * Syntax: sub-expression1 || sub-expression2 || ...
+ *
+ * @author bratseth
+ */
+public class ChoiceExpression extends ExpressionList<Expression> {
+
+ public ChoiceExpression() {
+ this(List.of());
+ }
+
+ public ChoiceExpression(Expression... choices) {
+ this(Arrays.asList(choices));
+ }
+
+ public ChoiceExpression(Collection<? extends Expression> choices) {
+ super(choices, resolveInputType(choices));
+ }
+
+ @Override
+ protected void doExecute(ExecutionContext context) {
+ FieldValue input = context.getValue();
+ for (Expression expression : this) {
+ context.setValue(input).execute(expression);
+ if (context.getValue() != null)
+ break; // value found
+ }
+ }
+
+ @Override
+ protected void doVerify(VerificationContext context) {
+ DataType input = context.getValueType();
+ for (Expression exp : this)
+ context.setValueType(input).execute(exp);
+ context.setValueType(input);
+ }
+
+ private static DataType resolveInputType(Collection<? extends Expression> list) {
+ DataType previousInput = null;
+ DataType previousOutput = null;
+ for (Expression choice : list) {
+ DataType thisInput = choice.requiredInputType();
+ if (previousInput == null)
+ previousInput = thisInput;
+ else if (thisInput != null && !previousInput.isAssignableFrom(thisInput))
+ throw new VerificationException(ScriptExpression.class, "Choice expression require conflicting input types, " +
+ previousInput.getName() + " vs " + thisInput.getName() + ".");
+
+ DataType thisOutput = choice.createdOutputType();
+ if (previousOutput == null)
+ previousOutput = thisOutput;
+ else if (thisOutput != null && !previousOutput.isAssignableFrom(thisOutput))
+ throw new VerificationException(ScriptExpression.class, "Choice expression produce conflicting output types, " +
+ previousOutput.getName() + " vs " + thisOutput.getName() + ".");
+ }
+ return previousInput;
+ }
+
+ @Override
+ public DataType createdOutputType() {
+ return UnresolvedDataType.INSTANCE;
+ }
+
+ @Override
+ public String toString() {
+ return asList().stream().map(Object::toString).collect(Collectors.joining(" || "));
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return super.equals(obj) && obj instanceof ChoiceExpression;
+ }
+
+}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ClearStateExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ClearStateExpression.java
index 8c2608a34ab..58dfb33a017 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ClearStateExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ClearStateExpression.java
@@ -11,6 +11,7 @@ public final class ClearStateExpression extends Expression {
public ClearStateExpression() {
super(null);
}
+
@Override
protected void doExecute(ExecutionContext context) {
context.clear();
@@ -40,4 +41,5 @@ public final class ClearStateExpression extends Expression {
public int hashCode() {
return getClass().hashCode();
}
+
}
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 64043eddab8..27e5524f4ad 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
@@ -11,6 +11,7 @@ public abstract class CompositeExpression extends Expression {
protected CompositeExpression(DataType inputType) {
super(inputType);
}
+
protected static String toScriptBlock(Expression exp) {
if (exp instanceof ScriptExpression) {
return exp.toString();
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExecutionContext.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExecutionContext.java
index 389259cc811..f01f2fcc9fb 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExecutionContext.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExecutionContext.java
@@ -30,13 +30,18 @@ public class ExecutionContext implements FieldTypeAdapter, FieldValueAdapter, Cl
this.language = Language.UNKNOWN;
}
- public ExecutionContext execute(Expression exp) {
- if (exp != null) {
- exp.execute(this);
- }
+ public ExecutionContext execute(Expression expression) {
+ if (expression != null)
+ expression.execute(this);
return this;
}
+ /**
+ * Returns whether this is for a complete execution of all statements of a script,
+ * or a partial execution of only the statements accessing the available data.
+ */
+ public boolean isComplete() { return adapter == null ? false : adapter.isComplete(); }
+
@Override
public DataType getInputType(Expression exp, String fieldName) {
return adapter.getInputType(exp, fieldName);
@@ -65,9 +70,8 @@ public class ExecutionContext implements FieldTypeAdapter, FieldValueAdapter, Cl
@Override
public ExecutionContext setOutputValue(Expression exp, String fieldName, FieldValue fieldValue) {
- if (adapter == null) {
+ if (adapter == null)
throw new IllegalStateException("Can not set field '" + fieldName + "' because adapter is null.");
- }
adapter.setOutputValue(exp, fieldName, fieldValue);
return this;
}
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 e5bf4711ad1..bf8201ee7ee 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
@@ -52,21 +52,21 @@ public abstract class Expression extends Selectable {
}
public static DocumentUpdate execute(Expression expression, AdapterFactory factory, DocumentUpdate update) {
- DocumentUpdate ret = null;
+ DocumentUpdate result = null;
for (UpdateAdapter adapter : factory.newUpdateAdapterList(update)) {
DocumentUpdate output = adapter.getExpression(expression).execute(adapter);
if (output == null) {
// ignore
- } else if (ret != null) {
- ret.addAll(output);
+ } else if (result != null) {
+ result.addAll(output);
} else {
- ret = output;
+ result = output;
}
}
- if (ret != null) {
- ret.setCreateIfNonExistent(update.getCreateIfNonExistent());
+ if (result != null) {
+ result.setCreateIfNonExistent(update.getCreateIfNonExistent());
}
- return ret;
+ return result;
}
public final DocumentUpdate execute(UpdateAdapter adapter) {
@@ -206,18 +206,13 @@ public abstract class Expression extends Selectable {
protected static boolean equals(Object lhs, Object rhs) {
if (lhs == null) {
- if (rhs != null) {
- return false;
- }
+ return rhs == null;
} else {
if (rhs == null) {
return false;
}
- if (!lhs.equals(rhs)) {
- return false;
- }
+ return lhs.equals(rhs);
}
- return true;
}
// Convenience For testing
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 9fe63258605..e2ff1de7126 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
@@ -56,13 +56,8 @@ public abstract class ExpressionList<T extends Expression> extends CompositeExpr
@Override
@SuppressWarnings("rawtypes")
public boolean equals(Object obj) {
- if (!(obj instanceof ExpressionList)) {
- return false;
- }
- ExpressionList rhs = (ExpressionList)obj;
- if (!expressions.equals(rhs.expressions)) {
- return false;
- }
+ if (!(obj instanceof ExpressionList rhs)) return false;
+ if (!expressions.equals(rhs.expressions)) return false;
return true;
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/FieldValueAdapter.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/FieldValueAdapter.java
index 6f6074db2fd..e8ec1d33446 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/FieldValueAdapter.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/FieldValueAdapter.java
@@ -14,4 +14,7 @@ public interface FieldValueAdapter extends FieldTypeAdapter {
FieldValueAdapter setOutputValue(Expression exp, String fieldName, FieldValue fieldValue);
+ /** Returns true if this has values for all possibly existing inputs, or represents a partial set of values. */
+ boolean isComplete();
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/FlattenExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/FlattenExpression.java
index 8b4fab3ea2f..95cbaf3150d 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/FlattenExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/FlattenExpression.java
@@ -46,11 +46,7 @@ public final class FlattenExpression extends Expression {
str = input.getString().substring(span.getFrom(), span.getTo());
}
Integer pos = span.getTo();
- List<String> entry = map.get(pos);
- if (entry == null) {
- entry = new LinkedList<>();
- map.put(pos, entry);
- }
+ List<String> entry = map.computeIfAbsent(pos, k -> new LinkedList<>());
entry.add(str);
}
String inputVal = String.valueOf(input);
@@ -92,4 +88,5 @@ public final class FlattenExpression extends Expression {
public int hashCode() {
return getClass().hashCode();
}
+
}
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 ad5ecba8ff4..0f3a445bcb9 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
@@ -99,13 +99,8 @@ public final class ForEachExpression extends CompositeExpression {
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof ForEachExpression)) {
- return false;
- }
- ForEachExpression rhs = (ForEachExpression)obj;
- if (!exp.equals(rhs.exp)) {
- return false;
- }
+ if (!(obj instanceof ForEachExpression rhs)) return false;
+ if (!exp.equals(rhs.exp)) return false;
return true;
}
@@ -141,4 +136,5 @@ public final class ForEachExpression extends CompositeExpression {
public void selectMembers(ObjectPredicate predicate, ObjectOperation operation) {
select(exp, predicate, operation);
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GetFieldExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GetFieldExpression.java
index 0156e36628c..ecb6980f795 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GetFieldExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GetFieldExpression.java
@@ -26,10 +26,9 @@ public final class GetFieldExpression extends Expression {
@Override
protected void doExecute(ExecutionContext context) {
FieldValue input = context.getValue();
- if (!(input instanceof StructuredFieldValue)) {
+ if (!(input instanceof StructuredFieldValue struct)) {
throw new IllegalArgumentException("Expected structured input, got " + input.getDataType().getName() + ".");
}
- StructuredFieldValue struct = (StructuredFieldValue)input;
Field field = struct.getField(fieldName);
if (field == null) {
throw new IllegalArgumentException("Field '" + fieldName + "' not found in struct type '" +
@@ -64,13 +63,8 @@ public final class GetFieldExpression extends Expression {
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof GetFieldExpression)) {
- return false;
- }
- GetFieldExpression rhs = (GetFieldExpression)obj;
- if (!fieldName.equals(rhs.fieldName)) {
- return false;
- }
+ if (!(obj instanceof GetFieldExpression rhs)) return false;
+ if (!fieldName.equals(rhs.fieldName)) return false;
return true;
}
@@ -78,4 +72,5 @@ public final class GetFieldExpression extends Expression {
public int hashCode() {
return getClass().hashCode() + fieldName.hashCode();
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GetVarExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GetVarExpression.java
index 1b44b43729d..4ebf5da2ff8 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GetVarExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GetVarExpression.java
@@ -45,13 +45,8 @@ public final class GetVarExpression extends Expression {
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof GetVarExpression)) {
- return false;
- }
- GetVarExpression rhs = (GetVarExpression)obj;
- if (!varName.equals(rhs.varName)) {
- return false;
- }
+ if (!(obj instanceof GetVarExpression rhs)) return false;
+ if (!varName.equals(rhs.varName)) return false;
return true;
}
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 2e32e7ee03e..da7cfcdcaee 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
@@ -63,13 +63,8 @@ public final class GuardExpression extends CompositeExpression {
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof GuardExpression)) {
- return false;
- }
- GuardExpression rhs = (GuardExpression)obj;
- if (!exp.equals(rhs.exp)) {
- return false;
- }
+ if (!(obj instanceof GuardExpression rhs)) return false;
+ if (!exp.equals(rhs.exp)) return false;
return true;
}
@@ -95,4 +90,5 @@ public final class GuardExpression extends CompositeExpression {
}
}
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexDecodeExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexDecodeExpression.java
index 4596d3997c9..93f101a422e 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexDecodeExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexDecodeExpression.java
@@ -16,6 +16,7 @@ public final class HexDecodeExpression extends Expression {
public HexDecodeExpression() {
super(DataType.STRING);
}
+
@Override
protected void doExecute(ExecutionContext context) {
String input = String.valueOf(context.getValue());
@@ -62,4 +63,5 @@ public final class HexDecodeExpression extends Expression {
public int hashCode() {
return getClass().hashCode();
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexEncodeExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexEncodeExpression.java
index ca2be7c3400..3854598ddec 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexEncodeExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexEncodeExpression.java
@@ -47,4 +47,5 @@ public final class HexEncodeExpression extends Expression {
public int hashCode() {
return getClass().hashCode();
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HostNameExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HostNameExpression.java
index f249dc26864..922cf8be434 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HostNameExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HostNameExpression.java
@@ -51,4 +51,5 @@ public final class HostNameExpression extends Expression {
int pos = hostName.indexOf('.');
return pos < 0 ? hostName : hostName.substring(0, pos);
}
+
}
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 7f6be0a9f9a..8a29c8e8645 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
@@ -16,7 +16,7 @@ import java.math.BigDecimal;
*/
public final class IfThenExpression extends CompositeExpression {
- public static enum Comparator {
+ public enum Comparator {
EQ("=="),
NE("!="),
LT("<"),
@@ -34,6 +34,7 @@ public final class IfThenExpression extends CompositeExpression {
public String toString() {
return img;
}
+
}
private final Expression lhs;
@@ -151,10 +152,9 @@ public final class IfThenExpression extends CompositeExpression {
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof IfThenExpression)) {
+ if (!(obj instanceof IfThenExpression exp)) {
return false;
}
- IfThenExpression exp = (IfThenExpression)obj;
if (!lhs.equals(exp.lhs)) {
return false;
}
@@ -191,7 +191,7 @@ public final class IfThenExpression extends CompositeExpression {
}
if (!prev.equals(next)) {
throw new VerificationException(IfThenExpression.class, "Operands require conflicting input types, " +
- prev.getName() + " vs " + next.getName() + ".");
+ prev.getName() + " vs " + next.getName() + ".");
}
return prev;
}
@@ -205,21 +205,14 @@ public final class IfThenExpression extends CompositeExpression {
} else {
res = lhs.compareTo(rhs);
}
- switch (cmp) {
- case EQ:
- return res == 0;
- case NE:
- return res != 0;
- case GT:
- return res > 0;
- case GE:
- return res >= 0;
- case LT:
- return res < 0;
- case LE:
- return res <= 0;
- default:
- throw new UnsupportedOperationException(cmp.toString());
- }
+ return switch (cmp) {
+ case EQ -> res == 0;
+ case NE -> res != 0;
+ case GT -> res > 0;
+ case GE -> res >= 0;
+ case LT -> res < 0;
+ case LE -> res <= 0;
+ };
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/IndexExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/IndexExpression.java
index 3e52843764a..891d37be23d 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/IndexExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/IndexExpression.java
@@ -14,4 +14,5 @@ public final class IndexExpression extends OutputExpression {
public boolean equals(Object obj) {
return super.equals(obj) && obj instanceof IndexExpression;
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/InputExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/InputExpression.java
index cbec1ddd930..30c824d410d 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/InputExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/InputExpression.java
@@ -9,6 +9,7 @@ import com.yahoo.vespa.objects.ObjectPredicate;
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
/**
* @author Simon Thoresen Hult
@@ -20,7 +21,7 @@ public final class InputExpression extends Expression {
public InputExpression(String fieldName) {
super(null);
- this.fieldName = fieldName;
+ this.fieldName = Objects.requireNonNull(fieldName);
}
public String getFieldName() {
@@ -29,19 +30,17 @@ public final class InputExpression extends Expression {
@Override
protected void doExecute(ExecutionContext context) {
- if (fieldPath != null) {
+ if (fieldPath != null)
context.setValue(context.getInputValue(fieldPath));
- } else {
+ else
context.setValue(context.getInputValue(fieldName));
- }
}
@Override
protected void doVerify(VerificationContext context) {
DataType val = context.getInputType(this, fieldName);
- if (val == null) {
+ if (val == null)
throw new VerificationException(this, "Field '" + fieldName + "' not found.");
- }
context.setValueType(val);
}
@@ -57,13 +56,8 @@ public final class InputExpression extends Expression {
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof InputExpression)) {
- return false;
- }
- InputExpression rhs = (InputExpression)obj;
- if (!equals(fieldName, rhs.fieldName)) {
- return false;
- }
+ if ( ! (obj instanceof InputExpression rhs)) return false;
+ if ( ! equals(fieldName, rhs.fieldName)) return false;
return true;
}
@@ -97,8 +91,6 @@ public final class InputExpression extends Expression {
private final List<String> inputFieldNames = new ArrayList<>(1);
- public List<String> getInputFieldNames() { return inputFieldNames; }
-
@Override
public void execute(Object obj) {
inputFieldNames.add(((InputExpression) obj).getFieldName());
@@ -109,6 +101,12 @@ public final class InputExpression extends Expression {
return obj instanceof InputExpression;
}
+ public static List<String> runOn(Expression expression) {
+ InputExpression.InputFieldNameExtractor inputFieldNameExtractor = new InputExpression.InputFieldNameExtractor();
+ expression.select(inputFieldNameExtractor, inputFieldNameExtractor);
+ return inputFieldNameExtractor.inputFieldNames;
+ }
+
}
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/JoinExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/JoinExpression.java
index cf11196d870..1c3582ea695 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/JoinExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/JoinExpression.java
@@ -35,7 +35,7 @@ public final class JoinExpression extends Expression {
}
StringBuilder output = new StringBuilder();
for (Iterator<FieldValue> it = ((Array)input).fieldValueIterator(); it.hasNext(); ) {
- output.append(String.valueOf(it.next()));
+ output.append(it.next());
if (it.hasNext()) {
output.append(delimiter);
}
@@ -64,13 +64,8 @@ public final class JoinExpression extends Expression {
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof JoinExpression)) {
- return false;
- }
- JoinExpression rhs = (JoinExpression)obj;
- if (!delimiter.equals(rhs.delimiter)) {
- return false;
- }
+ if (!(obj instanceof JoinExpression rhs)) return false;
+ if (!delimiter.equals(rhs.delimiter)) return false;
return true;
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/LowerCaseExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/LowerCaseExpression.java
index a4a40bf988b..3a439127148 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/LowerCaseExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/LowerCaseExpression.java
@@ -14,6 +14,7 @@ public final class LowerCaseExpression extends Expression {
public LowerCaseExpression() {
super(DataType.STRING);
}
+
@Override
protected void doExecute(ExecutionContext context) {
context.setValue(new StringFieldValue(toLowerCase(String.valueOf(context.getValue()))));
@@ -43,4 +44,5 @@ public final class LowerCaseExpression extends Expression {
public int hashCode() {
return getClass().hashCode();
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/MathResolver.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/MathResolver.java
index 128087d3c12..47d4e789602 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/MathResolver.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/MathResolver.java
@@ -3,6 +3,7 @@ package com.yahoo.vespa.indexinglanguage.expressions;
import java.util.LinkedList;
import java.util.List;
+import java.util.Objects;
import java.util.Stack;
/**
@@ -13,10 +14,8 @@ public class MathResolver {
private final List<Item> items = new LinkedList<>();
public void push(ArithmeticExpression.Operator op, Expression exp) {
- op.getClass(); // throws NullPointerException
- if (items.isEmpty() && op != ArithmeticExpression.Operator.ADD) {
- throw new IllegalArgumentException("First item in an arithmetic operation must be an addition.");
- }
+ if (items.isEmpty() && op != ArithmeticExpression.Operator.ADD)
+ throw new IllegalArgumentException("First item in an arithmetic operation must be an addition, not " + op);
items.add(new Item(op, exp));
}
@@ -48,8 +47,9 @@ public class MathResolver {
Expression exp;
Item(ArithmeticExpression.Operator op, Expression exp) {
- this.op = op;
+ this.op = Objects.requireNonNull(op);
this.exp = exp;
}
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NGramExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NGramExpression.java
index d0181ddbf9d..b60f5e5cbc2 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NGramExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NGramExpression.java
@@ -100,9 +100,8 @@ public final class NGramExpression extends Expression {
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof NGramExpression)) return false;
+ if (!(obj instanceof NGramExpression rhs)) return false;
- NGramExpression rhs = (NGramExpression)obj;
if (linguistics == null) {
if (rhs.linguistics != null) return false;
} else if (rhs.linguistics != null) {
@@ -118,4 +117,5 @@ public final class NGramExpression extends Expression {
public int hashCode() {
return getClass().hashCode() + gramSize;
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NormalizeExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NormalizeExpression.java
index 0f43c0341f7..b94cfb03b2e 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NormalizeExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NormalizeExpression.java
@@ -25,7 +25,6 @@ public final class NormalizeExpression extends Expression {
public Linguistics getLinguistics() {
return linguistics;
}
-
private static String escape(String str) {
StringBuilder buf = new StringBuilder();
@@ -79,8 +78,7 @@ public final class NormalizeExpression extends Expression {
@Override
public boolean equals(Object o) {
- if (!(o instanceof NormalizeExpression)) return false;
- NormalizeExpression other = (NormalizeExpression)o;
+ if (!(o instanceof NormalizeExpression other)) return false;
if (linguistics.getClass() != other.linguistics.getClass()) return false;
return true;
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NowExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NowExpression.java
index 5dc626ce841..abfa0267c69 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NowExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NowExpression.java
@@ -46,13 +46,8 @@ public final class NowExpression extends Expression {
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof NowExpression)) {
- return false;
- }
- NowExpression rhs = (NowExpression)obj;
- if (timer != rhs.timer) {
- return false;
- }
+ if (!(obj instanceof NowExpression rhs)) return false;
+ if (timer != rhs.timer) return false;
return true;
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/OptimizePredicateExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/OptimizePredicateExpression.java
index 25e65ad84ae..d4b6f2e0a0a 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/OptimizePredicateExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/OptimizePredicateExpression.java
@@ -96,4 +96,5 @@ public final class OptimizePredicateExpression extends Expression {
return notNodeReorderer.process(processedPredicate, options);
}
}
+
}
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 f2abefe8d5e..894f87a9fac 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
@@ -48,13 +48,8 @@ public abstract class OutputExpression extends Expression {
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof OutputExpression)) {
- return false;
- }
- OutputExpression rhs = (OutputExpression)obj;
- if (!equals(fieldName, rhs.fieldName)) {
- return false;
- }
+ if (!(obj instanceof OutputExpression rhs)) return false;
+ if (!equals(fieldName, rhs.fieldName)) return false;
return true;
}
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 30cea57dafc..60b059f3ef1 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
@@ -50,13 +50,8 @@ public class ParenthesisExpression extends CompositeExpression {
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof ParenthesisExpression)) {
- return false;
- }
- ParenthesisExpression rhs = (ParenthesisExpression)obj;
- if (!innerExp.equals(rhs.innerExp)) {
- return false;
- }
+ if (!(obj instanceof ParenthesisExpression rhs)) return false;
+ if (!innerExp.equals(rhs.innerExp)) return false;
return true;
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/PassthroughExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/PassthroughExpression.java
index 02c61c4a05b..d5ce22fd8d4 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/PassthroughExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/PassthroughExpression.java
@@ -18,4 +18,5 @@ public final class PassthroughExpression extends OutputExpression {
public boolean equals(Object obj) {
return super.equals(obj) && obj instanceof PassthroughExpression;
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/RandomExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/RandomExpression.java
index e70af07cf20..b74662a8c8b 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/RandomExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/RandomExpression.java
@@ -4,6 +4,7 @@ package com.yahoo.vespa.indexinglanguage.expressions;
import com.yahoo.document.DataType;
import com.yahoo.document.datatypes.IntegerFieldValue;
+import java.util.Objects;
import java.util.concurrent.ThreadLocalRandom;
/**
@@ -29,11 +30,7 @@ public final class RandomExpression extends Expression {
@Override
protected void doExecute(ExecutionContext context) {
int max;
- if (this.max != null) {
- max = this.max;
- } else {
- max = Integer.parseInt(String.valueOf(context.getValue()));
- }
+ max = Objects.requireNonNullElseGet(this.max, () -> Integer.parseInt(String.valueOf(context.getValue())));
context.setValue(new IntegerFieldValue(ThreadLocalRandom.current().nextInt(max)));
}
@@ -54,13 +51,8 @@ public final class RandomExpression extends Expression {
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof RandomExpression)) {
- return false;
- }
- RandomExpression rhs = (RandomExpression)obj;
- if (!equals(max, rhs.max)) {
- return false;
- }
+ if (!(obj instanceof RandomExpression rhs)) return false;
+ if (!equals(max, rhs.max)) return false;
return true;
}
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 29942998083..f0c37960a99 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
@@ -15,6 +15,7 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
+import java.util.List;
import java.util.Map;
/**
@@ -37,12 +38,22 @@ public final class ScriptExpression extends ExpressionList<StatementExpression>
@Override
protected void doExecute(ExecutionContext context) {
FieldValue input = context.getValue();
- for (Expression exp : this) {
- context.setValue(input).execute(exp);
+ for (StatementExpression statement : this) {
+ if (context.isComplete() ||
+ (statement.getInputFields().isEmpty() || containsAtLeastOneInputFrom(statement.getInputFields(), context))) {
+ context.setValue(input).execute(statement);
+ }
}
context.setValue(input);
}
+ private boolean containsAtLeastOneInputFrom(List<String> inputFields, ExecutionContext context) {
+ for (String inputField : inputFields)
+ if (context.getInputValue(inputField) != null)
+ return true;
+ return false;
+ }
+
@Override
protected void doVerify(VerificationContext context) {
DataType input = context.getValueType();
@@ -60,7 +71,7 @@ public final class ScriptExpression extends ExpressionList<StatementExpression>
prev = next;
} else if (next != null && !prev.isAssignableFrom(next)) {
throw new VerificationException(ScriptExpression.class, "Statements require conflicting input types, " +
- prev.getName() + " vs " + next.getName() + ".");
+ prev.getName() + " vs " + next.getName() + ".");
}
}
return prev;
@@ -102,4 +113,5 @@ public final class ScriptExpression extends ExpressionList<StatementExpression>
public static ScriptExpression newInstance(ScriptParserContext config) throws ParseException {
return ScriptParser.parseScript(config);
}
+
}
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 9d4c69267da..212b60525f9 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
@@ -34,7 +34,7 @@ public final class SelectInputExpression extends CompositeExpression {
@Override
public void setStatementOutput(DocumentType documentType, Field field) {
for (var casePair : cases)
- casePair.getSecond().setStatementOutput(documentType, field);
+ casePair.getSecond().setStatementOutput(documentType, field);
}
@Override
@@ -94,13 +94,8 @@ public final class SelectInputExpression extends CompositeExpression {
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof SelectInputExpression)) {
- return false;
- }
- SelectInputExpression rhs = (SelectInputExpression)obj;
- if (!cases.equals(rhs.cases)) {
- return false;
- }
+ if (!(obj instanceof SelectInputExpression rhs)) return false;
+ if (!cases.equals(rhs.cases)) return false;
return true;
}
@@ -108,4 +103,5 @@ public final class SelectInputExpression extends CompositeExpression {
public int hashCode() {
return getClass().hashCode() + cases.hashCode();
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetLanguageExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetLanguageExpression.java
index 42442eebc13..537a1275037 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetLanguageExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetLanguageExpression.java
@@ -36,9 +36,7 @@ public final class SetLanguageExpression extends Expression {
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof SetLanguageExpression)) {
- return false;
- }
+ if (!(obj instanceof SetLanguageExpression)) return false;
return true;
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetValueExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetValueExpression.java
index eca5ace1610..f7348c24af5 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetValueExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetValueExpression.java
@@ -45,20 +45,15 @@ public final class SetValueExpression extends Expression {
return "\"" + StringUtilities.escape(value.toString(), '"') + "\"";
}
if (value instanceof LongFieldValue) {
- return value.toString() + "L";
+ return value + "L";
}
return value.toString();
}
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof SetValueExpression)) {
- return false;
- }
- SetValueExpression rhs = (SetValueExpression)obj;
- if (!value.equals(rhs.value)) {
- return false;
- }
+ if (!(obj instanceof SetValueExpression rhs)) return false;
+ if (!value.equals(rhs.value)) return false;
return true;
}
@@ -66,4 +61,5 @@ public final class SetValueExpression extends Expression {
public int hashCode() {
return getClass().hashCode() + value.hashCode();
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetVarExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetVarExpression.java
index a3c7baf7bc4..a855ba86c9c 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetVarExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetVarExpression.java
@@ -47,13 +47,8 @@ public final class SetVarExpression extends Expression {
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof SetVarExpression)) {
- return false;
- }
- SetVarExpression rhs = (SetVarExpression)obj;
- if (!varName.equals(rhs.varName)) {
- return false;
- }
+ if (!(obj instanceof SetVarExpression rhs)) return false;
+ if (!varName.equals(rhs.varName)) return false;
return true;
}
@@ -61,4 +56,5 @@ public final class SetVarExpression extends Expression {
public int hashCode() {
return getClass().hashCode() + varName.hashCode();
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SplitExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SplitExpression.java
index 7755a77916b..34740f49d6b 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SplitExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SplitExpression.java
@@ -54,13 +54,8 @@ public final class SplitExpression extends Expression {
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof SplitExpression)) {
- return false;
- }
- SplitExpression rhs = (SplitExpression)obj;
- if (!splitPattern.toString().equals(rhs.splitPattern.toString())) {
- return false;
- }
+ if (!(obj instanceof SplitExpression rhs)) return false;
+ if (!splitPattern.toString().equals(rhs.splitPattern.toString())) return false;
return true;
}
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 38157531ba2..8516ddb883d 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
@@ -15,13 +15,17 @@ import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.stream.Collectors;
/**
* @author Simon Thoresen Hult
*/
public final class StatementExpression extends ExpressionList<Expression> {
- /** The name of the (last) output field tthis statement will write to, or null if none */
+ /** The names of the fields consumed by this. */
+ private final List<String> inputFields;
+
+ /** The name of the (last) output field this statement will write to, or null if none */
private String outputField;
public StatementExpression(Expression... lst) {
@@ -34,12 +38,16 @@ public final class StatementExpression extends ExpressionList<Expression> {
private StatementExpression(Iterable<Expression> list, Object unused) {
super(list, resolveInputType(list));
+ inputFields = List.copyOf(InputExpression.InputFieldNameExtractor.runOn(this));
}
+ /** Returns the input fields which are (perhaps optionally) consumed by some expression in this statement. */
+ public List<String> getInputFields() { return inputFields; }
+
@Override
protected void doExecute(ExecutionContext context) {
- for (Expression exp : this) {
- context.execute(exp);
+ for (Expression expression : this) {
+ context.execute(expression);
}
}
@@ -58,14 +66,10 @@ public final class StatementExpression extends ExpressionList<Expression> {
private static DataType resolveInputType(Iterable<Expression> lst) {
for (Expression exp : lst) {
DataType type = exp.requiredInputType();
- if (type != null) {
- return type;
- }
+ if (type != null) return type;
type = exp.createdOutputType();
- if (type != null) {
- return null;
- }
+ if (type != null) return null;
}
return null;
}
@@ -74,23 +78,14 @@ public final class StatementExpression extends ExpressionList<Expression> {
public DataType createdOutputType() {
for (int i = size(); --i >= 0; ) {
DataType type = get(i).createdOutputType();
- if (type != null) {
- return type;
- }
+ if (type != null) return type;
}
return null;
}
@Override
public String toString() {
- StringBuilder ret = new StringBuilder();
- for (Iterator<Expression> it = iterator(); it.hasNext();) {
- ret.append(it.next());
- if (it.hasNext()) {
- ret.append(" | ");
- }
- }
- return ret.toString();
+ return asList().stream().map(Expression::toString).collect(Collectors.joining(" | "));
}
@Override
@@ -122,4 +117,5 @@ public final class StatementExpression extends ExpressionList<Expression> {
}
return ret;
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SubstringExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SubstringExpression.java
index 10f6890fbec..6f96a215edb 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SubstringExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SubstringExpression.java
@@ -60,16 +60,9 @@ public final class SubstringExpression extends Expression {
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof SubstringExpression)) {
- return false;
- }
- SubstringExpression rhs = (SubstringExpression)obj;
- if (from != rhs.from) {
- return false;
- }
- if (to != rhs.to) {
- return false;
- }
+ if (!(obj instanceof SubstringExpression rhs)) return false;
+ if (from != rhs.from) return false;
+ if (to != rhs.to) return false;
return true;
}
@@ -79,4 +72,5 @@ public final class SubstringExpression extends Expression {
Integer.valueOf(from).hashCode() +
Integer.valueOf(to).hashCode();
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SummaryExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SummaryExpression.java
index c4a2ac7fd88..6284fdba92d 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SummaryExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SummaryExpression.java
@@ -14,4 +14,5 @@ public final class SummaryExpression extends OutputExpression {
public boolean equals(Object obj) {
return super.equals(obj) && obj instanceof SummaryExpression;
}
+
}
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 e46b721df90..86913d8c1ba 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
@@ -29,9 +29,7 @@ public final class SwitchExpression extends CompositeExpression {
public <T extends Expression> SwitchExpression(Map<String, T> cases, Expression defaultExp) {
super(null);
this.defaultExp = defaultExp;
- for (Map.Entry<String, T> entry : cases.entrySet()) {
- this.cases.put(entry.getKey(), entry.getValue());
- }
+ this.cases.putAll(cases);
}
public boolean isEmpty() {
@@ -121,16 +119,9 @@ public final class SwitchExpression extends CompositeExpression {
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof SwitchExpression)) {
- return false;
- }
- SwitchExpression rhs = (SwitchExpression)obj;
- if (!cases.equals(rhs.cases)) {
- return false;
- }
- if (!equals(defaultExp, rhs.defaultExp)) {
- return false;
- }
+ if (!(obj instanceof SwitchExpression rhs)) return false;
+ if (!cases.equals(rhs.cases)) return false;
+ if (!equals(defaultExp, rhs.defaultExp)) return false;
return true;
}
@@ -138,4 +129,5 @@ public final class SwitchExpression extends CompositeExpression {
public int hashCode() {
return getClass().hashCode() + (defaultExp != null ? defaultExp.hashCode() : 0);
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ThisExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ThisExpression.java
index 7b4bb32bdb0..07782b6ac23 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ThisExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ThisExpression.java
@@ -11,6 +11,7 @@ public final class ThisExpression extends Expression {
public ThisExpression() {
super(UnresolvedDataType.INSTANCE);
}
+
@Override
protected void doExecute(ExecutionContext context) {
// empty
@@ -40,4 +41,5 @@ public final class ThisExpression extends Expression {
public int hashCode() {
return getClass().hashCode();
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToArrayExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToArrayExpression.java
index df0277a23f4..165dce7c516 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToArrayExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToArrayExpression.java
@@ -14,6 +14,7 @@ public final class ToArrayExpression extends Expression {
public ToArrayExpression() {
super(UnresolvedDataType.INSTANCE);
}
+
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
protected void doExecute(ExecutionContext context) {
@@ -51,4 +52,5 @@ public final class ToArrayExpression extends Expression {
public int hashCode() {
return getClass().hashCode();
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToByteExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToByteExpression.java
index 4b398594e3e..7bde439aec0 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToByteExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToByteExpression.java
@@ -12,6 +12,7 @@ public final class ToByteExpression extends Expression {
public ToByteExpression() {
super(UnresolvedDataType.INSTANCE);
}
+
@Override
protected void doExecute(ExecutionContext context) {
context.setValue(new ByteFieldValue(Byte.valueOf(String.valueOf(context.getValue()))));
@@ -41,4 +42,5 @@ public final class ToByteExpression extends Expression {
public int hashCode() {
return getClass().hashCode();
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToDoubleExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToDoubleExpression.java
index 05470d91bb3..c630999bbc3 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToDoubleExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToDoubleExpression.java
@@ -12,6 +12,7 @@ public final class ToDoubleExpression extends Expression {
public ToDoubleExpression() {
super(UnresolvedDataType.INSTANCE);
}
+
@Override
protected void doExecute(ExecutionContext context) {
context.setValue(new DoubleFieldValue(Double.valueOf(String.valueOf(context.getValue()))));
@@ -41,4 +42,5 @@ public final class ToDoubleExpression extends Expression {
public int hashCode() {
return getClass().hashCode();
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToFloatExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToFloatExpression.java
index 1396583e788..2883b8ba0b7 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToFloatExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToFloatExpression.java
@@ -12,6 +12,7 @@ public final class ToFloatExpression extends Expression {
public ToFloatExpression() {
super(UnresolvedDataType.INSTANCE);
}
+
@Override
protected void doExecute(ExecutionContext context) {
context.setValue(new FloatFieldValue(Float.valueOf(String.valueOf(context.getValue()))));
@@ -41,4 +42,5 @@ public final class ToFloatExpression extends Expression {
public int hashCode() {
return getClass().hashCode();
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToIntegerExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToIntegerExpression.java
index 6c25b2dfa42..ba51fc47af6 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToIntegerExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToIntegerExpression.java
@@ -12,6 +12,7 @@ public final class ToIntegerExpression extends Expression {
public ToIntegerExpression() {
super(UnresolvedDataType.INSTANCE);
}
+
@Override
protected void doExecute(ExecutionContext context) {
context.setValue(new IntegerFieldValue(Integer.valueOf(String.valueOf(context.getValue()))));
@@ -41,4 +42,5 @@ public final class ToIntegerExpression extends Expression {
public int hashCode() {
return getClass().hashCode();
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToLongExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToLongExpression.java
index 0a074316773..5278d9504b2 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToLongExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToLongExpression.java
@@ -12,6 +12,7 @@ public final class ToLongExpression extends Expression {
public ToLongExpression() {
super(UnresolvedDataType.INSTANCE);
}
+
@Override
protected void doExecute(ExecutionContext context) {
context.setValue(new LongFieldValue(Long.valueOf(String.valueOf(context.getValue()))));
@@ -41,4 +42,5 @@ public final class ToLongExpression extends Expression {
public int hashCode() {
return getClass().hashCode();
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToPositionExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToPositionExpression.java
index 8f41a3329c6..30399407a7e 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToPositionExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToPositionExpression.java
@@ -12,6 +12,7 @@ public final class ToPositionExpression extends Expression {
public ToPositionExpression() {
super(DataType.STRING);
}
+
@Override
protected void doExecute(ExecutionContext context) {
context.setValue(PositionDataType.fromString(String.valueOf(context.getValue())));
@@ -42,3 +43,4 @@ public final class ToPositionExpression extends Expression {
return getClass().hashCode();
}
}
+
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToStringExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToStringExpression.java
index 0ff127fdc03..e7360890f04 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToStringExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToStringExpression.java
@@ -12,6 +12,7 @@ public final class ToStringExpression extends Expression {
public ToStringExpression() {
super(UnresolvedDataType.INSTANCE);
}
+
@Override
protected void doExecute(ExecutionContext context) {
context.setValue(new StringFieldValue(String.valueOf(context.getValue())));
@@ -41,4 +42,5 @@ public final class ToStringExpression extends Expression {
public int hashCode() {
return getClass().hashCode();
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToWsetExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToWsetExpression.java
index bb1aa82c502..0bfe0312e50 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToWsetExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToWsetExpression.java
@@ -76,7 +76,8 @@ public final class ToWsetExpression extends Expression {
@Override
public int hashCode() {
return getClass().hashCode() +
- Boolean.valueOf(createIfNonExistent).hashCode() +
- Boolean.valueOf(removeIfZero).hashCode();
+ createIfNonExistent.hashCode() +
+ removeIfZero.hashCode();
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/TokenizeExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/TokenizeExpression.java
index 577bc1e8d28..baf36858f66 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/TokenizeExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/TokenizeExpression.java
@@ -74,13 +74,8 @@ public final class TokenizeExpression extends Expression {
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof TokenizeExpression)) {
- return false;
- }
- TokenizeExpression rhs = (TokenizeExpression)obj;
- if (!config.equals(rhs.config)) {
- return false;
- }
+ if (!(obj instanceof TokenizeExpression rhs)) return false;
+ if (!config.equals(rhs.config)) return false;
return true;
}
@@ -88,4 +83,5 @@ public final class TokenizeExpression extends Expression {
public int hashCode() {
return getClass().hashCode() + config.hashCode();
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/TrimExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/TrimExpression.java
index 6f65dfb3ee4..62da064c35d 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/TrimExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/TrimExpression.java
@@ -45,4 +45,5 @@ public final class TrimExpression extends Expression {
public int hashCode() {
return getClass().hashCode();
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/UnresolvedFieldValue.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/UnresolvedFieldValue.java
index 9dd69acf328..a2c134ff71f 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/UnresolvedFieldValue.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/UnresolvedFieldValue.java
@@ -13,11 +13,14 @@ import com.yahoo.document.serialization.XmlStream;
* @author Simon Thoresen Hult
*/
public class UnresolvedFieldValue extends FieldValue {
+
private static class Factory extends PrimitiveDataType.Factory {
@Override public FieldValue create() { return new UnresolvedFieldValue(); }
@Override public FieldValue create(String value) { throw new UnsupportedOperationException(); }
}
+
public static PrimitiveDataType.Factory getFactory() { return new Factory(); }
+
@Override
public DataType getDataType() {
return UnresolvedDataType.INSTANCE;
@@ -47,4 +50,5 @@ public class UnresolvedFieldValue extends FieldValue {
public void deserialize(Field field, FieldReader reader) {
throw new UnsupportedOperationException();
}
+
}
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 ec05b1317e5..98a816eb728 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
@@ -38,4 +38,5 @@ public class VerificationException extends RuntimeException {
public String toString() {
return getClass().getName() + ": For expression '" + exp + "': " + getMessage();
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ZCurveExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ZCurveExpression.java
index 58dea7cc207..673b6df6d23 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ZCurveExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ZCurveExpression.java
@@ -16,6 +16,7 @@ public final class ZCurveExpression extends Expression {
public ZCurveExpression() {
super(PositionDataType.INSTANCE);
}
+
@Override
protected void doExecute(ExecutionContext context) {
Struct input = ((Struct) context.getValue());
@@ -60,4 +61,5 @@ public final class ZCurveExpression extends Expression {
public int hashCode() {
return getClass().hashCode();
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/linguistics/AnnotatorConfig.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/linguistics/AnnotatorConfig.java
index 441ac711cc3..e42ac6479f8 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/linguistics/AnnotatorConfig.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/linguistics/AnnotatorConfig.java
@@ -97,10 +97,9 @@ public class AnnotatorConfig implements Cloneable {
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof AnnotatorConfig)) {
+ if (!(obj instanceof AnnotatorConfig rhs)) {
return false;
}
- AnnotatorConfig rhs = (AnnotatorConfig)obj;
if (!language.equals(rhs.language)) {
return false;
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/parser/IndexingInput.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/parser/IndexingInput.java
index 3646a9f2681..78c6a4bbf03 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/parser/IndexingInput.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/parser/IndexingInput.java
@@ -11,4 +11,5 @@ public final class IndexingInput extends FastCharStream implements CharStream {
public IndexingInput(String input) {
super(input);
}
+
}
diff --git a/indexinglanguage/src/main/javacc/IndexingParser.jj b/indexinglanguage/src/main/javacc/IndexingParser.jj
index 51bb9be1f8a..9f0b4733119 100644
--- a/indexinglanguage/src/main/javacc/IndexingParser.jj
+++ b/indexinglanguage/src/main/javacc/IndexingParser.jj
@@ -8,7 +8,6 @@ options {
CACHE_TOKENS = false;
DEBUG_PARSER = false;
ERROR_REPORTING = true;
- STATIC = false;
USER_CHAR_STREAM = true;
}
@@ -24,7 +23,7 @@ package com.yahoo.vespa.indexinglanguage.parser;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List;
-import java.util.LinkedList;
+import java.util.ArrayList;
import java.util.Map;
import java.util.LinkedHashMap;
@@ -137,6 +136,7 @@ TOKEN :
<LE: "<="> |
<GT: ">"> |
<GE: ">="> |
+ <CHOICE: "||"> |
<PIPE: "|"> |
<LCURLY: "{"> |
<RCURLY: "}"> |
@@ -229,7 +229,7 @@ Expression root() :
ScriptExpression script() :
{
StatementExpression exp;
- List<StatementExpression> lst = new LinkedList<StatementExpression>();
+ List<StatementExpression> lst = new ArrayList<StatementExpression>();
}
{
( <LCURLY> nl() exp = statement() { lst.add(exp); } nl()
@@ -240,7 +240,7 @@ ScriptExpression script() :
StatementExpression statement() :
{
Expression exp;
- List<Expression> lst = new LinkedList<Expression>();
+ List<Expression> lst = new ArrayList<Expression>();
}
{
( exp = expression() { lst.add(exp); } ( <PIPE> nl() exp = expression() { lst.add(exp); } )* )
@@ -249,8 +249,19 @@ StatementExpression statement() :
Expression expression() :
{
+ Expression choice;
+ List<Expression> choices = new ArrayList<Expression>();
+}
+{
+ choice = nonChoiceExpression() { choices.add(choice); }
+ ( <CHOICE> choice = nonChoiceExpression() { choices.add(choice); } )*
+ { return choices.size() == 1 ? choices.get(0) : new ChoiceExpression(choices); }
+}
+
+Expression nonChoiceExpression() :
+{
Expression exp;
- List<Expression> lst = new LinkedList<Expression>();
+ List<Expression> lst = new ArrayList<Expression>();
}
{
( exp = math() { lst.add(exp); } ( <DOT> exp = math() { lst.add(exp); } )* )
@@ -274,6 +285,8 @@ Expression math() :
{ return math.resolve(); }
}
+
+
Expression value() :
{
Expression val;
@@ -553,7 +566,7 @@ Expression randomExp() :
Expression selectInputExp() :
{
- List<Pair<String, Expression>> cases = new LinkedList<Pair<String, Expression>>();
+ List<Pair<String, Expression>> cases = new ArrayList<Pair<String, Expression>>();
Expression exp;
String str;
}