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 e6ac9e71839..fcc6c680142 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 @@ -30,6 +30,7 @@ import org.elasticsearch.common.xcontent.json.JsonXContent; import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.IngestDocument; import org.elasticsearch.ingest.Processor; +import org.elasticsearch.script.DeprecationMap; import org.elasticsearch.script.IngestScript; import org.elasticsearch.script.Script; import org.elasticsearch.script.ScriptException; @@ -37,6 +38,8 @@ import org.elasticsearch.script.ScriptService; import java.io.InputStream; import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import static org.elasticsearch.ingest.ConfigurationUtils.newConfigurationException; @@ -46,6 +49,16 @@ import static org.elasticsearch.ingest.ConfigurationUtils.newConfigurationExcept */ public final class ScriptProcessor extends AbstractProcessor { + private static final Map DEPRECATIONS; + static { + Map deprecations = new HashMap<>(); + deprecations.put( + "_type", + "[types removal] Looking up doc types [_type] in scripts is deprecated." + ); + DEPRECATIONS = Collections.unmodifiableMap(deprecations); + } + public static final String TYPE = "script"; private final Script script; @@ -72,7 +85,8 @@ public final class ScriptProcessor extends AbstractProcessor { @Override public IngestDocument execute(IngestDocument document) { IngestScript.Factory factory = scriptService.compile(script, IngestScript.CONTEXT); - factory.newInstance(script.getParams()).execute(document.getSourceAndMetadata()); + factory.newInstance(script.getParams()).execute( + new DeprecationMap(document.getSourceAndMetadata(), DEPRECATIONS, "script_processor")); CollectionUtils.ensureNoSelfReferences(document.getSourceAndMetadata(), "ingest script"); return document; } 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 10fcf5fe602..2378827c9aa 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 @@ -74,4 +74,28 @@ public class ScriptProcessorTests extends ESTestCase { assertThat(ingestDocument.getSourceAndMetadata(), hasKey("bytes_total")); assertThat(ingestDocument.getSourceAndMetadata().get("bytes_total"), is(randomBytesTotal)); } + + public void testTypeDeprecation() throws Exception { + String scriptName = "script"; + ScriptService scriptService = new ScriptService(Settings.builder().build(), + Collections.singletonMap( + Script.DEFAULT_SCRIPT_LANG, new MockScriptEngine( + Script.DEFAULT_SCRIPT_LANG, + Collections.singletonMap( + scriptName, ctx -> { + ctx.get("_type"); + return null; + } + ), + Collections.emptyMap() + ) + ), + new HashMap<>(ScriptModule.CORE_CONTEXTS) + ); + Script script = new Script(ScriptType.INLINE, Script.DEFAULT_SCRIPT_LANG, scriptName, Collections.emptyMap()); + IngestDocument ingestDocument = RandomDocumentPicks.randomIngestDocument(random(), Collections.emptyMap()); + ScriptProcessor processor = new ScriptProcessor(randomAlphaOfLength(10), script, scriptService); + processor.execute(ingestDocument); + assertWarnings("[types removal] Looking up doc types [_type] in scripts is deprecated."); + } } diff --git a/modules/reindex/src/test/java/org/elasticsearch/index/reindex/AbstractAsyncBulkByScrollActionScriptTestCase.java b/modules/reindex/src/test/java/org/elasticsearch/index/reindex/AbstractAsyncBulkByScrollActionScriptTestCase.java index e838b89eb38..d452ea23bc1 100644 --- a/modules/reindex/src/test/java/org/elasticsearch/index/reindex/AbstractAsyncBulkByScrollActionScriptTestCase.java +++ b/modules/reindex/src/test/java/org/elasticsearch/index/reindex/AbstractAsyncBulkByScrollActionScriptTestCase.java @@ -58,7 +58,7 @@ public abstract class AbstractAsyncBulkByScrollActionScriptTestCase< UpdateScript.Factory factory = (params, ctx) -> new UpdateScript(Collections.emptyMap(), ctx) { @Override public void execute() { - scriptBody.accept(ctx); + scriptBody.accept(getCtx()); } };; when(scriptService.compile(any(), eq(UpdateScript.CONTEXT))).thenReturn(factory); @@ -67,6 +67,11 @@ public abstract class AbstractAsyncBulkByScrollActionScriptTestCase< return (result != null) ? (T) result.self() : null; } + public void testTypeDeprecation() { + applyScript((Map ctx) -> ctx.get("_type")); + assertWarnings("[types removal] Looking up doc types [_type] in scripts is deprecated."); + } + public void testScriptAddingJunkToCtxIsError() { try { applyScript((Map ctx) -> ctx.put("junk", "junk")); diff --git a/server/src/main/java/org/elasticsearch/ingest/ConditionalProcessor.java b/server/src/main/java/org/elasticsearch/ingest/ConditionalProcessor.java index 2493f291bcd..d5d489ec0e6 100644 --- a/server/src/main/java/org/elasticsearch/ingest/ConditionalProcessor.java +++ b/server/src/main/java/org/elasticsearch/ingest/ConditionalProcessor.java @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.ListIterator; @@ -31,12 +32,24 @@ import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.function.LongSupplier; import java.util.stream.Collectors; + +import org.elasticsearch.script.DeprecationMap; import org.elasticsearch.script.IngestConditionalScript; import org.elasticsearch.script.Script; import org.elasticsearch.script.ScriptService; public class ConditionalProcessor extends AbstractProcessor { + private static final Map DEPRECATIONS; + static { + Map deprecations = new HashMap<>(); + deprecations.put( + "_type", + "[types removal] Looking up doc types [_type] in scripts is deprecated." + ); + DEPRECATIONS = Collections.unmodifiableMap(deprecations); + } + static final String TYPE = "conditional"; private final Script condition; @@ -81,7 +94,8 @@ public class ConditionalProcessor extends AbstractProcessor { boolean evaluate(IngestDocument ingestDocument) { IngestConditionalScript script = scriptService.compile(condition, IngestConditionalScript.CONTEXT).newInstance(condition.getParams()); - return script.execute(new UnmodifiableIngestData(ingestDocument.getSourceAndMetadata())); + return script.execute(new UnmodifiableIngestData( + new DeprecationMap(ingestDocument.getSourceAndMetadata(), DEPRECATIONS, "conditional-processor"))); } Processor getProcessor() { diff --git a/server/src/main/java/org/elasticsearch/script/AbstractSortScript.java b/server/src/main/java/org/elasticsearch/script/AbstractSortScript.java index 949ca5bdb7f..13b109766af 100644 --- a/server/src/main/java/org/elasticsearch/script/AbstractSortScript.java +++ b/server/src/main/java/org/elasticsearch/script/AbstractSortScript.java @@ -66,7 +66,7 @@ abstract class AbstractSortScript implements ScorerAware { this.leafLookup = lookup.getLeafSearchLookup(leafContext); Map parameters = new HashMap<>(params); parameters.putAll(leafLookup.asMap()); - this.params = new DeprecationMap(parameters, DEPRECATIONS); + this.params = new DeprecationMap(parameters, DEPRECATIONS, "sort-script"); } protected AbstractSortScript() { diff --git a/server/src/main/java/org/elasticsearch/script/AggregationScript.java b/server/src/main/java/org/elasticsearch/script/AggregationScript.java index 5d36b91785f..f48d0973551 100644 --- a/server/src/main/java/org/elasticsearch/script/AggregationScript.java +++ b/server/src/main/java/org/elasticsearch/script/AggregationScript.java @@ -71,7 +71,7 @@ public abstract class AggregationScript implements ScorerAware { private Object value; public AggregationScript(Map params, SearchLookup lookup, LeafReaderContext leafContext) { - this.params = new DeprecationMap(new HashMap<>(params), DEPRECATIONS); + this.params = new DeprecationMap(new HashMap<>(params), DEPRECATIONS, "aggregation-script"); this.leafLookup = lookup.getLeafSearchLookup(leafContext); this.params.putAll(leafLookup.asMap()); } diff --git a/server/src/main/java/org/elasticsearch/script/DeprecationMap.java b/server/src/main/java/org/elasticsearch/script/DeprecationMap.java index 5b14e2e3b11..094baa9e0bd 100644 --- a/server/src/main/java/org/elasticsearch/script/DeprecationMap.java +++ b/server/src/main/java/org/elasticsearch/script/DeprecationMap.java @@ -35,9 +35,12 @@ public final class DeprecationMap implements Map { private final Map deprecations; - public DeprecationMap(Map delegate, Map deprecations) { + private final String logKeyPrefix; + + public DeprecationMap(Map delegate, Map deprecations, String logKeyPrefix) { this.delegate = delegate; this.deprecations = deprecations; + this.logKeyPrefix = logKeyPrefix; } @Override @@ -64,7 +67,7 @@ public final class DeprecationMap implements Map { public Object get(final Object key) { String deprecationMessage = deprecations.get(key); if (deprecationMessage != null) { - deprecationLogger.deprecated(deprecationMessage); + deprecationLogger.deprecatedAndMaybeLog(logKeyPrefix + "_" + key, deprecationMessage); } return delegate.get(key); } diff --git a/server/src/main/java/org/elasticsearch/script/FieldScript.java b/server/src/main/java/org/elasticsearch/script/FieldScript.java index 4f0e3c72290..7707301ab4c 100644 --- a/server/src/main/java/org/elasticsearch/script/FieldScript.java +++ b/server/src/main/java/org/elasticsearch/script/FieldScript.java @@ -63,7 +63,7 @@ public abstract class FieldScript { this.leafLookup = lookup.getLeafSearchLookup(leafContext); params = new HashMap<>(params); params.putAll(leafLookup.asMap()); - this.params = new DeprecationMap(params, DEPRECATIONS); + this.params = new DeprecationMap(params, DEPRECATIONS, "field-script"); } // for expression engine diff --git a/server/src/main/java/org/elasticsearch/script/ScoreScript.java b/server/src/main/java/org/elasticsearch/script/ScoreScript.java index 78d206888e9..6ac5935826b 100644 --- a/server/src/main/java/org/elasticsearch/script/ScoreScript.java +++ b/server/src/main/java/org/elasticsearch/script/ScoreScript.java @@ -73,7 +73,7 @@ public abstract class ScoreScript { this.leafLookup = lookup.getLeafSearchLookup(leafContext); params = new HashMap<>(params); params.putAll(leafLookup.asMap()); - this.params = new DeprecationMap(params, DEPRECATIONS); + this.params = new DeprecationMap(params, DEPRECATIONS, "score-script"); } } diff --git a/server/src/main/java/org/elasticsearch/script/ScriptedMetricAggContexts.java b/server/src/main/java/org/elasticsearch/script/ScriptedMetricAggContexts.java index a17503a026f..f1c3e996ec8 100644 --- a/server/src/main/java/org/elasticsearch/script/ScriptedMetricAggContexts.java +++ b/server/src/main/java/org/elasticsearch/script/ScriptedMetricAggContexts.java @@ -95,7 +95,7 @@ public class ScriptedMetricAggContexts { if (leafLookup != null) { params = new HashMap<>(params); // copy params so we aren't modifying input params.putAll(leafLookup.asMap()); // add lookup vars - params = new DeprecationMap(params, DEPRECATIONS); // wrap with deprecations + params = new DeprecationMap(params, DEPRECATIONS, "map-script"); // wrap with deprecations } this.params = params; } diff --git a/server/src/main/java/org/elasticsearch/script/TermsSetQueryScript.java b/server/src/main/java/org/elasticsearch/script/TermsSetQueryScript.java index 9462b6a8e81..c651c3ce690 100644 --- a/server/src/main/java/org/elasticsearch/script/TermsSetQueryScript.java +++ b/server/src/main/java/org/elasticsearch/script/TermsSetQueryScript.java @@ -64,7 +64,7 @@ public abstract class TermsSetQueryScript { Map parameters = new HashMap<>(params); this.leafLookup = lookup.getLeafSearchLookup(leafContext); parameters.putAll(leafLookup.asMap()); - this.params = new DeprecationMap(parameters, DEPRECATIONS); + this.params = new DeprecationMap(parameters, DEPRECATIONS, "term-set-query-script"); } protected TermsSetQueryScript() { diff --git a/server/src/main/java/org/elasticsearch/script/UpdateScript.java b/server/src/main/java/org/elasticsearch/script/UpdateScript.java index 9b9e79c7b74..765489b7e44 100644 --- a/server/src/main/java/org/elasticsearch/script/UpdateScript.java +++ b/server/src/main/java/org/elasticsearch/script/UpdateScript.java @@ -20,6 +20,8 @@ package org.elasticsearch.script; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; /** @@ -27,6 +29,16 @@ import java.util.Map; */ public abstract class UpdateScript { + private static final Map DEPRECATIONS; + static { + Map deprecations = new HashMap<>(); + deprecations.put( + "_type", + "[types removal] Looking up doc types [_type] in scripts is deprecated." + ); + DEPRECATIONS = Collections.unmodifiableMap(deprecations); + } + public static final String[] PARAMETERS = { }; /** The context used to compile {@link UpdateScript} factories. */ @@ -40,7 +52,7 @@ public abstract class UpdateScript { public UpdateScript(Map params, Map ctx) { this.params = params; - this.ctx = ctx; + this.ctx = new DeprecationMap(ctx, DEPRECATIONS, "update-script"); } /** Return the parameters for this script. */ diff --git a/server/src/main/java/org/elasticsearch/search/lookup/LeafDocLookup.java b/server/src/main/java/org/elasticsearch/search/lookup/LeafDocLookup.java index 17518b2f1f6..04522834579 100644 --- a/server/src/main/java/org/elasticsearch/search/lookup/LeafDocLookup.java +++ b/server/src/main/java/org/elasticsearch/search/lookup/LeafDocLookup.java @@ -44,7 +44,7 @@ public class LeafDocLookup implements Map> { = new DeprecationLogger(LogManager.getLogger(LeafDocLookup.class)); static final String TYPES_DEPRECATION_KEY = "type-field-doc-lookup"; static final String TYPES_DEPRECATION_MESSAGE = - "[types removal] Looking up doc types in scripts is deprecated."; + "[types removal] Looking up doc types [_type] in scripts is deprecated."; private final Map> localCacheFieldData = new HashMap<>(4); diff --git a/server/src/test/java/org/elasticsearch/ingest/ConditionalProcessorTests.java b/server/src/test/java/org/elasticsearch/ingest/ConditionalProcessorTests.java index c5548ae5594..f484957d897 100644 --- a/server/src/test/java/org/elasticsearch/ingest/ConditionalProcessorTests.java +++ b/server/src/test/java/org/elasticsearch/ingest/ConditionalProcessorTests.java @@ -133,6 +133,54 @@ public class ConditionalProcessorTests extends ESTestCase { assertMutatingCtxThrows(ctx -> ((List)ctx.get("listField")).remove("bar")); } + public void testTypeDeprecation() throws Exception { + String scriptName = "conditionalScript"; + ScriptService scriptService = new ScriptService(Settings.builder().build(), + Collections.singletonMap( + Script.DEFAULT_SCRIPT_LANG, + new MockScriptEngine( + Script.DEFAULT_SCRIPT_LANG, + Collections.singletonMap( + scriptName, ctx -> { + ctx.get("_type"); + return true; + } + ), + Collections.emptyMap() + ) + ), + new HashMap<>(ScriptModule.CORE_CONTEXTS) + ); + + LongSupplier relativeTimeProvider = mock(LongSupplier.class); + when(relativeTimeProvider.getAsLong()).thenReturn(0L, TimeUnit.MILLISECONDS.toNanos(1), 0L, TimeUnit.MILLISECONDS.toNanos(2)); + ConditionalProcessor processor = new ConditionalProcessor( + randomAlphaOfLength(10), + new Script( + ScriptType.INLINE, Script.DEFAULT_SCRIPT_LANG, + scriptName, Collections.emptyMap()), scriptService, + new Processor() { + @Override + public IngestDocument execute(final IngestDocument ingestDocument){ + return ingestDocument; + } + + @Override + public String getType() { + return null; + } + + @Override + public String getTag() { + return null; + } + }, relativeTimeProvider); + + IngestDocument ingestDocument = RandomDocumentPicks.randomIngestDocument(random(), Collections.emptyMap()); + processor.execute(ingestDocument); + assertWarnings("[types removal] Looking up doc types [_type] in scripts is deprecated."); + } + private static void assertMutatingCtxThrows(Consumer> mutation) throws Exception { String scriptName = "conditionalScript"; CompletableFuture expectedException = new CompletableFuture<>();