diff --git a/docs/changelog/87309.yaml b/docs/changelog/87309.yaml new file mode 100644 index 0000000000000..61c1b28386702 --- /dev/null +++ b/docs/changelog/87309.yaml @@ -0,0 +1,5 @@ +pr: 87309 +summary: "Script: Add Metadata to ingest context" +area: Infra/Scripting +type: enhancement +issues: [] diff --git a/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/ScriptProcessor.java b/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/ScriptProcessor.java index ef7da35f94ee5..2586b9aed919d 100644 --- a/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/ScriptProcessor.java +++ b/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/ScriptProcessor.java @@ -40,26 +40,26 @@ public final class ScriptProcessor extends AbstractProcessor { private final Script script; private final ScriptService scriptService; - private final IngestScript precompiledIngestScript; + private final IngestScript.Factory precompiledIngestScriptFactory; /** * Processor that evaluates a script with an ingest document in its context * @param tag The processor's tag. * @param description The processor's description. * @param script The {@link Script} to execute. - * @param precompiledIngestScript The {@link Script} precompiled + * @param precompiledIngestScriptFactory The {@link Script} precompiled script * @param scriptService The {@link ScriptService} used to execute the script. */ ScriptProcessor( String tag, String description, Script script, - @Nullable IngestScript precompiledIngestScript, + @Nullable IngestScript.Factory precompiledIngestScriptFactory, ScriptService scriptService ) { super(tag, description); this.script = script; - this.precompiledIngestScript = precompiledIngestScript; + this.precompiledIngestScriptFactory = precompiledIngestScriptFactory; this.scriptService = scriptService; } @@ -71,14 +71,11 @@ public final class ScriptProcessor extends AbstractProcessor { @Override public IngestDocument execute(IngestDocument document) { document.doNoSelfReferencesCheck(true); - final IngestScript ingestScript; - if (precompiledIngestScript == null) { - IngestScript.Factory factory = scriptService.compile(script, IngestScript.CONTEXT); - ingestScript = factory.newInstance(script.getParams()); - } else { - ingestScript = precompiledIngestScript; + IngestScript.Factory factory = precompiledIngestScriptFactory; + if (factory == null) { + factory = scriptService.compile(script, IngestScript.CONTEXT); } - ingestScript.execute(document.getSourceAndMetadata()); + factory.newInstance(script.getParams(), document.getMetadata(), document.getSourceAndMetadata()).execute(); return document; } @@ -91,8 +88,8 @@ Script getScript() { return script; } - IngestScript getPrecompiledIngestScript() { - return precompiledIngestScript; + IngestScript.Factory getPrecompiledIngestScriptFactory() { + return precompiledIngestScriptFactory; } public static final class Factory implements Processor.Factory { @@ -120,16 +117,17 @@ public ScriptProcessor create( Arrays.asList("id", "source", "inline", "lang", "params", "options").forEach(config::remove); // verify script is able to be compiled before successfully creating processor. - IngestScript ingestScript = null; + IngestScript.Factory ingestScriptFactory = null; try { - final IngestScript.Factory factory = scriptService.compile(script, IngestScript.CONTEXT); - if (ScriptType.INLINE.equals(script.getType())) { - ingestScript = factory.newInstance(script.getParams()); + ingestScriptFactory = scriptService.compile(script, IngestScript.CONTEXT); + if (ScriptType.STORED.equals(script.getType())) { + // do not cache stored scripts lest they change and invalidate the cached value + ingestScriptFactory = null; } } catch (ScriptException e) { throw newConfigurationException(TYPE, processorTag, null, e); } - return new ScriptProcessor(processorTag, description, script, ingestScript, scriptService); + return new ScriptProcessor(processorTag, description, script, ingestScriptFactory, scriptService); } } } diff --git a/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/DotExpanderProcessorTests.java b/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/DotExpanderProcessorTests.java index fc17506555edb..1714717d0e6d3 100644 --- a/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/DotExpanderProcessorTests.java +++ b/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/DotExpanderProcessorTests.java @@ -48,7 +48,7 @@ public void testEscapeFields() throws Exception { processor = new DotExpanderProcessor("_tag", null, null, "foo.bar"); processor.execute(document); assertThat(document.getSource().size(), equalTo(1)); - assertThat(document.getMetadata().size(), equalTo(1)); // the default version + assertThat(document.getMetadataMap().size(), equalTo(1)); // the default version assertThat(document.getFieldValue("foo.bar", List.class).size(), equalTo(2)); assertThat(document.getFieldValue("foo.bar.0", String.class), equalTo("baz2")); assertThat(document.getFieldValue("foo.bar.1", String.class), equalTo("baz1")); @@ -60,7 +60,7 @@ public void testEscapeFields() throws Exception { processor = new DotExpanderProcessor("_tag", null, null, "foo.bar"); processor.execute(document); assertThat(document.getSource().size(), equalTo(1)); - assertThat(document.getMetadata().size(), equalTo(1)); // the default version + assertThat(document.getMetadataMap().size(), equalTo(1)); // the default version assertThat(document.getFieldValue("foo.bar", List.class).size(), equalTo(2)); assertThat(document.getFieldValue("foo.bar.0", Integer.class), equalTo(1)); assertThat(document.getFieldValue("foo.bar.1", String.class), equalTo("2")); diff --git a/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/ScriptProcessorFactoryTests.java b/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/ScriptProcessorFactoryTests.java index 8042253b8b1df..6fb39fa0fb803 100644 --- a/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/ScriptProcessorFactoryTests.java +++ b/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/ScriptProcessorFactoryTests.java @@ -10,6 +10,8 @@ import org.elasticsearch.ElasticsearchException; import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.ingest.IngestDocument; +import org.elasticsearch.ingest.TestIngestDocument; import org.elasticsearch.script.IngestScript; import org.elasticsearch.script.MockScriptEngine; import org.elasticsearch.script.Script; @@ -155,9 +157,10 @@ public void testInlineIsCompiled() throws Exception { assertThat(processor.getScript().getLang(), equalTo(Script.DEFAULT_SCRIPT_LANG)); assertThat(processor.getScript().getType(), equalTo(ScriptType.INLINE)); assertThat(processor.getScript().getParams(), equalTo(Collections.emptyMap())); - assertNotNull(processor.getPrecompiledIngestScript()); - Map ctx = new HashMap<>(); - processor.getPrecompiledIngestScript().execute(ctx); + assertNotNull(processor.getPrecompiledIngestScriptFactory()); + IngestDocument doc = TestIngestDocument.emptyIngestDocument(); + Map ctx = TestIngestDocument.emptyIngestDocument().getIngestSourceAndMetadata(); + processor.getPrecompiledIngestScriptFactory().newInstance(null, doc.getMetadata(), ctx).execute(); assertThat(ctx.get("foo"), equalTo("bar")); } @@ -171,6 +174,6 @@ public void testStoredIsNotCompiled() throws Exception { assertNull(processor.getScript().getLang()); assertThat(processor.getScript().getType(), equalTo(ScriptType.STORED)); assertThat(processor.getScript().getParams(), equalTo(Collections.emptyMap())); - assertNull(processor.getPrecompiledIngestScript()); + assertNull(processor.getPrecompiledIngestScriptFactory()); } } diff --git a/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/ScriptProcessorTests.java b/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/ScriptProcessorTests.java index 6add04b9b9b61..972ca029b7b03 100644 --- a/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/ScriptProcessorTests.java +++ b/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/ScriptProcessorTests.java @@ -32,7 +32,7 @@ public class ScriptProcessorTests extends ESTestCase { private ScriptService scriptService; private Script script; - private IngestScript ingestScript; + private IngestScript.Factory ingestScriptFactory; @Before public void setupScripting() { @@ -53,7 +53,7 @@ public void setupScripting() { () -> 1L ); script = new Script(ScriptType.INLINE, Script.DEFAULT_SCRIPT_LANG, scriptName, Collections.emptyMap()); - ingestScript = scriptService.compile(script, IngestScript.CONTEXT).newInstance(script.getParams()); + ingestScriptFactory = scriptService.compile(script, IngestScript.CONTEXT); } public void testScriptingWithoutPrecompiledScriptFactory() throws Exception { @@ -64,7 +64,7 @@ public void testScriptingWithoutPrecompiledScriptFactory() throws Exception { } public void testScriptingWithPrecompiledIngestScript() { - ScriptProcessor processor = new ScriptProcessor(randomAlphaOfLength(10), null, script, ingestScript, scriptService); + ScriptProcessor processor = new ScriptProcessor(randomAlphaOfLength(10), null, script, ingestScriptFactory, scriptService); IngestDocument ingestDocument = randomDocument(); processor.execute(ingestDocument); assertIngestDocument(ingestDocument); diff --git a/modules/ingest-common/src/yamlRestTest/resources/rest-api-spec/test/ingest/190_script_processor.yml b/modules/ingest-common/src/yamlRestTest/resources/rest-api-spec/test/ingest/190_script_processor.yml index 590ecf8eb825a..540ce9203b9c2 100644 --- a/modules/ingest-common/src/yamlRestTest/resources/rest-api-spec/test/ingest/190_script_processor.yml +++ b/modules/ingest-common/src/yamlRestTest/resources/rest-api-spec/test/ingest/190_script_processor.yml @@ -314,3 +314,45 @@ teardown: } } - match: { error.root_cause.0.reason: "Failed to generate the source document for ingest pipeline [my_pipeline]" } + +--- +"Test metadata": + - do: + ingest.put_pipeline: + id: "my_pipeline" + body: > + { + "description": "metadata", + "processors": [ + { + "script" : { + "lang": "painless", + "source" : "Metadata m = metadata(); m.index += '2'; m.id += 'extra'; m.routing = 'myRouting'; m.versionType = 'external'; m.version = 5" + } + } + ] + } + - match: { acknowledged: true } + + - do: + index: + index: test2 + id: "1extra" + version: 4 + version_type: "external" + body: {source_field: "foobar"} + + - do: + index: + index: test + id: "1" + pipeline: "my_pipeline" + body: {source_field: "bazqux"} + + - do: + get: + index: test2 + id: "1extra" + - match: { _source.source_field: "bazqux" } + - match: { _version: 5 } + - match: { _routing: "myRouting" } diff --git a/modules/lang-painless/src/main/resources/org/elasticsearch/painless/org.elasticsearch.script.ingest.txt b/modules/lang-painless/src/main/resources/org/elasticsearch/painless/org.elasticsearch.script.ingest.txt index 72288e84ff89b..4924f93e87c91 100644 --- a/modules/lang-painless/src/main/resources/org/elasticsearch/painless/org.elasticsearch.script.ingest.txt +++ b/modules/lang-painless/src/main/resources/org/elasticsearch/painless/org.elasticsearch.script.ingest.txt @@ -18,3 +18,26 @@ class org.elasticsearch.painless.api.Json { String dump(def) String dump(def, boolean) } + +class org.elasticsearch.script.Metadata { + String getIndex() + void setIndex(String) + + String getId() + void setId(String) + + String getRouting() + void setRouting(String) + + long getVersion() + void setVersion(long) + + String getVersionType() + void setVersionType(String) + + ZonedDateTime getTimestamp() +} + +class org.elasticsearch.script.IngestScript { + Metadata metadata() +} diff --git a/server/src/internalClusterTest/java/org/elasticsearch/ingest/IngestClientIT.java b/server/src/internalClusterTest/java/org/elasticsearch/ingest/IngestClientIT.java index 8407d72eb728e..2e69cdff0fe80 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/ingest/IngestClientIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/ingest/IngestClientIT.java @@ -115,7 +115,7 @@ public void testSimulate() throws Exception { source.put("processed", true); IngestDocument ingestDocument = new IngestDocument("index", "id", Versions.MATCH_ANY, null, null, source); assertThat(simulateDocumentBaseResult.getIngestDocument().getSource(), equalTo(ingestDocument.getSource())); - assertThat(simulateDocumentBaseResult.getIngestDocument().getMetadata(), equalTo(ingestDocument.getMetadata())); + assertThat(simulateDocumentBaseResult.getIngestDocument().getMetadataMap(), equalTo(ingestDocument.getMetadataMap())); assertThat(simulateDocumentBaseResult.getFailure(), nullValue()); // cleanup diff --git a/server/src/main/java/org/elasticsearch/action/ingest/WriteableIngestDocument.java b/server/src/main/java/org/elasticsearch/action/ingest/WriteableIngestDocument.java index e22f4cb1b6f4a..e9e2882763e33 100644 --- a/server/src/main/java/org/elasticsearch/action/ingest/WriteableIngestDocument.java +++ b/server/src/main/java/org/elasticsearch/action/ingest/WriteableIngestDocument.java @@ -42,7 +42,9 @@ final class WriteableIngestDocument implements Writeable, ToXContentFragment { "ingest_document", true, a -> { - Map sourceAndMetadata = Maps.newHashMapWithExpectedSize(5); + Map source = (Map) a[5]; + Map sourceAndMetadata = Maps.newHashMapWithExpectedSize(5 + source.size()); + sourceAndMetadata.putAll(source); sourceAndMetadata.put(Metadata.INDEX.getFieldName(), a[0]); sourceAndMetadata.put(Metadata.ID.getFieldName(), a[1]); if (a[2] != null) { @@ -54,7 +56,6 @@ final class WriteableIngestDocument implements Writeable, ToXContentFragment { if (a[4] != null) { sourceAndMetadata.put(Metadata.VERSION_TYPE.getFieldName(), a[4]); } - sourceAndMetadata.putAll((Map) a[5]); Map ingestMetadata = (Map) a[6]; return new WriteableIngestDocument(new IngestDocument(sourceAndMetadata, ingestMetadata)); } @@ -106,7 +107,7 @@ IngestDocument getIngestDocument() { @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(DOC_FIELD); - Map metadataMap = ingestDocument.getMetadata(); + Map metadataMap = ingestDocument.getMetadataMap(); for (Map.Entry metadata : metadataMap.entrySet()) { if (metadata.getValue() != null) { builder.field(metadata.getKey(), metadata.getValue().toString()); diff --git a/server/src/main/java/org/elasticsearch/ingest/IngestDocument.java b/server/src/main/java/org/elasticsearch/ingest/IngestDocument.java index 55067ba2853bf..e6e8f428efb3a 100644 --- a/server/src/main/java/org/elasticsearch/ingest/IngestDocument.java +++ b/server/src/main/java/org/elasticsearch/ingest/IngestDocument.java @@ -733,17 +733,24 @@ public Map getSourceAndMetadata() { /** * Get source and metadata map as {@link IngestSourceAndMetadata} */ - IngestSourceAndMetadata getIngestSourceAndMetadata() { + public IngestSourceAndMetadata getIngestSourceAndMetadata() { return sourceAndMetadata; } /** * Get all Metadata values in a Map */ - public Map getMetadata() { + public Map getMetadataMap() { return sourceAndMetadata.getMetadata(); } + /** + * Get the strongly typed metadata + */ + public org.elasticsearch.script.Metadata getMetadata() { + return sourceAndMetadata; + } + /** * Get all source values in a Map */ diff --git a/server/src/main/java/org/elasticsearch/ingest/IngestSourceAndMetadata.java b/server/src/main/java/org/elasticsearch/ingest/IngestSourceAndMetadata.java index 2665e3058835c..68d779be37812 100644 --- a/server/src/main/java/org/elasticsearch/ingest/IngestSourceAndMetadata.java +++ b/server/src/main/java/org/elasticsearch/ingest/IngestSourceAndMetadata.java @@ -11,6 +11,7 @@ import org.elasticsearch.common.util.Maps; import org.elasticsearch.core.Tuple; import org.elasticsearch.index.VersionType; +import org.elasticsearch.script.Metadata; import java.time.ZonedDateTime; import java.util.AbstractCollection; @@ -40,7 +41,7 @@ * * The map is expected to be used by processors, server code should the typed getter and setters where possible. */ -class IngestSourceAndMetadata extends AbstractMap { +class IngestSourceAndMetadata extends AbstractMap implements Metadata { protected final ZonedDateTime timestamp; /** diff --git a/server/src/main/java/org/elasticsearch/script/IngestScript.java b/server/src/main/java/org/elasticsearch/script/IngestScript.java index 705366ff4bf51..87a026caf5361 100644 --- a/server/src/main/java/org/elasticsearch/script/IngestScript.java +++ b/server/src/main/java/org/elasticsearch/script/IngestScript.java @@ -18,7 +18,7 @@ */ public abstract class IngestScript { - public static final String[] PARAMETERS = { "ctx" }; + public static final String[] PARAMETERS = {}; /** The context used to compile {@link IngestScript} factories. */ public static final ScriptContext CONTEXT = new ScriptContext<>( @@ -33,8 +33,16 @@ public abstract class IngestScript { /** The generic runtime parameters for the script. */ private final Map params; - public IngestScript(Map params) { + /** The metadata available to the script */ + private final Metadata metadata; + + /** The metadata and source available to the script */ + private final Map ctx; + + public IngestScript(Map params, Metadata metadata, Map ctx) { this.params = params; + this.metadata = metadata; + this.ctx = ctx; } /** Return the parameters for this script. */ @@ -42,9 +50,19 @@ public Map getParams() { return params; } - public abstract void execute(Map ctx); + /** Provides backwards compatibility access to ctx */ + public Map getCtx() { + return ctx; + } + + /** Return the ingest metadata object */ + public Metadata metadata() { + return metadata; + } + + public abstract void execute(); public interface Factory { - IngestScript newInstance(Map params); + IngestScript newInstance(Map params, Metadata metadata, Map ctx); } } diff --git a/server/src/main/java/org/elasticsearch/script/Metadata.java b/server/src/main/java/org/elasticsearch/script/Metadata.java new file mode 100644 index 0000000000000..e598a211c109a --- /dev/null +++ b/server/src/main/java/org/elasticsearch/script/Metadata.java @@ -0,0 +1,60 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +package org.elasticsearch.script; + +import java.time.ZonedDateTime; + +/** + * Ingest and update metadata available to write scripts + */ +public interface Metadata { + /** + * The destination index + */ + String getIndex(); + + void setIndex(String index); + + /** + * The document id + */ + String getId(); + + void setId(String id); + + /** + * The document routing string + */ + String getRouting(); + + void setRouting(String routing); + + /** + * The version of the document + */ + long getVersion(); + + void setVersion(long version); + + /** + * The version type of the document, {@link org.elasticsearch.index.VersionType} as a lower-case string. + */ + String getVersionType(); + + /** + * Set the version type of the document. + * @param versionType {@link org.elasticsearch.index.VersionType} as a lower-case string + */ + void setVersionType(String versionType); + + /** + * Timestamp of this ingestion or update + */ + ZonedDateTime getTimestamp(); +} diff --git a/server/src/test/java/org/elasticsearch/action/ingest/SimulateExecutionServiceTests.java b/server/src/test/java/org/elasticsearch/action/ingest/SimulateExecutionServiceTests.java index f609114832a70..958c59f67a838 100644 --- a/server/src/test/java/org/elasticsearch/action/ingest/SimulateExecutionServiceTests.java +++ b/server/src/test/java/org/elasticsearch/action/ingest/SimulateExecutionServiceTests.java @@ -378,7 +378,7 @@ public boolean isAsync() { for (int id = 0; id < numDocs; id++) { SimulateDocumentBaseResult result = (SimulateDocumentBaseResult) response.getResults().get(id); assertThat( - result.getIngestDocument().getMetadata().get(IngestDocument.Metadata.ID.getFieldName()), + result.getIngestDocument().getMetadataMap().get(IngestDocument.Metadata.ID.getFieldName()), equalTo(Integer.toString(id)) ); assertThat(result.getIngestDocument().getSourceAndMetadata().get("processed"), is(true)); diff --git a/server/src/test/java/org/elasticsearch/action/ingest/SimulatePipelineRequestParsingTests.java b/server/src/test/java/org/elasticsearch/action/ingest/SimulatePipelineRequestParsingTests.java index 3fbb867346fbc..e906a2d619cb0 100644 --- a/server/src/test/java/org/elasticsearch/action/ingest/SimulatePipelineRequestParsingTests.java +++ b/server/src/test/java/org/elasticsearch/action/ingest/SimulatePipelineRequestParsingTests.java @@ -100,7 +100,7 @@ public void testParseUsingPipelineStore() throws Exception { Iterator> expectedDocsIterator = expectedDocs.iterator(); for (IngestDocument ingestDocument : actualRequest.documents()) { Map expectedDocument = expectedDocsIterator.next(); - Map metadataMap = ingestDocument.getMetadata(); + Map metadataMap = ingestDocument.getMetadataMap(); assertThat(metadataMap.get(INDEX.getFieldName()), equalTo(expectedDocument.get(INDEX.getFieldName()))); assertThat(metadataMap.get(ID.getFieldName()), equalTo(expectedDocument.get(ID.getFieldName()))); assertThat(ingestDocument.getSource(), equalTo(expectedDocument.get(Fields.SOURCE))); @@ -196,7 +196,7 @@ public void testParseWithProvidedPipeline() throws Exception { Iterator> expectedDocsIterator = expectedDocs.iterator(); for (IngestDocument ingestDocument : actualRequest.documents()) { Map expectedDocument = expectedDocsIterator.next(); - Map metadataMap = ingestDocument.getMetadata(); + Map metadataMap = ingestDocument.getMetadataMap(); assertThat(metadataMap.get(INDEX.getFieldName()), equalTo(expectedDocument.get(INDEX.getFieldName()))); assertThat(metadataMap.get(ID.getFieldName()), equalTo(expectedDocument.get(ID.getFieldName()))); assertThat(metadataMap.get(ROUTING.getFieldName()), equalTo(expectedDocument.get(ROUTING.getFieldName()))); @@ -349,7 +349,7 @@ public void testIngestPipelineWithDocumentsWithType() throws Exception { Iterator> expectedDocsIterator = expectedDocs.iterator(); for (IngestDocument ingestDocument : actualRequest.documents()) { Map expectedDocument = expectedDocsIterator.next(); - Map metadataMap = ingestDocument.getMetadata(); + Map metadataMap = ingestDocument.getMetadataMap(); assertThat(metadataMap.get(INDEX.getFieldName()), equalTo(expectedDocument.get(INDEX.getFieldName()))); assertThat(metadataMap.get(ID.getFieldName()), equalTo(expectedDocument.get(ID.getFieldName()))); assertThat(metadataMap.get(ROUTING.getFieldName()), equalTo(expectedDocument.get(ROUTING.getFieldName()))); diff --git a/server/src/test/java/org/elasticsearch/action/ingest/WriteableIngestDocumentTests.java b/server/src/test/java/org/elasticsearch/action/ingest/WriteableIngestDocumentTests.java index 195595370c214..03007d1e84712 100644 --- a/server/src/test/java/org/elasticsearch/action/ingest/WriteableIngestDocumentTests.java +++ b/server/src/test/java/org/elasticsearch/action/ingest/WriteableIngestDocumentTests.java @@ -148,7 +148,7 @@ public void testToXContent() throws IOException { Map toXContentSource = (Map) toXContentDoc.get("_source"); Map toXContentIngestMetadata = (Map) toXContentDoc.get("_ingest"); - Map metadataMap = ingestDocument.getMetadata(); + Map metadataMap = ingestDocument.getMetadataMap(); for (Map.Entry metadata : metadataMap.entrySet()) { String fieldName = metadata.getKey(); if (metadata.getValue() == null) { diff --git a/server/src/test/java/org/elasticsearch/ingest/IngestServiceTests.java b/server/src/test/java/org/elasticsearch/ingest/IngestServiceTests.java index c3559aceafa06..4471efe555157 100644 --- a/server/src/test/java/org/elasticsearch/ingest/IngestServiceTests.java +++ b/server/src/test/java/org/elasticsearch/ingest/IngestServiceTests.java @@ -2231,7 +2231,7 @@ private class IngestDocumentMatcher implements ArgumentMatcher { public boolean matches(IngestDocument other) { // ingest metadata and IngestSourceAndMetadata will not be the same (timestamp differs every time) return Objects.equals(ingestDocument.getSource(), other.getSource()) - && Objects.equals(ingestDocument.getMetadata(), other.getMetadata()); + && Objects.equals(ingestDocument.getMetadataMap(), other.getMetadataMap()); } } diff --git a/server/src/test/java/org/elasticsearch/ingest/IngestSourceAndMetadataTests.java b/server/src/test/java/org/elasticsearch/ingest/IngestSourceAndMetadataTests.java index 165889a13cdbd..f0085abda82ee 100644 --- a/server/src/test/java/org/elasticsearch/ingest/IngestSourceAndMetadataTests.java +++ b/server/src/test/java/org/elasticsearch/ingest/IngestSourceAndMetadataTests.java @@ -13,6 +13,7 @@ import java.util.HashMap; import java.util.Iterator; +import java.util.Locale; import java.util.Map; import java.util.Set; @@ -320,6 +321,25 @@ public void testDefaultValidatorForAllMetadata() { assertEquals(IngestDocument.Metadata.values().length, IngestSourceAndMetadata.VALIDATORS.size()); } + public void testHandlesAllVersionTypes() { + Map md = new HashMap<>(); + md.put("_version", 1234); + map = new IngestSourceAndMetadata(new HashMap<>(), md, null, null); + assertNull(map.getVersionType()); + for (VersionType vt : VersionType.values()) { + map.setVersionType(VersionType.toString(vt)); + assertEquals(VersionType.toString(vt), map.get("_version_type")); + } + + for (VersionType vt : VersionType.values()) { + map.put("_version_type", VersionType.toString(vt)); + assertEquals(vt.toString().toLowerCase(Locale.ROOT), map.getVersionType()); + } + + map.setVersionType(null); + assertNull(map.getVersionType()); + } + private static class TestEntry implements Map.Entry { String key; Object value; diff --git a/test/framework/src/main/java/org/elasticsearch/script/MockScriptEngine.java b/test/framework/src/main/java/org/elasticsearch/script/MockScriptEngine.java index bfc75a246b098..0b9f7f8972620 100644 --- a/test/framework/src/main/java/org/elasticsearch/script/MockScriptEngine.java +++ b/test/framework/src/main/java/org/elasticsearch/script/MockScriptEngine.java @@ -148,9 +148,9 @@ public boolean needs_score() { } else if (context.instanceClazz.equals(BytesRefSortScript.class)) { return context.factoryClazz.cast(new MockBytesRefSortScriptFactory(script)); } else if (context.instanceClazz.equals(IngestScript.class)) { - IngestScript.Factory factory = vars -> new IngestScript(vars) { + IngestScript.Factory factory = (parameters, metadata, ctx) -> new IngestScript(parameters, metadata, ctx) { @Override - public void execute(Map ctx) { + public void execute() { script.apply(ctx); } }; diff --git a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/inference/results/InferenceResultsTestCase.java b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/inference/results/InferenceResultsTestCase.java index 4377051fabd59..1663c63eeeae3 100644 --- a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/inference/results/InferenceResultsTestCase.java +++ b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/inference/results/InferenceResultsTestCase.java @@ -55,7 +55,7 @@ public void testWriteToDocAndSerialize() throws IOException { InferenceResults.writeResult(inferenceResult, document, parentField, modelId); try (XContentBuilder builder = XContentFactory.jsonBuilder()) { builder.startObject(); - Map metadataMap = document.getMetadata(); + Map metadataMap = document.getMetadataMap(); for (Map.Entry metadata : metadataMap.entrySet()) { if (metadata.getValue() != null) { builder.field(metadata.getKey(), metadata.getValue().toString()); diff --git a/x-pack/plugin/ml/qa/native-multi-node-tests/src/javaRestTest/java/org/elasticsearch/xpack/ml/integration/MlNativeIntegTestCase.java b/x-pack/plugin/ml/qa/native-multi-node-tests/src/javaRestTest/java/org/elasticsearch/xpack/ml/integration/MlNativeIntegTestCase.java index c29ecc430726b..b3928cae4dc90 100644 --- a/x-pack/plugin/ml/qa/native-multi-node-tests/src/javaRestTest/java/org/elasticsearch/xpack/ml/integration/MlNativeIntegTestCase.java +++ b/x-pack/plugin/ml/qa/native-multi-node-tests/src/javaRestTest/java/org/elasticsearch/xpack/ml/integration/MlNativeIntegTestCase.java @@ -440,9 +440,9 @@ public T compile(String name, String script, ScriptContext context, Map 0.0))); } if (context.name.equals("ingest")) { - IngestScript.Factory factory = vars -> new IngestScript(vars) { + IngestScript.Factory factory = (params, metadata, ctx) -> new IngestScript(params, metadata, ctx) { @Override - public void execute(Map ctx) {} + public void execute() {} }; return context.factoryClazz.cast(factory); } diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/MlSingleNodeTestCase.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/MlSingleNodeTestCase.java index d19a88043cef9..8749714d971fe 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/MlSingleNodeTestCase.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/MlSingleNodeTestCase.java @@ -200,9 +200,9 @@ public T compile(String name, String script, ScriptContext context, Map 0.0))); } if (context.name.equals("ingest")) { - IngestScript.Factory factory = vars -> new IngestScript(vars) { + IngestScript.Factory factory = (vars, metadata, ctx) -> new IngestScript(vars, metadata, ctx) { @Override - public void execute(Map ctx) {} + public void execute() {} }; return context.factoryClazz.cast(factory); } diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/support/BaseMlIntegTestCase.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/support/BaseMlIntegTestCase.java index de48292eec920..d2bb3daa13f07 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/support/BaseMlIntegTestCase.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/support/BaseMlIntegTestCase.java @@ -554,9 +554,9 @@ public T compile(String name, String script, ScriptContext context, Map 0.0))); } if (context.name.equals("ingest")) { - IngestScript.Factory factory = vars -> new IngestScript(vars) { + IngestScript.Factory factory = (vars, metadata, ctx) -> new IngestScript(vars, metadata, ctx) { @Override - public void execute(Map ctx) {} + public void execute() {} }; return context.factoryClazz.cast(factory); }