diff options
Diffstat (limited to 'indexinglanguage/src/main')
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; } |