diff options
author | Geir Storli <geirst@verizonmedia.com> | 2019-07-05 08:41:19 +0000 |
---|---|---|
committer | Geir Storli <geirst@verizonmedia.com> | 2019-07-05 08:41:19 +0000 |
commit | 21eef41d88e61ff2ee87b7ba7534caf59fc216f3 (patch) | |
tree | 5d63f362a382bb65a87125dbb9aec37ce529d990 /indexinglanguage/src | |
parent | 8c2a1b931b3b54cd076665c4a5aeb986bac2d5e7 (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().
Diffstat (limited to 'indexinglanguage/src')
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); } |