summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeir Storli <geirst@verizonmedia.com>2019-07-05 08:41:19 +0000
committerGeir Storli <geirst@verizonmedia.com>2019-07-05 08:41:19 +0000
commit21eef41d88e61ff2ee87b7ba7534caf59fc216f3 (patch)
tree5d63f362a382bb65a87125dbb9aec37ce529d990
parent8c2a1b931b3b54cd076665c4a5aeb986bac2d5e7 (diff)
Ensure that NGramExpression can be executed multiple times, where span tree from first execution is used.
This can happen when we have multiple UpdateAdapters (e.g. regular updates + field path updates) and then all scripts are executed per adapter in Expression.execute().
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NGramExpression.java4
-rw-r--r--indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/NGramTestCase.java16
2 files changed, 20 insertions, 0 deletions
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 816d6a62fd0..d91338e3d3f 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
@@ -48,6 +48,10 @@ public final class NGramExpression extends Expression {
@Override
protected void doExecute(ExecutionContext ctx) {
StringFieldValue input = (StringFieldValue)ctx.getValue();
+ if (input.getSpanTree(SpanTrees.LINGUISTICS) != null) {
+ // This expression is already executed for this input instance
+ return;
+ }
SpanList spanList = input.setSpanTree(new SpanTree(SpanTrees.LINGUISTICS)).spanList();
int lastPosition = 0;
for (Iterator<GramSplitter.Gram> it = linguistics.getGramSplitter().split(input.getString(), gramSize); it.hasNext();) {
diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/NGramTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/NGramTestCase.java
index bad1407c7c1..0b217d5ba9a 100644
--- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/NGramTestCase.java
+++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/NGramTestCase.java
@@ -77,6 +77,22 @@ public class NGramTestCase {
assertFalse(i.hasNext());
}
+ @Test
+ public void requireThatExecuteCanBeCalledMultipleTimes() {
+ ExecutionContext context = new ExecutionContext(new SimpleTestAdapter());
+ context.setValue(new StringFieldValue("some random text string"));
+ NGramExpression expression = new NGramExpression(new SimpleLinguistics(), 3);
+
+ expression.execute(context);
+ SpanTree firstTree = ((StringFieldValue)context.getValue()).getSpanTree(SpanTrees.LINGUISTICS);
+ assertNotNull(firstTree);
+
+ expression.execute(context);
+ SpanTree secondTree = ((StringFieldValue)context.getValue()).getSpanTree(SpanTrees.LINGUISTICS);
+ // The span tree instance should be the same.
+ assertEquals(firstTree, secondTree);
+ }
+
private void assertSpan(int from, int length, boolean gram, Iterator<SpanNode> i, SpanTree tree) {
assertSpan(from, length, gram, i, tree, null);
}