diff options
author | Jon Bratseth <bratseth@oath.com> | 2021-09-19 23:21:13 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-19 23:21:13 +0200 |
commit | 820b7403e2781407c0e158ba6def9fcd07129767 (patch) | |
tree | c86512d51a3eebe510b8dd5768bef26a58010ae8 | |
parent | 31d2cb6dd5fee11115ec11f0771f9c500df8426d (diff) | |
parent | 45fd51437b052cf05dc9fd8c7bfef5143a8c2164 (diff) |
Merge pull request #19198 from vespa-engine/bratseth/il-encode
Bratseth/il encode
107 files changed, 563 insertions, 336 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/document/SDField.java b/config-model/src/main/java/com/yahoo/searchdefinition/document/SDField.java index ac92207820c..9c89517f72d 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/document/SDField.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/document/SDField.java @@ -9,6 +9,7 @@ import com.yahoo.document.MapDataType; import com.yahoo.document.StructDataType; import com.yahoo.document.TensorDataType; import com.yahoo.language.Linguistics; +import com.yahoo.language.process.Encoder; import com.yahoo.language.simple.SimpleLinguistics; import com.yahoo.searchdefinition.Index; import com.yahoo.searchdefinition.Search; @@ -425,12 +426,12 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, /** Parse an indexing expression which will use the simple linguistics implementatino suitable for testing */ public void parseIndexingScript(String script) { - parseIndexingScript(script, new SimpleLinguistics()); + parseIndexingScript(script, new SimpleLinguistics(), Encoder.throwsOnUse); } - public void parseIndexingScript(String script, Linguistics linguistics) { + public void parseIndexingScript(String script, Linguistics linguistics, Encoder encoder) { try { - ScriptParserContext config = new ScriptParserContext(linguistics); + ScriptParserContext config = new ScriptParserContext(linguistics, encoder); config.setInputStream(new IndexingInput(script)); setIndexingScript(ScriptExpression.newInstance(config)); } catch (ParseException e) { diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/IndexingOperation.java b/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/IndexingOperation.java index dece0064fcc..4332d8baea8 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/IndexingOperation.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/IndexingOperation.java @@ -2,6 +2,7 @@ package com.yahoo.searchdefinition.fieldoperation; import com.yahoo.language.Linguistics; +import com.yahoo.language.process.Encoder; import com.yahoo.language.simple.SimpleLinguistics; import com.yahoo.searchdefinition.document.SDField; import com.yahoo.searchdefinition.parser.ParseException; @@ -27,14 +28,14 @@ public class IndexingOperation implements FieldOperation { } /** Creates an indexing operation which will use the simple linguistics implementation suitable for testing */ - @SuppressWarnings("deprecation") public static IndexingOperation fromStream(SimpleCharStream input, boolean multiLine) throws ParseException { - return fromStream(input, multiLine, new SimpleLinguistics()); + return fromStream(input, multiLine, new SimpleLinguistics(), Encoder.throwsOnUse); } - public static IndexingOperation fromStream(SimpleCharStream input, boolean multiLine, Linguistics linguistics) + public static IndexingOperation fromStream(SimpleCharStream input, boolean multiLine, + Linguistics linguistics, Encoder encoder) throws ParseException { - ScriptParserContext config = new ScriptParserContext(linguistics); + ScriptParserContext config = new ScriptParserContext(linguistics, encoder); config.setAnnotatorConfig(new AnnotatorConfig()); config.setInputStream(input); ScriptExpression exp; diff --git a/config-model/src/main/javacc/SDParser.jj b/config-model/src/main/javacc/SDParser.jj index 4d7b31e6e50..7df77588fe8 100644 --- a/config-model/src/main/javacc/SDParser.jj +++ b/config-model/src/main/javacc/SDParser.jj @@ -58,6 +58,7 @@ import com.yahoo.config.application.api.DeployLogger; import com.yahoo.config.application.api.FileRegistry; import com.yahoo.config.model.api.ModelContext; import com.yahoo.language.Linguistics; +import com.yahoo.language.process.Encoder; import com.yahoo.language.simple.SimpleLinguistics; import com.yahoo.search.query.ranking.Diversity; import java.util.Map; @@ -111,7 +112,7 @@ public class SDParser { */ @SuppressWarnings("deprecation") private IndexingOperation newIndexingOperation(boolean multiline) throws ParseException { - return newIndexingOperation(multiline, new SimpleLinguistics()); + return newIndexingOperation(multiline, new SimpleLinguistics(), Encoder.throwsOnUse); } /** @@ -120,13 +121,13 @@ public class SDParser { * @param multiline Whether or not to allow multi-line expressions. * @param linguistics What to use for tokenizing. */ - private IndexingOperation newIndexingOperation(boolean multiline, Linguistics linguistics) throws ParseException { + private IndexingOperation newIndexingOperation(boolean multiline, Linguistics linguistics, Encoder encoder) throws ParseException { SimpleCharStream input = (SimpleCharStream)token_source.input_stream; if (token.next != null) { input.backup(token.next.image.length()); } try { - return IndexingOperation.fromStream(input, multiline, linguistics); + return IndexingOperation.fromStream(input, multiline, linguistics, encoder); } finally { token.next = null; jj_ntk = -1; diff --git a/container-core/src/main/java/com/yahoo/language/provider/DefaultEncoderProvider.java b/container-core/src/main/java/com/yahoo/language/provider/DefaultEncoderProvider.java index 9b07ee55bd8..f8550d04d1c 100644 --- a/container-core/src/main/java/com/yahoo/language/provider/DefaultEncoderProvider.java +++ b/container-core/src/main/java/com/yahoo/language/provider/DefaultEncoderProvider.java @@ -19,30 +19,13 @@ import java.util.List; @SuppressWarnings("unused") // Injected public class DefaultEncoderProvider implements Provider<Encoder> { - // Use lazy initialization to avoid expensive (memory-wise) instantiation - private static final Encoder failingEncoder = new FailingEncoder(); - @Inject public DefaultEncoderProvider() { } @Override - public Encoder get() { return failingEncoder; } + public Encoder get() { return Encoder.throwsOnUse; } @Override public void deconstruct() {} - public static class FailingEncoder implements Encoder { - - @Override - public List<Integer> encode(String text, Language language) { - throw new IllegalStateException("No encoder has been configured"); - } - - @Override - public Tensor encode(String text, Language language, TensorType tensorType) { - throw new IllegalStateException("No encoder has been configured"); - } - - } - } 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 285f3e83602..53709c4ff87 100644 --- a/docprocs/src/main/java/com/yahoo/docprocs/indexing/IndexingProcessor.java +++ b/docprocs/src/main/java/com/yahoo/docprocs/indexing/IndexingProcessor.java @@ -20,6 +20,8 @@ import com.yahoo.document.DocumentUpdate; import com.yahoo.document.config.DocumentmanagerConfig; import com.yahoo.language.Linguistics; import java.util.logging.Level; + +import com.yahoo.language.process.Encoder; import com.yahoo.vespa.configdefinition.IlscriptsConfig; import com.yahoo.vespa.indexinglanguage.AdapterFactory; import com.yahoo.vespa.indexinglanguage.SimpleAdapterFactory; @@ -52,9 +54,10 @@ public class IndexingProcessor extends DocumentProcessor { @Inject public IndexingProcessor(DocumentmanagerConfig documentmanagerConfig, IlscriptsConfig ilscriptsConfig, - Linguistics linguistics) { + Linguistics linguistics, + Encoder encoder) { docTypeMgr = DocumentTypeManagerConfigurer.configureNewManager(documentmanagerConfig); - scriptMgr = new ScriptManager(docTypeMgr, ilscriptsConfig, linguistics); + scriptMgr = new ScriptManager(docTypeMgr, ilscriptsConfig, linguistics, encoder); adapterFactory = new SimpleAdapterFactory(new ExpressionSelector()); } 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 a148966c250..8f3f75af795 100644 --- a/docprocs/src/main/java/com/yahoo/docprocs/indexing/ScriptManager.java +++ b/docprocs/src/main/java/com/yahoo/docprocs/indexing/ScriptManager.java @@ -5,6 +5,8 @@ import com.yahoo.document.DocumentType; import com.yahoo.document.DocumentTypeManager; import com.yahoo.language.Linguistics; import java.util.logging.Level; + +import com.yahoo.language.process.Encoder; import com.yahoo.vespa.configdefinition.IlscriptsConfig; import com.yahoo.vespa.indexinglanguage.ScriptParserContext; import com.yahoo.vespa.indexinglanguage.expressions.InputExpression; @@ -26,9 +28,9 @@ public class ScriptManager { private final Map<String, Map<String, DocumentScript>> documentFieldScripts; private final DocumentTypeManager docTypeMgr; - public ScriptManager(DocumentTypeManager docTypeMgr, IlscriptsConfig config, Linguistics linguistics) { + public ScriptManager(DocumentTypeManager docTypeMgr, IlscriptsConfig config, Linguistics linguistics, Encoder encoder) { this.docTypeMgr = docTypeMgr; - documentFieldScripts = createScriptsMap(docTypeMgr, config, linguistics); + documentFieldScripts = createScriptsMap(docTypeMgr, config, linguistics, encoder); } @@ -72,9 +74,10 @@ public class ScriptManager { private static Map<String, Map<String, DocumentScript>> createScriptsMap(DocumentTypeManager docTypeMgr, IlscriptsConfig config, - Linguistics linguistics) { + Linguistics linguistics, + Encoder encoder) { Map<String, Map<String, DocumentScript>> documentFieldScripts = new HashMap<>(config.ilscript().size()); - ScriptParserContext parserContext = new ScriptParserContext(linguistics); + ScriptParserContext parserContext = new ScriptParserContext(linguistics, encoder); parserContext.getAnnotatorConfig().setMaxTermOccurrences(config.maxtermoccurrences()); parserContext.getAnnotatorConfig().setMaxTokenLength(config.fieldmatchmaxlength()); 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 8ad2ff0aaad..dc9b1ffba73 100644 --- a/docprocs/src/test/java/com/yahoo/docprocs/indexing/IndexingProcessorTestCase.java +++ b/docprocs/src/test/java/com/yahoo/docprocs/indexing/IndexingProcessorTestCase.java @@ -13,6 +13,7 @@ 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.Encoder; import com.yahoo.language.simple.SimpleLinguistics; import com.yahoo.vespa.configdefinition.IlscriptsConfig; import org.junit.Test; @@ -125,6 +126,7 @@ public class IndexingProcessorTestCase { private static IndexingProcessor newProcessor(String configId) { return new IndexingProcessor(ConfigGetter.getConfig(DocumentmanagerConfig.class, configId), ConfigGetter.getConfig(IlscriptsConfig.class, configId), - new SimpleLinguistics()); + new SimpleLinguistics(), + Encoder.throwsOnUse); } } 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 23df8c0eb25..607fee4f10d 100644 --- a/docprocs/src/test/java/com/yahoo/docprocs/indexing/ScriptManagerTestCase.java +++ b/docprocs/src/test/java/com/yahoo/docprocs/indexing/ScriptManagerTestCase.java @@ -3,6 +3,7 @@ package com.yahoo.docprocs.indexing; import com.yahoo.document.DocumentType; import com.yahoo.document.DocumentTypeManager; +import com.yahoo.language.process.Encoder; import com.yahoo.vespa.configdefinition.IlscriptsConfig; import com.yahoo.vespa.indexinglanguage.parser.ParseException; import org.junit.Test; @@ -28,7 +29,7 @@ public class ScriptManagerTestCase { IlscriptsConfig.Builder config = new IlscriptsConfig.Builder(); config.ilscript(new IlscriptsConfig.Ilscript.Builder().doctype("newssummary") .content("index")); - ScriptManager scriptMgr = new ScriptManager(typeMgr, new IlscriptsConfig(config), null); + ScriptManager scriptMgr = new ScriptManager(typeMgr, new IlscriptsConfig(config), null, Encoder.throwsOnUse); assertNotNull(scriptMgr.getScript(typeMgr.getDocumentType("newsarticle"))); assertNull(scriptMgr.getScript(new DocumentType("unknown"))); } @@ -43,7 +44,7 @@ public class ScriptManagerTestCase { IlscriptsConfig.Builder config = new IlscriptsConfig.Builder(); config.ilscript(new IlscriptsConfig.Ilscript.Builder().doctype("newsarticle") .content("index")); - ScriptManager scriptMgr = new ScriptManager(typeMgr, new IlscriptsConfig(config), null); + ScriptManager scriptMgr = new ScriptManager(typeMgr, new IlscriptsConfig(config), null, Encoder.throwsOnUse); assertNotNull(scriptMgr.getScript(typeMgr.getDocumentType("newssummary"))); assertNull(scriptMgr.getScript(new DocumentType("unknown"))); } @@ -52,7 +53,7 @@ public class ScriptManagerTestCase { public void requireThatEmptyConfigurationDoesNotThrow() { DocumentTypeManager typeMgr = new DocumentTypeManager(); typeMgr.configure("file:src/test/cfg/documentmanager_inherit.cfg"); - ScriptManager scriptMgr = new ScriptManager(typeMgr, new IlscriptsConfig(new IlscriptsConfig.Builder()), null); + ScriptManager scriptMgr = new ScriptManager(typeMgr, new IlscriptsConfig(new IlscriptsConfig.Builder()), null, Encoder.throwsOnUse); assertNull(scriptMgr.getScript(new DocumentType("unknown"))); } @@ -60,7 +61,7 @@ public class ScriptManagerTestCase { public void requireThatUnknownDocumentTypeReturnsNull() { DocumentTypeManager typeMgr = new DocumentTypeManager(); typeMgr.configure("file:src/test/cfg/documentmanager_inherit.cfg"); - ScriptManager scriptMgr = new ScriptManager(typeMgr, new IlscriptsConfig(new IlscriptsConfig.Builder()), null); + ScriptManager scriptMgr = new ScriptManager(typeMgr, new IlscriptsConfig(new IlscriptsConfig.Builder()), null, Encoder.throwsOnUse); for (Iterator<DocumentType> it = typeMgr.documentTypeIterator(); it.hasNext(); ) { assertNull(scriptMgr.getScript(it.next())); } diff --git a/document/src/main/java/com/yahoo/document/TensorDataType.java b/document/src/main/java/com/yahoo/document/TensorDataType.java index c4fdff30f8b..ad4a856d964 100644 --- a/document/src/main/java/com/yahoo/document/TensorDataType.java +++ b/document/src/main/java/com/yahoo/document/TensorDataType.java @@ -21,7 +21,7 @@ public class TensorDataType extends DataType { public static int classId = registerClass(Ids.document + 59, TensorDataType.class); public TensorDataType(TensorType tensorType) { - super(tensorType.toString(), DataType.tensorDataTypeCode); + super(tensorType == null ? "tensor" : tensorType.toString(), DataType.tensorDataTypeCode); this.tensorType = tensorType; } @@ -64,4 +64,5 @@ public class TensorDataType extends DataType { public int hashCode() { return Objects.hash(super.hashCode(), tensorType); } + } diff --git a/document/src/main/java/com/yahoo/document/datatypes/StringFieldValue.java b/document/src/main/java/com/yahoo/document/datatypes/StringFieldValue.java index 156fd853241..acdd9f2b27b 100644 --- a/document/src/main/java/com/yahoo/document/datatypes/StringFieldValue.java +++ b/document/src/main/java/com/yahoo/document/datatypes/StringFieldValue.java @@ -74,7 +74,6 @@ public class StringFieldValue extends FieldValue { * Returns {@link com.yahoo.document.DataType}.STRING. * * @return DataType.STRING, always - * @see com.yahoo.document.DataType */ @Override public DataType getDataType() { diff --git a/document/src/main/java/com/yahoo/document/fieldpathupdate/AddFieldPathUpdate.java b/document/src/main/java/com/yahoo/document/fieldpathupdate/AddFieldPathUpdate.java index 74b94b8135e..fc48a0a80ee 100644 --- a/document/src/main/java/com/yahoo/document/fieldpathupdate/AddFieldPathUpdate.java +++ b/document/src/main/java/com/yahoo/document/fieldpathupdate/AddFieldPathUpdate.java @@ -11,9 +11,10 @@ import com.yahoo.document.serialization.DocumentUpdateReader; import com.yahoo.document.serialization.VespaDocumentSerializer6; /** - * @author <a href="mailto:thomasg@yahoo-inc.com">Thomas Gundersen</a> + * @author Thomas Gundersen */ public class AddFieldPathUpdate extends FieldPathUpdate { + class IteratorHandler extends FieldPathIteratorHandler { Array newValues; diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/AdapterFactory.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/AdapterFactory.java index c172e50daeb..55374ea1ca2 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/AdapterFactory.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/AdapterFactory.java @@ -11,7 +11,8 @@ import java.util.List; */ public interface AdapterFactory { - public DocumentAdapter newDocumentAdapter(Document doc); + DocumentAdapter newDocumentAdapter(Document doc); + + List<UpdateAdapter> newUpdateAdapterList(DocumentUpdate upd); - public List<UpdateAdapter> newUpdateAdapterList(DocumentUpdate upd); } 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 6becfffaa8c..ec7ce6eb06c 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/DocumentAdapter.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/DocumentAdapter.java @@ -9,7 +9,8 @@ import com.yahoo.vespa.indexinglanguage.expressions.FieldValueAdapter; */ public interface DocumentAdapter extends FieldValueAdapter { - public Document getFullOutput(); + Document getFullOutput(); + + Document getUpdatableOutput(); - public Document getUpdatableOutput(); } diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionConverter.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionConverter.java index 264c54ce5cb..60ca16533fd 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionConverter.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionConverter.java @@ -121,7 +121,6 @@ public abstract class ExpressionConverter implements Cloneable { } @Override - @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException") public ExpressionConverter clone() { try { return (ExpressionConverter)super.clone(); diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionOptimizer.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionOptimizer.java index 2a87bbc2ec0..748035ed1fc 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionOptimizer.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionOptimizer.java @@ -12,6 +12,7 @@ import java.util.List; * generates a new execution value without regard for the existing one. */ public class ExpressionOptimizer extends ExpressionConverter { + @Override protected boolean shouldConvert(Expression exp) { return exp instanceof StatementExpression; @@ -111,4 +112,5 @@ public class ExpressionOptimizer extends ExpressionConverter { } } + } diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionSearcher.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionSearcher.java index f1d338371f3..7f8698b53d3 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionSearcher.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionSearcher.java @@ -42,4 +42,5 @@ public class ExpressionSearcher<T extends Expression> { return exp; } } + } diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldPathUpdateAdapter.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldPathUpdateAdapter.java index 84245d789fd..9ab2f8d49de 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldPathUpdateAdapter.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldPathUpdateAdapter.java @@ -123,4 +123,5 @@ public class FieldPathUpdateAdapter implements UpdateAdapter { update.getOriginalWhereClause())); } } + } 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 916b442fb74..c239b240985 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldPathUpdateHelper.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldPathUpdateHelper.java @@ -63,4 +63,5 @@ public abstract class FieldPathUpdateHelper { return 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 bb89ce736f7..c819587bedd 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateAdapter.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateAdapter.java @@ -255,4 +255,5 @@ public class FieldUpdateAdapter implements UpdateAdapter { return super.createValueUpdates(val, nullAssign); } } + } 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 e51f7984d65..586f2b020ec 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateHelper.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateHelper.java @@ -126,4 +126,5 @@ public abstract class FieldUpdateHelper { } throw new UnsupportedOperationException("Value update type " + upd.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 96c740df7bf..799327c01b3 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldValueConverter.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldValueConverter.java @@ -127,6 +127,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()); } @@ -151,8 +152,8 @@ public abstract class FieldValueConverter { * Returns whether or not the given {@link FieldValue} should be converted. If this method returns <em>false</em>, * the converter will proceed to traverse the value itself to see if its internal can be converted. * - * @param value The value to check. - * @return True to convert, false to traverse. + * @param value the value to check + * @return true to convert, false to traverse */ protected abstract boolean shouldConvert(FieldValue value); @@ -160,8 +161,9 @@ public abstract class FieldValueConverter { * Converts the given value. It is IMPERATIVE that the implementation of this method DOES NOT mutate the given * {@link FieldValue} in place, as that can cause SERIOUS inconsistencies in the parent structures. * - * @param value The value to convert. - * @return The value to replace the old. + * @param value the value to convert + * @return the value to replace the old */ protected abstract FieldValue doConvert(FieldValue value); + } diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/IdentityFieldPathUpdateAdapter.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/IdentityFieldPathUpdateAdapter.java index 42c9bd8c10c..a7c5e87b09b 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/IdentityFieldPathUpdateAdapter.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/IdentityFieldPathUpdateAdapter.java @@ -65,4 +65,5 @@ public class IdentityFieldPathUpdateAdapter implements UpdateAdapter { public void tryOutputType(Expression exp, String fieldName, DataType valueType) { fwdAdapter.tryOutputType(exp, fieldName, valueType); } + } 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 0bc82535ad8..34da5b47655 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ScriptParser.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ScriptParser.java @@ -50,18 +50,19 @@ public final class ScriptParser { }); } - private static interface ParserMethod<T extends Expression> { + private interface ParserMethod<T extends Expression> { T call(IndexingParser parser) throws ParseException; } - private static <T extends Expression> T parse(ScriptParserContext config, ParserMethod<T> method) + private static <T extends Expression> T parse(ScriptParserContext context, ParserMethod<T> method) throws ParseException { - CharStream input = config.getInputStream(); + CharStream input = context.getInputStream(); IndexingParser parser = new IndexingParser(input); - parser.setAnnotatorConfig(config.getAnnotatorConfig()); - parser.setDefaultFieldName(config.getDefaultFieldName()); - parser.setLinguistics(config.getLinguistcs()); + parser.setAnnotatorConfig(context.getAnnotatorConfig()); + parser.setDefaultFieldName(context.getDefaultFieldName()); + parser.setLinguistics(context.getLinguistcs()); + parser.setEncoder(context.getEncoder()); try { return method.call(parser); } catch (ParseException e) { @@ -75,4 +76,5 @@ public final class ScriptParser { } } } + } diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ScriptParserContext.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ScriptParserContext.java index 77bd3e0306f..06be91703fa 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ScriptParserContext.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ScriptParserContext.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.indexinglanguage; import com.yahoo.language.Linguistics; +import com.yahoo.language.process.Encoder; import com.yahoo.language.simple.SimpleLinguistics; import com.yahoo.vespa.indexinglanguage.linguistics.AnnotatorConfig; import com.yahoo.vespa.indexinglanguage.parser.CharStream; @@ -13,11 +14,13 @@ public class ScriptParserContext { private AnnotatorConfig annotatorConfig = new AnnotatorConfig(); private Linguistics linguistics; + private final Encoder encoder; private String defaultFieldName = null; private CharStream inputStream = null; - public ScriptParserContext(Linguistics linguistics) { + public ScriptParserContext(Linguistics linguistics, Encoder encoder) { this.linguistics = linguistics; + this.encoder = encoder; } public AnnotatorConfig getAnnotatorConfig() { @@ -38,6 +41,10 @@ public class ScriptParserContext { return this; } + public Encoder getEncoder() { + return encoder; + } + public String getDefaultFieldName() { return defaultFieldName; } @@ -55,4 +62,5 @@ public class ScriptParserContext { inputStream = stream; return this; } + } 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 35bb70c2a88..801afa546c6 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/SimpleAdapterFactory.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/SimpleAdapterFactory.java @@ -15,11 +15,13 @@ import java.util.List; */ @SuppressWarnings("rawtypes") public class SimpleAdapterFactory implements AdapterFactory { + public static class SelectExpression { public Expression selectExpression(DocumentType documentType, String fieldName) { return null; } } + private final SelectExpression expressionSelector; public SimpleAdapterFactory() { @@ -79,4 +81,5 @@ public class SimpleAdapterFactory implements AdapterFactory { ret.add(FieldUpdateAdapter.fromCompleteUpdate(newDocumentAdapter(complete, true))); return ret; } + } diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/SimpleDocumentAdapter.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/SimpleDocumentAdapter.java index 16afa08cf45..d2444ff25c5 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/SimpleDocumentAdapter.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/SimpleDocumentAdapter.java @@ -76,7 +76,6 @@ public class SimpleDocumentAdapter implements DocumentAdapter { } } - @SuppressWarnings({ "unchecked" }) @Override public SimpleDocumentAdapter setOutputValue(Expression exp, String fieldName, FieldValue fieldValue) { Field field = output.getField(fieldName); @@ -87,4 +86,5 @@ public class SimpleDocumentAdapter implements DocumentAdapter { output.setFieldValue(field, fieldValue); return this; } + } diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/StringFieldConverter.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/StringFieldConverter.java index f66f1d00f93..1e0fd235e1f 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/StringFieldConverter.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/StringFieldConverter.java @@ -21,4 +21,5 @@ public abstract class StringFieldConverter extends FieldValueConverter { } protected abstract FieldValue doConvert(StringFieldValue value); + } diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/TypedExpressionConverter.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/TypedExpressionConverter.java index b4085e65505..be9e212ae26 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/TypedExpressionConverter.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/TypedExpressionConverter.java @@ -25,4 +25,5 @@ public abstract class TypedExpressionConverter<T extends Expression> extends Exp } protected abstract Expression typedConvert(T exp); + } 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 f1cf9a4ae4b..7b29a297a81 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/UpdateAdapter.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/UpdateAdapter.java @@ -10,6 +10,7 @@ import com.yahoo.vespa.indexinglanguage.expressions.FieldValueAdapter; */ public interface UpdateAdapter extends FieldValueAdapter { - public DocumentUpdate getOutput(); - public Expression getExpression(Expression expression); + DocumentUpdate getOutput(); + Expression getExpression(Expression expression); + } diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ValueTransformProvider.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ValueTransformProvider.java index e9bb3dd418d..599e07493bb 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ValueTransformProvider.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ValueTransformProvider.java @@ -60,4 +60,5 @@ public abstract class ValueTransformProvider extends ExpressionConverter { protected abstract boolean requiresTransform(Expression exp); protected abstract Expression newTransform(); + } diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ArithmeticExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ArithmeticExpression.java index 68b9e79e092..ee2d4e17a74 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ArithmeticExpression.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ArithmeticExpression.java @@ -68,17 +68,17 @@ public final class ArithmeticExpression extends CompositeExpression { } @Override - protected void doExecute(ExecutionContext ctx) { - FieldValue input = ctx.getValue(); - ctx.setValue(evaluate(ctx.setValue(input).execute(lhs).getValue(), - ctx.setValue(input).execute(rhs).getValue())); + protected void doExecute(ExecutionContext context) { + FieldValue input = context.getValue(); + context.setValue(evaluate(context.setValue(input).execute(lhs).getValue(), + context.setValue(input).execute(rhs).getValue())); } @Override protected void doVerify(VerificationContext context) { - DataType input = context.getValue(); - context.setValue(evaluate(context.setValue(input).execute(lhs).getValue(), - context.setValue(input).execute(rhs).getValue())); + DataType input = context.getValueType(); + context.setValueType(evaluate(context.setValueType(input).execute(lhs).getValueType(), + context.setValueType(input).execute(rhs).getValueType())); } private static DataType requiredInputType(Expression lhs, Expression rhs) { diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Base64DecodeExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Base64DecodeExpression.java index 463c009e0a3..c056c11a4c0 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Base64DecodeExpression.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Base64DecodeExpression.java @@ -16,10 +16,10 @@ public final class Base64DecodeExpression extends Expression { } @Override - protected void doExecute(ExecutionContext ctx) { - String input = String.valueOf(ctx.getValue()); + protected void doExecute(ExecutionContext context) { + String input = String.valueOf(context.getValue()); if (input.isEmpty()) { - ctx.setValue(new LongFieldValue(Long.MIN_VALUE)); + context.setValue(new LongFieldValue(Long.MIN_VALUE)); return; } if (input.length() > 12) { @@ -33,12 +33,12 @@ public final class Base64DecodeExpression extends Expression { for (int i = decoded.length; --i >= 0;) { output = (output << 8) + (((int)decoded[i]) & 0xff); } - ctx.setValue(new LongFieldValue(output)); + context.setValue(new LongFieldValue(output)); } @Override protected void doVerify(VerificationContext context) { - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Base64EncodeExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Base64EncodeExpression.java index e61ac7051c1..940b75b4c99 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Base64EncodeExpression.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Base64EncodeExpression.java @@ -16,20 +16,20 @@ public final class Base64EncodeExpression extends Expression { super(DataType.LONG); } @Override - protected void doExecute(ExecutionContext ctx) { - long input = ((LongFieldValue)ctx.getValue()).getLong(); + protected void doExecute(ExecutionContext context) { + long input = ((LongFieldValue) context.getValue()).getLong(); byte[] output = new byte[8]; for (int i = 0; i < output.length; ++i) { output[i] = (byte)(input & 0xffL); input >>>= 8; } String encoded = Base64.getEncoder().encodeToString(output); - ctx.setValue(new StringFieldValue(encoded)); + context.setValue(new StringFieldValue(encoded)); } @Override protected void doVerify(VerificationContext context) { - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/CatExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/CatExpression.java index f395446cb10..9f8a012770b 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/CatExpression.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/CatExpression.java @@ -26,40 +26,40 @@ public final class CatExpression extends ExpressionList<Expression> { } @Override - protected void doExecute(ExecutionContext ctx) { - FieldValue input = ctx.getValue(); + protected void doExecute(ExecutionContext context) { + FieldValue input = context.getValue(); DataType inputType = input != null ? input.getDataType() : null; - VerificationContext ver = new VerificationContext(ctx); + VerificationContext ver = new VerificationContext(context); List<FieldValue> values = new LinkedList<>(); List<DataType> types = new LinkedList<>(); for (Expression exp : this) { - FieldValue val = ctx.setValue(input).execute(exp).getValue(); + FieldValue val = context.setValue(input).execute(exp).getValue(); values.add(val); DataType type; if (val != null) { type = val.getDataType(); } else { - type = ver.setValue(inputType).execute(this).getValue(); + type = ver.setValueType(inputType).execute(this).getValueType(); } types.add(type); } DataType type = resolveOutputType(types); - ctx.setValue(type == DataType.STRING ? asString(values) : asCollection(type, values)); + context.setValue(type == DataType.STRING ? asString(values) : asCollection(type, values)); } @Override protected void doVerify(VerificationContext context) { - DataType input = context.getValue(); + DataType input = context.getValueType(); List<DataType> types = new LinkedList<>(); for (Expression exp : this) { - DataType val = context.setValue(input).execute(exp).getValue(); + DataType val = context.setValueType(input).execute(exp).getValueType(); types.add(val); if (val == null) { throw new VerificationException(this, "Attempting to concatenate a null value (" + exp + ")."); } } - context.setValue(resolveOutputType(types)); + context.setValueType(resolveOutputType(types)); } private static DataType resolveInputType(Collection<? extends Expression> list) { 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 68aff396c54..dbf50dbf9a7 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 @@ -2,7 +2,6 @@ package com.yahoo.vespa.indexinglanguage.expressions; import com.yahoo.document.DataType; -import com.yahoo.document.DocumentType; /** * @author Simon Thoresen Hult @@ -13,8 +12,8 @@ public final class ClearStateExpression extends Expression { super(null); } @Override - protected void doExecute(ExecutionContext ctx) { - ctx.clear(); + protected void doExecute(ExecutionContext context) { + context.clear(); } @Override 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 4da12bd0361..82e77192618 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 @@ -20,4 +20,5 @@ public abstract class CompositeExpression extends Expression { } return new ScriptExpression(new StatementExpression(exp)).toString(); } + } diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EchoExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EchoExpression.java index 8d5504b2b1c..b0c2a52b027 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EchoExpression.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EchoExpression.java @@ -26,8 +26,8 @@ public final class EchoExpression extends Expression { } @Override - protected void doExecute(ExecutionContext ctx) { - out.println(String.valueOf(ctx.getValue())); + protected void doExecute(ExecutionContext context) { + out.println(String.valueOf(context.getValue())); } @Override diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EncodeExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EncodeExpression.java new file mode 100644 index 00000000000..09034659ad0 --- /dev/null +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EncodeExpression.java @@ -0,0 +1,64 @@ +// 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.TensorDataType; +import com.yahoo.document.datatypes.StringFieldValue; +import com.yahoo.document.datatypes.TensorFieldValue; +import com.yahoo.language.process.Encoder; +import com.yahoo.tensor.Tensor; +import com.yahoo.tensor.TensorType; + +/** + * Encodes a string as a tensor using the configured Encoder component + * + * @author bratseth + */ +public class EncodeExpression extends Expression { + + private final Encoder encoder; + + /** The target type we are encoding to. Set during verification. */ + private TensorType targetType; + + public EncodeExpression(Encoder encoder) { + super(DataType.STRING); + this.encoder = encoder; + } + + @Override + protected void doExecute(ExecutionContext context) { + StringFieldValue input = (StringFieldValue) context.getValue(); + Tensor tensor = encoder.encode(input.getString(), context.getLanguage(), targetType); + context.setValue(new TensorFieldValue(tensor)); + } + + @Override + protected void doVerify(VerificationContext context) { + String outputField = context.getOutputField(); + if (outputField == null) + throw new VerificationException(this, "No output field in this statement: " + + "Don't know what tensor type to encode to."); + DataType outputFieldType = context.getInputType(this, outputField); + if ( ! (outputFieldType instanceof TensorDataType) ) + throw new VerificationException(this, "The type of the output field " + outputField + + " is not a tensor but " + outputField); + targetType = ((TensorDataType) outputFieldType).getTensorType(); + context.setValueType(createdOutputType()); + } + + @Override + public DataType createdOutputType() { + return new TensorDataType(targetType); + } + + @Override + public String toString() { return "encode"; } + + @Override + public int hashCode() { return 1; } + + @Override + public boolean equals(Object o) { return o instanceof EncodeExpression; } + +} diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExactExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExactExpression.java index 31633cdc88b..06f2d66f3fb 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExactExpression.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ExactExpression.java @@ -25,12 +25,12 @@ public final class ExactExpression extends Expression { } @Override - protected void doExecute(ExecutionContext ctx) { - StringFieldValue input = (StringFieldValue)ctx.getValue(); + protected void doExecute(ExecutionContext context) { + StringFieldValue input = (StringFieldValue) context.getValue(); if (input.getString().isEmpty()) return; StringFieldValue output = input.clone(); - ctx.setValue(output); + context.setValue(output); String prev = output.getString(); String next = toLowerCase(prev); 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 a4f1e3a5ca4..e2820dd5578 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 @@ -127,4 +127,5 @@ public class ExecutionContext implements FieldTypeAdapter, FieldValueAdapter, Cl value = null; 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 b23fe4d0ebd..a121df8e5a8 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 @@ -6,6 +6,7 @@ import com.yahoo.document.Document; import com.yahoo.document.DocumentUpdate; import com.yahoo.document.datatypes.FieldValue; import com.yahoo.language.Linguistics; +import com.yahoo.language.process.Encoder; import com.yahoo.language.simple.SimpleLinguistics; import com.yahoo.vespa.indexinglanguage.*; import com.yahoo.vespa.indexinglanguage.parser.IndexingInput; @@ -19,6 +20,13 @@ public abstract class Expression extends Selectable { private final DataType inputType; + /** + * Creates an expression + * + * @param inputType the type of the input this expression can work with. + * UnresolvedDataType.INSTANCE if it works with any type, + * and null if it does not consume any input. + */ protected Expression(DataType inputType) { this.inputType = inputType; } @@ -87,14 +95,14 @@ public abstract class Expression extends Selectable { return context.getValue(); } - protected abstract void doExecute(ExecutionContext ctx); + protected abstract void doExecute(ExecutionContext context); public final DataType verify() { return verify(new VerificationContext()); } public final DataType verify(DataType val) { - return verify(new VerificationContext().setValue(val)); + return verify(new VerificationContext().setValueType(val)); } public final Document verify(Document doc) { @@ -140,7 +148,7 @@ public abstract class Expression extends Selectable { public final DataType verify(VerificationContext context) { if (inputType != null) { - DataType input = context.getValue(); + DataType input = context.getValueType(); if (input == null) { throw new VerificationException(this, "Expected " + inputType.getName() + " input, got null."); } @@ -155,7 +163,7 @@ public abstract class Expression extends Selectable { doVerify(context); DataType outputType = createdOutputType(); if (outputType != null) { - DataType output = context.getValue(); + DataType output = context.getValueType(); if (output == null) { throw new VerificationException(this, "Expected " + outputType.getName() + " output, got null."); } @@ -167,7 +175,7 @@ public abstract class Expression extends Selectable { output.getName() + "."); } } - return context.getValue(); + return context.getValueType(); } protected abstract void doVerify(VerificationContext context); @@ -178,11 +186,11 @@ public abstract class Expression extends Selectable { /** Creates an expression with simple lingustics for testing */ public static Expression fromString(String expression) throws ParseException { - return fromString(expression, new SimpleLinguistics()); + return fromString(expression, new SimpleLinguistics(), Encoder.throwsOnUse); } - public static Expression fromString(String expression, Linguistics linguistics) throws ParseException { - return newInstance(new ScriptParserContext(linguistics).setInputStream(new IndexingInput(expression))); + public static Expression fromString(String expression, Linguistics linguistics, Encoder encoder) throws ParseException { + return newInstance(new ScriptParserContext(linguistics, encoder).setInputStream(new IndexingInput(expression))); } public static Expression newInstance(ScriptParserContext context) throws ParseException { 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 ca929773a4c..0ac195efb5d 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 @@ -2,7 +2,6 @@ package com.yahoo.vespa.indexinglanguage.expressions; import com.yahoo.document.DataType; -import com.yahoo.document.DocumentType; import com.yahoo.vespa.objects.ObjectOperation; import com.yahoo.vespa.objects.ObjectPredicate; @@ -70,4 +69,5 @@ public abstract class ExpressionList<T extends Expression> extends CompositeExpr exp.select(predicate, operation); } } + } diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/FieldTypeAdapter.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/FieldTypeAdapter.java index 1e8c9e430ab..a24501823af 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/FieldTypeAdapter.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/FieldTypeAdapter.java @@ -8,7 +8,8 @@ import com.yahoo.document.DataType; */ public interface FieldTypeAdapter { - public DataType getInputType(Expression exp, String fieldName); + DataType getInputType(Expression exp, String fieldName); + + void tryOutputType(Expression exp, String fieldName, DataType valueType); - public void tryOutputType(Expression exp, String fieldName, DataType valueType); } 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 db3cabf8b4c..036e421e6d7 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 @@ -9,8 +9,9 @@ import com.yahoo.document.datatypes.FieldValue; */ public interface FieldValueAdapter extends FieldTypeAdapter { - public FieldValue getInputValue(String fieldName); - public FieldValue getInputValue(FieldPath fieldPath); + FieldValue getInputValue(String fieldName); + FieldValue getInputValue(FieldPath fieldPath); + + FieldValueAdapter setOutputValue(Expression exp, String fieldName, FieldValue fieldValue); - public FieldValueAdapter setOutputValue(Expression exp, String fieldName, FieldValue fieldValue); } 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 91f46381def..34fa42dcbca 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 @@ -26,8 +26,8 @@ public final class FlattenExpression extends Expression { } @Override - protected void doExecute(ExecutionContext ctx) { - StringFieldValue input = (StringFieldValue)ctx.getValue(); + protected void doExecute(ExecutionContext context) { + StringFieldValue input = (StringFieldValue) context.getValue(); SpanTree tree = input.getSpanTree(SpanTrees.LINGUISTICS); Map<Integer, List<String>> map = new HashMap<>(); for (Annotation anno : tree) { @@ -65,12 +65,12 @@ public final class FlattenExpression extends Expression { output.append(inputVal.charAt(i)); } } - ctx.setValue(new StringFieldValue(output.toString())); + context.setValue(new StringFieldValue(output.toString())); } @Override protected void doVerify(VerificationContext context) { - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override 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 4dc2fdd0343..84dbe07d418 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 @@ -27,18 +27,18 @@ public final class ForEachExpression extends CompositeExpression { } @Override - protected void doExecute(final ExecutionContext ctx) { - FieldValue input = ctx.getValue(); + protected void doExecute(final ExecutionContext context) { + FieldValue input = context.getValue(); if (input instanceof Array || input instanceof WeightedSet) { - FieldValue next = new MyConverter(ctx, exp).convert(input); + FieldValue next = new MyConverter(context, exp).convert(input); if (next == null) { - VerificationContext vctx = new VerificationContext(ctx); - vctx.setValue(input.getDataType()).execute(this); - next = vctx.getValue().createFieldValue(); + VerificationContext vctx = new VerificationContext(context); + vctx.setValueType(input.getDataType()).execute(this); + next = vctx.getValueType().createFieldValue(); } - ctx.setValue(next); + context.setValue(next); } else if (input instanceof Struct) { - ctx.setValue(new MyConverter(ctx, exp).convert(input)); + context.setValue(new MyConverter(context, exp).convert(input)); } else { throw new IllegalArgumentException("Expected Array, Struct or WeightedSet input, got " + input.getDataType().getName() + "."); @@ -47,25 +47,25 @@ public final class ForEachExpression extends CompositeExpression { @Override protected void doVerify(VerificationContext context) { - DataType input = context.getValue(); + DataType input = context.getValueType(); if (input instanceof ArrayDataType || input instanceof WeightedSetDataType) { - context.setValue(((CollectionDataType)input).getNestedType()).execute(exp); + context.setValueType(((CollectionDataType)input).getNestedType()).execute(exp); if (input instanceof ArrayDataType) { - context.setValue(DataType.getArray(context.getValue())); + context.setValueType(DataType.getArray(context.getValueType())); } else { WeightedSetDataType wset = (WeightedSetDataType)input; - context.setValue(DataType.getWeightedSet(context.getValue(), wset.createIfNonExistent(), wset.removeIfZero())); + context.setValueType(DataType.getWeightedSet(context.getValueType(), wset.createIfNonExistent(), wset.removeIfZero())); } } else if (input instanceof StructDataType) { for (Field field : ((StructDataType)input).getFields()) { DataType fieldType = field.getDataType(); - DataType valueType = context.setValue(fieldType).execute(exp).getValue(); + DataType valueType = context.setValueType(fieldType).execute(exp).getValueType(); if (!fieldType.isAssignableFrom(valueType)) { throw new VerificationException(this, "Expected " + fieldType.getName() + " output, got " + valueType.getName() + "."); } } - context.setValue(input); + context.setValueType(input); } else { throw new VerificationException(this, "Expected Array, Struct or WeightedSet input, got " + input.getName() + "."); 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 35bdbce1fd2..470284d128b 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 @@ -24,8 +24,8 @@ public final class GetFieldExpression extends Expression { } @Override - protected void doExecute(ExecutionContext ctx) { - FieldValue input = ctx.getValue(); + protected void doExecute(ExecutionContext context) { + FieldValue input = context.getValue(); if (!(input instanceof StructuredFieldValue)) { throw new IllegalArgumentException("Expected structured input, got " + input.getDataType().getName() + "."); } @@ -35,12 +35,12 @@ public final class GetFieldExpression extends Expression { throw new IllegalArgumentException("Field '" + fieldName + "' not found in struct type '" + struct.getDataType().getName() + "'"); } - ctx.setValue(struct.getFieldValue(field)); + context.setValue(struct.getFieldValue(field)); } @Override protected void doVerify(VerificationContext context) { - DataType input = context.getValue(); + DataType input = context.getValueType(); if (!(input instanceof StructuredDataType)) { throw new VerificationException(this, "Expected structured input, got " + input.getName() + "."); } @@ -49,7 +49,7 @@ public final class GetFieldExpression extends Expression { throw new VerificationException(this, "Field '" + fieldName + "' not found in struct type '" + input.getName() + "'"); } - context.setValue(field.getDataType()); + context.setValueType(field.getDataType()); } @Override 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 50b502049dc..980cb4ff869 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 @@ -20,8 +20,8 @@ public final class GetVarExpression extends Expression { } @Override - protected void doExecute(ExecutionContext ctx) { - ctx.setValue(ctx.getVariable(varName)); + protected void doExecute(ExecutionContext context) { + context.setValue(context.getVariable(varName)); } @Override @@ -30,7 +30,7 @@ public final class GetVarExpression extends Expression { if (input == null) { throw new VerificationException(this, "Variable '" + varName + "' not found."); } - context.setValue(input); + context.setValueType(input); } @Override 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 3973dd8b317..179f202788c 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 @@ -27,11 +27,11 @@ public final class GuardExpression extends CompositeExpression { } @Override - protected void doExecute(ExecutionContext ctx) { - if (!shouldExecute && ctx.getAdapter() instanceof UpdateAdapter) { - ctx.setValue(null); + protected void doExecute(ExecutionContext context) { + if (!shouldExecute && context.getAdapter() instanceof UpdateAdapter) { + context.setValue(null); } else { - exp.execute(ctx); + exp.execute(context); } } 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 c97771943b7..f3bcef6fa3c 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 @@ -17,10 +17,10 @@ public final class HexDecodeExpression extends Expression { super(DataType.STRING); } @Override - protected void doExecute(ExecutionContext ctx) { - String input = String.valueOf(ctx.getValue()); + protected void doExecute(ExecutionContext context) { + String input = String.valueOf(context.getValue()); if (input.isEmpty()) { - ctx.setValue(new LongFieldValue(Long.MIN_VALUE)); + context.setValue(new LongFieldValue(Long.MIN_VALUE)); return; } BigInteger output; @@ -35,12 +35,12 @@ public final class HexDecodeExpression extends Expression { if (output.compareTo(BigInteger.ZERO) == 1 && output.bitLength() == 64) { output = output.subtract(ULONG_MAX); // flip to negative } - ctx.setValue(new LongFieldValue(output.longValue())); + context.setValue(new LongFieldValue(output.longValue())); } @Override protected void doVerify(VerificationContext context) { - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override 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 cf91115caad..ebc9deb2b88 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 @@ -14,14 +14,14 @@ public final class HexEncodeExpression extends Expression { super(DataType.LONG); } @Override - protected void doExecute(ExecutionContext ctx) { - long input = ((LongFieldValue)ctx.getValue()).getLong(); - ctx.setValue(new StringFieldValue(Long.toHexString(input))); + protected void doExecute(ExecutionContext context) { + long input = ((LongFieldValue) context.getValue()).getLong(); + context.setValue(new StringFieldValue(Long.toHexString(input))); } @Override protected void doVerify(VerificationContext context) { - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override 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 0c614c7368d..bb0c28580f0 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 @@ -2,7 +2,6 @@ package com.yahoo.vespa.indexinglanguage.expressions; import com.yahoo.document.DataType; -import com.yahoo.document.DocumentType; import com.yahoo.document.datatypes.StringFieldValue; import static com.yahoo.vespa.defaults.Defaults.getDefaults; @@ -16,13 +15,13 @@ public final class HostNameExpression extends Expression { } @Override - protected void doExecute(ExecutionContext ctx) { - ctx.setValue(new StringFieldValue(normalizeHostName(getDefaults().vespaHostname()))); + protected void doExecute(ExecutionContext context) { + context.setValue(new StringFieldValue(normalizeHostName(getDefaults().vespaHostname()))); } @Override protected void doVerify(VerificationContext context) { - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override 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 9e7f60aa3e3..a6dfa4dd13e 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 @@ -2,7 +2,6 @@ package com.yahoo.vespa.indexinglanguage.expressions; import com.yahoo.document.DataType; -import com.yahoo.document.DocumentType; import com.yahoo.document.datatypes.FieldValue; import com.yahoo.document.datatypes.NumericFieldValue; import com.yahoo.vespa.objects.ObjectOperation; @@ -75,34 +74,34 @@ public final class IfThenExpression extends CompositeExpression { } @Override - protected void doExecute(ExecutionContext ctx) { - FieldValue input = ctx.getValue(); - FieldValue lhsVal = ctx.setValue(input).execute(lhs).getValue(); + protected void doExecute(ExecutionContext context) { + FieldValue input = context.getValue(); + FieldValue lhsVal = context.setValue(input).execute(lhs).getValue(); if (lhsVal == null) { - ctx.setValue(null); + context.setValue(null); return; } - FieldValue rhsVal = ctx.setValue(input).execute(rhs).getValue(); + FieldValue rhsVal = context.setValue(input).execute(rhs).getValue(); if (rhsVal == null) { - ctx.setValue(null); + context.setValue(null); return; } - ctx.setValue(input); + context.setValue(input); if (isTrue(lhsVal, cmp, rhsVal)) { - ifTrue.execute(ctx); + ifTrue.execute(context); } else if (ifFalse != null) { - ifFalse.execute(ctx); + ifFalse.execute(context); } } @Override protected void doVerify(VerificationContext context) { - DataType input = context.getValue(); - context.setValue(input).execute(lhs); - context.setValue(input).execute(rhs); - context.setValue(input).execute(ifTrue); - context.setValue(input).execute(ifFalse); - context.setValue(input); + DataType input = context.getValueType(); + context.setValueType(input).execute(lhs); + context.setValueType(input).execute(rhs); + context.setValueType(input).execute(ifTrue); + context.setValueType(input).execute(ifFalse); + context.setValueType(input); } @Override 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 d707a50fbd8..2ae43f8c12a 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,7 +9,6 @@ import com.yahoo.vespa.objects.ObjectPredicate; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.atomic.AtomicReference; /** * @author Simon Thoresen Hult @@ -29,11 +28,11 @@ public final class InputExpression extends Expression { } @Override - protected void doExecute(ExecutionContext ctx) { + protected void doExecute(ExecutionContext context) { if (fieldPath != null) { - ctx.setValue(ctx.getInputValue(fieldPath)); + context.setValue(context.getInputValue(fieldPath)); } else { - ctx.setValue(ctx.getInputValue(fieldName)); + context.setValue(context.getInputValue(fieldName)); } } @@ -43,7 +42,7 @@ public final class InputExpression extends Expression { if (val == null) { throw new VerificationException(this, "Field '" + fieldName + "' not found."); } - context.setValue(val); + context.setValueType(val); } @Override 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 5cff622f033..0f7e8122c9d 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 @@ -28,8 +28,8 @@ public final class JoinExpression extends Expression { @SuppressWarnings({ "unchecked" }) @Override - protected void doExecute(ExecutionContext ctx) { - FieldValue input = ctx.getValue(); + protected void doExecute(ExecutionContext context) { + FieldValue input = context.getValue(); if (!(input instanceof Array)) { throw new IllegalArgumentException("Expected Array input, got " + input.getDataType().getName() + "."); } @@ -40,16 +40,16 @@ public final class JoinExpression extends Expression { output.append(delimiter); } } - ctx.setValue(new StringFieldValue(output.toString())); + context.setValue(new StringFieldValue(output.toString())); } @Override protected void doVerify(VerificationContext context) { - DataType input = context.getValue(); + DataType input = context.getValueType(); if (!(input instanceof ArrayDataType)) { throw new VerificationException(this, "Expected Array input, got " + input.getName() + "."); } - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/LiteralBoolExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/LiteralBoolExpression.java index a989f1a57d2..f92bb9f9b7d 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/LiteralBoolExpression.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/LiteralBoolExpression.java @@ -25,7 +25,7 @@ public class LiteralBoolExpression extends Expression { @Override protected void doVerify(VerificationContext context) { - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override 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 106045591e2..47d790e0b07 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 @@ -15,13 +15,13 @@ public final class LowerCaseExpression extends Expression { super(DataType.STRING); } @Override - protected void doExecute(ExecutionContext ctx) { - ctx.setValue(new StringFieldValue(toLowerCase(String.valueOf(ctx.getValue())))); + protected void doExecute(ExecutionContext context) { + context.setValue(new StringFieldValue(toLowerCase(String.valueOf(context.getValue())))); } @Override protected void doVerify(VerificationContext context) { - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override 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 0aa4e4eb772..3ff218f1fc4 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 @@ -16,7 +16,7 @@ import com.yahoo.vespa.indexinglanguage.linguistics.LinguisticsAnnotator; import java.util.Iterator; /** - * A filter which splits incoming text into n-grams + * A filter which splits incoming text into n-grams. * * @author bratseth */ @@ -28,7 +28,7 @@ public final class NGramExpression extends Expression { /** * Creates an executable ngram expression * - * @param linguistics the gram splitter to use, or null if this is used for representation and will not be executed + * @param linguistics the gram splitter to use, or null if this is used for representation and will not be executed * @param gramSize the gram size */ public NGramExpression(Linguistics linguistics, int gramSize) { @@ -46,14 +46,14 @@ public final class NGramExpression extends Expression { } @Override - protected void doExecute(ExecutionContext ctx) { - StringFieldValue input = (StringFieldValue)ctx.getValue(); + protected void doExecute(ExecutionContext context) { + StringFieldValue input = (StringFieldValue) context.getValue(); if (input.getSpanTree(SpanTrees.LINGUISTICS) != null) { // This expression is already executed for this input instance return; } StringFieldValue output = input.clone(); - ctx.setValue(output); + context.setValue(output); SpanList spanList = output.setSpanTree(new SpanTree(SpanTrees.LINGUISTICS)).spanList(); int lastPosition = 0; 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 1a3037761c6..d1ca03f99ba 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 @@ -64,7 +64,7 @@ public final class NormalizeExpression extends Expression { @Override protected void doVerify(VerificationContext context) { - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override 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 c8df0c0d667..2c59adb5e1d 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 @@ -25,13 +25,13 @@ public final class NowExpression extends Expression { } @Override - protected void doExecute(ExecutionContext ctx) { - ctx.setValue(new LongFieldValue(timer.currentTimeSeconds())); + protected void doExecute(ExecutionContext context) { + context.setValue(new LongFieldValue(timer.currentTimeSeconds())); } @Override protected void doVerify(VerificationContext context) { - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override 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 8ba129b92c1..d4e913bb25b 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 @@ -30,16 +30,16 @@ public final class OptimizePredicateExpression extends Expression { } @Override - protected void doExecute(ExecutionContext ctx) { - PredicateFieldValue predicate = ((PredicateFieldValue)ctx.getValue()).clone(); - IntegerFieldValue arity = (IntegerFieldValue)ctx.getVariable("arity"); - LongFieldValue lower_bound = (LongFieldValue)ctx.getVariable("lower_bound"); - LongFieldValue upper_bound = (LongFieldValue)ctx.getVariable("upper_bound"); + protected void doExecute(ExecutionContext context) { + PredicateFieldValue predicate = ((PredicateFieldValue) context.getValue()).clone(); + IntegerFieldValue arity = (IntegerFieldValue) context.getVariable("arity"); + LongFieldValue lower_bound = (LongFieldValue) context.getVariable("lower_bound"); + LongFieldValue upper_bound = (LongFieldValue) context.getVariable("upper_bound"); Long lower = lower_bound != null? lower_bound.getLong() : null; Long upper = upper_bound != null? upper_bound.getLong() : null; PredicateOptions options = new PredicateOptions(arity.getInteger(), lower, upper); predicate.setPredicate(optimizer.process(predicate.getPredicate(), options)); - ctx.setValue(predicate); + context.setValue(predicate); } @Override @@ -47,7 +47,7 @@ public final class OptimizePredicateExpression extends Expression { checkVariable(context, "arity", DataType.INT, true); checkVariable(context, "lower_bound", DataType.LONG, false); checkVariable(context, "upper_bound", DataType.LONG, false); - context.setValue(DataType.PREDICATE); + context.setValueType(DataType.PREDICATE); } private void checkVariable(VerificationContext ctx, String var, DataType type, boolean required) { 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 2e39c45203d..398c2751bd8 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 @@ -2,7 +2,6 @@ package com.yahoo.vespa.indexinglanguage.expressions; import com.yahoo.document.DataType; -import com.yahoo.document.DocumentType; /** * @author Simon Thoresen Hult @@ -23,13 +22,13 @@ public abstract class OutputExpression extends Expression { } @Override - protected void doExecute(ExecutionContext ctx) { - ctx.setOutputValue(this, fieldName, ctx.getValue()); + protected void doExecute(ExecutionContext context) { + context.setOutputValue(this, fieldName, context.getValue()); } @Override protected void doVerify(VerificationContext context) { - context.tryOutputType(this, fieldName, context.getValue()); + context.tryOutputType(this, fieldName, context.getValueType()); } @Override @@ -58,4 +57,5 @@ public abstract class OutputExpression extends Expression { public int hashCode() { return getClass().hashCode() + (fieldName != null ? fieldName.hashCode() : 0); } + } 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 70c9463eb85..8f7e6bc7040 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 @@ -23,8 +23,8 @@ public class ParenthesisExpression extends CompositeExpression { } @Override - protected void doExecute(ExecutionContext ctx) { - innerExp.execute(ctx); + protected void doExecute(ExecutionContext context) { + innerExp.execute(context); } @Override 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 a00714798cf..f97f5ca9ebc 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 @@ -27,19 +27,19 @@ public final class RandomExpression extends Expression { } @Override - protected void doExecute(ExecutionContext ctx) { + protected void doExecute(ExecutionContext context) { int max; if (this.max != null) { max = this.max; } else { - max = Integer.parseInt(String.valueOf(ctx.getValue())); + max = Integer.parseInt(String.valueOf(context.getValue())); } - ctx.setValue(new IntegerFieldValue(ThreadLocalRandom.current().nextInt(max))); + context.setValue(new IntegerFieldValue(ThreadLocalRandom.current().nextInt(max))); } @Override protected void doVerify(VerificationContext context) { - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override 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 320c47103aa..7317cb2216f 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 @@ -4,6 +4,7 @@ package com.yahoo.vespa.indexinglanguage.expressions; import com.yahoo.document.DataType; import com.yahoo.document.datatypes.FieldValue; import com.yahoo.language.Linguistics; +import com.yahoo.language.process.Encoder; import com.yahoo.language.simple.SimpleLinguistics; import com.yahoo.vespa.indexinglanguage.ScriptParser; import com.yahoo.vespa.indexinglanguage.ScriptParserContext; @@ -33,21 +34,21 @@ public final class ScriptExpression extends ExpressionList<StatementExpression> } @Override - protected void doExecute(ExecutionContext ctx) { - FieldValue input = ctx.getValue(); + protected void doExecute(ExecutionContext context) { + FieldValue input = context.getValue(); for (Expression exp : this) { - ctx.setValue(input).execute(exp); + context.setValue(input).execute(exp); } - ctx.setValue(input); + context.setValue(input); } @Override protected void doVerify(VerificationContext context) { - DataType input = context.getValue(); + DataType input = context.getValueType(); for (Expression exp : this) { - context.setValue(input).execute(exp); + context.setValueType(input).execute(exp); } - context.setValue(input); + context.setValueType(input); } private static DataType resolveInputType(Collection<? extends StatementExpression> list) { @@ -91,11 +92,11 @@ public final class ScriptExpression extends ExpressionList<StatementExpression> /** Creates an expression with simple lingustics for testing */ @SuppressWarnings("deprecation") public static ScriptExpression fromString(String expression) throws ParseException { - return fromString(expression, new SimpleLinguistics()); + return fromString(expression, new SimpleLinguistics(), Encoder.throwsOnUse); } - public static ScriptExpression fromString(String expression, Linguistics linguistics) throws ParseException { - return newInstance(new ScriptParserContext(linguistics).setInputStream(new IndexingInput(expression))); + public static ScriptExpression fromString(String expression, Linguistics linguistics, Encoder encoder) throws ParseException { + return newInstance(new ScriptParserContext(linguistics, encoder).setInputStream(new IndexingInput(expression))); } public static ScriptExpression newInstance(ScriptParserContext config) throws ParseException { 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 b511410dd10..c711b92c7c1 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 @@ -3,7 +3,6 @@ package com.yahoo.vespa.indexinglanguage.expressions; import com.yahoo.collections.Pair; import com.yahoo.document.DataType; -import com.yahoo.document.DocumentType; import com.yahoo.document.datatypes.FieldValue; import com.yahoo.vespa.objects.ObjectOperation; import com.yahoo.vespa.objects.ObjectPredicate; @@ -30,29 +29,29 @@ public final class SelectInputExpression extends CompositeExpression { } @Override - protected void doExecute(ExecutionContext ctx) { - FieldValue input = ctx.getValue(); + protected void doExecute(ExecutionContext context) { + FieldValue input = context.getValue(); for (Pair<String, Expression> entry : cases) { - FieldValue val = ctx.getInputValue(entry.getFirst()); + FieldValue val = context.getInputValue(entry.getFirst()); if (val != null) { - ctx.setValue(val).execute(entry.getSecond()); + context.setValue(val).execute(entry.getSecond()); break; } } - ctx.setValue(input); + context.setValue(input); } @Override protected void doVerify(VerificationContext context) { - DataType input = context.getValue(); + DataType input = context.getValueType(); for (Pair<String, Expression> entry : cases) { DataType val = context.getInputType(this, entry.getFirst()); if (val == null) { throw new VerificationException(this, "Field '" + entry.getFirst() + "' not found."); } - context.setValue(val).execute(entry.getSecond()); + context.setValueType(val).execute(entry.getSecond()); } - context.setValue(input); + context.setValueType(input); } @Override 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 8ec766cd1e1..f8e2462b41d 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 @@ -15,8 +15,8 @@ public final class SetLanguageExpression extends Expression { super(DataType.STRING); } @Override - protected void doExecute(ExecutionContext ctx) { - ctx.setLanguage(Language.fromLanguageTag(String.valueOf(ctx.getValue()))); + protected void doExecute(ExecutionContext context) { + context.setLanguage(Language.fromLanguageTag(String.valueOf(context.getValue()))); } @Override 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 f013e22ebc3..8fc3aa48f6d 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 @@ -25,13 +25,13 @@ public final class SetValueExpression extends Expression { } @Override - protected void doExecute(ExecutionContext ctx) { - ctx.setValue(value); + protected void doExecute(ExecutionContext context) { + context.setValue(value); } @Override protected void doVerify(VerificationContext context) { - context.setValue(value.getDataType()); + context.setValueType(value.getDataType()); } @Override 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 f15982796ce..184325c3c7e 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 @@ -20,13 +20,13 @@ public final class SetVarExpression extends Expression { } @Override - protected void doExecute(ExecutionContext ctx) { - ctx.setVariable(varName, ctx.getValue()); + protected void doExecute(ExecutionContext context) { + context.setVariable(varName, context.getValue()); } @Override protected void doVerify(VerificationContext context) { - DataType next = context.getValue(); + DataType next = context.getValueType(); DataType prev = context.getVariable(varName); if (prev != null && !prev.equals(next)) { throw new VerificationException(this, "Attempting to assign conflicting types to variable '" + varName + 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 b436775b151..092f07f8514 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 @@ -25,8 +25,8 @@ public final class SplitExpression extends Expression { } @Override - protected void doExecute(ExecutionContext ctx) { - String input = String.valueOf(ctx.getValue()); + protected void doExecute(ExecutionContext context) { + String input = String.valueOf(context.getValue()); Array<StringFieldValue> output = new Array<>(DataType.getArray(DataType.STRING)); if (!input.isEmpty()) { String[] splits = splitPattern.split(input); @@ -34,12 +34,12 @@ public final class SplitExpression extends Expression { output.add(new StringFieldValue(split)); } } - ctx.setValue(output); + context.setValue(output); } @Override protected void doVerify(VerificationContext context) { - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override 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 cf1e808946d..145133e210d 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 @@ -2,7 +2,9 @@ package com.yahoo.vespa.indexinglanguage.expressions; import com.yahoo.document.DataType; +import com.yahoo.document.TensorDataType; import com.yahoo.language.Linguistics; +import com.yahoo.language.process.Encoder; import com.yahoo.language.simple.SimpleLinguistics; import com.yahoo.vespa.indexinglanguage.ScriptParser; import com.yahoo.vespa.indexinglanguage.ScriptParserContext; @@ -20,6 +22,9 @@ import java.util.List; */ public final class StatementExpression extends ExpressionList<Expression> { + /** The name of the (last) output field tthis statement will write to, or null if none */ + private String outputField; + public StatementExpression(Expression... lst) { this(Arrays.asList(lst)); } @@ -33,17 +38,21 @@ public final class StatementExpression extends ExpressionList<Expression> { } @Override - protected void doExecute(ExecutionContext ctx) { + protected void doExecute(ExecutionContext context) { for (Expression exp : this) { - ctx.execute(exp); + context.execute(exp); } } @Override protected void doVerify(VerificationContext context) { - for (Expression exp : this) { - context.execute(exp); + for (Expression expression : this) { + if (expression instanceof OutputExpression) + outputField = ((OutputExpression)expression).getFieldName(); } + context.setOutputField(outputField); + for (Expression expression : this) + context.execute(expression); } private static DataType resolveInputType(Iterable<Expression> lst) { @@ -90,13 +99,12 @@ public final class StatementExpression extends ExpressionList<Expression> { } /** Creates an expression with simple lingustics for testing */ - @SuppressWarnings("deprecation") public static StatementExpression fromString(String expression) throws ParseException { - return fromString(expression, new SimpleLinguistics()); + return fromString(expression, new SimpleLinguistics(), Encoder.throwsOnUse); } - public static StatementExpression fromString(String expression, Linguistics linguistics) throws ParseException { - return newInstance(new ScriptParserContext(linguistics).setInputStream(new IndexingInput(expression))); + public static StatementExpression fromString(String expression, Linguistics linguistics, Encoder encoder) throws ParseException { + return newInstance(new ScriptParserContext(linguistics, encoder).setInputStream(new IndexingInput(expression))); } public static StatementExpression newInstance(ScriptParserContext config) throws ParseException { 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 4b30d646d53..ce31c6f6408 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 @@ -30,8 +30,8 @@ public final class SubstringExpression extends Expression { } @Override - protected void doExecute(ExecutionContext ctx) { - String input = String.valueOf(ctx.getValue()); + protected void doExecute(ExecutionContext context) { + String input = String.valueOf(context.getValue()); int len = input.length(); if (from >= len) { input = ""; @@ -40,12 +40,12 @@ public final class SubstringExpression extends Expression { } else { input = input.substring(from, to); } - ctx.setValue(new StringFieldValue(input)); + context.setValue(new StringFieldValue(input)); } @Override protected void doVerify(VerificationContext context) { - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override 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 72dec19ef4e..9a8e8719461 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 @@ -2,7 +2,6 @@ package com.yahoo.vespa.indexinglanguage.expressions; import com.yahoo.document.DataType; -import com.yahoo.document.DocumentType; import com.yahoo.document.datatypes.FieldValue; import com.yahoo.document.datatypes.StringFieldValue; import com.yahoo.text.StringUtilities; @@ -46,8 +45,8 @@ public final class SwitchExpression extends CompositeExpression { } @Override - protected void doExecute(ExecutionContext ctx) { - FieldValue input = ctx.getValue(); + protected void doExecute(ExecutionContext context) { + FieldValue input = context.getValue(); Expression exp = null; if (input != null) { if (!(input instanceof StringFieldValue)) { @@ -60,9 +59,9 @@ public final class SwitchExpression extends CompositeExpression { exp = defaultExp; } if (exp != null) { - exp.execute(ctx); + exp.execute(context); } - ctx.setValue(input); + context.setValue(input); } @Override @@ -75,7 +74,7 @@ public final class SwitchExpression extends CompositeExpression { @Override protected void doVerify(VerificationContext context) { - DataType input = context.getValue(); + DataType input = context.getValueType(); if (input == null) { throw new VerificationException(this, "Expected " + DataType.STRING.getName() + " input, got null."); } @@ -84,10 +83,10 @@ public final class SwitchExpression extends CompositeExpression { input.getName() + "."); } for (Expression exp : cases.values()) { - context.setValue(input).execute(exp); + context.setValueType(input).execute(exp); } - context.setValue(input).execute(defaultExp); - context.setValue(input); + context.setValueType(input).execute(defaultExp); + context.setValueType(input); } @Override 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 04ce7d2be39..7c467b1e08d 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 @@ -2,7 +2,6 @@ package com.yahoo.vespa.indexinglanguage.expressions; import com.yahoo.document.DataType; -import com.yahoo.document.DocumentType; /** * @author Simon Thoresen Hult @@ -13,7 +12,7 @@ public final class ThisExpression extends Expression { super(UnresolvedDataType.INSTANCE); } @Override - protected void doExecute(ExecutionContext ctx) { + protected void doExecute(ExecutionContext context) { // empty } 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 cad3f1f9c04..3069fc5906a 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 @@ -16,20 +16,20 @@ public final class ToArrayExpression extends Expression { } @SuppressWarnings({ "unchecked", "rawtypes" }) @Override - protected void doExecute(ExecutionContext ctx) { - FieldValue input = ctx.getValue(); + protected void doExecute(ExecutionContext context) { + FieldValue input = context.getValue(); DataType inputType = input.getDataType(); ArrayDataType outputType = DataType.getArray(inputType); Array output = outputType.createFieldValue(); output.add(input); - ctx.setValue(output); + context.setValue(output); } @Override protected void doVerify(VerificationContext context) { - context.setValue(DataType.getArray(context.getValue())); + context.setValueType(DataType.getArray(context.getValueType())); } @Override diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToBoolExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToBoolExpression.java index d6d8ed54d26..da59df1fdd6 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToBoolExpression.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToBoolExpression.java @@ -2,10 +2,8 @@ package com.yahoo.vespa.indexinglanguage.expressions; import com.yahoo.document.DataType; -import com.yahoo.document.NumericDataType; import com.yahoo.document.datatypes.BoolFieldValue; import com.yahoo.document.datatypes.FieldValue; -import com.yahoo.document.datatypes.LongFieldValue; import com.yahoo.document.datatypes.NumericFieldValue; import com.yahoo.document.datatypes.StringFieldValue; @@ -33,7 +31,7 @@ public final class ToBoolExpression extends Expression { @Override protected void doVerify(VerificationContext context) { - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override 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 5348493a8fd..b43371a5dba 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 @@ -13,13 +13,13 @@ public final class ToByteExpression extends Expression { super(UnresolvedDataType.INSTANCE); } @Override - protected void doExecute(ExecutionContext ctx) { - ctx.setValue(new ByteFieldValue(Byte.valueOf(String.valueOf(ctx.getValue())))); + protected void doExecute(ExecutionContext context) { + context.setValue(new ByteFieldValue(Byte.valueOf(String.valueOf(context.getValue())))); } @Override protected void doVerify(VerificationContext context) { - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override 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 c9a04693a25..7d55de7b265 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 @@ -13,13 +13,13 @@ public final class ToDoubleExpression extends Expression { super(UnresolvedDataType.INSTANCE); } @Override - protected void doExecute(ExecutionContext ctx) { - ctx.setValue(new DoubleFieldValue(Double.valueOf(String.valueOf(ctx.getValue())))); + protected void doExecute(ExecutionContext context) { + context.setValue(new DoubleFieldValue(Double.valueOf(String.valueOf(context.getValue())))); } @Override protected void doVerify(VerificationContext context) { - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override 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 b255702ada3..b1d6a00a668 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 @@ -13,13 +13,13 @@ public final class ToFloatExpression extends Expression { super(UnresolvedDataType.INSTANCE); } @Override - protected void doExecute(ExecutionContext ctx) { - ctx.setValue(new FloatFieldValue(Float.valueOf(String.valueOf(ctx.getValue())))); + protected void doExecute(ExecutionContext context) { + context.setValue(new FloatFieldValue(Float.valueOf(String.valueOf(context.getValue())))); } @Override protected void doVerify(VerificationContext context) { - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override 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 7efc25d8400..a63833e0882 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 @@ -13,13 +13,13 @@ public final class ToIntegerExpression extends Expression { super(UnresolvedDataType.INSTANCE); } @Override - protected void doExecute(ExecutionContext ctx) { - ctx.setValue(new IntegerFieldValue(Integer.valueOf(String.valueOf(ctx.getValue())))); + protected void doExecute(ExecutionContext context) { + context.setValue(new IntegerFieldValue(Integer.valueOf(String.valueOf(context.getValue())))); } @Override protected void doVerify(VerificationContext context) { - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override 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 74d43fc1693..0ef775614e5 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 @@ -13,13 +13,13 @@ public final class ToLongExpression extends Expression { super(UnresolvedDataType.INSTANCE); } @Override - protected void doExecute(ExecutionContext ctx) { - ctx.setValue(new LongFieldValue(Long.valueOf(String.valueOf(ctx.getValue())))); + protected void doExecute(ExecutionContext context) { + context.setValue(new LongFieldValue(Long.valueOf(String.valueOf(context.getValue())))); } @Override protected void doVerify(VerificationContext context) { - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override 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 4c7cd348fbb..a16feec981f 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 @@ -2,7 +2,6 @@ package com.yahoo.vespa.indexinglanguage.expressions; import com.yahoo.document.DataType; -import com.yahoo.document.DocumentType; import com.yahoo.document.PositionDataType; /** @@ -14,13 +13,13 @@ public final class ToPositionExpression extends Expression { super(DataType.STRING); } @Override - protected void doExecute(ExecutionContext ctx) { - ctx.setValue(PositionDataType.fromString(String.valueOf(ctx.getValue()))); + protected void doExecute(ExecutionContext context) { + context.setValue(PositionDataType.fromString(String.valueOf(context.getValue()))); } @Override protected void doVerify(VerificationContext context) { - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override 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 36f896a0b7f..64ed14618d7 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 @@ -13,13 +13,13 @@ public final class ToStringExpression extends Expression { super(UnresolvedDataType.INSTANCE); } @Override - protected void doExecute(ExecutionContext ctx) { - ctx.setValue(new StringFieldValue(String.valueOf(ctx.getValue()))); + protected void doExecute(ExecutionContext context) { + context.setValue(new StringFieldValue(String.valueOf(context.getValue()))); } @Override protected void doVerify(VerificationContext context) { - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override 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 8d511d442df..dcc14e715e9 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 @@ -30,20 +30,20 @@ public final class ToWsetExpression extends Expression { @SuppressWarnings({ "unchecked", "rawtypes" }) @Override - protected void doExecute(ExecutionContext ctx) { - FieldValue input = ctx.getValue(); + protected void doExecute(ExecutionContext context) { + FieldValue input = context.getValue(); DataType inputType = input.getDataType(); WeightedSetDataType outputType = DataType.getWeightedSet(inputType, createIfNonExistent, removeIfZero); WeightedSet output = outputType.createFieldValue(); output.add(input); - ctx.setValue(output); + context.setValue(output); } @Override protected void doVerify(VerificationContext context) { - context.setValue(DataType.getWeightedSet(context.getValue(), createIfNonExistent, removeIfZero)); + context.setValueType(DataType.getWeightedSet(context.getValueType(), createIfNonExistent, removeIfZero)); } @Override 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 8dcf360a6ee..7db04a2e595 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 @@ -2,7 +2,6 @@ package com.yahoo.vespa.indexinglanguage.expressions; import com.yahoo.document.DataType; -import com.yahoo.document.DocumentType; import com.yahoo.document.datatypes.StringFieldValue; /** @@ -15,13 +14,13 @@ public final class TrimExpression extends Expression { } @Override - protected void doExecute(ExecutionContext ctx) { - ctx.setValue(new StringFieldValue(String.valueOf(ctx.getValue()).trim())); + protected void doExecute(ExecutionContext context) { + context.setValue(new StringFieldValue(String.valueOf(context.getValue()).trim())); } @Override protected void doVerify(VerificationContext context) { - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/UnresolvedDataType.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/UnresolvedDataType.java index ef08c01633a..1847db0f29e 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/UnresolvedDataType.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/UnresolvedDataType.java @@ -19,4 +19,5 @@ final class UnresolvedDataType extends PrimitiveDataType { public boolean isValueCompatible(FieldValue value) { return value != null; } + } diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/VerificationContext.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/VerificationContext.java index 38b8b82f9e9..61d796e5356 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/VerificationContext.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/VerificationContext.java @@ -14,6 +14,7 @@ public class VerificationContext implements FieldTypeAdapter, Cloneable { private final Map<String, DataType> variables = new HashMap<String, DataType>(); private final FieldTypeAdapter adapter; private DataType value; + private String outputField; public VerificationContext() { this.adapter = null; @@ -49,19 +50,30 @@ public class VerificationContext implements FieldTypeAdapter, Cloneable { return this; } - public DataType getValue() { + public DataType getValueType() { return value; } - public VerificationContext setValue(DataType value) { + /** Sets the output value type */ + public VerificationContext setValueType(DataType value) { this.value = value; return this; } + /** Sets the name of the (last) output field of the statement this is executed as a part of */ + public void setOutputField(String outputField) { this.outputField = outputField; } + + /** + * Returns the name of the (last) output field of the statement this is executed as a part of, + * or null if none or not yet verified + */ + public String getOutputField() { return outputField; } + public VerificationContext clear() { variables.clear(); value = null; return this; } + } 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 ed56cdfb604..955131e63b0 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 @@ -17,14 +17,14 @@ public final class ZCurveExpression extends Expression { super(PositionDataType.INSTANCE); } @Override - protected void doExecute(ExecutionContext ctx) { - Struct input = ((Struct)ctx.getValue()); + protected void doExecute(ExecutionContext context) { + Struct input = ((Struct) context.getValue()); Integer x = getFieldValue(input, PositionDataType.FIELD_X); Integer y = getFieldValue(input, PositionDataType.FIELD_Y); if (x != null && y != null) { - ctx.setValue(new LongFieldValue(ZCurve.encode(x, y))); + context.setValue(new LongFieldValue(ZCurve.encode(x, y))); } else { - ctx.setValue(DataType.LONG.createFieldValue()); + context.setValue(DataType.LONG.createFieldValue()); } } @@ -35,7 +35,7 @@ public final class ZCurveExpression extends Expression { @Override protected void doVerify(VerificationContext context) { - context.setValue(createdOutputType()); + context.setValueType(createdOutputType()); } @Override diff --git a/indexinglanguage/src/main/javacc/IndexingParser.jj b/indexinglanguage/src/main/javacc/IndexingParser.jj index 632a19a2c6c..4533a17954c 100644 --- a/indexinglanguage/src/main/javacc/IndexingParser.jj +++ b/indexinglanguage/src/main/javacc/IndexingParser.jj @@ -34,6 +34,7 @@ import com.yahoo.text.StringUtilities; import com.yahoo.vespa.indexinglanguage.expressions.*; import com.yahoo.vespa.indexinglanguage.linguistics.AnnotatorConfig; import com.yahoo.language.process.StemMode; +import com.yahoo.language.process.Encoder; import com.yahoo.language.Linguistics; /** @@ -44,6 +45,7 @@ public class IndexingParser { private String defaultFieldName; private Linguistics linguistics; + private Encoder encoder; private AnnotatorConfig annotatorCfg; public IndexingParser(String str) { @@ -60,6 +62,11 @@ public class IndexingParser { return this; } + public IndexingParser setEncoder(Encoder encoder) { + this.encoder = encoder; + return this; + } + public IndexingParser setAnnotatorConfig(AnnotatorConfig cfg) { annotatorCfg = cfg; return this; @@ -150,6 +157,7 @@ TOKEN : <CREATE_IF_NON_EXISTENT: "create_if_non_existent"> | <ECHO: "echo"> | <ELSE: "else"> | + <ENCODE: "encode"> | <EXACT: "exact"> | <FLATTEN: "flatten"> | <FOR_EACH: "for_each"> | @@ -275,6 +283,7 @@ Expression value() : val = base64EncodeExp() | val = clearStateExp() | val = echoExp() | + val = encodeExp() | val = exactExp() | val = flattenExp() | val = forEachExp() | @@ -356,6 +365,12 @@ Expression echoExp() : { } { return new EchoExpression(); } } +Expression encodeExp() : { } +{ + ( <ENCODE> ) + { return new EncodeExpression(encoder); } +} + Expression exactExp() : { } { ( <EXACT> ) @@ -729,6 +744,7 @@ String identifier() : <ECHO> | <EXACT> | <ELSE> | + <ENCODE> | <FLATTEN> | <FOR_EACH> | <GET_FIELD> | diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ExpressionConverterTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ExpressionConverterTestCase.java index 5c86d0fe836..644da80191d 100644 --- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ExpressionConverterTestCase.java +++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ExpressionConverterTestCase.java @@ -260,7 +260,7 @@ public class ExpressionConverterTestCase { super(null); } @Override - protected void doExecute(ExecutionContext ctx) { + protected void doExecute(ExecutionContext context) { } diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ScriptParserTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ScriptParserTestCase.java index 0df3073cd25..32e38dbee6f 100644 --- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ScriptParserTestCase.java +++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ScriptParserTestCase.java @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.indexinglanguage; +import com.yahoo.language.process.Encoder; import com.yahoo.language.simple.SimpleLinguistics; import com.yahoo.vespa.indexinglanguage.expressions.EchoExpression; import com.yahoo.vespa.indexinglanguage.expressions.InputExpression; @@ -95,7 +96,7 @@ public class ScriptParserTestCase { } private static ScriptParserContext newContext(String input) { - return new ScriptParserContext(new SimpleLinguistics()).setInputStream(new IndexingInput(input)); + return new ScriptParserContext(new SimpleLinguistics(), Encoder.throwsOnUse).setInputStream(new IndexingInput(input)); } } diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ScriptTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ScriptTestCase.java index 14a8f40c46c..9d3d0abb256 100644 --- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ScriptTestCase.java +++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ScriptTestCase.java @@ -4,12 +4,28 @@ package com.yahoo.vespa.indexinglanguage; import com.yahoo.document.DataType; import com.yahoo.document.Document; import com.yahoo.document.DocumentType; +import com.yahoo.document.Field; +import com.yahoo.document.FieldPath; +import com.yahoo.document.TensorDataType; import com.yahoo.document.datatypes.BoolFieldValue; +import com.yahoo.document.datatypes.FieldValue; import com.yahoo.document.datatypes.StringFieldValue; +import com.yahoo.document.datatypes.TensorFieldValue; +import com.yahoo.language.Language; +import com.yahoo.language.process.Encoder; +import com.yahoo.language.simple.SimpleLinguistics; +import com.yahoo.tensor.Tensor; +import com.yahoo.tensor.TensorAddress; +import com.yahoo.tensor.TensorType; import com.yahoo.vespa.indexinglanguage.expressions.*; import com.yahoo.vespa.indexinglanguage.parser.ParseException; import org.junit.Test; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + import static org.junit.Assert.*; /** @@ -84,10 +100,49 @@ public class ScriptTestCase { Document input = new Document(type, "id:scheme:mytype::"); input.setFieldValue("in-1", new StringFieldValue("foo")); var expression = Expression.fromString("if (input 'in-1' == \"foo\") { true | summary 'mybool' | attribute 'mybool' }"); - System.out.println(expression); Document output = Expression.execute(expression, input); assertNotNull(output); assertEquals(new BoolFieldValue(true), output.getFieldValue("mybool")); } + @Test + public void testEncode() throws ParseException { + TensorType tensorType = TensorType.fromSpec("tensor(d[4])"); + var expression = Expression.fromString("input myText | encode | attribute 'myTensor'", + new SimpleLinguistics(), + new MockEncoder()); + + SimpleTestAdapter adapter = new SimpleTestAdapter(); + adapter.createField(new Field("myText", DataType.STRING)); + adapter.createField(new Field("myTensor", new TensorDataType(tensorType))); + adapter.setValue("myText", new StringFieldValue("input text")); + + // Necessary to resolve output type + VerificationContext verificationContext = new VerificationContext(adapter); + assertEquals(TensorDataType.class, expression.verify(verificationContext).getClass()); + + ExecutionContext context = new ExecutionContext(adapter); + context.setValue(new StringFieldValue("input text")); + expression.execute(context); + assertNotNull(context); + //assertTrue(context.getOutputType() instanceof TensorDataType); + assertTrue(adapter.values.containsKey("myTensor")); + assertEquals(Tensor.from(tensorType, "[7,3,0,0]"), + ((TensorFieldValue)adapter.values.get("myTensor")).getTensor().get()); + } + + private static class MockEncoder implements Encoder { + + @Override + public List<Integer> encode(String text, Language language) { + return null; + } + + @Override + public Tensor encode(String text, Language language, TensorType tensorType) { + return Tensor.from(tensorType, "[7,3,0,0]"); + } + + } + } 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 5d1cc514d35..892b4ebecb2 100644 --- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/SimpleTestAdapter.java +++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/SimpleTestAdapter.java @@ -17,8 +17,8 @@ import java.util.Map; */ public class SimpleTestAdapter implements FieldValueAdapter { - private final Map<String, DataType> types = new HashMap<String, DataType>(); - private final Map<String, FieldValue> values = new HashMap<String, FieldValue>(); + final Map<String, DataType> types = new HashMap<>(); + final Map<String, FieldValue> values = new HashMap<>(); public SimpleTestAdapter(Field... fields) { for (Field field : fields) { @@ -58,9 +58,15 @@ public class SimpleTestAdapter implements FieldValueAdapter { } } + public SimpleTestAdapter setValue(String fieldName, FieldValue fieldValue) { + values.put(fieldName, fieldValue); + return this; + } + @Override public SimpleTestAdapter setOutputValue(Expression exp, String fieldName, FieldValue fieldValue) { values.put(fieldName, fieldValue); return this; } + } diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/CatTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/CatTestCase.java index 1b9c546fa19..84b2a7ec856 100644 --- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/CatTestCase.java +++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/CatTestCase.java @@ -243,6 +243,6 @@ public class CatTestCase { SimpleTestAdapter adapter = new SimpleTestAdapter(new Field("a", typeA), new Field("b", typeB)); VerificationContext ctx = new VerificationContext(adapter); new CatExpression(new InputExpression("a"), new InputExpression("b")).verify(ctx); - return ctx.getValue(); + return ctx.getValueType(); } } diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ExpressionAssert.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ExpressionAssert.java index e837b30707d..818827fc53a 100644 --- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ExpressionAssert.java +++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ExpressionAssert.java @@ -18,18 +18,18 @@ class ExpressionAssert { } public static void assertVerify(DataType valueBefore, Expression exp, DataType expectedValueAfter) { - assertVerifyCtx(new VerificationContext().setValue(valueBefore), exp, expectedValueAfter); + assertVerifyCtx(new VerificationContext().setValueType(valueBefore), exp, expectedValueAfter); } public static void assertVerifyThrows(DataType valueBefore, Expression exp, String expectedException) { - assertVerifyCtxThrows(new VerificationContext().setValue(valueBefore), exp, expectedException); + assertVerifyCtxThrows(new VerificationContext().setValueType(valueBefore), exp, expectedException); } interface CreateExpression { Expression create(); } public static void assertVerifyThrows(DataType valueBefore, CreateExpression createExp, String expectedException) { - assertVerifyCtxThrows(new VerificationContext().setValue(valueBefore), createExp, expectedException); + assertVerifyCtxThrows(new VerificationContext().setValueType(valueBefore), createExp, expectedException); } public static void assertVerifyCtxThrows(VerificationContext ctx, CreateExpression createExp, String expectedException) { diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ForEachTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ForEachTestCase.java index b7b4a5cce1a..e2af6b19704 100644 --- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ForEachTestCase.java +++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ForEachTestCase.java @@ -209,7 +209,7 @@ public class ForEachTestCase { type.addField(new Field("my_int", DataType.INT)); VerificationContext ctx = new VerificationContext(new SimpleTestAdapter()); - ctx.setValue(type); + ctx.setValueType(type); try { new ForEachExpression(new ToArrayExpression()).verify(ctx); @@ -246,8 +246,8 @@ public class ForEachTestCase { super(null); } @Override - protected void doExecute(ExecutionContext ctx) { - lst.add(ctx.getValue()); + protected void doExecute(ExecutionContext context) { + lst.add(context.getValue()); } @Override diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/OptimizePredicateTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/OptimizePredicateTestCase.java index 06d74a49ed6..b6ef12dba83 100644 --- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/OptimizePredicateTestCase.java +++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/OptimizePredicateTestCase.java @@ -80,7 +80,7 @@ public class OptimizePredicateTestCase { assertVerifyThrows(DataType.INT, exp, "Expected predicate input, got int."); assertVerifyThrows(DataType.PREDICATE, exp, "Variable 'arity' must be set."); - VerificationContext context = new VerificationContext().setValue(DataType.PREDICATE); + VerificationContext context = new VerificationContext().setValueType(DataType.PREDICATE); context.setVariable("arity", DataType.STRING); assertVerifyCtxThrows(context, exp, "Variable 'arity' must have type int."); context.setVariable("arity", DataType.INT); diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/OutputAssert.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/OutputAssert.java index 810863478ec..56da13bb530 100644 --- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/OutputAssert.java +++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/OutputAssert.java @@ -32,14 +32,14 @@ class OutputAssert { } public static void assertVerify(FieldTypeAdapter adapter, DataType value, Expression exp) { - assertEquals(value, new VerificationContext(adapter).setValue(value).execute(exp).getValue()); + assertEquals(value, new VerificationContext(adapter).setValueType(value).execute(exp).getValueType()); } public static void assertVerifyThrows(FieldTypeAdapter adapter, DataType value, Expression exp, String expectedException) { try { - new VerificationContext(adapter).setValue(value).execute(exp); + new VerificationContext(adapter).setValueType(value).execute(exp); fail(); } catch (VerificationException e) { assertEquals(expectedException, e.getMessage()); diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/SelectInputTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/SelectInputTestCase.java index 02644db25f0..2dc271769b6 100644 --- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/SelectInputTestCase.java +++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/SelectInputTestCase.java @@ -74,7 +74,7 @@ public class SelectInputTestCase { } private static void assertVerify(FieldTypeAdapter adapter, DataType value, Expression exp) { - assertEquals(value, exp.verify(new VerificationContext(adapter).setValue(value))); + assertEquals(value, exp.verify(new VerificationContext(adapter).setValueType(value))); } private static void assertVerifyThrows(FieldTypeAdapter adapter, Expression exp, String expectedException) { diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/SetVarTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/SetVarTestCase.java index 85039260cb0..495cdd7d383 100644 --- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/SetVarTestCase.java +++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/SetVarTestCase.java @@ -39,7 +39,7 @@ public class SetVarTestCase { assertVerifyThrows(null, exp, "Expected any input, got null."); try { - new VerificationContext().setVariable("foo", DataType.INT).setValue(DataType.STRING).execute(exp); + new VerificationContext().setVariable("foo", DataType.INT).setValueType(DataType.STRING).execute(exp); fail(); } catch (VerificationException e) { assertEquals("Attempting to assign conflicting types to variable 'foo', int vs string.", e.getMessage()); @@ -60,11 +60,11 @@ public class SetVarTestCase { @Test public void requireThatVariableTypeCanNotChange() { VerificationContext ctx = new VerificationContext(new SimpleTestAdapter()); - ctx.setValue(DataType.INT); + ctx.setValueType(DataType.INT); new SetVarExpression("out").verify(ctx); try { - ctx.setValue(DataType.STRING); + ctx.setValueType(DataType.STRING); new SetVarExpression("out").verify(ctx); fail(); } catch (VerificationException e) { diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/SimpleExpression.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/SimpleExpression.java index 462189384c6..3ac4594854b 100644 --- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/SimpleExpression.java +++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/SimpleExpression.java @@ -40,16 +40,16 @@ final class SimpleExpression extends Expression { } @Override - protected void doExecute(ExecutionContext ctx) { + protected void doExecute(ExecutionContext context) { if (hasExecuteValue) { - ctx.setValue(executeValue); + context.setValue(executeValue); } } @Override protected void doVerify(VerificationContext context) { if (hasVerifyValue) { - context.setValue(verifyValue); + context.setValueType(verifyValue); } } diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/VerificationContextTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/VerificationContextTestCase.java index eb4aec37770..21580698787 100644 --- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/VerificationContextTestCase.java +++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/VerificationContextTestCase.java @@ -16,8 +16,8 @@ public class VerificationContextTestCase { public void requireThatValueCanBeSet() { VerificationContext ctx = new VerificationContext(); DataType val = DataType.STRING; - ctx.setValue(val); - assertSame(val, ctx.getValue()); + ctx.setValueType(val); + assertSame(val, ctx.getValueType()); } @Test @@ -31,9 +31,9 @@ public class VerificationContextTestCase { @Test public void requireThatClearRemovesValue() { VerificationContext ctx = new VerificationContext(); - ctx.setValue(DataType.STRING); + ctx.setValueType(DataType.STRING); ctx.clear(); - assertNull(ctx.getValue()); + assertNull(ctx.getValueType()); } @Test diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/parser/DefaultFieldNameTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/parser/DefaultFieldNameTestCase.java index 77998a9ac05..2a71aeb564c 100644 --- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/parser/DefaultFieldNameTestCase.java +++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/parser/DefaultFieldNameTestCase.java @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.indexinglanguage.parser; +import com.yahoo.language.process.Encoder; import com.yahoo.language.simple.SimpleLinguistics; import com.yahoo.vespa.indexinglanguage.ScriptParserContext; import com.yahoo.vespa.indexinglanguage.expressions.Expression; @@ -17,9 +18,11 @@ public class DefaultFieldNameTestCase { @Test public void requireThatDefaultFieldNameIsAppliedWhenArgumentIsMissing() throws ParseException { IndexingInput input = new IndexingInput("input"); - InputExpression exp = (InputExpression)Expression.newInstance(new ScriptParserContext(new SimpleLinguistics()) + InputExpression exp = (InputExpression)Expression.newInstance(new ScriptParserContext(new SimpleLinguistics(), + Encoder.throwsOnUse) .setInputStream(input) .setDefaultFieldName("foo")); assertEquals("foo", exp.getFieldName()); } + } 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 223c8191186..d7c5ae5c15a 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 @@ -2,6 +2,7 @@ package com.yahoo.vespa.indexinglanguage.parser; import com.yahoo.language.Linguistics; +import com.yahoo.language.process.Encoder; import com.yahoo.language.simple.SimpleLinguistics; import com.yahoo.vespa.indexinglanguage.expressions.*; import org.junit.Test; @@ -84,9 +85,9 @@ public class ExpressionTestCase { private static void assertExpression(Class expectedClass, String str) throws ParseException { Linguistics linguistics = new SimpleLinguistics(); - Expression foo = Expression.fromString(str, linguistics); + Expression foo = Expression.fromString(str, linguistics, Encoder.throwsOnUse); assertEquals(expectedClass, foo.getClass()); - Expression bar = Expression.fromString(foo.toString(), linguistics); + Expression bar = Expression.fromString(foo.toString(), linguistics, Encoder.throwsOnUse); assertEquals(foo.hashCode(), bar.hashCode()); assertEquals(foo, bar); } diff --git a/linguistics/abi-spec.json b/linguistics/abi-spec.json index e8687b5c9f4..dc7450678c5 100644 --- a/linguistics/abi-spec.json +++ b/linguistics/abi-spec.json @@ -328,6 +328,21 @@ ], "fields": [] }, + "com.yahoo.language.process.Encoder$FailingEncoder": { + "superClass": "java.lang.Object", + "interfaces": [ + "com.yahoo.language.process.Encoder" + ], + "attributes": [ + "public" + ], + "methods": [ + "public void <init>()", + "public java.util.List encode(java.lang.String, com.yahoo.language.Language)", + "public com.yahoo.tensor.Tensor encode(java.lang.String, com.yahoo.language.Language, com.yahoo.tensor.TensorType)" + ], + "fields": [] + }, "com.yahoo.language.process.Encoder": { "superClass": "java.lang.Object", "interfaces": [], @@ -340,7 +355,9 @@ "public abstract java.util.List encode(java.lang.String, com.yahoo.language.Language)", "public abstract com.yahoo.tensor.Tensor encode(java.lang.String, com.yahoo.language.Language, com.yahoo.tensor.TensorType)" ], - "fields": [] + "fields": [ + "public static final com.yahoo.language.process.Encoder throwsOnUse" + ] }, "com.yahoo.language.process.GramSplitter$Gram": { "superClass": "java.lang.Object", diff --git a/linguistics/src/main/java/com/yahoo/language/process/Encoder.java b/linguistics/src/main/java/com/yahoo/language/process/Encoder.java index 91de16f669b..27f73d15e54 100644 --- a/linguistics/src/main/java/com/yahoo/language/process/Encoder.java +++ b/linguistics/src/main/java/com/yahoo/language/process/Encoder.java @@ -14,6 +14,9 @@ import java.util.List; */ public interface Encoder { + /** An instance of this which throws IllegalStateException if attempted used */ + Encoder throwsOnUse = new FailingEncoder(); + /** * Encodes text into tokens in a list of ids. * @@ -36,4 +39,18 @@ public interface Encoder { */ Tensor encode(String text, Language language, TensorType tensorType); + class FailingEncoder implements Encoder { + + @Override + public List<Integer> encode(String text, Language language) { + throw new IllegalStateException("No encoder has been configured"); + } + + @Override + public Tensor encode(String text, Language language, TensorType tensorType) { + throw new IllegalStateException("No encoder has been configured"); + } + + } + } diff --git a/vespajlib/src/main/java/com/yahoo/tensor/TensorType.java b/vespajlib/src/main/java/com/yahoo/tensor/TensorType.java index 7867a53b8da..4a714925397 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/TensorType.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/TensorType.java @@ -187,7 +187,7 @@ public class TensorType { } /** - * Returns whether or not this type can simply be renamed to + * Returns whether this type can simply be renamed to * the given type. This is the same as being assignable, but disregarding * dimension names. */ |