diff options
Diffstat (limited to 'indexinglanguage/src')
3 files changed, 92 insertions, 23 deletions
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 b0478f8001c..1935664cddc 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 @@ -10,16 +10,18 @@ import com.yahoo.language.detect.Detection; import java.util.HashMap; import java.util.Map; +import java.util.Objects; /** * @author Simon Thoresen Hult */ -public class ExecutionContext implements FieldTypeAdapter, FieldValueAdapter, Cloneable { +public class ExecutionContext implements FieldTypeAdapter, FieldValueAdapter { private final Map<String, FieldValue> variables = new HashMap<>(); private final FieldValueAdapter adapter; private FieldValue value; private Language language; + private Map<String, Object> cache = null; public ExecutionContext() { this(null); @@ -40,7 +42,9 @@ public class ExecutionContext implements FieldTypeAdapter, FieldValueAdapter, Cl * 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(); } + public boolean isComplete() { + return adapter != null && adapter.isComplete(); + } @Override public DataType getInputType(Expression exp, String fieldName) { @@ -89,43 +93,45 @@ public class ExecutionContext implements FieldTypeAdapter, FieldValueAdapter, Cl return this; } - public Language getLanguage() { - return language; - } + public Language getLanguage() { return language; } public ExecutionContext setLanguage(Language language) { - language.getClass(); - this.language = language; + this.language = Objects.requireNonNull(language); return this; } public Language resolveLanguage(Linguistics linguistics) { - if (language != null && language != Language.UNKNOWN) { - return language; - } - if (linguistics == null) { - return Language.ENGLISH; - } + if (language != null && language != Language.UNKNOWN) return language; + if (linguistics == null) return Language.ENGLISH; + Detection detection = linguistics.getDetector().detect(String.valueOf(value), null); - if (detection == null) { - return Language.ENGLISH; - } + if (detection == null) return Language.ENGLISH; + Language detected = detection.getLanguage(); - if (detected == Language.UNKNOWN) { - return Language.ENGLISH; - } + if (detected == Language.UNKNOWN) return Language.ENGLISH; return detected; } - public FieldValue getValue() { - return value; - } + public FieldValue getValue() { return value; } public ExecutionContext setValue(FieldValue value) { this.value = value; return this; } + public void putCachedValue(String key, Object value) { + if (cache == null) + cache = new HashMap<>(); + cache.put(key, value); + } + + /** Returns a cached value, or null if not present. */ + public Object getCachedValue(String key) { + if (cache == null) return null; + return cache.get(key); + } + + /** Clears all state in this except the cache. */ public ExecutionContext clear() { variables.clear(); value = null; 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 a88e56939ee..7d180b9fd7a 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 @@ -51,7 +51,8 @@ public final class ScriptExpression extends ExpressionList<StatementExpression> for (StatementExpression statement : this) { if (context.isComplete() || (statement.getInputFields().isEmpty() || containsAtLeastOneInputFrom(statement.getInputFields(), context))) { - context.setValue(input).execute(statement); + context.setValue(input); + context.execute(statement); } } context.setValue(input); 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 75f852f0331..df7f99d22d2 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 @@ -75,6 +75,20 @@ public class ScriptTestCase { } @Test + public void testCache() { + SimpleTestAdapter adapter = new SimpleTestAdapter(new Field("field1", DataType.STRING)); + var script = newScript(newStatement(new InputExpression("field1"), + new PutCacheExpression("myCacheKey", "myCacheValue")), + newStatement(new ClearStateExpression()), // inserted by config model + newStatement(new InputExpression("field1"), + new AssertCacheExpression("myCacheKey", "myCacheValue"))); + adapter.setValue("field1", new StringFieldValue("foo1")); + ExecutionContext context = new ExecutionContext(adapter); + script.execute(context); + assertEquals("myCacheValue", context.getCachedValue("myCacheKey")); + } + + @Test public void requireThatStatementsProcessingMissingInputsAreSkipped() { SimpleTestAdapter adapter = new SimpleTestAdapter(new Field("foo", DataType.STRING), new Field("bar", DataType.STRING)); @@ -155,4 +169,52 @@ public class ScriptTestCase { } + private static class PutCacheExpression extends Expression { + + private final String keyToSet; + private final String valueToSet; + + public PutCacheExpression(String keyToSet, String valueToSet) { + super(null); + this.keyToSet = keyToSet; + this.valueToSet = valueToSet; + } + + @Override + protected void doExecute(ExecutionContext context) { + context.putCachedValue(keyToSet, valueToSet); + } + + @Override + protected void doVerify(VerificationContext context) {} + + @Override + public DataType createdOutputType() { return null; } + + } + + private static class AssertCacheExpression extends Expression { + + private final String expectedKey; + private final String expectedValue; + + public AssertCacheExpression(String expectedKey, String expectedValue) { + super(null); + this.expectedKey = expectedKey; + this.expectedValue = expectedValue; + } + + @Override + protected void doExecute(ExecutionContext context) { + assertEquals(expectedValue, context.getCachedValue(expectedKey)); + } + + @Override + protected void doVerify(VerificationContext context) {} + + @Override + public DataType createdOutputType() { return null; } + + } + } |