From 12f9d93fd13a74eb022e8ef0633ff3b1456d345b Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Wed, 27 Sep 2023 17:28:13 +0200 Subject: Return the expected output In if-else expressions, return the output of the executed branch rather than the input. The current behavior was undocumented and quite unexpected, so I suggest we treat that as a bug. Also return the last executed expression in a script as its output (rather than nothing. In addition, improve some error messages. --- .../indexinglanguage/ExpressionOptimizer.java | 2 +- .../indexinglanguage/FieldPathUpdateAdapter.java | 9 +- .../vespa/indexinglanguage/FieldUpdateAdapter.java | 4 +- .../vespa/indexinglanguage/FieldUpdateHelper.java | 2 +- .../indexinglanguage/FieldValueConverter.java | 14 ++-- .../indexinglanguage/SimpleDocumentAdapter.java | 8 +- .../expressions/ArithmeticExpression.java | 48 +++++------ .../expressions/Base64DecodeExpression.java | 4 +- .../expressions/CatExpression.java | 4 +- .../expressions/ChoiceExpression.java | 4 +- .../expressions/ConstantExpression.java | 66 +++++++++++++++ .../expressions/EmbedExpression.java | 2 +- .../expressions/ExecutionContext.java | 6 +- .../indexinglanguage/expressions/Expression.java | 21 +++-- .../expressions/ExpressionList.java | 4 +- .../expressions/ForEachExpression.java | 6 +- .../expressions/GetFieldExpression.java | 4 +- .../expressions/GetVarExpression.java | 2 +- .../expressions/HashExpression.java | 2 +- .../expressions/HexDecodeExpression.java | 6 +- .../expressions/IfThenExpression.java | 98 +++++++++++----------- .../expressions/InputExpression.java | 2 +- .../expressions/JoinExpression.java | 4 +- .../expressions/OptimizePredicateExpression.java | 4 +- .../expressions/ScriptExpression.java | 18 ++-- .../expressions/SelectInputExpression.java | 2 +- .../expressions/SetValueExpression.java | 65 -------------- .../expressions/SetVarExpression.java | 2 +- .../expressions/StatementExpression.java | 8 +- .../expressions/SwitchExpression.java | 6 +- indexinglanguage/src/main/javacc/IndexingParser.jj | 4 +- 31 files changed, 214 insertions(+), 217 deletions(-) create mode 100644 indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ConstantExpression.java delete mode 100644 indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetValueExpression.java (limited to 'indexinglanguage/src/main') diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionOptimizer.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionOptimizer.java index 5df066f06fa..1a1e26b1091 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionOptimizer.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionOptimizer.java @@ -70,7 +70,7 @@ public class ExpressionOptimizer extends ExpressionConverter { } return exp instanceof InputExpression || exp instanceof NowExpression || - exp instanceof SetValueExpression || + exp instanceof ConstantExpression || exp instanceof HostNameExpression || exp instanceof GetVarExpression; } diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldPathUpdateAdapter.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldPathUpdateAdapter.java index 3c3f75a6693..24ed6b898fd 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldPathUpdateAdapter.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldPathUpdateAdapter.java @@ -75,7 +75,7 @@ public class FieldPathUpdateAdapter implements UpdateAdapter { if (type == FieldPathEntry.Type.STRUCT_FIELD) { if (!(value instanceof StructuredFieldValue)) { throw new IllegalArgumentException("Expected structured field value, got " + - value.getClass().getName() + "."); + value.getClass().getName()); } for (Iterator> it = ((StructuredFieldValue)value).iterator(); it.hasNext();) { Map.Entry structEntry = it.next(); @@ -84,8 +84,7 @@ public class FieldPathUpdateAdapter implements UpdateAdapter { createUpdatesAt(nextPath, structEntry.getValue(), idx + 1, out); } } else if (type == FieldPathEntry.Type.MAP_KEY) { - if (value instanceof WeightedSet) { - WeightedSet wset = (WeightedSet)value; + if (value instanceof WeightedSet wset) { for (Iterator it = wset.fieldValueIterator(); it.hasNext();) { FieldValue wsetEntry = it.next(); List nextPath = new ArrayList<>(path); @@ -102,7 +101,7 @@ public class FieldPathUpdateAdapter implements UpdateAdapter { } } else { throw new IllegalArgumentException("Expected map or weighted set, got " + - value.getClass().getName() + "."); + value.getClass().getName()); } } else { path.add(pathEntry); @@ -111,7 +110,7 @@ public class FieldPathUpdateAdapter implements UpdateAdapter { } else if (update instanceof AddFieldPathUpdate) { if (!(value instanceof Array)) { throw new IllegalStateException("Expected array, got " + - value.getClass().getName() + "."); + value.getClass().getName()); } out.addFieldPathUpdate(new AddFieldPathUpdate(update.getDocumentType(), new FieldPath(path).toString(), update.getOriginalWhereClause(), (Array)value)); 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 2601c5d0f71..b2ef838bcc4 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateAdapter.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateAdapter.java @@ -152,7 +152,7 @@ public class FieldUpdateAdapter implements UpdateAdapter { if (val instanceof Array) { lst.addAll(createMapValueUpdatesForArray((Array)val, (MapValueUpdate)upd)); } else if (val instanceof MapFieldValue) { - throw new UnsupportedOperationException("Can not map into a " + val.getClass().getName() + "."); + throw new UnsupportedOperationException("Can not map into a " + val.getClass().getName()); } else if (val instanceof StructuredFieldValue) { lst.addAll(createMapValueUpdatesForStruct((StructuredFieldValue)val, (MapValueUpdate)upd)); } else if (val instanceof WeightedSet) { @@ -168,7 +168,7 @@ public class FieldUpdateAdapter implements UpdateAdapter { lst.add(upd); } else { throw new UnsupportedOperationException( - "Value update type " + upd.getClass().getName() + " not supported."); + "Value update type " + upd.getClass().getName() + " not supported"); } return lst; } 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 8c32f2e451d..a7fed91c360 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateHelper.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateHelper.java @@ -95,7 +95,7 @@ public abstract class FieldUpdateHelper { return applyUpdate(nestedUpdate, value); } } else if (value instanceof MapFieldValue) { - throw new UnsupportedOperationException("Can not map into a " + value.getClass().getName() + "."); + 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) { 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 4f96f2b7a31..d2cf97273ad 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldValueConverter.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldValueConverter.java @@ -49,7 +49,7 @@ public abstract class FieldValueConverter { nextType = nextVal.getDataType(); } else if (!nextType.isValueCompatible(nextVal)) { throw new IllegalArgumentException("Expected " + nextType.getName() + ", got " + - nextVal.getDataType().getName() + "."); + nextVal.getDataType().getName()); } next.add(nextVal); } @@ -63,7 +63,7 @@ public abstract class FieldValueConverter { @SuppressWarnings({ "unchecked", "rawtypes" }) private FieldValue convertMap(MapFieldValue val) { - Map next = new LinkedHashMap(); + Map next = new LinkedHashMap<>(); DataType nextKeyType = null, nextValType = null; for (Map.Entry entry : val.entrySet()) { FieldValue prevKey = entry.getKey(); @@ -75,7 +75,7 @@ public abstract class FieldValueConverter { nextKeyType = nextKey.getDataType(); } else if (!nextKeyType.isValueCompatible(nextKey)) { throw new IllegalArgumentException("Expected " + nextKeyType.getName() + ", got " + - nextKey.getDataType().getName() + "."); + nextKey.getDataType().getName()); } FieldValue prevVal = entry.getValue(); FieldValue nextVal = convert(prevVal); @@ -86,7 +86,7 @@ public abstract class FieldValueConverter { nextValType = nextVal.getDataType(); } else if (!nextValType.isValueCompatible(nextVal)) { throw new IllegalArgumentException("Expected " + nextValType.getName() + ", got " + - nextVal.getDataType().getName() + "."); + nextVal.getDataType().getName()); } next.put(nextKey, nextVal); } @@ -100,7 +100,7 @@ public abstract class FieldValueConverter { @SuppressWarnings({ "unchecked", "rawtypes" }) private FieldValue convertWset(WeightedSet val) { - Map next = new LinkedHashMap(); + Map next = new LinkedHashMap<>(); DataType nextType = null; for (Iterator it = val.fieldValueIterator(); it.hasNext();) { FieldValue prevKey = it.next(); @@ -114,7 +114,7 @@ public abstract class FieldValueConverter { nextType = nextKey.getDataType(); } else if (!nextType.isValueCompatible(nextKey)) { throw new IllegalArgumentException("Expected " + nextType.getName() + ", got " + - nextKey.getDataType().getName() + "."); + nextKey.getDataType().getName()); } next.put(nextKey, prevVal); } @@ -143,7 +143,7 @@ public abstract class FieldValueConverter { } /** - * Returns whether or not the given {@link FieldValue} should be converted. If this method returns false, + * Returns whether the given {@link FieldValue} should be converted. If this method returns false, * the converter will proceed to traverse the value itself to see if its internal can be converted. * * @param value the value to check diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/SimpleDocumentAdapter.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/SimpleDocumentAdapter.java index f36c44539c7..bab1f5fe7c0 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/SimpleDocumentAdapter.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/SimpleDocumentAdapter.java @@ -41,7 +41,7 @@ public class SimpleDocumentAdapter implements DocumentAdapter { try { return input.getDataType().buildFieldPath(fieldName).getResultingDataType(); } catch (IllegalArgumentException e) { - throw new VerificationException(exp, "Input field '" + fieldName + "' not found."); + throw new VerificationException(exp, "Input field '" + fieldName + "' not found"); } } @@ -67,12 +67,12 @@ public class SimpleDocumentAdapter implements DocumentAdapter { public void tryOutputType(Expression exp, String fieldName, DataType valueType) { Field field = output.getDataType().getField(fieldName); if (field == null) { - throw new VerificationException(exp, "Field '" + fieldName + "' not found."); + throw new VerificationException(exp, "Field '" + fieldName + "' not found"); } DataType fieldType = field.getDataType(); if (!fieldType.isAssignableFrom(valueType)) { throw new VerificationException(exp, "Can not assign " + valueType.getName() + " to field '" + - fieldName + "' which is " + fieldType.getName() + "."); + fieldName + "' which is " + fieldType.getName()); } } @@ -81,7 +81,7 @@ public class SimpleDocumentAdapter implements DocumentAdapter { Field field = output.getField(fieldName); if (field == null) { throw new IllegalArgumentException("Field '" + fieldName + "' not found in document type '" + - output.getDataType().getName() + "'."); + output.getDataType().getName()); } output.setFieldValue(field, fieldValue); return this; 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 b7ee444975f..8fff5d488c2 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 @@ -42,28 +42,28 @@ public final class ArithmeticExpression extends CompositeExpression { } } - private final Expression lhs; + private final Expression left; private final Operator op; - private final Expression rhs; + private final Expression right; - public ArithmeticExpression(Expression lhs, Operator op, Expression rhs) { - super(requiredInputType(lhs, rhs)); - lhs.getClass(); // throws NullPointerException + public ArithmeticExpression(Expression left, Operator op, Expression right) { + super(requiredInputType(left, right)); + left.getClass(); // throws NullPointerException op.getClass(); - rhs.getClass(); - this.lhs = lhs; + right.getClass(); + this.left = left; this.op = op; - this.rhs = rhs; + this.right = right; } @Override public ArithmeticExpression convertChildren(ExpressionConverter converter) { // TODO: branch()? - return new ArithmeticExpression(converter.convert(lhs), op, converter.convert(rhs)); + return new ArithmeticExpression(converter.convert(left), op, converter.convert(right)); } public Expression getLeftHandSide() { - return lhs; + return left; } public Operator getOperator() { @@ -71,21 +71,21 @@ public final class ArithmeticExpression extends CompositeExpression { } public Expression getRightHandSide() { - return rhs; + return right; } @Override protected void doExecute(ExecutionContext context) { FieldValue input = context.getValue(); - context.setValue(evaluate(context.setValue(input).execute(lhs).getValue(), - context.setValue(input).execute(rhs).getValue())); + context.setValue(evaluate(context.setValue(input).execute(left).getValue(), + context.setValue(input).execute(right).getValue())); } @Override protected void doVerify(VerificationContext context) { DataType input = context.getValueType(); - context.setValueType(evaluate(context.setValueType(input).execute(lhs).getValueType(), - context.setValueType(input).execute(rhs).getValueType())); + context.setValueType(evaluate(context.setValueType(input).execute(left).getValueType(), + context.setValueType(input).execute(right).getValueType())); } private static DataType requiredInputType(Expression lhs, Expression rhs) { @@ -99,7 +99,7 @@ public final class ArithmeticExpression extends CompositeExpression { } if (!lhsType.equals(rhsType)) { throw new VerificationException(ArithmeticExpression.class, "Operands require conflicting input types, " + - lhsType.getName() + " vs " + rhsType.getName() + "."); + lhsType.getName() + " vs " + rhsType.getName()); } return lhsType; } @@ -111,7 +111,7 @@ public final class ArithmeticExpression extends CompositeExpression { @Override public String toString() { - return lhs + " " + op + " " + rhs; + return left + " " + op + " " + right; } @Override @@ -120,13 +120,13 @@ public final class ArithmeticExpression extends CompositeExpression { return false; } ArithmeticExpression exp = (ArithmeticExpression)obj; - if (!lhs.equals(exp.lhs)) { + if (!left.equals(exp.left)) { return false; } if (!op.equals(exp.op)) { return false; } - if (!rhs.equals(exp.rhs)) { + if (!right.equals(exp.right)) { return false; } return true; @@ -134,12 +134,12 @@ public final class ArithmeticExpression extends CompositeExpression { @Override public int hashCode() { - return getClass().hashCode() + lhs.hashCode() + op.hashCode() + rhs.hashCode(); + return getClass().hashCode() + left.hashCode() + op.hashCode() + right.hashCode(); } private DataType evaluate(DataType lhs, DataType rhs) { if (lhs == null || rhs == null) { - throw new VerificationException(this, "Attempting to perform arithmetic on a null value."); + throw new VerificationException(this, "Attempting to perform arithmetic on a null value"); } if (!(lhs instanceof NumericDataType) || !(rhs instanceof NumericDataType)) @@ -210,12 +210,12 @@ public final class ArithmeticExpression extends CompositeExpression { return BigDecimal.valueOf(((LongFieldValue)value).getLong()); } throw new IllegalArgumentException("Unsupported numeric field value type '" + - value.getClass().getName() + "'."); + value.getClass().getName() + "'"); } @Override public void selectMembers(ObjectPredicate predicate, ObjectOperation operation) { - lhs.select(predicate, operation); - rhs.select(predicate, operation); + left.select(predicate, operation); + right.select(predicate, operation); } } diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Base64DecodeExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Base64DecodeExpression.java index 2474dadab77..d5b5fa2ddfa 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Base64DecodeExpression.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Base64DecodeExpression.java @@ -23,11 +23,11 @@ public final class Base64DecodeExpression extends Expression { return; } if (input.length() > 12) { - throw new NumberFormatException("Base64 value '" + input + "' is out of range."); + throw new NumberFormatException("Base64 value '" + input + "' is out of range"); } byte[] decoded = Base64.getDecoder().decode(input); if (decoded == null || decoded.length == 0) { - throw new NumberFormatException("Illegal base64 value '" + input + "'."); + throw new NumberFormatException("Illegal base64 value '" + input + "'"); } long output = 0; for (int i = decoded.length; --i >= 0;) { 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 564ab015e10..b495a0b3bbf 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 @@ -62,7 +62,7 @@ public final class CatExpression extends ExpressionList { DataType val = context.setValueType(input).execute(exp).getValueType(); types.add(val); if (val == null) { - throw new VerificationException(this, "Attempting to concatenate a null value (" + exp + ")."); + throw new VerificationException(this, "Attempting to concatenate a null value (" + exp + ")"); } } context.setValueType(resolveOutputType(types)); @@ -78,7 +78,7 @@ public final class CatExpression extends ExpressionList { prev = next; } else if (!prev.isAssignableFrom(next)) { throw new VerificationException(CatExpression.class, "Operands require conflicting input types, " + - prev.getName() + " vs " + next.getName() + "."); + prev.getName() + " vs " + next.getName()); } } return prev; diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ChoiceExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ChoiceExpression.java index 5dbb9292a9d..991cbd30433 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ChoiceExpression.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ChoiceExpression.java @@ -64,14 +64,14 @@ public class ChoiceExpression extends ExpressionList { 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() + "."); + 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() + "."); + previousOutput.getName() + " vs " + thisOutput.getName()); } return previousInput; } diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ConstantExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ConstantExpression.java new file mode 100644 index 00000000000..b44d4844c4d --- /dev/null +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ConstantExpression.java @@ -0,0 +1,66 @@ +// 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 com.yahoo.document.datatypes.LongFieldValue; +import com.yahoo.document.datatypes.StringFieldValue; +import com.yahoo.text.StringUtilities; + +import java.util.Objects; + +/** + * @author Simon Thoresen Hult + */ +public final class ConstantExpression extends Expression { + + private final FieldValue value; + + public ConstantExpression(FieldValue value) { + super(null); + this.value = Objects.requireNonNull(value); + } + + public FieldValue getValue() { + return value; + } + + @Override + protected void doExecute(ExecutionContext context) { + context.setValue(value); + } + + @Override + protected void doVerify(VerificationContext context) { + context.setValueType(value.getDataType()); + } + + @Override + public DataType createdOutputType() { + return value.getDataType(); + } + + @Override + public String toString() { + if (value instanceof StringFieldValue) { + return "\"" + StringUtilities.escape(value.toString(), '"') + "\""; + } + if (value instanceof LongFieldValue) { + return value + "L"; + } + return value.toString(); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof ConstantExpression rhs)) return false; + if (!value.equals(rhs.value)) return false; + return true; + } + + @Override + public int hashCode() { + return getClass().hashCode() + value.hashCode(); + } + +} diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EmbedExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EmbedExpression.java index 5ee5fea3158..0407e17596b 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EmbedExpression.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EmbedExpression.java @@ -116,7 +116,7 @@ public class EmbedExpression extends Expression { String outputField = context.getOutputField(); if (outputField == null) throw new VerificationException(this, "No output field in this statement: " + - "Don't know what tensor type to embed into."); + "Don't know what tensor type to embed into"); targetType = toTargetTensor(context.getInputType(this, outputField)); if ( ! validTarget(targetType)) throw new VerificationException(this, "The embedding target field must either be a dense 1d tensor, " + 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 f01f2fcc9fb..7f0abfd64db 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 @@ -50,7 +50,7 @@ public class ExecutionContext implements FieldTypeAdapter, FieldValueAdapter, Cl @Override public FieldValue getInputValue(String fieldName) { if (adapter == null) { - throw new IllegalStateException("Can not get field '" + fieldName + "' because adapter is null."); + throw new IllegalStateException("Can not get field '" + fieldName + "' because adapter is null"); } return adapter.getInputValue(fieldName); } @@ -58,7 +58,7 @@ public class ExecutionContext implements FieldTypeAdapter, FieldValueAdapter, Cl @Override public FieldValue getInputValue(FieldPath fieldPath) { if (adapter == null) { - throw new IllegalStateException("Can not get field '" + fieldPath + "' because adapter is null."); + throw new IllegalStateException("Can not get field '" + fieldPath + "' because adapter is null"); } return adapter.getInputValue(fieldPath); } @@ -71,7 +71,7 @@ public class ExecutionContext implements FieldTypeAdapter, FieldValueAdapter, Cl @Override public ExecutionContext setOutputValue(Expression exp, String fieldName, FieldValue fieldValue) { if (adapter == null) - throw new IllegalStateException("Can not set field '" + fieldName + "' because adapter is 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 f498b871096..a6f117beb40 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 @@ -28,8 +28,8 @@ public abstract class Expression extends Selectable { * Creates an expression * * @param inputType the type of the input this expression can work with. - * UnresolvedDataType.INSTANCE if it works with any type, - * and null if it does not consume any input. + * UnresolvedDataType.INSTANCE if it works with any type, + * and null if it does not consume any input. */ protected Expression(DataType inputType) { this.inputType = inputType; @@ -93,7 +93,7 @@ public abstract class Expression extends Selectable { } if (!inputType.isValueCompatible(input)) { throw new IllegalArgumentException("Expression '" + this + "' expected " + inputType.getName() + - " input, got " + input.getDataType().getName() + "."); + " input, got " + input.getDataType().getName()); } } doExecute(context); @@ -102,7 +102,7 @@ public abstract class Expression extends Selectable { FieldValue output = context.getValue(); if (output != null && !outputType.isValueCompatible(output)) { throw new IllegalStateException("Expression '" + this + "' expected " + outputType.getName() + - " output, got " + output.getDataType().getName() + "."); + " output, got " + output.getDataType().getName()); } } return context.getValue(); @@ -163,14 +163,14 @@ public abstract class Expression extends Selectable { if (inputType != null) { DataType input = context.getValueType(); if (input == null) { - throw new VerificationException(this, "Expected " + inputType.getName() + " input, got null."); + throw new VerificationException(this, "Expected " + inputType.getName() + " input, but no input is specified"); } if (input.getPrimitiveType() == UnresolvedDataType.INSTANCE) { - throw new VerificationException(this, "Failed to resolve input type."); + throw new VerificationException(this, "Failed to resolve input type"); } if (!inputType.isAssignableFrom(input)) { throw new VerificationException(this, "Expected " + inputType.getName() + " input, got " + - input.getName() + "."); + input.getName()); } } doVerify(context); @@ -178,14 +178,13 @@ public abstract class Expression extends Selectable { if (outputType != null) { DataType output = context.getValueType(); if (output == null) { - throw new VerificationException(this, "Expected " + outputType.getName() + " output, got null."); + throw new VerificationException(this, "Expected " + outputType.getName() + " output, but no output is specified"); } if (output.getPrimitiveType() == UnresolvedDataType.INSTANCE) { - throw new VerificationException(this, "Failed to resolve output type."); + throw new VerificationException(this, "Failed to resolve output type"); } if (!outputType.isAssignableFrom(output)) { - throw new VerificationException(this, "Expected " + outputType.getName() + " output, got " + - output.getName() + "."); + throw new VerificationException(this, "Expected " + outputType.getName() + " output, got " + output.getName()); } } return context.getValueType(); 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 57de66f80a0..f3e9e33d841 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 @@ -21,9 +21,9 @@ public abstract class ExpressionList extends CompositeExpr private final List expressions = new LinkedList(); - protected ExpressionList(Iterable lst, DataType inputType) { + protected ExpressionList(Iterable expressions, DataType inputType) { super(inputType); - for (T exp : lst) { + for (T exp : expressions) { this.expressions.add(exp); } } 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 3053a391823..7e32c93faff 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 @@ -52,7 +52,7 @@ public final class ForEachExpression extends CompositeExpression { context.setValue(new MyConverter(context, exp).convert(input)); } else { throw new IllegalArgumentException("Expected Array, Struct or WeightedSet input, got " + - input.getDataType().getName() + "."); + input.getDataType().getName()); } } @@ -80,13 +80,13 @@ public final class ForEachExpression extends CompositeExpression { DataType structValueType = context.setValueType(fieldType).execute(exp).getValueType(); if (!fieldType.isAssignableFrom(structValueType)) throw new VerificationException(this, "Expected " + fieldType.getName() + " output, got " + - structValueType.getName() + "."); + structValueType.getName()); } context.setValueType(valueType); } else { throw new VerificationException(this, "Expected Array, Struct or WeightedSet input, got " + - valueType.getName() + "."); + valueType.getName()); } } 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 ecb6980f795..8a0fc9a56ec 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 @@ -27,7 +27,7 @@ public final class GetFieldExpression extends Expression { protected void doExecute(ExecutionContext context) { FieldValue input = context.getValue(); if (!(input instanceof StructuredFieldValue struct)) { - throw new IllegalArgumentException("Expected structured input, got " + input.getDataType().getName() + "."); + throw new IllegalArgumentException("Expected structured input, got " + input.getDataType().getName()); } Field field = struct.getField(fieldName); if (field == null) { @@ -41,7 +41,7 @@ public final class GetFieldExpression extends Expression { protected void doVerify(VerificationContext context) { DataType input = context.getValueType(); if (!(input instanceof StructuredDataType)) { - throw new VerificationException(this, "Expected structured input, got " + input.getName() + "."); + throw new VerificationException(this, "Expected structured input, got " + input.getName()); } Field field = ((StructuredDataType)input).getField(fieldName); if (field == null) { 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 4ebf5da2ff8..54e85be1986 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 @@ -28,7 +28,7 @@ public final class GetVarExpression extends Expression { protected void doVerify(VerificationContext context) { DataType input = context.getVariable(varName); if (input == null) { - throw new VerificationException(this, "Variable '" + varName + "' not found."); + throw new VerificationException(this, "Variable '" + varName + "' not found"); } context.setValueType(input); } diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HashExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HashExpression.java index 2952692b5d0..3b4c1b432bf 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HashExpression.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HashExpression.java @@ -63,7 +63,7 @@ public class HashExpression extends Expression { String outputField = context.getOutputField(); if (outputField == null) throw new VerificationException(this, "No output field in this statement: " + - "Don't know what value to hash to."); + "Don't know what value to hash to"); DataType outputFieldType = context.getInputType(this, outputField); if ( ! canStoreHash(outputFieldType)) throw new VerificationException(this, "The type of the output field " + outputField + 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 93f101a422e..4a2c7381ac0 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 @@ -28,12 +28,12 @@ public final class HexDecodeExpression extends Expression { try { output = new BigInteger(input, 16); } catch (NumberFormatException e) { - throw new NumberFormatException("Illegal hex value '" + input + "'."); + throw new NumberFormatException("Illegal hex value '" + input + "'"); } if (output.bitLength() > 64) { - throw new NumberFormatException("Hex value '" + input + "' is out of range."); + throw new NumberFormatException("Hex value '" + input + "' is out of range"); } - if (output.compareTo(BigInteger.ZERO) == 1 && output.bitLength() == 64) { + if (output.compareTo(BigInteger.ZERO) > 0 && output.bitLength() == 64) { output = output.subtract(ULONG_MAX); // flip to negative } context.setValue(new LongFieldValue(output.longValue())); 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 f05795aa234..e0fb4e0337a 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 @@ -27,7 +27,7 @@ public final class IfThenExpression extends CompositeExpression { private final String img; - private Comparator(String img) { + Comparator(String img) { this.img = img; } @@ -38,77 +38,67 @@ public final class IfThenExpression extends CompositeExpression { } - private final Expression lhs; - private final Comparator cmp; - private final Expression rhs; + private final Expression left; + private final Comparator comparator; + private final Expression right; private final Expression ifTrue; private final Expression ifFalse; - public IfThenExpression(Expression lhs, Comparator cmp, Expression rhs, Expression ifTrue) { - this(lhs, cmp, rhs, ifTrue, null); + public IfThenExpression(Expression lhs, Comparator cmp, Expression right, Expression ifTrue) { + this(lhs, cmp, right, ifTrue, null); } - public IfThenExpression(Expression lhs, Comparator cmp, Expression rhs, Expression ifTrue, Expression ifFalse) { - super(resolveInputType(lhs, rhs, ifTrue, ifFalse)); - this.lhs = lhs; - this.cmp = cmp; - this.rhs = rhs; + public IfThenExpression(Expression lhs, Comparator cmp, Expression right, Expression ifTrue, Expression ifFalse) { + super(resolveInputType(lhs, right, ifTrue, ifFalse)); + this.left = lhs; + this.comparator = cmp; + this.right = right; this.ifTrue = ifTrue; this.ifFalse = ifFalse; } @Override public IfThenExpression convertChildren(ExpressionConverter converter) { - return new IfThenExpression(converter.branch().convert(lhs), - cmp, - converter.branch().convert(rhs), + return new IfThenExpression(converter.branch().convert(left), + comparator, + converter.branch().convert(right), converter.branch().convert(ifTrue), converter.branch().convert(ifFalse)); } @Override public void setStatementOutput(DocumentType documentType, Field field) { - lhs.setStatementOutput(documentType, field); - rhs.setStatementOutput(documentType, field); + left.setStatementOutput(documentType, field); + right.setStatementOutput(documentType, field); ifTrue.setStatementOutput(documentType, field); ifFalse.setStatementOutput(documentType, field); } - public Expression getLeftHandSide() { - return lhs; - } + public Expression getLeftHandSide() { return left; } - public Comparator getComparator() { - return cmp; - } + public Comparator getComparator() { return comparator; } - public Expression getRightHandSide() { - return rhs; - } + public Expression getRightHandSide() { return right; } - public Expression getIfTrueExpression() { - return ifTrue; - } + public Expression getIfTrueExpression() { return ifTrue; } - public Expression getIfFalseExpression() { - return ifFalse; - } + public Expression getIfFalseExpression() { return ifFalse; } @Override protected void doExecute(ExecutionContext context) { FieldValue input = context.getValue(); - FieldValue lhsVal = context.setValue(input).execute(lhs).getValue(); - if (lhsVal == null) { + FieldValue leftValue = context.setValue(input).execute(left).getValue(); + if (leftValue == null) { context.setValue(null); return; } - FieldValue rhsVal = context.setValue(input).execute(rhs).getValue(); - if (rhsVal == null) { + FieldValue rightValue = context.setValue(input).execute(right).getValue(); + if (rightValue == null) { context.setValue(null); return; } context.setValue(input); - if (isTrue(lhsVal, cmp, rhsVal)) { + if (isTrue(leftValue, comparator, rightValue)) { ifTrue.execute(context); } else if (ifFalse != null) { ifFalse.execute(context); @@ -118,17 +108,19 @@ public final class IfThenExpression extends CompositeExpression { @Override protected void doVerify(VerificationContext context) { DataType input = context.getValueType(); - context.setValueType(input).execute(lhs); - context.setValueType(input).execute(rhs); - context.setValueType(input).execute(ifTrue); - context.setValueType(input).execute(ifFalse); - context.setValueType(input); + context.setValueType(input).execute(left); + context.setValueType(input).execute(right); + var trueValue = context.setValueType(input).execute(ifTrue); + var falseValue = context.setValueType(input).execute(ifFalse); + var valueType = trueValue.getValueType().isAssignableFrom(falseValue.getValueType()) ? + trueValue.getValueType() : falseValue.getValueType(); + context.setValueType(valueType); } @Override public void selectMembers(ObjectPredicate predicate, ObjectOperation operation) { - select(lhs, predicate, operation); - select(rhs, predicate, operation); + select(left, predicate, operation); + select(right, predicate, operation); select(ifTrue, predicate, operation); select(ifFalse, predicate, operation); } @@ -146,13 +138,19 @@ public final class IfThenExpression extends CompositeExpression { @Override public DataType createdOutputType() { - return null; + DataType ifTrueType = ifTrue.createdOutputType(); + DataType ifFalseType = ifFalse == null ? null : ifFalse.createdOutputType(); + if (ifTrueType == null || ifFalseType == null) return null; + if (ifTrueType.isAssignableFrom(ifFalseType)) + return ifTrueType; + else + return ifFalseType; } @Override public String toString() { StringBuilder ret = new StringBuilder(); - ret.append("if (").append(lhs).append(" ").append(cmp).append(" ").append(rhs).append(") "); + ret.append("if (").append(left).append(" ").append(comparator).append(" ").append(right).append(") "); ret.append(toScriptBlock(ifTrue)); if (ifFalse != null) { ret.append(" else ").append(toScriptBlock(ifFalse)); @@ -165,13 +163,13 @@ public final class IfThenExpression extends CompositeExpression { if (!(obj instanceof IfThenExpression exp)) { return false; } - if (!lhs.equals(exp.lhs)) { + if (!left.equals(exp.left)) { return false; } - if (!cmp.equals(exp.cmp)) { + if (!comparator.equals(exp.comparator)) { return false; } - if (!rhs.equals(exp.rhs)) { + if (!right.equals(exp.right)) { return false; } if (!ifTrue.equals(exp.ifTrue)) { @@ -185,7 +183,7 @@ public final class IfThenExpression extends CompositeExpression { @Override public int hashCode() { - int ret = getClass().hashCode() + lhs.hashCode() + cmp.hashCode() + rhs.hashCode() + ifTrue.hashCode(); + int ret = getClass().hashCode() + left.hashCode() + comparator.hashCode() + right.hashCode() + ifTrue.hashCode(); if (ifFalse != null) { ret += ifFalse.hashCode(); } @@ -201,7 +199,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; } 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 bba1b09cda2..8534e58694e 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 @@ -42,7 +42,7 @@ public final class InputExpression extends Expression { protected void doVerify(VerificationContext context) { DataType val = context.getInputType(this, fieldName); if (val == null) - throw new VerificationException(this, "Field '" + fieldName + "' not found."); + throw new VerificationException(this, "Field '" + fieldName + "' not found"); context.setValueType(val); } 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 1c3582ea695..39325385dde 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 @@ -31,7 +31,7 @@ public final class JoinExpression extends Expression { protected void doExecute(ExecutionContext context) { FieldValue input = context.getValue(); if (!(input instanceof Array)) { - throw new IllegalArgumentException("Expected Array input, got " + input.getDataType().getName() + "."); + throw new IllegalArgumentException("Expected Array input, got " + input.getDataType().getName()); } StringBuilder output = new StringBuilder(); for (Iterator it = ((Array)input).fieldValueIterator(); it.hasNext(); ) { @@ -47,7 +47,7 @@ public final class JoinExpression extends Expression { protected void doVerify(VerificationContext context) { DataType input = context.getValueType(); if (!(input instanceof ArrayDataType)) { - throw new VerificationException(this, "Expected Array input, got " + input.getName() + "."); + throw new VerificationException(this, "Expected Array input, got " + input.getName()); } context.setValueType(createdOutputType()); } 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 d4b6f2e0a0a..97bbb1494e0 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 @@ -54,10 +54,10 @@ public final class OptimizePredicateExpression extends Expression { DataType input = ctx.getVariable(var); if (input == null) { if (required) { - throw new VerificationException(this, "Variable '" + var + "' must be set."); + throw new VerificationException(this, "Variable '" + var + "' must be set"); } } else if (input != type) { - throw new VerificationException(this, "Variable '" + var + "' must have type " + type.getName() + "."); + throw new VerificationException(this, "Variable '" + var + "' must have type " + type.getName()); } } 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 1a640c9924e..f9ceed4cb34 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 @@ -29,12 +29,12 @@ public final class ScriptExpression extends ExpressionList this(Collections.emptyList()); } - public ScriptExpression(StatementExpression... lst) { - this(Arrays.asList(lst)); + public ScriptExpression(StatementExpression... statements) { + this(Arrays.asList(statements)); } - public ScriptExpression(Collection lst) { - super(lst, resolveInputType(lst)); + public ScriptExpression(Collection statements) { + super(statements, resolveInputType(statements)); } @Override @@ -67,10 +67,8 @@ public final class ScriptExpression extends ExpressionList @Override protected void doVerify(VerificationContext context) { DataType input = context.getValueType(); - for (Expression exp : this) { + for (Expression exp : this) context.setValueType(input).execute(exp); - } - context.setValueType(input); } private static DataType resolveInputType(Collection list) { @@ -81,7 +79,7 @@ public final class ScriptExpression extends ExpressionList 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; @@ -89,7 +87,9 @@ public final class ScriptExpression extends ExpressionList @Override public DataType createdOutputType() { - return null; + var expressions = asList(); + if (expressions.isEmpty()) return null; + return (expressions.get(expressions.size() - 1)).createdOutputType(); } @Override 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 bb8111f358e..90b2253b520 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 @@ -65,7 +65,7 @@ public final class SelectInputExpression extends CompositeExpression { for (Pair entry : cases) { DataType val = context.getInputType(this, entry.getFirst()); if (val == null) { - throw new VerificationException(this, "Field '" + entry.getFirst() + "' not found."); + throw new VerificationException(this, "Field '" + entry.getFirst() + "' not found"); } context.setValueType(val).execute(entry.getSecond()); } 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 deleted file mode 100644 index f7348c24af5..00000000000 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetValueExpression.java +++ /dev/null @@ -1,65 +0,0 @@ -// 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 com.yahoo.document.datatypes.LongFieldValue; -import com.yahoo.document.datatypes.StringFieldValue; -import com.yahoo.text.StringUtilities; - -/** - * @author Simon Thoresen Hult - */ -public final class SetValueExpression extends Expression { - - private final FieldValue value; - - public SetValueExpression(FieldValue value) { - super(null); - value.getClass(); // throws NullPointerException - this.value = value; - } - - public FieldValue getValue() { - return value; - } - - @Override - protected void doExecute(ExecutionContext context) { - context.setValue(value); - } - - @Override - protected void doVerify(VerificationContext context) { - context.setValueType(value.getDataType()); - } - - @Override - public DataType createdOutputType() { - return value.getDataType(); - } - - @Override - public String toString() { - if (value instanceof StringFieldValue) { - return "\"" + StringUtilities.escape(value.toString(), '"') + "\""; - } - if (value instanceof LongFieldValue) { - return value + "L"; - } - return value.toString(); - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof SetValueExpression rhs)) return false; - if (!value.equals(rhs.value)) return false; - return true; - } - - @Override - 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 a855ba86c9c..c80efbf7d19 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 @@ -30,7 +30,7 @@ public final class SetVarExpression extends Expression { DataType prev = context.getVariable(varName); if (prev != null && !prev.equals(next)) { throw new VerificationException(this, "Attempting to assign conflicting types to variable '" + varName + - "', " + prev.getName() + " vs " + next.getName() + "."); + "', " + prev.getName() + " vs " + next.getName()); } context.setVariable(varName, next); } 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 75f206ef47d..da067935d18 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 @@ -73,12 +73,12 @@ public final class StatementExpression extends ExpressionList { context.execute(expression); } - private static DataType resolveInputType(Iterable lst) { - for (Expression exp : lst) { - DataType type = exp.requiredInputType(); + private static DataType resolveInputType(Iterable expressions) { + for (Expression expression : expressions) { + DataType type = expression.requiredInputType(); if (type != null) return type; - type = exp.createdOutputType(); + type = expression.createdOutputType(); if (type != null) return null; } return null; 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 c7cf7066483..3bf67ff9c5d 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 @@ -70,7 +70,7 @@ public final class SwitchExpression extends CompositeExpression { if (input != null) { if (!(input instanceof StringFieldValue)) { throw new IllegalArgumentException("Expected " + DataType.STRING.getName() + " input, got " + - input.getDataType().getName() + "."); + input.getDataType().getName()); } exp = cases.get(String.valueOf(input)); } @@ -95,11 +95,11 @@ public final class SwitchExpression extends CompositeExpression { protected void doVerify(VerificationContext context) { DataType input = context.getValueType(); if (input == null) { - throw new VerificationException(this, "Expected " + DataType.STRING.getName() + " input, got null."); + throw new VerificationException(this, "Expected " + DataType.STRING.getName() + " input, but no input is specified"); } if (input != DataType.STRING) { throw new VerificationException(this, "Expected " + DataType.STRING.getName() + " input, got " + - input.getName() + "."); + input.getName()); } for (Expression exp : cases.values()) { context.setValueType(input).execute(exp); diff --git a/indexinglanguage/src/main/javacc/IndexingParser.jj b/indexinglanguage/src/main/javacc/IndexingParser.jj index d559d9b7260..02372fcadbd 100644 --- a/indexinglanguage/src/main/javacc/IndexingParser.jj +++ b/indexinglanguage/src/main/javacc/IndexingParser.jj @@ -32,7 +32,6 @@ import com.yahoo.document.datatypes.*; import com.yahoo.text.StringUtilities; import com.yahoo.vespa.indexinglanguage.expressions.*; import com.yahoo.vespa.indexinglanguage.linguistics.AnnotatorConfig; -import com.yahoo.language.process.StemMode; import com.yahoo.language.process.Embedder; import com.yahoo.language.Linguistics; @@ -100,6 +99,7 @@ public class IndexingParser { return new LongFieldValue(new BigInteger(str).longValue()); } } +}} } PARSER_END(IndexingParser) @@ -592,7 +592,7 @@ Expression setValueExp() : } { ( val = fieldValue() ) - { return new SetValueExpression(val); } + { return new ConstantExpression(val); } } Expression setVarExp() : -- cgit v1.2.3 From 6a96bab034cdccedc31f23c7bf3c7fdb9777e9f9 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Wed, 27 Sep 2023 16:42:01 -0400 Subject: Repair parser --- .../src/test/java/com/yahoo/schema/processing/AssertIndexingScript.java | 2 +- indexinglanguage/src/main/javacc/IndexingParser.jj | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) (limited to 'indexinglanguage/src/main') diff --git a/config-model/src/test/java/com/yahoo/schema/processing/AssertIndexingScript.java b/config-model/src/test/java/com/yahoo/schema/processing/AssertIndexingScript.java index f9c1e992347..36f20c18588 100644 --- a/config-model/src/test/java/com/yahoo/schema/processing/AssertIndexingScript.java +++ b/config-model/src/test/java/com/yahoo/schema/processing/AssertIndexingScript.java @@ -38,6 +38,6 @@ public abstract class AssertIndexingScript { String str = actualExp.toString(); assertTrue(parsedExpected.remove(str), "Unexpected: " + str); } - assertTrue(parsedExpected.isEmpty(), "Missing: " + parsedExpected.toString()); + assertTrue(parsedExpected.isEmpty(), "Missing: " + parsedExpected); } } diff --git a/indexinglanguage/src/main/javacc/IndexingParser.jj b/indexinglanguage/src/main/javacc/IndexingParser.jj index 02372fcadbd..3c67a468aea 100644 --- a/indexinglanguage/src/main/javacc/IndexingParser.jj +++ b/indexinglanguage/src/main/javacc/IndexingParser.jj @@ -99,7 +99,6 @@ public class IndexingParser { return new LongFieldValue(new BigInteger(str).longValue()); } } -}} } PARSER_END(IndexingParser) -- cgit v1.2.3