summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config-model/src/main/java/com/yahoo/schema/derived/IndexingScript.java1
-rw-r--r--config-model/src/test/examples/indexing_extra_field_input_null.sd2
-rw-r--r--docprocs/src/main/java/com/yahoo/docprocs/indexing/DocumentScript.java32
-rw-r--r--docprocs/src/main/java/com/yahoo/docprocs/indexing/IndexingProcessor.java55
-rw-r--r--docprocs/src/main/java/com/yahoo/docprocs/indexing/ScriptManager.java38
-rw-r--r--docprocs/src/test/cfg/documentmanager.cfg12
-rw-r--r--docprocs/src/test/cfg/ilscripts.cfg17
-rw-r--r--docprocs/src/test/java/com/yahoo/docprocs/indexing/IndexingProcessorTestCase.java197
-rw-r--r--docprocs/src/test/java/com/yahoo/docprocs/indexing/ScriptManagerTestCase.java6
-rw-r--r--document/src/main/java/com/yahoo/document/Document.java26
-rw-r--r--document/src/main/java/com/yahoo/document/update/AssignValueUpdate.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/DocumentAdapter.java3
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldPathUpdateHelper.java8
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateAdapter.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateHelper.java125
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldValueConverter.java12
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ScriptParser.java32
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/SimpleAdapterFactory.java32
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/UpdateAdapter.java3
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ChoiceExpression.java88
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ClearStateExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/CompositeExpression.java1
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExecutionContext.java16
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Expression.java23
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExpressionList.java9
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/FieldValueAdapter.java3
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/FlattenExpression.java7
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ForEachExpression.java10
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GetFieldExpression.java13
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GetVarExpression.java9
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/GuardExpression.java10
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexDecodeExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexEncodeExpression.java1
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HostNameExpression.java1
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/IfThenExpression.java33
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/IndexExpression.java1
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/InputExpression.java28
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/JoinExpression.java11
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/LowerCaseExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/MathResolver.java10
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NGramExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NormalizeExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NowExpression.java9
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/OptimizePredicateExpression.java1
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/OutputExpression.java9
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ParenthesisExpression.java9
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/PassthroughExpression.java1
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/RandomExpression.java16
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ScriptExpression.java18
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SelectInputExpression.java12
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetLanguageExpression.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetValueExpression.java12
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SetVarExpression.java10
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SplitExpression.java9
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/StatementExpression.java36
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SubstringExpression.java14
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SummaryExpression.java1
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SwitchExpression.java18
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ThisExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToArrayExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToByteExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToDoubleExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToFloatExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToIntegerExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToLongExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToPositionExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToStringExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToWsetExpression.java5
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/TokenizeExpression.java10
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/TrimExpression.java1
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/UnresolvedFieldValue.java4
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/VerificationException.java1
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ZCurveExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/linguistics/AnnotatorConfig.java3
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/parser/IndexingInput.java1
-rw-r--r--indexinglanguage/src/main/javacc/IndexingParser.jj25
-rw-r--r--indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/SimpleTestAdapter.java5
-rw-r--r--indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ChoiceTestCase.java47
-rw-r--r--indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ExactTestCase.java2
-rw-r--r--indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/InputTestCase.java12
-rw-r--r--indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/MathResolverTestCase.java4
-rw-r--r--indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ScriptTestCase.java48
-rw-r--r--indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/StatementTestCase.java13
-rw-r--r--indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/parser/ExpressionTestCase.java3
84 files changed, 728 insertions, 550 deletions
diff --git a/config-model/src/main/java/com/yahoo/schema/derived/IndexingScript.java b/config-model/src/main/java/com/yahoo/schema/derived/IndexingScript.java
index a35bc735608..32add37a546 100644
--- a/config-model/src/main/java/com/yahoo/schema/derived/IndexingScript.java
+++ b/config-model/src/main/java/com/yahoo/schema/derived/IndexingScript.java
@@ -24,7 +24,6 @@ import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
-import java.util.stream.Collectors;
/**
* An indexing language script derived from a search definition. An indexing script contains a set of indexing
diff --git a/config-model/src/test/examples/indexing_extra_field_input_null.sd b/config-model/src/test/examples/indexing_extra_field_input_null.sd
index 4f139490807..c4600fa680a 100644
--- a/config-model/src/test/examples/indexing_extra_field_input_null.sd
+++ b/config-model/src/test/examples/indexing_extra_field_input_null.sd
@@ -4,6 +4,6 @@ search indexing_extra_field_input_null {
}
field foo type string {
- indexing: input | index
+ indexing: input foo | index
}
}
diff --git a/docprocs/src/main/java/com/yahoo/docprocs/indexing/DocumentScript.java b/docprocs/src/main/java/com/yahoo/docprocs/indexing/DocumentScript.java
index b50c0f652b5..e690ca1dc64 100644
--- a/docprocs/src/main/java/com/yahoo/docprocs/indexing/DocumentScript.java
+++ b/docprocs/src/main/java/com/yahoo/docprocs/indexing/DocumentScript.java
@@ -41,9 +41,10 @@ public class DocumentScript {
}
public Expression getExpression() { return expression; }
+
public Document execute(AdapterFactory adapterFactory, Document document) {
- for (Iterator<Map.Entry<Field, FieldValue>> it = document.iterator(); it.hasNext(); ) {
- Map.Entry<Field, FieldValue> entry = it.next();
+ for (var i = document.iterator(); i.hasNext(); ) {
+ Map.Entry<Field, FieldValue> entry = i.next();
requireThatFieldIsDeclaredInDocument(entry.getKey());
removeAnyLinguisticsSpanTree(entry.getValue());
}
@@ -84,28 +85,29 @@ public class DocumentScript {
private void removeAnyLinguisticsSpanTree(FieldValue value) {
if (value instanceof StringFieldValue) {
((StringFieldValue)value).removeSpanTree(SpanTrees.LINGUISTICS);
- } else if (value instanceof Array) {
- Array<?> arr = (Array)value;
- for (Object obj : arr.getValues()) {
- removeAnyLinguisticsSpanTree((FieldValue)obj);
+ } else if (value instanceof Array<?> arr) {
+ for (FieldValue fieldValue : arr.getValues()) {
+ removeAnyLinguisticsSpanTree(fieldValue);
}
- } else if (value instanceof WeightedSet) {
- WeightedSet<?> wset = (WeightedSet)value;
- for (Object obj : wset.keySet()) {
- removeAnyLinguisticsSpanTree((FieldValue)obj);
+ } else if (value instanceof WeightedSet<?> wset) {
+ for (FieldValue fieldValue : wset.keySet()) {
+ removeAnyLinguisticsSpanTree(fieldValue);
}
- } else if (value instanceof MapFieldValue) {
- MapFieldValue<?,?> map = (MapFieldValue)value;
- for (Map.Entry<?,?> entry : map.entrySet()) {
+ } else if (value instanceof MapFieldValue<?, ?> map) {
+ for (Map.Entry<?, ?> entry : map.entrySet()) {
removeAnyLinguisticsSpanTree((FieldValue)entry.getKey());
removeAnyLinguisticsSpanTree((FieldValue)entry.getValue());
}
- } else if (value instanceof StructuredFieldValue) {
- StructuredFieldValue struct = (StructuredFieldValue)value;
+ } else if (value instanceof StructuredFieldValue struct) {
for (Iterator<Map.Entry<Field, FieldValue>> it = struct.iterator(); it.hasNext();) {
removeAnyLinguisticsSpanTree(it.next().getValue());
}
}
}
+ @Override
+ public String toString() {
+ return "indexing script for '" + documentType + "' given inputs " + inputFields + ": " + expression;
+ }
+
}
diff --git a/docprocs/src/main/java/com/yahoo/docprocs/indexing/IndexingProcessor.java b/docprocs/src/main/java/com/yahoo/docprocs/indexing/IndexingProcessor.java
index a55159cdaa0..de4fee2ed68 100644
--- a/docprocs/src/main/java/com/yahoo/docprocs/indexing/IndexingProcessor.java
+++ b/docprocs/src/main/java/com/yahoo/docprocs/indexing/IndexingProcessor.java
@@ -29,10 +29,8 @@ import com.yahoo.vespa.indexinglanguage.SimpleAdapterFactory;
import com.yahoo.vespa.indexinglanguage.expressions.Expression;
import java.util.Map;
-import java.util.logging.Level;
import java.util.stream.Collectors;
-
/**
* @author Simon Thoresen Hult
*/
@@ -45,7 +43,6 @@ public class IndexingProcessor extends DocumentProcessor {
public final static String INDEXING_START = "indexingStart";
public final static String INDEXING_END = "indexingEnd";
- private final static FastLogger log = FastLogger.getLogger(IndexingProcessor.class.getName());
private final DocumentTypeManager docTypeMgr;
private final ScriptManager scriptMgr;
private final AdapterFactory adapterFactory;
@@ -69,9 +66,8 @@ public class IndexingProcessor extends DocumentProcessor {
@Override
public Progress process(Processing proc) {
- if (proc.getDocumentOperations().isEmpty()) {
- return Progress.DONE;
- }
+ if (proc.getDocumentOperations().isEmpty()) return Progress.DONE;
+
List<DocumentOperation> out = new ArrayList<>(proc.getDocumentOperations().size());
for (DocumentOperation documentOperation : proc.getDocumentOperations()) {
if (documentOperation instanceof DocumentPut) {
@@ -95,56 +91,45 @@ public class IndexingProcessor extends DocumentProcessor {
return docTypeMgr;
}
- private void processDocument(DocumentPut prev, List<DocumentOperation> out) {
- DocumentType hadType = prev.getDocument().getDataType();
+ private void processDocument(DocumentPut input, List<DocumentOperation> out) {
+ DocumentType hadType = input.getDocument().getDataType();
DocumentScript script = scriptMgr.getScript(hadType);
if (script == null) {
- log.log(Level.FINE, "No indexing script for document '%s'.", prev.getId());
- out.add(prev);
+ out.add(input);
return;
}
- log.log(Level.FINE, "Processing document '%s'.", prev.getId());
DocumentType wantType = docTypeMgr.getDocumentType(hadType.getName());
- Document prevDoc = prev.getDocument();
+ Document inputDocument = input.getDocument();
if (hadType != wantType) {
// this happens when you have a concrete document; we need to
// convert back to a "normal" Document for indexing of complex structures
// to work properly.
GrowableByteBuffer buffer = new GrowableByteBuffer(64 * 1024, 2.0f);
DocumentSerializer serializer = DocumentSerializerFactory.createHead(buffer);
- serializer.write(prevDoc);
+ serializer.write(inputDocument);
buffer.flip();
- prevDoc = docTypeMgr.createDocument(buffer);
- }
- Document next = script.execute(adapterFactory, prevDoc);
- if (next == null) {
- log.log(Level.FINE, "Document '%s' produced no output.", prev.getId());
- return;
+ inputDocument = docTypeMgr.createDocument(buffer);
}
+ Document output = script.execute(adapterFactory, inputDocument);
+ if (output == null) return;
- out.add(new DocumentPut(prev, next));
+ out.add(new DocumentPut(input, output));
}
- private void processUpdate(DocumentUpdate prev, List<DocumentOperation> out) {
- DocumentScript script = scriptMgr.getScript(prev.getType());
+ private void processUpdate(DocumentUpdate input, List<DocumentOperation> out) {
+ DocumentScript script = scriptMgr.getScript(input.getType());
if (script == null) {
- log.log(Level.FINE, "No indexing script for update '%s'.", prev.getId());
- out.add(prev);
- return;
- }
- log.log(Level.FINE, "Processing update '%s'.", prev.getId());
- DocumentUpdate next = script.execute(adapterFactory, prev);
- if (next == null) {
- log.log(Level.FINE, "Update '%s' produced no output.", prev.getId());
+ out.add(input);
return;
}
- next.setCondition(prev.getCondition());
- out.add(next);
+ DocumentUpdate output = script.execute(adapterFactory, input);
+ if (output == null) return;
+ output.setCondition(input.getCondition());
+ out.add(output);
}
- private void processRemove(DocumentRemove prev, List<DocumentOperation> out) {
- log.log(Level.FINE, "Not processing remove '%s'.", prev.getId());
- out.add(prev);
+ private void processRemove(DocumentRemove input, List<DocumentOperation> out) {
+ out.add(input);
}
private Map<String, Embedder> toMap(ComponentRegistry<Embedder> embedders) {
diff --git a/docprocs/src/main/java/com/yahoo/docprocs/indexing/ScriptManager.java b/docprocs/src/main/java/com/yahoo/docprocs/indexing/ScriptManager.java
index de3a429e357..489e9031b19 100644
--- a/docprocs/src/main/java/com/yahoo/docprocs/indexing/ScriptManager.java
+++ b/docprocs/src/main/java/com/yahoo/docprocs/indexing/ScriptManager.java
@@ -36,23 +36,15 @@ public class ScriptManager {
private Map<String, DocumentScript> getScripts(DocumentType inputType) {
Map<String, DocumentScript> scripts = documentFieldScripts.get(inputType.getName());
- if (scripts != null) {
- log.log(Level.FINE, "Using script for type '%s'.", inputType.getName());
- return scripts;
- }
+ if (scripts != null) return scripts;
for (Map.Entry<String, Map<String, DocumentScript>> entry : documentFieldScripts.entrySet()) {
- if (inputType.inherits(docTypeMgr.getDocumentType(entry.getKey()))) {
- log.log(Level.FINE, "Using script of super-type '%s'.", entry.getKey());
+ if (inputType.inherits(docTypeMgr.getDocumentType(entry.getKey())))
return entry.getValue();
- }
}
for (Map.Entry<String, Map<String, DocumentScript>> entry : documentFieldScripts.entrySet()) {
- if (docTypeMgr.getDocumentType(entry.getKey()).inherits(inputType)) {
- log.log(Level.FINE, "Using script of sub-type '%s'.", entry.getKey());
+ if (docTypeMgr.getDocumentType(entry.getKey()).inherits(inputType))
return entry.getValue();
- }
}
- log.log(Level.FINE, "No script for type '%s'.", inputType.getName());
return null;
}
@@ -64,14 +56,15 @@ public class ScriptManager {
Map<String, DocumentScript> fieldScripts = getScripts(inputType);
if (fieldScripts != null) {
DocumentScript script = fieldScripts.get(inputFieldName);
- if (script != null) {
- log.log(Level.FINE, "Using script for type '%s' and field '%s'.", inputType.getName(), inputFieldName);
- return script;
- }
+ if (script != null) return script;
}
return null;
}
+ /**
+ * Returns an unmodifiable map from document type name to a map of the subset of indexing statements
+ * to run for each input field which *only* depend on that field.
+ */
private static Map<String, Map<String, DocumentScript>> createScriptsMap(DocumentTypeManager docTypeMgr,
IlscriptsConfig config,
Linguistics linguistics,
@@ -89,8 +82,7 @@ public class ScriptManager {
for (String content : ilscript.content()) {
StatementExpression statement = parse(ilscript.doctype(), parserContext, content);
expressions.add(statement);
- InputExpression.InputFieldNameExtractor inputFieldNameExtractor = new InputExpression.InputFieldNameExtractor();
- statement.select(inputFieldNameExtractor, inputFieldNameExtractor);
+ List<String> inputFieldNames = InputExpression.InputFieldNameExtractor.runOn(statement);
OutputExpression.OutputFieldNameExtractor outputFieldNameExtractor = new OutputExpression.OutputFieldNameExtractor();
statement.select(outputFieldNameExtractor, outputFieldNameExtractor);
statement.select(fieldPathOptimizer, fieldPathOptimizer);
@@ -98,24 +90,22 @@ public class ScriptManager {
String outputFieldName = outputFieldNameExtractor.getOutputFieldNames().get(0);
statement.setStatementOutput(documentType, documentType.getField(outputFieldName));
}
- if (inputFieldNameExtractor.getInputFieldNames().size() == 1) {
- String fieldName = inputFieldNameExtractor.getInputFieldNames().get(0);
+ if (inputFieldNames.size() == 1) {
+ String fieldName = inputFieldNames.get(0);
ScriptExpression script;
if (fieldScripts.containsKey(fieldName)) {
DocumentScript prev = fieldScripts.get(fieldName);
List<StatementExpression> appendedList = new ArrayList<>(((ScriptExpression)prev.getExpression()).asList());
appendedList.add(statement);
script = new ScriptExpression(appendedList);
- log.log(Level.FINE, "Appending script for field '" + fieldName + "' = " + statement);
- log.log(Level.FINE, "Full script for field '" + fieldName + "' = " + appendedList);
} else {
script = new ScriptExpression(statement);
- log.log(Level.FINE, "Setting script for field '" + fieldName + "' = " + statement);
}
- DocumentScript documentScript = new DocumentScript(ilscript.doctype(), inputFieldNameExtractor.getInputFieldNames(), script);
+ DocumentScript documentScript = new DocumentScript(ilscript.doctype(), inputFieldNames, script);
fieldScripts.put(fieldName, documentScript);
} else {
- log.log(Level.FINE, "Non single(" + inputFieldNameExtractor.getInputFieldNames().size() +") inputs = " + inputFieldNameExtractor.getInputFieldNames() + ". Script = " + statement);
+ log.log(Level.FINE, "Non single(" + inputFieldNames.size() +"" +
+ ") inputs = " + inputFieldNames + ". Script = " + statement);
}
}
diff --git a/docprocs/src/test/cfg/documentmanager.cfg b/docprocs/src/test/cfg/documentmanager.cfg
index 017c7bdffe1..cf3101581d9 100644
--- a/docprocs/src/test/cfg/documentmanager.cfg
+++ b/docprocs/src/test/cfg/documentmanager.cfg
@@ -115,6 +115,12 @@ doctype[1].structtype[0].field[17].type 10017
doctype[1].structtype[0].field[18].name "titles"
doctype[1].structtype[0].field[18].internalid 1831803314
doctype[1].structtype[0].field[18].type 10016
+doctype[1].structtype[0].field[19].name "combined"
+doctype[1].structtype[0].field[19].internalid 12345
+doctype[1].structtype[0].field[19].type 10016
+doctype[2].structtype[0].field[20].name "combinedWithFallback"
+doctype[2].structtype[0].field[20].internalid 67890
+doctype[2].structtype[0].field[20].type 10004
doctype[2].name "music"
doctype[2].idx 10018
doctype[2].inherits[0].idx 10000
@@ -249,6 +255,12 @@ doctype[2].structtype[0].field[37].type 10004
doctype[2].structtype[0].field[38].name "multiposition2d"
doctype[2].structtype[0].field[38].internalid 807198992
doctype[2].structtype[0].field[38].type 10016
+doctype[2].structtype[0].field[39].name "combined"
+doctype[2].structtype[0].field[39].internalid 12345
+doctype[2].structtype[0].field[39].type 10004
+doctype[2].structtype[0].field[40].name "combinedWithFallback"
+doctype[2].structtype[0].field[40].internalid 67890
+doctype[2].structtype[0].field[40].type 10004
doctype[3].name "music_summary"
doctype[3].idx 10023
doctype[3].inherits[0].idx 10000
diff --git a/docprocs/src/test/cfg/ilscripts.cfg b/docprocs/src/test/cfg/ilscripts.cfg
index 550cbed2c26..ce5e209458d 100644
--- a/docprocs/src/test/cfg/ilscripts.cfg
+++ b/docprocs/src/test/cfg/ilscripts.cfg
@@ -1,12 +1,13 @@
ilscript[1]
ilscript[0].doctype "music"
-ilscript[0].docfield[4]
+ilscript[0].docfield[3]
ilscript[0].docfield[0] "artist"
ilscript[0].docfield[1] "title"
-ilscript[0].docfield[2] "isbn"
-ilscript[0].docfield[3] "song"
-ilscript[0].content[4]
-ilscript[0].content[0] "input artist | attribute title"
-ilscript[0].content[1] "input title | attribute artist"
-ilscript[0].content[2] "input isbn | passthrough isbn"
-ilscript[0].content[3] "input isbn | attribute song"
+ilscript[0].docfield[2] "song"
+ilscript[0].content[5]
+ilscript[0].content[0] "input artist | attribute artist"
+ilscript[0].content[1] "input title | attribute title"
+ilscript[0].content[2] "input song | attribute song"
+ilscript[0].content[4] "input artist . " ". input title | index combined"
+ilscript[0].content[5] "(input artist || "") . " ". (input title || "") | index combinedWithFallback"
+
diff --git a/docprocs/src/test/java/com/yahoo/docprocs/indexing/IndexingProcessorTestCase.java b/docprocs/src/test/java/com/yahoo/docprocs/indexing/IndexingProcessorTestCase.java
index c6ba63b7924..ae7437ed80b 100644
--- a/docprocs/src/test/java/com/yahoo/docprocs/indexing/IndexingProcessorTestCase.java
+++ b/docprocs/src/test/java/com/yahoo/docprocs/indexing/IndexingProcessorTestCase.java
@@ -15,7 +15,6 @@ import com.yahoo.document.datatypes.StringFieldValue;
import com.yahoo.document.update.AssignValueUpdate;
import com.yahoo.document.update.FieldUpdate;
import com.yahoo.document.update.ValueUpdate;
-import com.yahoo.language.process.Embedder;
import com.yahoo.language.simple.SimpleLinguistics;
import com.yahoo.vespa.configdefinition.IlscriptsConfig;
import org.junit.Test;
@@ -23,28 +22,20 @@ import org.junit.Test;
import java.util.List;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
/**
* @author Simon Thoresen Hult
+ * @author bratseth
*/
public class IndexingProcessorTestCase {
private static final String CONFIG_ID = "dir:src/test/cfg";
- private IndexingProcessor indexer = newProcessor(CONFIG_ID);
- @Test
- public void requireThatIndexerProcessesDocuments() {
- Document input = new Document(indexer.getDocumentTypeManager().getDocumentType("music"), "id:ns:music::");
- input.setFieldValue("artist", new StringFieldValue("69"));
- DocumentOperation op = process(new DocumentPut(input));
- assertTrue(op instanceof DocumentPut);
-
- Document output = ((DocumentPut)op).getDocument();
- assertEquals(new StringFieldValue("69"), output.getFieldValue("title"));
- assertEquals("music", output.getDataType().getName());
- }
+ private final IndexingProcessor indexer = newProcessor(CONFIG_ID);
@Test
public void requireThatIndexerForwardsDocumentsOfUnknownType() {
@@ -55,57 +46,134 @@ public class IndexingProcessorTestCase {
}
@Test
- public void requireThatIndexerProcessesUpdates() {
- DocumentType inputType = indexer.getDocumentTypeManager().getDocumentType("music");
- DocumentUpdate input = new DocumentUpdate(inputType, "id:ns:music::");
- input.addFieldUpdate(FieldUpdate.createAssign(inputType.getField("isbn"), new StringFieldValue("isbnmarker")));
- input.addFieldUpdate(FieldUpdate.createAssign(inputType.getField("artist"), new StringFieldValue("69")));
- DocumentOperation output = process(input);
+ public void testPut() {
+ // 'combined' gets the value of both
+ // 'combinedWithFallback' falls back to an empty string if an input is missing
+
+ { // Both artist and title are set
+ DocumentType inputType = indexer.getDocumentTypeManager().getDocumentType("music");
+ DocumentPut input = new DocumentPut(inputType, "id:ns:music::");
+ input.getDocument().setFieldValue(inputType.getField("artist"), new StringFieldValue("artist1"));
+ input.getDocument().setFieldValue(inputType.getField("title"), new StringFieldValue("title1"));
+
+ Document output = ((DocumentPut)process(input)).getDocument();
+ assertEquals("artist1", output.getFieldValue("artist").getWrappedValue());
+ assertEquals("title1", output.getFieldValue("title").getWrappedValue());
+ assertNull(output.getFieldValue("song"));
+ assertEquals("artist1 title1", output.getFieldValue("combined").getWrappedValue());
+ assertEquals("artist1 title1", output.getFieldValue("combinedWithFallback").getWrappedValue());
+ }
- assertTrue(output instanceof DocumentUpdate);
- DocumentUpdate docUpdate = (DocumentUpdate) output;
-
- assertEquals(3, docUpdate.fieldUpdates().size());
- {
- FieldUpdate fieldUpdate = docUpdate.getFieldUpdate("song");
- assertEquals("song", fieldUpdate.getField().getName());
- assertEquals(1, fieldUpdate.getValueUpdates().size());
- ValueUpdate<?> valueUpdate = fieldUpdate.getValueUpdate(0);
- assertTrue(valueUpdate instanceof AssignValueUpdate);
- assertEquals(new StringFieldValue("isbnmarker"), valueUpdate.getValue());
- fieldUpdate = docUpdate.getFieldUpdate("title");
- assertEquals("title", fieldUpdate.getField().getName());
- assertEquals(1, fieldUpdate.getValueUpdates().size());
- valueUpdate = fieldUpdate.getValueUpdate(0);
- assertTrue(valueUpdate instanceof AssignValueUpdate);
- assertEquals(new StringFieldValue("69"), valueUpdate.getValue());
+ { // Just artist is set
+ DocumentType inputType = indexer.getDocumentTypeManager().getDocumentType("music");
+ DocumentPut input = new DocumentPut(inputType, "id:ns:music::");
+ input.getDocument().setFieldValue(inputType.getField("artist"), new StringFieldValue("artist1"));
+
+ Document output = ((DocumentPut)process(input)).getDocument();
+ assertEquals("artist1", output.getFieldValue("artist").getWrappedValue());
+ assertNull(output.getFieldValue("title"));
+ assertNull(output.getFieldValue("song"));
+ assertNull(output.getFieldValue("combined"));
+ assertEquals("artist1 ", output.getFieldValue("combinedWithFallback").getWrappedValue());
}
- {
- FieldUpdate fieldUpdate = docUpdate.getFieldUpdate("title");
- ValueUpdate<?> valueUpdate = fieldUpdate.getValueUpdate(0);
- assertEquals("title", fieldUpdate.getField().getName());
- assertTrue(valueUpdate instanceof AssignValueUpdate);
- assertEquals(new StringFieldValue("69"), valueUpdate.getValue());
+ { // Just title is set
+ DocumentType inputType = indexer.getDocumentTypeManager().getDocumentType("music");
+ DocumentPut input = new DocumentPut(inputType, "id:ns:music::");
+ input.getDocument().setFieldValue(inputType.getField("title"), new StringFieldValue("title1"));
+
+ Document output = ((DocumentPut)process(input)).getDocument();
+ assertEquals("title1", output.getFieldValue("title").getWrappedValue());
+ assertNull(output.getFieldValue("artist"));
+ assertNull(output.getFieldValue("song"));
+ assertNull(output.getFieldValue("combined"));
+ assertEquals(" title1", output.getFieldValue("combinedWithFallback").getWrappedValue());
}
- {
- FieldUpdate fieldUpdate = docUpdate.getFieldUpdate("isbn");
- ValueUpdate<?> valueUpdate = fieldUpdate.getValueUpdate(0);
- assertEquals("isbn", fieldUpdate.getField().getName());
- assertTrue(valueUpdate instanceof AssignValueUpdate);
- assertEquals(new StringFieldValue("isbnmarker"), valueUpdate.getValue());
+
+ { // Neither title nor artist is set
+ DocumentType inputType = indexer.getDocumentTypeManager().getDocumentType("music");
+ DocumentPut input = new DocumentPut(inputType, "id:ns:music::");
+ input.getDocument().setFieldValue(inputType.getField("song"), new StringFieldValue("song1"));
+
+ Document output = ((DocumentPut)process(input)).getDocument();
+ assertNull(output.getFieldValue("artist"));
+ assertNull(output.getFieldValue("title"));
+ assertEquals("song1", output.getFieldValue("song").getWrappedValue());
+ assertNull(output.getFieldValue("combined"));
+ assertEquals(" ", output.getFieldValue("combinedWithFallback").getWrappedValue());
}
+ { // None is set
+ DocumentType inputType = indexer.getDocumentTypeManager().getDocumentType("music");
+ DocumentPut input = new DocumentPut(inputType, "id:ns:music::");
+
+ Document output = ((DocumentPut)process(input)).getDocument();
+ assertNull(output.getFieldValue("artist"));
+ assertNull(output.getFieldValue("title"));
+ assertNull(output.getFieldValue("song"));
+ assertNull(output.getFieldValue("combined"));
+ assertEquals(" ", output.getFieldValue("combinedWithFallback").getWrappedValue());
+ }
}
@Test
- public void requireThatEmptyDocumentUpdateOutputDoesNotThrow() {
- DocumentType inputType = indexer.getDocumentTypeManager().getDocumentType("music");
- DocumentUpdate input = new DocumentUpdate(inputType, "id:ns:music::");
- Processing proc = new Processing();
- proc.getDocumentOperations().add(input);
- indexer.process(proc);
- assertEquals(0, proc.getDocumentOperations().size());
+ public void testUpdate() {
+ // 'combined' gets the value of artist and title
+ // 'combinedWithFallback' falls back to an empty string if an input is missing
+
+ { // Both artist and title are set
+ DocumentType inputType = indexer.getDocumentTypeManager().getDocumentType("music");
+ DocumentUpdate input = new DocumentUpdate(inputType, "id:ns:music::");
+ input.addFieldUpdate(FieldUpdate.createAssign(inputType.getField("artist"), new StringFieldValue("artist1")));
+ input.addFieldUpdate(FieldUpdate.createAssign(inputType.getField("title"), new StringFieldValue("title1")));
+
+ DocumentUpdate output = (DocumentUpdate)process(input);
+ assertEquals(4, output.fieldUpdates().size());
+ assertAssignment("artist", "artist1", output);
+ assertAssignment("title", "title1", output);
+ assertAssignment("combined", "artist1 title1", output);
+ assertAssignment("combinedWithFallback", "artist1 title1", output);
+ }
+
+ { // Just artist is set
+ DocumentType inputType = indexer.getDocumentTypeManager().getDocumentType("music");
+ DocumentUpdate input = new DocumentUpdate(inputType, "id:ns:music::");
+ input.addFieldUpdate(FieldUpdate.createAssign(inputType.getField("artist"), new StringFieldValue("artist1")));
+
+ DocumentUpdate output = (DocumentUpdate)process(input);
+ assertEquals(2, output.fieldUpdates().size());
+ assertAssignment("artist", "artist1", output);
+ assertAssignment("combinedWithFallback", "artist1 ", output);
+ }
+
+ { // Just title is set
+ DocumentType inputType = indexer.getDocumentTypeManager().getDocumentType("music");
+ DocumentUpdate input = new DocumentUpdate(inputType, "id:ns:music::");
+ input.addFieldUpdate(FieldUpdate.createAssign(inputType.getField("title"), new StringFieldValue("title1")));
+
+ DocumentUpdate output = (DocumentUpdate)process(input);
+ assertEquals(2, output.fieldUpdates().size());
+ assertAssignment("title", "title1", output);
+ assertAssignment("combinedWithFallback", " title1", output);
+ }
+
+ { // Neither title nor artist is set: Should not update embeddings even though it has fallbacks for all
+ DocumentType inputType = indexer.getDocumentTypeManager().getDocumentType("music");
+ DocumentUpdate input = new DocumentUpdate(inputType, "id:ns:music::");
+ input.addFieldUpdate(FieldUpdate.createAssign(inputType.getField("song"), new StringFieldValue("song1")));
+
+ DocumentUpdate output = (DocumentUpdate)process(input);
+ assertEquals(1, output.fieldUpdates().size());
+ assertAssignment("song", "song1", output);
+ }
+
+ { // None is set: Should not update anything
+ DocumentType inputType = indexer.getDocumentTypeManager().getDocumentType("music");
+ DocumentUpdate input = new DocumentUpdate(inputType, "id:ns:music::");
+
+ DocumentUpdate output = (DocumentUpdate)process(input);
+ assertNull(output);
+ }
}
@Test
@@ -115,14 +183,25 @@ public class IndexingProcessorTestCase {
assertSame(input, output);
}
+ private void assertAssignment(String fieldName, String value, DocumentUpdate output) {
+ FieldUpdate update = output.getFieldUpdate(fieldName);
+ assertNotNull("Update of '" + fieldName + "' exists", update);
+ assertEquals(fieldName, update.getField().getName());
+ assertEquals(1, update.getValueUpdates().size());
+ ValueUpdate<?> combinedAssignment = update.getValueUpdate(0);
+ assertTrue(combinedAssignment instanceof AssignValueUpdate);
+ assertEquals(new StringFieldValue(value), combinedAssignment.getValue());
+ }
+
private DocumentOperation process(DocumentOperation input) {
Processing proc = new Processing();
proc.getDocumentOperations().add(input);
indexer.process(proc);
- List<DocumentOperation> lst = proc.getDocumentOperations();
- assertEquals(1, lst.size());
- return lst.get(0);
+ List<DocumentOperation> operations = proc.getDocumentOperations();
+ if (operations.isEmpty()) return null;
+ assertEquals(1, operations.size());
+ return operations.get(0);
}
@SuppressWarnings("deprecation")
@@ -130,6 +209,6 @@ public class IndexingProcessorTestCase {
return new IndexingProcessor(new DocumentTypeManager(ConfigGetter.getConfig(DocumentmanagerConfig.class, configId)),
ConfigGetter.getConfig(IlscriptsConfig.class, configId),
new SimpleLinguistics(),
- new ComponentRegistry<Embedder>());
+ new ComponentRegistry<>());
}
}
diff --git a/docprocs/src/test/java/com/yahoo/docprocs/indexing/ScriptManagerTestCase.java b/docprocs/src/test/java/com/yahoo/docprocs/indexing/ScriptManagerTestCase.java
index 4a7e643fb0a..578c3517922 100644
--- a/docprocs/src/test/java/com/yahoo/docprocs/indexing/ScriptManagerTestCase.java
+++ b/docprocs/src/test/java/com/yahoo/docprocs/indexing/ScriptManagerTestCase.java
@@ -5,11 +5,9 @@ import com.yahoo.document.DocumentType;
import com.yahoo.document.DocumentTypeManager;
import com.yahoo.language.process.Embedder;
import com.yahoo.vespa.configdefinition.IlscriptsConfig;
-import com.yahoo.vespa.indexinglanguage.parser.ParseException;
import org.junit.Test;
import java.util.Iterator;
-import java.util.Map;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
@@ -20,7 +18,7 @@ import static org.junit.Assert.assertNull;
public class ScriptManagerTestCase {
@Test
- public void requireThatScriptsAreAppliedToSubType() throws ParseException {
+ public void requireThatScriptsAreAppliedToSubType() {
var typeMgr = DocumentTypeManager.fromFile("src/test/cfg/documentmanager_inherit.cfg");
DocumentType docType = typeMgr.getDocumentType("newssummary");
assertNotNull(docType);
@@ -35,7 +33,7 @@ public class ScriptManagerTestCase {
}
@Test
- public void requireThatScriptsAreAppliedToSuperType() throws ParseException {
+ public void requireThatScriptsAreAppliedToSuperType() {
var typeMgr = DocumentTypeManager.fromFile("src/test/cfg/documentmanager_inherit.cfg");
DocumentType docType = typeMgr.getDocumentType("newsarticle");
assertNotNull(docType);
diff --git a/document/src/main/java/com/yahoo/document/Document.java b/document/src/main/java/com/yahoo/document/Document.java
index 760b9de0199..3dc628e0a90 100644
--- a/document/src/main/java/com/yahoo/document/Document.java
+++ b/document/src/main/java/com/yahoo/document/Document.java
@@ -43,7 +43,7 @@ public class Document extends StructuredFieldValue {
public static final int classId = registerClass(Ids.document + 3, Document.class);
public static final short SERIALIZED_VERSION = 8;
private DocumentId docId;
- private Struct header;
+ private Struct content;
private Long lastModified = null;
/**
@@ -73,7 +73,7 @@ public class Document extends StructuredFieldValue {
*/
public Document(Document doc) {
this(doc.getDataType(), doc.getId());
- header = doc.header;
+ content = doc.content;
lastModified = doc.lastModified;
}
@@ -105,12 +105,12 @@ public class Document extends StructuredFieldValue {
public Document clone() {
Document doc = (Document) super.clone();
doc.docId = docId.clone();
- doc.header = header.clone();
+ doc.content = content.clone();
return doc;
}
private void setNewType(DocumentType type) {
- header = type.contentStruct().createFieldValue();
+ content = type.contentStruct().createFieldValue();
}
public void setDataType(DataType type) {
@@ -163,7 +163,7 @@ public class Document extends StructuredFieldValue {
@Override
public Field getField(String fieldName) {
- Field field = header.getField(fieldName);
+ Field field = content.getField(fieldName);
if (field == null) {
for(DocumentType parent : getDataType().getInheritedTypes()) {
field = parent.getField(fieldName);
@@ -177,27 +177,27 @@ public class Document extends StructuredFieldValue {
@Override
public FieldValue getFieldValue(Field field) {
- return header.getFieldValue(field);
+ return content.getFieldValue(field);
}
@Override
protected void doSetFieldValue(Field field, FieldValue value) {
- header.setFieldValue(field, value);
+ content.setFieldValue(field, value);
}
@Override
public FieldValue removeFieldValue(Field field) {
- return header.removeFieldValue(field);
+ return content.removeFieldValue(field);
}
@Override
public void clear() {
- header.clear();
+ content.clear();
}
@Override
public Iterator<Map.Entry<Field, FieldValue>> iterator() {
- return header.iterator();
+ return content.iterator();
}
public String toString() {
@@ -244,7 +244,7 @@ public class Document extends StructuredFieldValue {
if (o == this) return true;
if (!(o instanceof Document other)) return false;
return (super.equals(o) && docId.equals(other.docId) &&
- header.equals(other.header));
+ content.equals(other.content));
}
@Override
@@ -289,7 +289,7 @@ public class Document extends StructuredFieldValue {
@Override
public int getFieldCount() {
- return header.getFieldCount();
+ return content.getFieldCount();
}
public void serialize(DocumentWriter writer) {
@@ -329,7 +329,7 @@ public class Document extends StructuredFieldValue {
return comp;
}
- comp = header.compareTo(otherValue.header);
+ comp = content.compareTo(otherValue.content);
if (comp != 0) {
return comp;
diff --git a/document/src/main/java/com/yahoo/document/update/AssignValueUpdate.java b/document/src/main/java/com/yahoo/document/update/AssignValueUpdate.java
index 0797db5772f..9b1fdc647eb 100644
--- a/document/src/main/java/com/yahoo/document/update/AssignValueUpdate.java
+++ b/document/src/main/java/com/yahoo/document/update/AssignValueUpdate.java
@@ -8,9 +8,10 @@ import com.yahoo.document.serialization.DocumentUpdateWriter;
/**
* <p>Value update that represents assigning a new value.</p>
*
- * @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a>
+ * @author Einar M R Rosenvinge
*/
public class AssignValueUpdate extends ValueUpdate {
+
protected FieldValue value;
public AssignValueUpdate(FieldValue value) {
@@ -84,4 +85,5 @@ public class AssignValueUpdate extends ValueUpdate {
public String toString() {
return super.toString() + " " + value;
}
+
}
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;
}
diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/SimpleTestAdapter.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/SimpleTestAdapter.java
index cfb82034545..000d4aaecdd 100644
--- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/SimpleTestAdapter.java
+++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/SimpleTestAdapter.java
@@ -69,4 +69,9 @@ public class SimpleTestAdapter implements FieldValueAdapter {
return this;
}
+ @Override
+ public boolean isComplete() {
+ return false;
+ }
+
}
diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ChoiceTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ChoiceTestCase.java
new file mode 100644
index 00000000000..351c925ed56
--- /dev/null
+++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ChoiceTestCase.java
@@ -0,0 +1,47 @@
+// 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.Field;
+import com.yahoo.document.datatypes.StringFieldValue;
+import com.yahoo.vespa.indexinglanguage.SimpleTestAdapter;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author bratseth
+ */
+public class ChoiceTestCase {
+
+ @Test
+ public void testChoiceExecution() {
+ var choice = new ChoiceExpression(new InputExpression("foo"), new InputExpression("bar"));
+
+ { // foo only
+ var adapter = new SimpleTestAdapter(new Field("foo", DataType.STRING));
+ adapter.setValue("foo", new StringFieldValue("foo1"));
+ ExecutionContext context = new ExecutionContext(adapter);
+ choice.execute(context);
+ assertEquals("foo1", context.getValue().getWrappedValue());
+ }
+
+ { // bar only
+ var adapter = new SimpleTestAdapter(new Field("bar", DataType.STRING));
+ adapter.setValue("bar", new StringFieldValue("bar1"));
+ ExecutionContext context = new ExecutionContext(adapter);
+ choice.execute(context);
+ assertEquals("bar1", context.getValue().getWrappedValue());
+ }
+
+ { // both foo and bar
+ var adapter = new SimpleTestAdapter(new Field("foo", DataType.STRING), new Field("bar", DataType.STRING));
+ adapter.setValue("foo", new StringFieldValue("foo1"));
+ adapter.setValue("bar", new StringFieldValue("bar1"));
+ ExecutionContext context = new ExecutionContext(adapter);
+ choice.execute(context);
+ assertEquals("foo1", context.getValue().getWrappedValue());
+ }
+ }
+
+}
diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ExactTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ExactTestCase.java
index 68661c7b341..e993f6cbdee 100644
--- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ExactTestCase.java
+++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ExactTestCase.java
@@ -21,7 +21,7 @@ public class ExactTestCase {
@Test
public void requireThatHashCodeAndEqualsAreImplemented() {
Expression exp = new ExactExpression();
- assertFalse(exp.equals(new Object()));
+ assertNotEquals(exp, new Object());
assertEquals(exp, new ExactExpression());
assertEquals(exp.hashCode(), new ExactExpression().hashCode());
}
diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/InputTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/InputTestCase.java
index 5752c373001..fe16e8d10ab 100644
--- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/InputTestCase.java
+++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/InputTestCase.java
@@ -24,15 +24,9 @@ public class InputTestCase {
@Test
public void requireThatHashCodeAndEqualsAreImplemented() {
- Expression exp = new InputExpression(null);
- assertFalse(exp.equals(new Object()));
- assertFalse(exp.equals(new InputExpression("foo")));
- assertEquals(exp, new InputExpression(null));
- assertEquals(exp.hashCode(), new InputExpression(null).hashCode());
-
- exp = new InputExpression("foo");
- assertFalse(exp.equals(new Object()));
- assertFalse(exp.equals(new InputExpression("bar")));
+ Expression exp = new InputExpression("foo");
+ assertNotEquals(exp, new Object());
+ assertNotEquals(exp, new InputExpression("bar"));
assertEquals(exp, new InputExpression("foo"));
assertEquals(exp.hashCode(), new InputExpression("foo").hashCode());
}
diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/MathResolverTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/MathResolverTestCase.java
index decd0d7670e..1f9afdea44d 100644
--- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/MathResolverTestCase.java
+++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/MathResolverTestCase.java
@@ -71,7 +71,7 @@ public class MathResolverTestCase {
try {
resolver.push(type, newInteger(69));
} catch (IllegalArgumentException e) {
- assertEquals("First item in an arithmetic operation must be an addition.", e.getMessage());
+ assertEquals("First item in an arithmetic operation must be an addition, not " + type, e.getMessage());
}
}
}
@@ -81,7 +81,7 @@ public class MathResolverTestCase {
try {
new MathResolver().push(null, newInteger(69));
fail();
- } catch (NullPointerException e) {
+ } catch (IllegalArgumentException e) {
}
}
diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ScriptTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ScriptTestCase.java
index 2a69f094691..c648bb12ede 100644
--- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ScriptTestCase.java
+++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ScriptTestCase.java
@@ -4,6 +4,7 @@ package com.yahoo.vespa.indexinglanguage.expressions;
import com.yahoo.document.DataType;
import com.yahoo.document.Field;
import com.yahoo.document.datatypes.IntegerFieldValue;
+import com.yahoo.document.datatypes.StringFieldValue;
import com.yahoo.vespa.indexinglanguage.SimpleTestAdapter;
import org.junit.Test;
@@ -39,13 +40,13 @@ public class ScriptTestCase {
StatementExpression foo = newStatement(new AttributeExpression("foo"));
StatementExpression bar = newStatement(new AttributeExpression("bar"));
Expression exp = newScript(foo, bar);
- assertFalse(exp.equals(new Object()));
- assertFalse(exp.equals(new CatExpression(foo, bar)));
- assertFalse(exp.equals(newScript(newStatement(new IndexExpression("foo")))));
- assertFalse(exp.equals(newScript(newStatement(new IndexExpression("foo")),
- newStatement(new IndexExpression("bar")))));
- assertFalse(exp.equals(newScript(newStatement(foo),
- newStatement(new IndexExpression("bar")))));
+ assertNotEquals(exp, new Object());
+ assertNotEquals(exp, new CatExpression(foo, bar));
+ assertNotEquals(exp, newScript(newStatement(new IndexExpression("foo"))));
+ assertNotEquals(exp, newScript(newStatement(new IndexExpression("foo")),
+ newStatement(new IndexExpression("bar"))));
+ assertNotEquals(exp, newScript(newStatement(foo),
+ newStatement(new IndexExpression("bar"))));
assertEquals(exp, newScript(foo, bar));
assertEquals(exp.hashCode(), newScript(foo, bar).hashCode());
}
@@ -74,6 +75,19 @@ public class ScriptTestCase {
}
@Test
+ public void requireThatStatementsProcessingMissingInputsAreSkipped() {
+ SimpleTestAdapter adapter = new SimpleTestAdapter(new Field("foo", DataType.STRING),
+ new Field("bar", DataType.STRING));
+ adapter.setValue("foo", new StringFieldValue("foo1"));
+ ExecutionContext context = new ExecutionContext(adapter);
+ // The latter expression is not executed, so no exception is thrown
+ var script = new ScriptExpression(newStatement(new InputExpression("foo"), new AttributeExpression("foo")),
+ newStatement(new InputExpression("bar"), new ThrowingExpression()));
+ script.execute(context);
+ assertEquals("foo1", adapter.getInputValue("foo").getWrappedValue());
+ }
+
+ @Test
public void requireThatScriptEvaluatesToInputValue() {
SimpleTestAdapter adapter = new SimpleTestAdapter(new Field("out", DataType.INT));
newStatement(new SetValueExpression(new IntegerFieldValue(6)),
@@ -121,4 +135,24 @@ public class ScriptTestCase {
private static StatementExpression newStatement(Expression... args) {
return new StatementExpression(args);
}
+
+ private static class ThrowingExpression extends Expression {
+
+ public ThrowingExpression() {
+ super(null);
+ }
+
+ @Override
+ protected void doExecute(ExecutionContext context) {
+ throw new RuntimeException();
+ }
+
+ @Override
+ protected void doVerify(VerificationContext context) {}
+
+ @Override
+ public DataType createdOutputType() { return null; }
+
+ }
+
}
diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/StatementTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/StatementTestCase.java
index 2bede31d057..1a1442f68ac 100644
--- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/StatementTestCase.java
+++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/StatementTestCase.java
@@ -39,13 +39,11 @@ public class StatementTestCase {
Expression foo = new AttributeExpression("foo");
Expression bar = new AttributeExpression("bar");
Expression exp = newStatement(foo, bar);
- assertFalse(exp.equals(new Object()));
- assertFalse(exp.equals(new CatExpression(foo, bar)));
- assertFalse(exp.equals(newStatement(new IndexExpression("foo"))));
- assertFalse(exp.equals(newStatement(new IndexExpression("foo"),
- new IndexExpression("bar"))));
- assertFalse(exp.equals(newStatement(foo,
- new IndexExpression("bar"))));
+ assertNotEquals(exp, new Object());
+ assertNotEquals(exp, new CatExpression(foo, bar));
+ assertNotEquals(exp, newStatement(new IndexExpression("foo")));
+ assertNotEquals(exp, newStatement(new IndexExpression("foo"), new IndexExpression("bar")));
+ assertNotEquals(exp, newStatement(foo, new IndexExpression("bar")));
assertEquals(exp, newStatement(foo, bar));
assertEquals(exp.hashCode(), newStatement(foo, bar).hashCode());
}
@@ -117,4 +115,5 @@ public class StatementTestCase {
private static StatementExpression newStatement(Expression... args) {
return new StatementExpression(args);
}
+
}
diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/parser/ExpressionTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/parser/ExpressionTestCase.java
index 7db026d43ee..551f770a01e 100644
--- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/parser/ExpressionTestCase.java
+++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/parser/ExpressionTestCase.java
@@ -37,7 +37,7 @@ public class ExpressionTestCase {
assertExpression(IfThenExpression.class, "if (1 < 2) { 3 }");
assertExpression(IfThenExpression.class, "if (1 < 2) { 3 } else { 4 }");
assertExpression(IndexExpression.class, "index");
- assertExpression(InputExpression.class, "input");
+ assertExpression(InputExpression.class, "input foo");
assertExpression(InputExpression.class, "input field1");
assertExpression(JoinExpression.class, "join '1'");
assertExpression(LowerCaseExpression.class, "lowercase");
@@ -81,6 +81,7 @@ public class ExpressionTestCase {
assertExpression(ToWsetExpression.class, "to_wset remove_if_zero create_if_non_existent");
assertExpression(TrimExpression.class, "trim");
assertExpression(ZCurveExpression.class, "zcurve");
+ assertExpression(ChoiceExpression.class, "input foo || \"\"");
}
private static void assertExpression(Class expectedClass, String str) throws ParseException {