فهرست منبع

Removed deprecated 1.x script and template syntax

Closes #13729
Martijn van Groningen 9 سال پیش
والد
کامیت
2c3165d080
35فایلهای تغییر یافته به همراه365 افزوده شده و 1969 حذف شده
  1. 1 18
      core/src/main/java/org/elasticsearch/action/update/UpdateRequest.java
  2. 3 24
      core/src/main/java/org/elasticsearch/index/query/ScriptQueryBuilder.java
  3. 11 74
      core/src/main/java/org/elasticsearch/index/query/TemplateQueryBuilder.java
  4. 1 25
      core/src/main/java/org/elasticsearch/index/query/functionscore/ScriptScoreFunctionBuilder.java
  5. 0 18
      core/src/main/java/org/elasticsearch/rest/action/update/RestUpdateAction.java
  6. 10 23
      core/src/main/java/org/elasticsearch/script/AbstractScriptParser.java
  7. 2 2
      core/src/main/java/org/elasticsearch/script/Script.java
  8. 3 5
      core/src/main/java/org/elasticsearch/script/ScriptMetaData.java
  9. 0 234
      core/src/main/java/org/elasticsearch/script/ScriptParameterParser.java
  10. 26 59
      core/src/main/java/org/elasticsearch/script/ScriptService.java
  11. 4 22
      core/src/main/java/org/elasticsearch/script/Template.java
  12. 1 23
      core/src/main/java/org/elasticsearch/search/aggregations/bucket/significant/heuristics/ScriptHeuristic.java
  13. 4 55
      core/src/main/java/org/elasticsearch/search/aggregations/metrics/scripted/ScriptedMetricAggregationBuilder.java
  14. 2 19
      core/src/main/java/org/elasticsearch/search/sort/ScriptSortBuilder.java
  15. 12 0
      core/src/test/java/org/elasticsearch/action/update/UpdateRequestTests.java
  16. 15 1
      core/src/test/java/org/elasticsearch/index/query/ScriptQueryBuilderTests.java
  17. 2 2
      core/src/test/java/org/elasticsearch/index/query/TemplateQueryBuilderTests.java
  18. 0 1280
      core/src/test/java/org/elasticsearch/script/ScriptParameterParserTests.java
  19. 2 3
      core/src/test/java/org/elasticsearch/script/ScriptServiceTests.java
  20. 7 10
      core/src/test/java/org/elasticsearch/search/sort/ScriptSortBuilderTests.java
  21. 1 1
      core/src/test/resources/org/elasticsearch/action/bulk/simple-bulk4.json
  22. 186 2
      docs/reference/migration/migrate_5_0/scripting.asciidoc
  23. 8 3
      modules/lang-groovy/src/test/java/org/elasticsearch/messy/tests/BulkTests.java
  24. 16 11
      modules/lang-groovy/src/test/resources/rest-api-spec/test/lang_groovy/15_update.yaml
  25. 9 6
      modules/lang-groovy/src/test/resources/rest-api-spec/test/lang_groovy/25_script_upsert.yaml
  26. 6 4
      modules/lang-groovy/src/test/resources/rest-api-spec/test/lang_groovy/90_missing.yaml
  27. 1 1
      modules/lang-mustache/src/test/java/org/elasticsearch/messy/tests/TemplateQueryParserTests.java
  28. 0 9
      modules/lang-mustache/src/test/java/org/elasticsearch/messy/tests/TemplateQueryTests.java
  29. 5 5
      modules/lang-mustache/src/test/resources/rest-api-spec/test/lang_mustache/30_template_query_execution.yaml
  30. 1 1
      modules/lang-mustache/src/test/resources/rest-api-spec/test/lang_mustache/50_messy_test_msearch.yaml
  31. 8 6
      modules/lang-painless/src/test/resources/rest-api-spec/test/plan_a/15_update.yaml
  32. 12 9
      modules/lang-painless/src/test/resources/rest-api-spec/test/plan_a/25_script_upsert.yaml
  33. 3 2
      qa/smoke-test-reindex-with-painless/src/test/resources/rest-api-spec/test/reindex/40_search_failures.yaml
  34. 3 2
      qa/smoke-test-reindex-with-painless/src/test/resources/rest-api-spec/test/update_by_query/40_search_failure.yaml
  35. 0 10
      rest-api-spec/src/main/resources/rest-api-spec/api/update.json

+ 1 - 18
core/src/main/java/org/elasticsearch/action/update/UpdateRequest.java

@@ -39,8 +39,6 @@ import org.elasticsearch.common.xcontent.XContentType;
 import org.elasticsearch.index.VersionType;
 import org.elasticsearch.index.VersionType;
 import org.elasticsearch.index.shard.ShardId;
 import org.elasticsearch.index.shard.ShardId;
 import org.elasticsearch.script.Script;
 import org.elasticsearch.script.Script;
-import org.elasticsearch.script.ScriptParameterParser;
-import org.elasticsearch.script.ScriptParameterParser.ScriptParameterValue;
 import org.elasticsearch.script.ScriptService;
 import org.elasticsearch.script.ScriptService;
 import org.elasticsearch.script.ScriptService.ScriptType;
 import org.elasticsearch.script.ScriptService.ScriptType;
 
 
@@ -637,8 +635,6 @@ public class UpdateRequest extends InstanceShardOperationRequest<UpdateRequest>
     }
     }
 
 
     public UpdateRequest source(BytesReference source) throws Exception {
     public UpdateRequest source(BytesReference source) throws Exception {
-        ScriptParameterParser scriptParameterParser = new ScriptParameterParser();
-        Map<String, Object> scriptParams = null;
         Script script = null;
         Script script = null;
         try (XContentParser parser = XContentFactory.xContent(source).createParser(source)) {
         try (XContentParser parser = XContentFactory.xContent(source).createParser(source)) {
             XContentParser.Token token = parser.nextToken();
             XContentParser.Token token = parser.nextToken();
@@ -649,11 +645,8 @@ public class UpdateRequest extends InstanceShardOperationRequest<UpdateRequest>
             while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
             while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
                 if (token == XContentParser.Token.FIELD_NAME) {
                 if (token == XContentParser.Token.FIELD_NAME) {
                     currentFieldName = parser.currentName();
                     currentFieldName = parser.currentName();
-                } else if ("script".equals(currentFieldName) && token == XContentParser.Token.START_OBJECT) {
-                    //here we don't have settings available, unable to throw strict deprecation exceptions
+                } else if ("script".equals(currentFieldName)) {
                     script = Script.parse(parser, ParseFieldMatcher.EMPTY);
                     script = Script.parse(parser, ParseFieldMatcher.EMPTY);
-                } else if ("params".equals(currentFieldName)) {
-                    scriptParams = parser.map();
                 } else if ("scripted_upsert".equals(currentFieldName)) {
                 } else if ("scripted_upsert".equals(currentFieldName)) {
                     scriptedUpsert = parser.booleanValue();
                     scriptedUpsert = parser.booleanValue();
                 } else if ("upsert".equals(currentFieldName)) {
                 } else if ("upsert".equals(currentFieldName)) {
@@ -680,16 +673,6 @@ public class UpdateRequest extends InstanceShardOperationRequest<UpdateRequest>
                     if (fields != null) {
                     if (fields != null) {
                         fields(fields.toArray(new String[fields.size()]));
                         fields(fields.toArray(new String[fields.size()]));
                     }
                     }
-                } else {
-                    //here we don't have settings available, unable to throw deprecation exceptions
-                    scriptParameterParser.token(currentFieldName, token, parser, ParseFieldMatcher.EMPTY);
-                }
-            }
-            // Don't have a script using the new API so see if it is specified with the old API
-            if (script == null) {
-                ScriptParameterValue scriptValue = scriptParameterParser.getDefaultScriptParameterValue();
-                if (scriptValue != null) {
-                    script = new Script(scriptValue.script(), scriptValue.scriptType(), scriptParameterParser.lang(), scriptParams);
                 }
                 }
             }
             }
             if (script != null) {
             if (script != null) {

+ 3 - 24
core/src/main/java/org/elasticsearch/index/query/ScriptQueryBuilder.java

@@ -25,7 +25,6 @@ import org.apache.lucene.search.Query;
 import org.apache.lucene.search.RandomAccessWeight;
 import org.apache.lucene.search.RandomAccessWeight;
 import org.apache.lucene.search.Weight;
 import org.apache.lucene.search.Weight;
 import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.Bits;
-import org.elasticsearch.cluster.ClusterState;
 import org.elasticsearch.common.ParseField;
 import org.elasticsearch.common.ParseField;
 import org.elasticsearch.common.ParsingException;
 import org.elasticsearch.common.ParsingException;
 import org.elasticsearch.common.io.stream.StreamInput;
 import org.elasticsearch.common.io.stream.StreamInput;
@@ -36,15 +35,12 @@ import org.elasticsearch.script.LeafSearchScript;
 import org.elasticsearch.script.Script;
 import org.elasticsearch.script.Script;
 import org.elasticsearch.script.Script.ScriptField;
 import org.elasticsearch.script.Script.ScriptField;
 import org.elasticsearch.script.ScriptContext;
 import org.elasticsearch.script.ScriptContext;
-import org.elasticsearch.script.ScriptParameterParser;
-import org.elasticsearch.script.ScriptParameterParser.ScriptParameterValue;
 import org.elasticsearch.script.ScriptService;
 import org.elasticsearch.script.ScriptService;
 import org.elasticsearch.script.SearchScript;
 import org.elasticsearch.script.SearchScript;
 import org.elasticsearch.search.lookup.SearchLookup;
 import org.elasticsearch.search.lookup.SearchLookup;
 
 
 import java.io.IOException;
 import java.io.IOException;
 import java.util.Collections;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.Map;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Optional;
@@ -97,11 +93,8 @@ public class ScriptQueryBuilder extends AbstractQueryBuilder<ScriptQueryBuilder>
 
 
     public static Optional<ScriptQueryBuilder> fromXContent(QueryParseContext parseContext) throws IOException {
     public static Optional<ScriptQueryBuilder> fromXContent(QueryParseContext parseContext) throws IOException {
         XContentParser parser = parseContext.parser();
         XContentParser parser = parseContext.parser();
-        ScriptParameterParser scriptParameterParser = new ScriptParameterParser();
-
         // also, when caching, since its isCacheable is false, will result in loading all bit set...
         // also, when caching, since its isCacheable is false, will result in loading all bit set...
         Script script = null;
         Script script = null;
-        Map<String, Object> params = null;
 
 
         float boost = AbstractQueryBuilder.DEFAULT_BOOST;
         float boost = AbstractQueryBuilder.DEFAULT_BOOST;
         String queryName = null;
         String queryName = null;
@@ -116,9 +109,6 @@ public class ScriptQueryBuilder extends AbstractQueryBuilder<ScriptQueryBuilder>
             } else if (token == XContentParser.Token.START_OBJECT) {
             } else if (token == XContentParser.Token.START_OBJECT) {
                 if (parseContext.getParseFieldMatcher().match(currentFieldName, ScriptField.SCRIPT)) {
                 if (parseContext.getParseFieldMatcher().match(currentFieldName, ScriptField.SCRIPT)) {
                     script = Script.parse(parser, parseContext.getParseFieldMatcher());
                     script = Script.parse(parser, parseContext.getParseFieldMatcher());
-                } else if (parseContext.getParseFieldMatcher().match(currentFieldName, PARAMS_FIELD)) {
-                    // TODO remove in 3.0 (here to support old script APIs)
-                    params = parser.map();
                 } else {
                 } else {
                     throw new ParsingException(parser.getTokenLocation(), "[script] query does not support [" + currentFieldName + "]");
                     throw new ParsingException(parser.getTokenLocation(), "[script] query does not support [" + currentFieldName + "]");
                 }
                 }
@@ -127,25 +117,14 @@ public class ScriptQueryBuilder extends AbstractQueryBuilder<ScriptQueryBuilder>
                     queryName = parser.text();
                     queryName = parser.text();
                 } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.BOOST_FIELD)) {
                 } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.BOOST_FIELD)) {
                     boost = parser.floatValue();
                     boost = parser.floatValue();
-                } else if (!scriptParameterParser.token(currentFieldName, token, parser, parseContext.getParseFieldMatcher())) {
+                } else if (parseContext.getParseFieldMatcher().match(currentFieldName, ScriptField.SCRIPT)) {
+                    script = Script.parse(parser, parseContext.getParseFieldMatcher());
+                } else {
                     throw new ParsingException(parser.getTokenLocation(), "[script] query does not support [" + currentFieldName + "]");
                     throw new ParsingException(parser.getTokenLocation(), "[script] query does not support [" + currentFieldName + "]");
                 }
                 }
             }
             }
         }
         }
 
 
-        if (script == null) { // Didn't find anything using the new API so try using the old one instead
-            ScriptParameterValue scriptValue = scriptParameterParser.getDefaultScriptParameterValue();
-            if (scriptValue != null) {
-                if (params == null) {
-                    params = new HashMap<>();
-                }
-                script = new Script(scriptValue.script(), scriptValue.scriptType(), scriptParameterParser.lang(), params);
-            }
-        } else if (params != null) {
-            throw new ParsingException(parser.getTokenLocation(),
-                    "script params must be specified inside script object in a [script] filter");
-        }
-
         if (script == null) {
         if (script == null) {
             throw new ParsingException(parser.getTokenLocation(), "script must be provided with a [script] filter");
             throw new ParsingException(parser.getTokenLocation(), "script must be provided with a [script] filter");
         }
         }

+ 11 - 74
core/src/main/java/org/elasticsearch/index/query/TemplateQueryBuilder.java

@@ -20,7 +20,6 @@ package org.elasticsearch.index.query;
 
 
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.Query;
 import org.elasticsearch.common.ParseField;
 import org.elasticsearch.common.ParseField;
-import org.elasticsearch.common.ParseFieldMatcher;
 import org.elasticsearch.common.ParsingException;
 import org.elasticsearch.common.ParsingException;
 import org.elasticsearch.common.bytes.BytesReference;
 import org.elasticsearch.common.bytes.BytesReference;
 import org.elasticsearch.common.io.stream.StreamInput;
 import org.elasticsearch.common.io.stream.StreamInput;
@@ -30,13 +29,10 @@ import org.elasticsearch.common.xcontent.XContentFactory;
 import org.elasticsearch.common.xcontent.XContentParser;
 import org.elasticsearch.common.xcontent.XContentParser;
 import org.elasticsearch.script.ExecutableScript;
 import org.elasticsearch.script.ExecutableScript;
 import org.elasticsearch.script.ScriptContext;
 import org.elasticsearch.script.ScriptContext;
-import org.elasticsearch.script.ScriptService;
 import org.elasticsearch.script.Template;
 import org.elasticsearch.script.Template;
 
 
 import java.io.IOException;
 import java.io.IOException;
 import java.util.Collections;
 import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
 import java.util.Objects;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Optional;
 
 
@@ -48,13 +44,6 @@ public class TemplateQueryBuilder extends AbstractQueryBuilder<TemplateQueryBuil
     public static final String NAME = "template";
     public static final String NAME = "template";
     public static final ParseField QUERY_NAME_FIELD = new ParseField(NAME);
     public static final ParseField QUERY_NAME_FIELD = new ParseField(NAME);
 
 
-    private static final Map<String, ScriptService.ScriptType> parametersToTypes = new HashMap<>();
-    static {
-        parametersToTypes.put("query", ScriptService.ScriptType.INLINE);
-        parametersToTypes.put("file", ScriptService.ScriptType.FILE);
-        parametersToTypes.put("id", ScriptService.ScriptType.STORED);
-    }
-
     /** Template to fill. */
     /** Template to fill. */
     private final Template template;
     private final Template template;
 
 
@@ -73,32 +62,6 @@ public class TemplateQueryBuilder extends AbstractQueryBuilder<TemplateQueryBuil
         return template;
         return template;
     }
     }
 
 
-    /**
-     * @param template
-     *            the template to use for that query.
-     * @param vars
-     *            the parameters to fill the template with.
-     * @deprecated Use {@link #TemplateQueryBuilder(Template)} instead.
-     * */
-    @Deprecated
-    public TemplateQueryBuilder(String template, Map<String, Object> vars) {
-        this(new Template(template, ScriptService.ScriptType.INLINE, null, null, vars));
-    }
-
-    /**
-     * @param template
-     *            the template to use for that query.
-     * @param vars
-     *            the parameters to fill the template with.
-     * @param templateType
-     *            what kind of template (INLINE,FILE,ID)
-     * @deprecated Use {@link #TemplateQueryBuilder(Template)} instead.
-     * */
-    @Deprecated
-    public TemplateQueryBuilder(String template, ScriptService.ScriptType templateType, Map<String, Object> vars) {
-        this(new Template(template, templateType, null, null, vars));
-    }
-
     /**
     /**
      * Read from a stream.
      * Read from a stream.
      */
      */
@@ -118,42 +81,6 @@ public class TemplateQueryBuilder extends AbstractQueryBuilder<TemplateQueryBuil
         template.toXContent(builder, builderParams);
         template.toXContent(builder, builderParams);
     }
     }
 
 
-    /**
-     * In the simplest case, parse template string and variables from the request,
-     * compile the template and execute the template against the given variables.
-     */
-    public static Optional<TemplateQueryBuilder> fromXContent(QueryParseContext parseContext) throws IOException {
-        XContentParser parser = parseContext.parser();
-        Template template = parse(parser, parseContext.getParseFieldMatcher());
-        return Optional.of(new TemplateQueryBuilder(template));
-    }
-
-    public static Template parse(XContentParser parser, ParseFieldMatcher parseFieldMatcher, String... parameters) throws IOException {
-        Map<String, ScriptService.ScriptType> parameterMap = new HashMap<>(parametersToTypes);
-        for (String parameter : parameters) {
-            parameterMap.put(parameter, ScriptService.ScriptType.INLINE);
-        }
-        return parse(parser, parameterMap, parseFieldMatcher);
-    }
-
-    public static Template parse(String defaultLang, XContentParser parser,
-                                 ParseFieldMatcher parseFieldMatcher, String... parameters) throws IOException {
-        Map<String, ScriptService.ScriptType> parameterMap = new HashMap<>(parametersToTypes);
-        for (String parameter : parameters) {
-            parameterMap.put(parameter, ScriptService.ScriptType.INLINE);
-        }
-        return Template.parse(parser, parameterMap, defaultLang, parseFieldMatcher);
-    }
-
-    public static Template parse(XContentParser parser, ParseFieldMatcher parseFieldMatcher) throws IOException {
-        return parse(parser, parametersToTypes, parseFieldMatcher);
-    }
-
-    public static Template parse(XContentParser parser, Map<String, ScriptService.ScriptType> parameterMap,
-                                 ParseFieldMatcher parseFieldMatcher) throws IOException {
-        return Template.parse(parser, parameterMap, parseFieldMatcher);
-    }
-
     @Override
     @Override
     public String getWriteableName() {
     public String getWriteableName() {
         return NAME;
         return NAME;
@@ -182,7 +109,7 @@ public class TemplateQueryBuilder extends AbstractQueryBuilder<TemplateQueryBuil
         try (XContentParser qSourceParser = XContentFactory.xContent(querySource).createParser(querySource)) {
         try (XContentParser qSourceParser = XContentFactory.xContent(querySource).createParser(querySource)) {
             final QueryParseContext queryParseContext = queryRewriteContext.newParseContext(qSourceParser);
             final QueryParseContext queryParseContext = queryRewriteContext.newParseContext(qSourceParser);
             final QueryBuilder queryBuilder = queryParseContext.parseInnerQueryBuilder().orElseThrow(
             final QueryBuilder queryBuilder = queryParseContext.parseInnerQueryBuilder().orElseThrow(
-                    () -> new ParsingException(qSourceParser.getTokenLocation(), "inner query in [" + NAME + "] cannot be empty"));;
+                    () -> new ParsingException(qSourceParser.getTokenLocation(), "inner query in [" + NAME + "] cannot be empty"));
             if (boost() != DEFAULT_BOOST || queryName() != null) {
             if (boost() != DEFAULT_BOOST || queryName() != null) {
                 final BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
                 final BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
                 boolQueryBuilder.must(queryBuilder);
                 boolQueryBuilder.must(queryBuilder);
@@ -191,4 +118,14 @@ public class TemplateQueryBuilder extends AbstractQueryBuilder<TemplateQueryBuil
             return queryBuilder;
             return queryBuilder;
         }
         }
     }
     }
+
+    /**
+     * In the simplest case, parse template string and variables from the request,
+     * compile the template and execute the template against the given variables.
+     */
+    public static Optional<TemplateQueryBuilder> fromXContent(QueryParseContext parseContext) throws IOException {
+        XContentParser parser = parseContext.parser();
+        Template template =  Template.parse(parser, parseContext.getParseFieldMatcher());
+        return Optional.of(new TemplateQueryBuilder(template));
+    }
 }
 }

+ 1 - 25
core/src/main/java/org/elasticsearch/index/query/functionscore/ScriptScoreFunctionBuilder.java

@@ -32,14 +32,10 @@ import org.elasticsearch.index.query.QueryShardException;
 import org.elasticsearch.script.Script;
 import org.elasticsearch.script.Script;
 import org.elasticsearch.script.Script.ScriptField;
 import org.elasticsearch.script.Script.ScriptField;
 import org.elasticsearch.script.ScriptContext;
 import org.elasticsearch.script.ScriptContext;
-import org.elasticsearch.script.ScriptParameterParser;
-import org.elasticsearch.script.ScriptParameterParser.ScriptParameterValue;
 import org.elasticsearch.script.SearchScript;
 import org.elasticsearch.script.SearchScript;
 
 
 import java.io.IOException;
 import java.io.IOException;
 import java.util.Collections;
 import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
 import java.util.Objects;
 import java.util.Objects;
 
 
 /**
 /**
@@ -111,39 +107,19 @@ public class ScriptScoreFunctionBuilder extends ScoreFunctionBuilder<ScriptScore
     public static ScriptScoreFunctionBuilder fromXContent(QueryParseContext parseContext)
     public static ScriptScoreFunctionBuilder fromXContent(QueryParseContext parseContext)
             throws IOException, ParsingException {
             throws IOException, ParsingException {
         XContentParser parser = parseContext.parser();
         XContentParser parser = parseContext.parser();
-        ScriptParameterParser scriptParameterParser = new ScriptParameterParser();
         Script script = null;
         Script script = null;
-        Map<String, Object> vars = null;
         String currentFieldName = null;
         String currentFieldName = null;
         XContentParser.Token token;
         XContentParser.Token token;
         while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
         while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
             if (token == XContentParser.Token.FIELD_NAME) {
             if (token == XContentParser.Token.FIELD_NAME) {
                 currentFieldName = parser.currentName();
                 currentFieldName = parser.currentName();
-            } else if (token == XContentParser.Token.START_OBJECT) {
+            } else {
                 if (parseContext.getParseFieldMatcher().match(currentFieldName, ScriptField.SCRIPT)) {
                 if (parseContext.getParseFieldMatcher().match(currentFieldName, ScriptField.SCRIPT)) {
                     script = Script.parse(parser, parseContext.getParseFieldMatcher());
                     script = Script.parse(parser, parseContext.getParseFieldMatcher());
-                } else if ("params".equals(currentFieldName)) { // TODO remove in 3.0 (here to support old script APIs)
-                    vars = parser.map();
                 } else {
                 } else {
                     throw new ParsingException(parser.getTokenLocation(), NAME + " query does not support [" + currentFieldName + "]");
                     throw new ParsingException(parser.getTokenLocation(), NAME + " query does not support [" + currentFieldName + "]");
                 }
                 }
-            } else if (token.isValue()) {
-                if (!scriptParameterParser.token(currentFieldName, token, parser, parseContext.getParseFieldMatcher())) {
-                    throw new ParsingException(parser.getTokenLocation(), NAME + " query does not support [" + currentFieldName + "]");
-                }
-            }
-        }
-
-        if (script == null) { // Didn't find anything using the new API so try using the old one instead
-            ScriptParameterValue scriptValue = scriptParameterParser.getDefaultScriptParameterValue();
-            if (scriptValue != null) {
-                if (vars == null) {
-                    vars = new HashMap<>();
-                }
-                script = new Script(scriptValue.script(), scriptValue.scriptType(), scriptParameterParser.lang(), vars);
             }
             }
-        } else if (vars != null) {
-            throw new ParsingException(parser.getTokenLocation(), "script params must be specified inside script object");
         }
         }
 
 
         if (script == null) {
         if (script == null) {

+ 0 - 18
core/src/main/java/org/elasticsearch/rest/action/update/RestUpdateAction.java

@@ -33,12 +33,6 @@ import org.elasticsearch.rest.RestController;
 import org.elasticsearch.rest.RestRequest;
 import org.elasticsearch.rest.RestRequest;
 import org.elasticsearch.rest.action.support.RestActions;
 import org.elasticsearch.rest.action.support.RestActions;
 import org.elasticsearch.rest.action.support.RestStatusToXContentListener;
 import org.elasticsearch.rest.action.support.RestStatusToXContentListener;
-import org.elasticsearch.script.Script;
-import org.elasticsearch.script.ScriptParameterParser;
-import org.elasticsearch.script.ScriptParameterParser.ScriptParameterValue;
-
-import java.util.HashMap;
-import java.util.Map;
 
 
 import static org.elasticsearch.rest.RestRequest.Method.POST;
 import static org.elasticsearch.rest.RestRequest.Method.POST;
 
 
@@ -64,18 +58,6 @@ public class RestUpdateAction extends BaseRestHandler {
             updateRequest.consistencyLevel(WriteConsistencyLevel.fromString(consistencyLevel));
             updateRequest.consistencyLevel(WriteConsistencyLevel.fromString(consistencyLevel));
         }
         }
         updateRequest.docAsUpsert(request.paramAsBoolean("doc_as_upsert", updateRequest.docAsUpsert()));
         updateRequest.docAsUpsert(request.paramAsBoolean("doc_as_upsert", updateRequest.docAsUpsert()));
-        ScriptParameterParser scriptParameterParser = new ScriptParameterParser();
-        scriptParameterParser.parseParams(request);
-        ScriptParameterValue scriptValue = scriptParameterParser.getDefaultScriptParameterValue();
-        if (scriptValue != null) {
-            Map<String, Object> scriptParams = new HashMap<>();
-            for (Map.Entry<String, String> entry : request.params().entrySet()) {
-                if (entry.getKey().startsWith("sp_")) {
-                    scriptParams.put(entry.getKey().substring(3), entry.getValue());
-                }
-            }
-            updateRequest.script(new Script(scriptValue.script(), scriptValue.scriptType(), scriptParameterParser.lang(), scriptParams));
-        }
         String sField = request.param("fields");
         String sField = request.param("fields");
         if (sField != null) {
         if (sField != null) {
             String[] sFields = Strings.splitStringByCommaToArray(sField);
             String[] sFields = Strings.splitStringByCommaToArray(sField);

+ 10 - 23
core/src/main/java/org/elasticsearch/script/AbstractScriptParser.java

@@ -26,24 +26,18 @@ import org.elasticsearch.script.Script.ScriptParseException;
 import org.elasticsearch.script.ScriptService.ScriptType;
 import org.elasticsearch.script.ScriptService.ScriptType;
 
 
 import java.io.IOException;
 import java.io.IOException;
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Map.Entry;
 
 
 public abstract class AbstractScriptParser<S extends Script> {
 public abstract class AbstractScriptParser<S extends Script> {
 
 
-    protected abstract String parseInlineScript(XContentParser parser) throws IOException;
+    public abstract String parseInlineScript(XContentParser parser) throws IOException;
 
 
     protected abstract S createScript(String script, ScriptType type, String lang, Map<String, Object> params);
     protected abstract S createScript(String script, ScriptType type, String lang, Map<String, Object> params);
 
 
     protected abstract S createSimpleScript(XContentParser parser) throws IOException;
     protected abstract S createSimpleScript(XContentParser parser) throws IOException;
 
 
-    @Deprecated
-    protected Map<String, ScriptType> getAdditionalScriptParameters() {
-        return Collections.emptyMap();
-    }
-
     public S parse(XContentParser parser, ParseFieldMatcher parseFieldMatcher) throws IOException {
     public S parse(XContentParser parser, ParseFieldMatcher parseFieldMatcher) throws IOException {
 
 
         XContentParser.Token token = parser.currentToken();
         XContentParser.Token token = parser.currentToken();
@@ -68,24 +62,24 @@ public abstract class AbstractScriptParser<S extends Script> {
         while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
         while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
             if (token == XContentParser.Token.FIELD_NAME) {
             if (token == XContentParser.Token.FIELD_NAME) {
                 currentFieldName = parser.currentName();
                 currentFieldName = parser.currentName();
-            } else if (parseFieldMatcher.match(currentFieldName, ScriptType.INLINE.getParseField()) || parseFieldMatcher.match(currentFieldName, ScriptService.SCRIPT_INLINE)) {
+            } else if (parseFieldMatcher.match(currentFieldName, ScriptType.INLINE.getParseField())) {
                 type = ScriptType.INLINE;
                 type = ScriptType.INLINE;
                 script = parseInlineScript(parser);
                 script = parseInlineScript(parser);
-            } else if (parseFieldMatcher.match(currentFieldName, ScriptType.FILE.getParseField()) || parseFieldMatcher.match(currentFieldName, ScriptService.SCRIPT_FILE)) {
+            } else if (parseFieldMatcher.match(currentFieldName, ScriptType.FILE.getParseField())) {
                 type = ScriptType.FILE;
                 type = ScriptType.FILE;
                 if (token == XContentParser.Token.VALUE_STRING) {
                 if (token == XContentParser.Token.VALUE_STRING) {
                     script = parser.text();
                     script = parser.text();
                 } else {
                 } else {
                     throw new ScriptParseException("expected a string value for field [{}], but found [{}]", currentFieldName, token);
                     throw new ScriptParseException("expected a string value for field [{}], but found [{}]", currentFieldName, token);
                 }
                 }
-            } else if (parseFieldMatcher.match(currentFieldName, ScriptType.STORED.getParseField()) || parseFieldMatcher.match(currentFieldName, ScriptService.SCRIPT_ID)) {
+            } else if (parseFieldMatcher.match(currentFieldName, ScriptType.STORED.getParseField())) {
                 type = ScriptType.STORED;
                 type = ScriptType.STORED;
                 if (token == XContentParser.Token.VALUE_STRING) {
                 if (token == XContentParser.Token.VALUE_STRING) {
                     script = parser.text();
                     script = parser.text();
                 } else {
                 } else {
                     throw new ScriptParseException("expected a string value for field [{}], but found [{}]", currentFieldName, token);
                     throw new ScriptParseException("expected a string value for field [{}], but found [{}]", currentFieldName, token);
                 }
                 }
-            } else if (parseFieldMatcher.match(currentFieldName, ScriptField.LANG) || parseFieldMatcher.match(currentFieldName, ScriptService.SCRIPT_LANG)) {
+            } else if (parseFieldMatcher.match(currentFieldName, ScriptField.LANG)) {
                 if (token == XContentParser.Token.VALUE_STRING) {
                 if (token == XContentParser.Token.VALUE_STRING) {
                     lang = parser.text();
                     lang = parser.text();
                 } else {
                 } else {
@@ -98,14 +92,7 @@ public abstract class AbstractScriptParser<S extends Script> {
                     throw new ScriptParseException("expected an object for field [{}], but found [{}]", currentFieldName, token);
                     throw new ScriptParseException("expected an object for field [{}], but found [{}]", currentFieldName, token);
                 }
                 }
             } else {
             } else {
-                // TODO remove this in 3.0
-                ScriptType paramScriptType = getAdditionalScriptParameters().get(currentFieldName);
-                if (paramScriptType != null) {
-                    script = parseInlineScript(parser);
-                    type = paramScriptType;
-                } else {
-                    throw new ScriptParseException("unexpected field [{}]", currentFieldName);
-                }
+                throw new ScriptParseException("unexpected field [{}]", currentFieldName);
             }
             }
         }
         }
         if (script == null) {
         if (script == null) {
@@ -135,7 +122,7 @@ public abstract class AbstractScriptParser<S extends Script> {
             Entry<String, Object> entry = itr.next();
             Entry<String, Object> entry = itr.next();
             String parameterName = entry.getKey();
             String parameterName = entry.getKey();
             Object parameterValue = entry.getValue();
             Object parameterValue = entry.getValue();
-            if (parseFieldMatcher.match(parameterName, ScriptField.LANG) || parseFieldMatcher.match(parameterName, ScriptService.SCRIPT_LANG)) {
+            if (parseFieldMatcher.match(parameterName, ScriptField.LANG)) {
                 if (parameterValue instanceof String || parameterValue == null) {
                 if (parameterValue instanceof String || parameterValue == null) {
                     lang = (String) parameterValue;
                     lang = (String) parameterValue;
                     if (removeMatchedEntries) {
                     if (removeMatchedEntries) {
@@ -153,7 +140,7 @@ public abstract class AbstractScriptParser<S extends Script> {
                 } else {
                 } else {
                     throw new ScriptParseException("Value must be of type String: [" + parameterName + "]");
                     throw new ScriptParseException("Value must be of type String: [" + parameterName + "]");
                 }
                 }
-            } else if (parseFieldMatcher.match(parameterName, ScriptType.INLINE.getParseField()) || parseFieldMatcher.match(parameterName, ScriptService.SCRIPT_INLINE)) {
+            } else if (parseFieldMatcher.match(parameterName, ScriptType.INLINE.getParseField())) {
                 if (parameterValue instanceof String || parameterValue == null) {
                 if (parameterValue instanceof String || parameterValue == null) {
                     script = (String) parameterValue;
                     script = (String) parameterValue;
                     type = ScriptType.INLINE;
                     type = ScriptType.INLINE;
@@ -163,7 +150,7 @@ public abstract class AbstractScriptParser<S extends Script> {
                 } else {
                 } else {
                     throw new ScriptParseException("Value must be of type String: [" + parameterName + "]");
                     throw new ScriptParseException("Value must be of type String: [" + parameterName + "]");
                 }
                 }
-            } else if (parseFieldMatcher.match(parameterName, ScriptType.FILE.getParseField()) || parseFieldMatcher.match(parameterName, ScriptService.SCRIPT_FILE)) {
+            } else if (parseFieldMatcher.match(parameterName, ScriptType.FILE.getParseField())) {
                 if (parameterValue instanceof String || parameterValue == null) {
                 if (parameterValue instanceof String || parameterValue == null) {
                     script = (String) parameterValue;
                     script = (String) parameterValue;
                     type = ScriptType.FILE;
                     type = ScriptType.FILE;
@@ -173,7 +160,7 @@ public abstract class AbstractScriptParser<S extends Script> {
                 } else {
                 } else {
                     throw new ScriptParseException("Value must be of type String: [" + parameterName + "]");
                     throw new ScriptParseException("Value must be of type String: [" + parameterName + "]");
                 }
                 }
-            } else if (parseFieldMatcher.match(parameterName, ScriptType.STORED.getParseField()) || parseFieldMatcher.match(parameterName, ScriptService.SCRIPT_ID)) {
+            } else if (parseFieldMatcher.match(parameterName, ScriptType.STORED.getParseField())) {
                 if (parameterValue instanceof String || parameterValue == null) {
                 if (parameterValue instanceof String || parameterValue == null) {
                     script = (String) parameterValue;
                     script = (String) parameterValue;
                     type = ScriptType.STORED;
                     type = ScriptType.STORED;

+ 2 - 2
core/src/main/java/org/elasticsearch/script/Script.java

@@ -121,7 +121,7 @@ public class Script implements ToXContent, Writeable {
         }
         }
         doWriteTo(out);
         doWriteTo(out);
     }
     }
-    
+
     protected void doWriteTo(StreamOutput out) throws IOException {};
     protected void doWriteTo(StreamOutput out) throws IOException {};
 
 
     /**
     /**
@@ -253,7 +253,7 @@ public class Script implements ToXContent, Writeable {
         }
         }
 
 
         @Override
         @Override
-        protected String parseInlineScript(XContentParser parser) throws IOException {
+        public String parseInlineScript(XContentParser parser) throws IOException {
             return parser.text();
             return parser.text();
         }
         }
     }
     }

+ 3 - 5
core/src/main/java/org/elasticsearch/script/ScriptMetaData.java

@@ -23,13 +23,10 @@ import org.elasticsearch.cluster.AbstractDiffable;
 import org.elasticsearch.cluster.Diff;
 import org.elasticsearch.cluster.Diff;
 import org.elasticsearch.cluster.DiffableUtils;
 import org.elasticsearch.cluster.DiffableUtils;
 import org.elasticsearch.cluster.metadata.MetaData;
 import org.elasticsearch.cluster.metadata.MetaData;
-import org.elasticsearch.common.ParseFieldMatcher;
 import org.elasticsearch.common.ParsingException;
 import org.elasticsearch.common.ParsingException;
 import org.elasticsearch.common.bytes.BytesReference;
 import org.elasticsearch.common.bytes.BytesReference;
 import org.elasticsearch.common.io.stream.StreamInput;
 import org.elasticsearch.common.io.stream.StreamInput;
 import org.elasticsearch.common.io.stream.StreamOutput;
 import org.elasticsearch.common.io.stream.StreamOutput;
-import org.elasticsearch.common.io.stream.Writeable;
-import org.elasticsearch.common.xcontent.ToXContent;
 import org.elasticsearch.common.xcontent.XContentBuilder;
 import org.elasticsearch.common.xcontent.XContentBuilder;
 import org.elasticsearch.common.xcontent.XContentFactory;
 import org.elasticsearch.common.xcontent.XContentFactory;
 import org.elasticsearch.common.xcontent.XContentHelper;
 import org.elasticsearch.common.xcontent.XContentHelper;
@@ -42,8 +39,6 @@ import java.util.Collections;
 import java.util.EnumSet;
 import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
 
 
 public final class ScriptMetaData implements MetaData.Custom {
 public final class ScriptMetaData implements MetaData.Custom {
 
 
@@ -70,7 +65,10 @@ public final class ScriptMetaData implements MetaData.Custom {
         if (scriptAsBytes == null) {
         if (scriptAsBytes == null) {
             return null;
             return null;
         }
         }
+        return parseStoredScript(scriptAsBytes);
+    }
 
 
+    public static String parseStoredScript(BytesReference scriptAsBytes) {
         // Scripts can be stored via API in several ways:
         // Scripts can be stored via API in several ways:
         // 1) wrapped into a 'script' json object or field
         // 1) wrapped into a 'script' json object or field
         // 2) wrapped into a 'template' json object or field
         // 2) wrapped into a 'template' json object or field

+ 0 - 234
core/src/main/java/org/elasticsearch/script/ScriptParameterParser.java

@@ -1,234 +0,0 @@
-/*
- * Licensed to Elasticsearch under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.elasticsearch.script;
-
-import org.elasticsearch.common.ParseField;
-import org.elasticsearch.common.ParseFieldMatcher;
-import org.elasticsearch.common.xcontent.ToXContent.Params;
-import org.elasticsearch.common.xcontent.XContentParser;
-import org.elasticsearch.script.Script.ScriptParseException;
-import org.elasticsearch.script.ScriptService.ScriptType;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-public class ScriptParameterParser {
-
-    public static final String FILE_SUFFIX = "_file";
-    public static final String INDEXED_SUFFIX = "_id";
-
-    private Map<String, ScriptParameterValue> parameterValues = new HashMap<>();
-    private Set<ParseField> inlineParameters;
-    private Set<ParseField> fileParameters;
-    private Set<ParseField> indexedParameters;
-    private String lang = null;
-
-    public ScriptParameterParser() {
-        this(null);
-    }
-
-    public ScriptParameterParser(Set<String> parameterNames) {
-        if (parameterNames == null || parameterNames.isEmpty()) {
-            inlineParameters = Collections.singleton(ScriptService.SCRIPT_INLINE);
-            fileParameters = Collections.singleton(ScriptService.SCRIPT_FILE);
-            indexedParameters = Collections.singleton(ScriptService.SCRIPT_ID);
-        } else {
-            inlineParameters = new HashSet<>();
-            fileParameters = new HashSet<>();
-            indexedParameters = new HashSet<>();
-            for (String parameterName : parameterNames) {
-                if (ParseFieldMatcher.EMPTY.match(parameterName, ScriptService.SCRIPT_LANG)) {
-                    throw new IllegalArgumentException("lang is reserved and cannot be used as a parameter name");
-                }
-                inlineParameters.add(new ParseField(parameterName));
-                fileParameters.add(new ParseField(parameterName + FILE_SUFFIX));
-                indexedParameters.add(new ParseField(parameterName + INDEXED_SUFFIX));
-            }
-        }
-    }
-
-    public boolean token(String currentFieldName, XContentParser.Token token, XContentParser parser, ParseFieldMatcher parseFieldMatcher) throws IOException {
-        if (token == XContentParser.Token.VALUE_STRING) {
-            if (parseFieldMatcher.match(currentFieldName, ScriptService.SCRIPT_LANG)) {
-                lang  = parser.text();
-                return true;
-            } else {
-                for (ParseField parameter : inlineParameters) {
-                    if (parseFieldMatcher.match(currentFieldName, parameter)) {
-                        String coreParameterName = parameter.getPreferredName();
-                        putParameterValue(coreParameterName, parser.textOrNull(), ScriptType.INLINE);
-                        return true;
-                    }
-                }
-                for (ParseField parameter : fileParameters) {
-                    if (parseFieldMatcher.match(currentFieldName, parameter)) {
-                        String coreParameterName = parameter.getPreferredName().replace(FILE_SUFFIX, "");
-                        putParameterValue(coreParameterName, parser.textOrNull(), ScriptType.FILE);
-                        return true;
-                    }
-                }
-                for (ParseField parameter : indexedParameters) {
-                    if (parseFieldMatcher.match(currentFieldName, parameter)) {
-                        String coreParameterName = parameter.getPreferredName().replace(INDEXED_SUFFIX, "");
-                        putParameterValue(coreParameterName, parser.textOrNull(), ScriptType.STORED);
-                        return true;
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-    public void parseConfig(Map<String, Object> config, boolean removeMatchedEntries, ParseFieldMatcher parseFieldMatcher) {
-        for (Iterator<Map.Entry<String, Object>> itr = config.entrySet().iterator(); itr.hasNext();) {
-            Map.Entry<String, Object> entry = itr.next();
-            String parameterName = entry.getKey();
-            Object parameterValue = entry.getValue();
-            if (parseFieldMatcher.match(parameterName, ScriptService.SCRIPT_LANG)) {
-                if (parameterValue instanceof String || parameterValue == null) {
-                    lang = (String) parameterValue;
-                    if (removeMatchedEntries) {
-                        itr.remove();
-                    }
-                } else {
-                    throw new ScriptParseException("Value must be of type String: [" + parameterName + "]");
-                }
-            } else {
-                for (ParseField parameter : inlineParameters) {
-                    if (parseFieldMatcher.match(parameterName, parameter)) {
-                        String coreParameterName = parameter.getPreferredName();
-                        String stringValue;
-                        if (parameterValue instanceof String) {
-                            stringValue = (String) parameterValue;
-                        } else {
-                            throw new ScriptParseException("Value must be of type String: [" + parameterName + "]");
-                        }
-                        putParameterValue(coreParameterName, stringValue, ScriptType.INLINE);
-                        if (removeMatchedEntries) {
-                            itr.remove();
-                        }
-                    }
-                }
-                for (ParseField parameter : fileParameters) {
-                    if (parseFieldMatcher.match(parameterName, parameter)) {
-                        String coreParameterName = parameter.getPreferredName().replace(FILE_SUFFIX, "");;
-                        String stringValue;
-                        if (parameterValue instanceof String) {
-                            stringValue = (String) parameterValue;
-                        } else {
-                            throw new ScriptParseException("Value must be of type String: [" + parameterName + "]");
-                        }
-                        putParameterValue(coreParameterName, stringValue, ScriptType.FILE);
-                        if (removeMatchedEntries) {
-                            itr.remove();
-                        }
-                    }
-                }
-                for (ParseField parameter : indexedParameters) {
-                    if (parseFieldMatcher.match(parameterName, parameter)) {
-                        String coreParameterName = parameter.getPreferredName().replace(INDEXED_SUFFIX, "");
-                        String stringValue = null;
-                        if (parameterValue instanceof String) {
-                            stringValue = (String) parameterValue;
-                        } else {
-                            throw new ScriptParseException("Value must be of type String: [" + parameterName + "]");
-                        }
-                        putParameterValue(coreParameterName, stringValue, ScriptType.STORED);
-                        if (removeMatchedEntries) {
-                            itr.remove();
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    private void putParameterValue(String coreParameterName, String script, ScriptType scriptType) {
-        if (parameterValues.get(coreParameterName) == null) {
-            parameterValues.put(coreParameterName, new ScriptParameterValue(script, scriptType));
-        } else {
-            throw new ScriptParseException("Only one of [" + coreParameterName + ", " + coreParameterName
-                    + FILE_SUFFIX + ", " + coreParameterName + INDEXED_SUFFIX + "] is allowed.");
-        }
-    }
-
-    public void parseParams(Params params) {
-        lang = params.param(ScriptService.SCRIPT_LANG.getPreferredName());
-        for (ParseField parameter : inlineParameters) {
-            String value = params.param(parameter.getPreferredName());
-            if (value != null) {
-                String coreParameterName = parameter.getPreferredName();
-                putParameterValue(coreParameterName, value, ScriptType.INLINE);
-
-            }
-        }
-        for (ParseField parameter : fileParameters) {
-            String value = params.param(parameter.getPreferredName());
-            if (value != null) {
-                String coreParameterName = parameter.getPreferredName().replace(FILE_SUFFIX, "");
-                putParameterValue(coreParameterName, value, ScriptType.FILE);
-
-            }
-        }
-        for (ParseField parameter : indexedParameters) {
-            String value = params.param(parameter.getPreferredName());
-            if (value != null) {
-                String coreParameterName = parameter.getPreferredName().replace(INDEXED_SUFFIX, "");
-                putParameterValue(coreParameterName, value, ScriptType.STORED);
-
-            }
-        }
-    }
-
-    public ScriptParameterValue getDefaultScriptParameterValue() {
-        return getScriptParameterValue(ScriptService.SCRIPT_INLINE.getPreferredName());
-    }
-
-    public ScriptParameterValue getScriptParameterValue(String parameterName) {
-        return parameterValues.get(parameterName);
-    }
-
-    public String lang() {
-        return lang;
-    }
-
-    public static class ScriptParameterValue {
-        private String script;
-        private ScriptType scriptType;
-
-        public ScriptParameterValue(String script, ScriptType scriptType) {
-            this.script = script;
-            this.scriptType = scriptType;
-        }
-
-        public String script() {
-            return script;
-        }
-
-        public ScriptType scriptType() {
-            return scriptType;
-        }
-    }
-}

+ 26 - 59
core/src/main/java/org/elasticsearch/script/ScriptService.java

@@ -52,10 +52,7 @@ import org.elasticsearch.common.settings.Setting.Property;
 import org.elasticsearch.common.settings.Settings;
 import org.elasticsearch.common.settings.Settings;
 import org.elasticsearch.common.unit.TimeValue;
 import org.elasticsearch.common.unit.TimeValue;
 import org.elasticsearch.common.util.concurrent.ConcurrentCollections;
 import org.elasticsearch.common.util.concurrent.ConcurrentCollections;
-import org.elasticsearch.common.xcontent.XContentFactory;
-import org.elasticsearch.common.xcontent.XContentParser;
 import org.elasticsearch.env.Environment;
 import org.elasticsearch.env.Environment;
-import org.elasticsearch.index.query.TemplateQueryBuilder;
 import org.elasticsearch.search.lookup.SearchLookup;
 import org.elasticsearch.search.lookup.SearchLookup;
 import org.elasticsearch.watcher.FileChangesListener;
 import org.elasticsearch.watcher.FileChangesListener;
 import org.elasticsearch.watcher.FileWatcher;
 import org.elasticsearch.watcher.FileWatcher;
@@ -109,31 +106,6 @@ public class ScriptService extends AbstractComponent implements Closeable, Clust
 
 
     private ClusterState clusterState;
     private ClusterState clusterState;
 
 
-    /**
-     * @deprecated Use {@link org.elasticsearch.script.Script.ScriptField} instead. This should be removed in
-     *             2.0
-     */
-    @Deprecated
-    public static final ParseField SCRIPT_LANG = new ParseField("lang","script_lang");
-    /**
-     * @deprecated Use {@link ScriptType#getParseField()} instead. This should
-     *             be removed in 2.0
-     */
-    @Deprecated
-    public static final ParseField SCRIPT_FILE = new ParseField("script_file");
-    /**
-     * @deprecated Use {@link ScriptType#getParseField()} instead. This should
-     *             be removed in 2.0
-     */
-    @Deprecated
-    public static final ParseField SCRIPT_ID = new ParseField("script_id");
-    /**
-     * @deprecated Use {@link ScriptType#getParseField()} instead. This should
-     *             be removed in 2.0
-     */
-    @Deprecated
-    public static final ParseField SCRIPT_INLINE = new ParseField("script");
-
     public ScriptService(Settings settings, Environment env,
     public ScriptService(Settings settings, Environment env,
                          ResourceWatcherService resourceWatcherService, ScriptEngineRegistry scriptEngineRegistry,
                          ResourceWatcherService resourceWatcherService, ScriptEngineRegistry scriptEngineRegistry,
                          ScriptContextRegistry scriptContextRegistry, ScriptSettings scriptSettings) throws IOException {
                          ScriptContextRegistry scriptContextRegistry, ScriptSettings scriptSettings) throws IOException {
@@ -346,47 +318,42 @@ public class ScriptService extends AbstractComponent implements Closeable, Clust
         return script;
         return script;
     }
     }
 
 
-    void validate(String id, String scriptLang, BytesReference scriptBytes) {
+    void validateStoredScript(String id, String scriptLang, BytesReference scriptBytes) {
         validateScriptSize(id, scriptBytes.length());
         validateScriptSize(id, scriptBytes.length());
-        try (XContentParser parser = XContentFactory.xContent(scriptBytes).createParser(scriptBytes)) {
-            parser.nextToken();
-            Template template = TemplateQueryBuilder.parse(scriptLang, parser, parseFieldMatcher, "params", "script", "template");
-            if (Strings.hasLength(template.getScript())) {
-                //Just try and compile it
-                try {
-                    ScriptEngineService scriptEngineService = getScriptEngineServiceForLang(scriptLang);
-                    //we don't know yet what the script will be used for, but if all of the operations for this lang with
-                    //indexed scripts are disabled, it makes no sense to even compile it.
-                    if (isAnyScriptContextEnabled(scriptLang, ScriptType.STORED)) {
-                        Object compiled = scriptEngineService.compile(id, template.getScript(), Collections.emptyMap());
-                        if (compiled == null) {
-                            throw new IllegalArgumentException("Unable to parse [" + template.getScript() +
-                                    "] lang [" + scriptLang + "] (ScriptService.compile returned null)");
-                        }
-                    } else {
-                        logger.warn(
-                                "skipping compile of script [{}], lang [{}] as all scripted operations are disabled for indexed scripts",
-                                template.getScript(), scriptLang);
+        String script = ScriptMetaData.parseStoredScript(scriptBytes);
+        if (Strings.hasLength(scriptBytes)) {
+            //Just try and compile it
+            try {
+                ScriptEngineService scriptEngineService = getScriptEngineServiceForLang(scriptLang);
+                //we don't know yet what the script will be used for, but if all of the operations for this lang with
+                //indexed scripts are disabled, it makes no sense to even compile it.
+                if (isAnyScriptContextEnabled(scriptLang, ScriptType.STORED)) {
+                    Object compiled = scriptEngineService.compile(id, script, Collections.emptyMap());
+                    if (compiled == null) {
+                        throw new IllegalArgumentException("Unable to parse [" + script + "] lang [" + scriptLang +
+                                "] (ScriptService.compile returned null)");
                     }
                     }
-                } catch (ScriptException good) {
-                    // TODO: remove this when all script engines have good exceptions!
-                    throw good; // its already good!
-                } catch (Exception e) {
-                    throw new IllegalArgumentException("Unable to parse [" + template.getScript() +
-                            "] lang [" + scriptLang + "]", e);
+                } else {
+                    logger.warn(
+                            "skipping compile of script [{}], lang [{}] as all scripted operations are disabled for indexed scripts",
+                            script, scriptLang);
                 }
                 }
-            } else {
-                throw new IllegalArgumentException("Unable to find script in : " + scriptBytes.utf8ToString());
+            } catch (ScriptException good) {
+                // TODO: remove this when all script engines have good exceptions!
+                throw good; // its already good!
+            } catch (Exception e) {
+                throw new IllegalArgumentException("Unable to parse [" + script +
+                        "] lang [" + scriptLang + "]", e);
             }
             }
-        } catch (IOException e) {
-            throw new IllegalArgumentException("failed to parse template script", e);
+        } else {
+            throw new IllegalArgumentException("Unable to find script in : " + scriptBytes.utf8ToString());
         }
         }
     }
     }
 
 
     public void storeScript(ClusterService clusterService, PutStoredScriptRequest request, ActionListener<PutStoredScriptResponse> listener) {
     public void storeScript(ClusterService clusterService, PutStoredScriptRequest request, ActionListener<PutStoredScriptResponse> listener) {
         String scriptLang = validateScriptLanguage(request.scriptLang());
         String scriptLang = validateScriptLanguage(request.scriptLang());
         //verify that the script compiles
         //verify that the script compiles
-        validate(request.id(), scriptLang, request.script());
+        validateStoredScript(request.id(), scriptLang, request.script());
         clusterService.submitStateUpdateTask("put-script-" + request.id(), new AckedClusterStateUpdateTask<PutStoredScriptResponse>(request, listener) {
         clusterService.submitStateUpdateTask("put-script-" + request.id(), new AckedClusterStateUpdateTask<PutStoredScriptResponse>(request, listener) {
 
 
             @Override
             @Override

+ 4 - 22
core/src/main/java/org/elasticsearch/script/Template.java

@@ -31,7 +31,6 @@ import org.elasticsearch.common.xcontent.XContentType;
 import org.elasticsearch.script.ScriptService.ScriptType;
 import org.elasticsearch.script.ScriptService.ScriptType;
 
 
 import java.io.IOException;
 import java.io.IOException;
-import java.util.Collections;
 import java.util.Map;
 import java.util.Map;
 
 
 public class Template extends Script {
 public class Template extends Script {
@@ -112,21 +111,11 @@ public class Template extends Script {
     }
     }
 
 
     public static Script parse(Map<String, Object> config, boolean removeMatchedEntries, ParseFieldMatcher parseFieldMatcher) {
     public static Script parse(Map<String, Object> config, boolean removeMatchedEntries, ParseFieldMatcher parseFieldMatcher) {
-        return new TemplateParser(Collections.emptyMap(), DEFAULT_LANG).parse(config, removeMatchedEntries, parseFieldMatcher);
+        return new TemplateParser(DEFAULT_LANG).parse(config, removeMatchedEntries, parseFieldMatcher);
     }
     }
 
 
     public static Template parse(XContentParser parser, ParseFieldMatcher parseFieldMatcher) throws IOException {
     public static Template parse(XContentParser parser, ParseFieldMatcher parseFieldMatcher) throws IOException {
-        return new TemplateParser(Collections.emptyMap(), DEFAULT_LANG).parse(parser, parseFieldMatcher);
-    }
-
-    @Deprecated
-    public static Template parse(XContentParser parser, Map<String, ScriptType> additionalTemplateFieldNames, ParseFieldMatcher parseFieldMatcher) throws IOException {
-        return new TemplateParser(additionalTemplateFieldNames, DEFAULT_LANG).parse(parser, parseFieldMatcher);
-    }
-
-    @Deprecated
-    public static Template parse(XContentParser parser, Map<String, ScriptType> additionalTemplateFieldNames, String defaultLang, ParseFieldMatcher parseFieldMatcher) throws IOException {
-        return new TemplateParser(additionalTemplateFieldNames, defaultLang).parse(parser, parseFieldMatcher);
+        return new TemplateParser(DEFAULT_LANG).parse(parser, parseFieldMatcher);
     }
     }
 
 
     @Override
     @Override
@@ -150,11 +139,9 @@ public class Template extends Script {
     private static class TemplateParser extends AbstractScriptParser<Template> {
     private static class TemplateParser extends AbstractScriptParser<Template> {
 
 
         private XContentType contentType = null;
         private XContentType contentType = null;
-        private final Map<String, ScriptType> additionalTemplateFieldNames;
         private String defaultLang;
         private String defaultLang;
 
 
-        public TemplateParser(Map<String, ScriptType> additionalTemplateFieldNames, String defaultLang) {
-            this.additionalTemplateFieldNames = additionalTemplateFieldNames;
+        public TemplateParser(String defaultLang) {
             this.defaultLang = defaultLang;
             this.defaultLang = defaultLang;
         }
         }
 
 
@@ -169,7 +156,7 @@ public class Template extends Script {
         }
         }
 
 
         @Override
         @Override
-        protected String parseInlineScript(XContentParser parser) throws IOException {
+        public String parseInlineScript(XContentParser parser) throws IOException {
             if (parser.currentToken() == XContentParser.Token.START_OBJECT) {
             if (parser.currentToken() == XContentParser.Token.START_OBJECT) {
                 contentType = parser.contentType();
                 contentType = parser.contentType();
                 XContentBuilder builder = XContentFactory.contentBuilder(contentType);
                 XContentBuilder builder = XContentFactory.contentBuilder(contentType);
@@ -179,11 +166,6 @@ public class Template extends Script {
             }
             }
         }
         }
 
 
-        @Override
-        protected Map<String, ScriptType> getAdditionalScriptParameters() {
-            return additionalTemplateFieldNames;
-        }
-
         @Override
         @Override
         protected String getDefaultScriptLang() {
         protected String getDefaultScriptLang() {
             return defaultLang;
             return defaultLang;

+ 1 - 23
core/src/main/java/org/elasticsearch/search/aggregations/bucket/significant/heuristics/ScriptHeuristic.java

@@ -33,16 +33,12 @@ import org.elasticsearch.script.ExecutableScript;
 import org.elasticsearch.script.Script;
 import org.elasticsearch.script.Script;
 import org.elasticsearch.script.Script.ScriptField;
 import org.elasticsearch.script.Script.ScriptField;
 import org.elasticsearch.script.ScriptContext;
 import org.elasticsearch.script.ScriptContext;
-import org.elasticsearch.script.ScriptParameterParser;
-import org.elasticsearch.script.ScriptParameterParser.ScriptParameterValue;
 import org.elasticsearch.script.ScriptService;
 import org.elasticsearch.script.ScriptService;
 import org.elasticsearch.search.aggregations.InternalAggregation;
 import org.elasticsearch.search.aggregations.InternalAggregation;
 import org.elasticsearch.search.internal.SearchContext;
 import org.elasticsearch.search.internal.SearchContext;
 
 
 import java.io.IOException;
 import java.io.IOException;
 import java.util.Collections;
 import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
 import java.util.Objects;
 import java.util.Objects;
 
 
 public class ScriptHeuristic extends SignificanceHeuristic {
 public class ScriptHeuristic extends SignificanceHeuristic {
@@ -155,37 +151,19 @@ public class ScriptHeuristic extends SignificanceHeuristic {
         String heuristicName = parser.currentName();
         String heuristicName = parser.currentName();
         Script script = null;
         Script script = null;
         XContentParser.Token token;
         XContentParser.Token token;
-        Map<String, Object> params = null;
         String currentFieldName = null;
         String currentFieldName = null;
-        ScriptParameterParser scriptParameterParser = new ScriptParameterParser();
         while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
         while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
             if (token.equals(XContentParser.Token.FIELD_NAME)) {
             if (token.equals(XContentParser.Token.FIELD_NAME)) {
                 currentFieldName = parser.currentName();
                 currentFieldName = parser.currentName();
-            } else if (token == XContentParser.Token.START_OBJECT) {
+            } else {
                 if (parseFieldMatcher.match(currentFieldName, ScriptField.SCRIPT)) {
                 if (parseFieldMatcher.match(currentFieldName, ScriptField.SCRIPT)) {
                     script = Script.parse(parser, parseFieldMatcher);
                     script = Script.parse(parser, parseFieldMatcher);
-                } else if ("params".equals(currentFieldName)) { // TODO remove in 3.0 (here to support old script APIs)
-                    params = parser.map();
                 } else {
                 } else {
                     throw new ElasticsearchParseException("failed to parse [{}] significance heuristic. unknown object [{}]", heuristicName, currentFieldName);
                     throw new ElasticsearchParseException("failed to parse [{}] significance heuristic. unknown object [{}]", heuristicName, currentFieldName);
                 }
                 }
-            } else if (!scriptParameterParser.token(currentFieldName, token, parser, parseFieldMatcher)) {
-                throw new ElasticsearchParseException("failed to parse [{}] significance heuristic. unknown field [{}]", heuristicName, currentFieldName);
             }
             }
         }
         }
 
 
-        if (script == null) { // Didn't find anything using the new API so try using the old one instead
-            ScriptParameterValue scriptValue = scriptParameterParser.getDefaultScriptParameterValue();
-            if (scriptValue != null) {
-                if (params == null) {
-                    params = new HashMap<>();
-                }
-                script = new Script(scriptValue.script(), scriptValue.scriptType(), scriptParameterParser.lang(), params);
-            }
-        } else if (params != null) {
-            throw new ElasticsearchParseException("failed to parse [{}] significance heuristic. script params must be specified inside script object", heuristicName);
-        }
-
         if (script == null) {
         if (script == null) {
             throw new ElasticsearchParseException("failed to parse [{}] significance heuristic. no script found in script_heuristic", heuristicName);
             throw new ElasticsearchParseException("failed to parse [{}] significance heuristic. no script found in script_heuristic", heuristicName);
         }
         }

+ 4 - 55
core/src/main/java/org/elasticsearch/search/aggregations/metrics/scripted/ScriptedMetricAggregationBuilder.java

@@ -27,12 +27,10 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
 import org.elasticsearch.common.xcontent.XContentParser;
 import org.elasticsearch.common.xcontent.XContentParser;
 import org.elasticsearch.index.query.QueryParseContext;
 import org.elasticsearch.index.query.QueryParseContext;
 import org.elasticsearch.script.Script;
 import org.elasticsearch.script.Script;
-import org.elasticsearch.script.ScriptParameterParser;
-import org.elasticsearch.script.ScriptParameterParser.ScriptParameterValue;
 import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
 import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
 import org.elasticsearch.search.aggregations.AggregatorFactories.Builder;
 import org.elasticsearch.search.aggregations.AggregatorFactories.Builder;
-import org.elasticsearch.search.aggregations.InternalAggregation.Type;
 import org.elasticsearch.search.aggregations.AggregatorFactory;
 import org.elasticsearch.search.aggregations.AggregatorFactory;
+import org.elasticsearch.search.aggregations.InternalAggregation.Type;
 import org.elasticsearch.search.aggregations.support.AggregationContext;
 import org.elasticsearch.search.aggregations.support.AggregationContext;
 
 
 import java.io.IOException;
 import java.io.IOException;
@@ -52,7 +50,6 @@ public class ScriptedMetricAggregationBuilder extends AbstractAggregationBuilder
     private static final ParseField COMBINE_SCRIPT_FIELD = new ParseField("combine_script");
     private static final ParseField COMBINE_SCRIPT_FIELD = new ParseField("combine_script");
     private static final ParseField REDUCE_SCRIPT_FIELD = new ParseField("reduce_script");
     private static final ParseField REDUCE_SCRIPT_FIELD = new ParseField("reduce_script");
     private static final ParseField PARAMS_FIELD = new ParseField("params");
     private static final ParseField PARAMS_FIELD = new ParseField("params");
-    private static final ParseField REDUCE_PARAMS_FIELD = new ParseField("reduce_params");
 
 
     private Script initScript;
     private Script initScript;
     private Script mapScript;
     private Script mapScript;
@@ -222,7 +219,6 @@ public class ScriptedMetricAggregationBuilder extends AbstractAggregationBuilder
         Script combineScript = null;
         Script combineScript = null;
         Script reduceScript = null;
         Script reduceScript = null;
         Map<String, Object> params = null;
         Map<String, Object> params = null;
-        Map<String, Object> reduceParams = null;
         XContentParser.Token token;
         XContentParser.Token token;
         String currentFieldName = null;
         String currentFieldName = null;
         Set<String> scriptParameters = new HashSet<>();
         Set<String> scriptParameters = new HashSet<>();
@@ -230,13 +226,12 @@ public class ScriptedMetricAggregationBuilder extends AbstractAggregationBuilder
         scriptParameters.add(MAP_SCRIPT_FIELD.getPreferredName());
         scriptParameters.add(MAP_SCRIPT_FIELD.getPreferredName());
         scriptParameters.add(COMBINE_SCRIPT_FIELD.getPreferredName());
         scriptParameters.add(COMBINE_SCRIPT_FIELD.getPreferredName());
         scriptParameters.add(REDUCE_SCRIPT_FIELD.getPreferredName());
         scriptParameters.add(REDUCE_SCRIPT_FIELD.getPreferredName());
-        ScriptParameterParser scriptParameterParser = new ScriptParameterParser(scriptParameters);
 
 
         XContentParser parser = context.parser();
         XContentParser parser = context.parser();
         while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
         while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
             if (token == XContentParser.Token.FIELD_NAME) {
             if (token == XContentParser.Token.FIELD_NAME) {
                 currentFieldName = parser.currentName();
                 currentFieldName = parser.currentName();
-            } else if (token == XContentParser.Token.START_OBJECT) {
+            } else if (token == XContentParser.Token.START_OBJECT || token == XContentParser.Token.VALUE_STRING) {
                 if (context.getParseFieldMatcher().match(currentFieldName, INIT_SCRIPT_FIELD)) {
                 if (context.getParseFieldMatcher().match(currentFieldName, INIT_SCRIPT_FIELD)) {
                     initScript = Script.parse(parser, context.getParseFieldMatcher());
                     initScript = Script.parse(parser, context.getParseFieldMatcher());
                 } else if (context.getParseFieldMatcher().match(currentFieldName, MAP_SCRIPT_FIELD)) {
                 } else if (context.getParseFieldMatcher().match(currentFieldName, MAP_SCRIPT_FIELD)) {
@@ -245,64 +240,18 @@ public class ScriptedMetricAggregationBuilder extends AbstractAggregationBuilder
                     combineScript = Script.parse(parser, context.getParseFieldMatcher());
                     combineScript = Script.parse(parser, context.getParseFieldMatcher());
                 } else if (context.getParseFieldMatcher().match(currentFieldName, REDUCE_SCRIPT_FIELD)) {
                 } else if (context.getParseFieldMatcher().match(currentFieldName, REDUCE_SCRIPT_FIELD)) {
                     reduceScript = Script.parse(parser, context.getParseFieldMatcher());
                     reduceScript = Script.parse(parser, context.getParseFieldMatcher());
-                } else if (context.getParseFieldMatcher().match(currentFieldName, PARAMS_FIELD)) {
+                } else if (token == XContentParser.Token.START_OBJECT &&
+                        context.getParseFieldMatcher().match(currentFieldName, PARAMS_FIELD)) {
                     params = parser.map();
                     params = parser.map();
-                } else if (context.getParseFieldMatcher().match(currentFieldName, REDUCE_PARAMS_FIELD)) {
-                  reduceParams = parser.map();
                 } else {
                 } else {
                     throw new ParsingException(parser.getTokenLocation(),
                     throw new ParsingException(parser.getTokenLocation(),
                             "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
                             "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
                 }
                 }
-            } else if (token.isValue()) {
-                if (!scriptParameterParser.token(currentFieldName, token, parser, context.getParseFieldMatcher())) {
-                    throw new ParsingException(parser.getTokenLocation(),
-                            "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
-                }
             } else {
             } else {
                 throw new ParsingException(parser.getTokenLocation(), "Unexpected token " + token + " in [" + aggregationName + "].");
                 throw new ParsingException(parser.getTokenLocation(), "Unexpected token " + token + " in [" + aggregationName + "].");
             }
             }
         }
         }
 
 
-        if (initScript == null) { // Didn't find anything using the new API so try using the old one instead
-            ScriptParameterValue scriptValue = scriptParameterParser.getScriptParameterValue(INIT_SCRIPT_FIELD.getPreferredName());
-            if (scriptValue != null) {
-                initScript = new Script(scriptValue.script(), scriptValue.scriptType(), scriptParameterParser.lang(), params);
-            }
-        } else if (initScript.getParams() != null) {
-            throw new ParsingException(parser.getTokenLocation(), "init_script params are not supported. Parameters for the "
-                    + "init_script must be specified in the params field on the scripted_metric aggregator not inside the init_script "
-                    + "object");
-        }
-
-        if (mapScript == null) { // Didn't find anything using the new API so try using the old one instead
-            ScriptParameterValue scriptValue = scriptParameterParser.getScriptParameterValue(MAP_SCRIPT_FIELD.getPreferredName());
-            if (scriptValue != null) {
-                mapScript = new Script(scriptValue.script(), scriptValue.scriptType(), scriptParameterParser.lang(), params);
-            }
-        } else if (mapScript.getParams() != null) {
-            throw new ParsingException(parser.getTokenLocation(), "map_script params are not supported. Parameters for the map_script "
-                    + "must be specified in the params field on the scripted_metric aggregator not inside the map_script object");
-        }
-
-        if (combineScript == null) { // Didn't find anything using the new API so try using the old one instead
-            ScriptParameterValue scriptValue = scriptParameterParser.getScriptParameterValue(COMBINE_SCRIPT_FIELD.getPreferredName());
-            if (scriptValue != null) {
-                combineScript = new Script(scriptValue.script(), scriptValue.scriptType(), scriptParameterParser.lang(), params);
-            }
-        } else if (combineScript.getParams() != null) {
-            throw new ParsingException(parser.getTokenLocation(),
-                    "combine_script params are not supported. Parameters for the "
-                            + "combine_script must be specified in the params field on the scripted_metric aggregator not inside the "
-                            + "combine_script object");
-        }
-
-        if (reduceScript == null) { // Didn't find anything using the new API so try using the old one instead
-            ScriptParameterValue scriptValue = scriptParameterParser.getScriptParameterValue(REDUCE_SCRIPT_FIELD.getPreferredName());
-            if (scriptValue != null) {
-                reduceScript = new Script(scriptValue.script(), scriptValue.scriptType(), scriptParameterParser.lang(), reduceParams);
-            }
-        }
-
         if (mapScript == null) {
         if (mapScript == null) {
             throw new ParsingException(parser.getTokenLocation(), "map_script field is required in [" + aggregationName + "].");
             throw new ParsingException(parser.getTokenLocation(), "map_script field is required in [" + aggregationName + "].");
         }
         }

+ 2 - 19
core/src/main/java/org/elasticsearch/search/sort/ScriptSortBuilder.java

@@ -49,8 +49,6 @@ import org.elasticsearch.script.LeafSearchScript;
 import org.elasticsearch.script.Script;
 import org.elasticsearch.script.Script;
 import org.elasticsearch.script.Script.ScriptField;
 import org.elasticsearch.script.Script.ScriptField;
 import org.elasticsearch.script.ScriptContext;
 import org.elasticsearch.script.ScriptContext;
-import org.elasticsearch.script.ScriptParameterParser;
-import org.elasticsearch.script.ScriptParameterParser.ScriptParameterValue;
 import org.elasticsearch.script.SearchScript;
 import org.elasticsearch.script.SearchScript;
 import org.elasticsearch.search.DocValueFormat;
 import org.elasticsearch.search.DocValueFormat;
 import org.elasticsearch.search.MultiValueMode;
 import org.elasticsearch.search.MultiValueMode;
@@ -74,7 +72,6 @@ public class ScriptSortBuilder extends SortBuilder<ScriptSortBuilder> {
     public static final ParseField SORTMODE_FIELD = new ParseField("mode");
     public static final ParseField SORTMODE_FIELD = new ParseField("mode");
     public static final ParseField NESTED_PATH_FIELD = new ParseField("nested_path");
     public static final ParseField NESTED_PATH_FIELD = new ParseField("nested_path");
     public static final ParseField NESTED_FILTER_FIELD = new ParseField("nested_filter");
     public static final ParseField NESTED_FILTER_FIELD = new ParseField("nested_filter");
-    public static final ParseField PARAMS_FIELD = new ParseField("params");
 
 
     private final Script script;
     private final Script script;
 
 
@@ -231,7 +228,6 @@ public class ScriptSortBuilder extends SortBuilder<ScriptSortBuilder> {
      *        in '{ "foo": { "order" : "asc"} }'. When parsing the inner object, the field name can be passed in via this argument
      *        in '{ "foo": { "order" : "asc"} }'. When parsing the inner object, the field name can be passed in via this argument
      */
      */
     public static ScriptSortBuilder fromXContent(QueryParseContext context, String elementName) throws IOException {
     public static ScriptSortBuilder fromXContent(QueryParseContext context, String elementName) throws IOException {
-        ScriptParameterParser scriptParameterParser = new ScriptParameterParser();
         XContentParser parser = context.parser();
         XContentParser parser = context.parser();
         ParseFieldMatcher parseField = context.getParseFieldMatcher();
         ParseFieldMatcher parseField = context.getParseFieldMatcher();
         Script script = null;
         Script script = null;
@@ -240,7 +236,6 @@ public class ScriptSortBuilder extends SortBuilder<ScriptSortBuilder> {
         SortOrder order = null;
         SortOrder order = null;
         Optional<QueryBuilder> nestedFilter = Optional.empty();
         Optional<QueryBuilder> nestedFilter = Optional.empty();
         String nestedPath = null;
         String nestedPath = null;
-        Map<String, Object> params = new HashMap<>();
 
 
         XContentParser.Token token;
         XContentParser.Token token;
         String currentName = parser.currentName();
         String currentName = parser.currentName();
@@ -250,8 +245,6 @@ public class ScriptSortBuilder extends SortBuilder<ScriptSortBuilder> {
             } else if (token == XContentParser.Token.START_OBJECT) {
             } else if (token == XContentParser.Token.START_OBJECT) {
                 if (parseField.match(currentName, ScriptField.SCRIPT)) {
                 if (parseField.match(currentName, ScriptField.SCRIPT)) {
                     script = Script.parse(parser, parseField);
                     script = Script.parse(parser, parseField);
-                } else if (parseField.match(currentName, PARAMS_FIELD)) {
-                    params = parser.map();
                 } else if (parseField.match(currentName, NESTED_FILTER_FIELD)) {
                 } else if (parseField.match(currentName, NESTED_FILTER_FIELD)) {
                     nestedFilter = context.parseInnerQueryBuilder();
                     nestedFilter = context.parseInnerQueryBuilder();
                 } else {
                 } else {
@@ -260,14 +253,14 @@ public class ScriptSortBuilder extends SortBuilder<ScriptSortBuilder> {
             } else if (token.isValue()) {
             } else if (token.isValue()) {
                 if (parseField.match(currentName, ORDER_FIELD)) {
                 if (parseField.match(currentName, ORDER_FIELD)) {
                     order = SortOrder.fromString(parser.text());
                     order = SortOrder.fromString(parser.text());
-                } else if (scriptParameterParser.token(currentName, token, parser, parseField)) {
-                    // Do Nothing (handled by ScriptParameterParser
                 } else if (parseField.match(currentName, TYPE_FIELD)) {
                 } else if (parseField.match(currentName, TYPE_FIELD)) {
                     type = ScriptSortType.fromString(parser.text());
                     type = ScriptSortType.fromString(parser.text());
                 } else if (parseField.match(currentName, SORTMODE_FIELD)) {
                 } else if (parseField.match(currentName, SORTMODE_FIELD)) {
                     sortMode = SortMode.fromString(parser.text());
                     sortMode = SortMode.fromString(parser.text());
                 } else if (parseField.match(currentName, NESTED_PATH_FIELD)) {
                 } else if (parseField.match(currentName, NESTED_PATH_FIELD)) {
                     nestedPath = parser.text();
                     nestedPath = parser.text();
+                } else if (parseField.match(currentName, ScriptField.SCRIPT)) {
+                    script = Script.parse(parser, parseField);
                 } else {
                 } else {
                     throw new ParsingException(parser.getTokenLocation(), "[" + NAME + "] failed to parse field [" + currentName + "]");
                     throw new ParsingException(parser.getTokenLocation(), "[" + NAME + "] failed to parse field [" + currentName + "]");
                 }
                 }
@@ -276,16 +269,6 @@ public class ScriptSortBuilder extends SortBuilder<ScriptSortBuilder> {
             }
             }
         }
         }
 
 
-        if (script == null) { // Didn't find anything using the new API so try using the old one instead
-            ScriptParameterValue scriptValue = scriptParameterParser.getDefaultScriptParameterValue();
-            if (scriptValue != null) {
-                if (params == null) {
-                    params = new HashMap<>();
-                }
-                script = new Script(scriptValue.script(), scriptValue.scriptType(), scriptParameterParser.lang(), params);
-            }
-        }
-
         ScriptSortBuilder result = new ScriptSortBuilder(script, type);
         ScriptSortBuilder result = new ScriptSortBuilder(script, type);
         if (order != null) {
         if (order != null) {
             result.order(order);
             result.order(order);

+ 12 - 0
core/src/test/java/org/elasticsearch/action/update/UpdateRequestTests.java

@@ -59,6 +59,18 @@ public class UpdateRequestTests extends ESTestCase {
         Map<String, Object> params = script.getParams();
         Map<String, Object> params = script.getParams();
         assertThat(params, nullValue());
         assertThat(params, nullValue());
 
 
+        // simple verbose script
+        request.source(XContentFactory.jsonBuilder().startObject()
+                .startObject("script").field("inline", "script1").endObject()
+                .endObject());
+        script = request.script();
+        assertThat(script, notNullValue());
+        assertThat(script.getScript(), equalTo("script1"));
+        assertThat(script.getType(), equalTo(ScriptType.INLINE));
+        assertThat(script.getLang(), nullValue());
+        params = script.getParams();
+        assertThat(params, nullValue());
+
         // script with params
         // script with params
         request = new UpdateRequest("test", "type", "1");
         request = new UpdateRequest("test", "type", "1");
         request.source(XContentFactory.jsonBuilder().startObject().startObject("script").field("inline", "script1").startObject("params")
         request.source(XContentFactory.jsonBuilder().startObject().startObject("script").field("inline", "script1").startObject("params")

+ 15 - 1
core/src/test/java/org/elasticsearch/index/query/ScriptQueryBuilderTests.java

@@ -48,7 +48,7 @@ public class ScriptQueryBuilderTests extends AbstractQueryTestCase<ScriptQueryBu
         expectThrows(IllegalArgumentException.class, () -> new ScriptQueryBuilder((Script) null));
         expectThrows(IllegalArgumentException.class, () -> new ScriptQueryBuilder((Script) null));
     }
     }
 
 
-    public void testFromJson() throws IOException {
+    public void testFromJsonVerbose() throws IOException {
         String json =
         String json =
                 "{\n" +
                 "{\n" +
                 "  \"script\" : {\n" +
                 "  \"script\" : {\n" +
@@ -67,4 +67,18 @@ public class ScriptQueryBuilderTests extends AbstractQueryTestCase<ScriptQueryBu
 
 
         assertEquals(json, "mockscript", parsed.script().getLang());
         assertEquals(json, "mockscript", parsed.script().getLang());
     }
     }
+
+    public void testFromJson() throws IOException {
+        String json =
+                "{\n" +
+                        "  \"script\" : {\n" +
+                        "    \"script\" : \"5\"," +
+                        "    \"boost\" : 1.0,\n" +
+                        "    \"_name\" : \"PcKdEyPOmR\"\n" +
+                        "  }\n" +
+                        "}";
+
+        ScriptQueryBuilder parsed = (ScriptQueryBuilder) parseQuery(json);
+        assertEquals(json, "5", parsed.script().getScript());
+    }
 }
 }

+ 2 - 2
core/src/test/java/org/elasticsearch/index/query/TemplateQueryBuilderTests.java

@@ -100,7 +100,7 @@ public class TemplateQueryBuilderTests extends AbstractQueryTestCase<TemplateQue
 
 
     public void testRawEscapedTemplate() throws IOException {
     public void testRawEscapedTemplate() throws IOException {
         String expectedTemplateString = "{\"match_{{template}}\": {}}\"";
         String expectedTemplateString = "{\"match_{{template}}\": {}}\"";
-        String query = "{\"template\": {\"query\": \"{\\\"match_{{template}}\\\": {}}\\\"\",\"params\" : {\"template\" : \"all\"}}}";
+        String query = "{\"template\": {\"inline\": \"{\\\"match_{{template}}\\\": {}}\\\"\",\"params\" : {\"template\" : \"all\"}}}";
         Map<String, Object> params = new HashMap<>();
         Map<String, Object> params = new HashMap<>();
         params.put("template", "all");
         params.put("template", "all");
         QueryBuilder expectedBuilder = new TemplateQueryBuilder(new Template(expectedTemplateString, ScriptType.INLINE, null, null,
         QueryBuilder expectedBuilder = new TemplateQueryBuilder(new Template(expectedTemplateString, ScriptType.INLINE, null, null,
@@ -110,7 +110,7 @@ public class TemplateQueryBuilderTests extends AbstractQueryTestCase<TemplateQue
 
 
     public void testRawTemplate() throws IOException {
     public void testRawTemplate() throws IOException {
         String expectedTemplateString = "{\"match_{{template}}\":{}}";
         String expectedTemplateString = "{\"match_{{template}}\":{}}";
-        String query = "{\"template\": {\"query\": {\"match_{{template}}\": {}},\"params\" : {\"template\" : \"all\"}}}";
+        String query = "{\"template\": {\"inline\": {\"match_{{template}}\": {}},\"params\" : {\"template\" : \"all\"}}}";
         Map<String, Object> params = new HashMap<>();
         Map<String, Object> params = new HashMap<>();
         params.put("template", "all");
         params.put("template", "all");
         QueryBuilder expectedBuilder = new TemplateQueryBuilder(new Template(expectedTemplateString, ScriptType.INLINE, null,
         QueryBuilder expectedBuilder = new TemplateQueryBuilder(new Template(expectedTemplateString, ScriptType.INLINE, null,

+ 0 - 1280
core/src/test/java/org/elasticsearch/script/ScriptParameterParserTests.java

@@ -1,1280 +0,0 @@
-/*
- * Licensed to Elasticsearch under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.elasticsearch.script;
-
-
-import org.elasticsearch.common.ParseFieldMatcher;
-import org.elasticsearch.common.bytes.BytesArray;
-import org.elasticsearch.common.xcontent.ToXContent.MapParams;
-import org.elasticsearch.common.xcontent.XContentHelper;
-import org.elasticsearch.common.xcontent.XContentParser;
-import org.elasticsearch.common.xcontent.XContentParser.Token;
-import org.elasticsearch.script.Script.ScriptParseException;
-import org.elasticsearch.script.ScriptParameterParser.ScriptParameterValue;
-import org.elasticsearch.script.ScriptService.ScriptType;
-import org.elasticsearch.test.ESTestCase;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Set;
-
-import static java.util.Collections.singleton;
-import static org.hamcrest.Matchers.containsString;
-import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.nullValue;
-
-public class ScriptParameterParserTests extends ESTestCase {
-    public void testTokenDefaultInline() throws IOException {
-        XContentParser parser = XContentHelper.createParser(new BytesArray("{ \"script\" : \"scriptValue\" }"));
-        Token token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        ScriptParameterParser paramParser = new ScriptParameterParser();
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(true));
-        assertDefaultParameterValue(paramParser, "scriptValue", ScriptType.INLINE);
-        assertThat(paramParser.lang(), nullValue());
-        paramParser = new ScriptParameterParser(null);
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(true));
-        assertDefaultParameterValue(paramParser, "scriptValue", ScriptType.INLINE);
-        assertThat(paramParser.lang(), nullValue());
-        paramParser = new ScriptParameterParser(new HashSet<String>());
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(true));
-        assertDefaultParameterValue(paramParser, "scriptValue", ScriptType.INLINE);
-        assertThat(paramParser.lang(), nullValue());
-    }
-
-    public void testTokenDefaultFile() throws IOException {
-        XContentParser parser = XContentHelper.createParser(new BytesArray("{ \"script_file\" : \"scriptValue\" }"));
-        Token token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        ScriptParameterParser paramParser = new ScriptParameterParser();
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(true));
-        assertDefaultParameterValue(paramParser, "scriptValue", ScriptType.FILE);
-        assertThat(paramParser.lang(), nullValue());
-    }
-
-    public void testTokenDefaultIndexed() throws IOException {
-        XContentParser parser = XContentHelper.createParser(new BytesArray("{ \"script_id\" : \"scriptValue\" }"));
-        Token token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        ScriptParameterParser paramParser = new ScriptParameterParser();
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(true));
-        assertDefaultParameterValue(paramParser, "scriptValue", ScriptType.STORED);
-        assertThat(paramParser.lang(), nullValue());
-    }
-
-    public void testTokenDefaultNotFound() throws IOException {
-        XContentParser parser = XContentHelper.createParser(new BytesArray("{ \"foo\" : \"bar\" }"));
-        Token token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        ScriptParameterParser paramParser = new ScriptParameterParser();
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(false));
-        assertThat(paramParser.getDefaultScriptParameterValue(), nullValue());
-        assertThat(paramParser.getScriptParameterValue("script"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-    }
-
-    public void testTokenSingleParameter() throws IOException {
-        XContentParser parser = XContentHelper.createParser(new BytesArray("{ \"foo\" : \"scriptValue\" }"));
-        Token token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(true));
-        assertParameterValue(paramParser, "foo", "scriptValue", ScriptType.INLINE);
-        assertThat(paramParser.lang(), nullValue());
-    }
-
-    public void testTokenSingleParameterFile() throws IOException {
-        XContentParser parser = XContentHelper.createParser(new BytesArray("{ \"foo_file\" : \"scriptValue\" }"));
-        Token token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(true));
-        assertParameterValue(paramParser, "foo", "scriptValue", ScriptType.FILE);
-        assertThat(paramParser.lang(), nullValue());
-    }
-
-    public void testTokenSingleParameterIndexed() throws IOException {
-        XContentParser parser = XContentHelper.createParser(new BytesArray("{ \"foo_id\" : \"scriptValue\" }"));
-        Token token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(true));
-        assertParameterValue(paramParser, "foo", "scriptValue", ScriptType.STORED);
-        assertThat(paramParser.lang(), nullValue());
-    }
-
-    public void testTokenSingleParameterDelcaredTwiceInlineFile() throws IOException {
-        XContentParser parser = XContentHelper.createParser(new BytesArray("{ \"foo\" : \"scriptValue\", \"foo_file\" : \"scriptValue\" }"));
-        Token token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(true));
-        assertParameterValue(paramParser, "foo", "scriptValue", ScriptType.INLINE);
-        assertThat(paramParser.lang(), nullValue());
-        token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        try {
-            paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT);
-            fail("Expected ScriptParseException");
-        } catch (ScriptParseException e) {
-            assertThat(e.getMessage(), is("Only one of [foo, foo_file, foo_id] is allowed."));
-        }
-    }
-
-    public void testTokenSingleParameterDelcaredTwiceInlineIndexed() throws IOException {
-        XContentParser parser = XContentHelper.createParser(new BytesArray("{ \"foo\" : \"scriptValue\", \"foo_id\" : \"scriptValue\" }"));
-        Token token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(true));
-        assertParameterValue(paramParser, "foo", "scriptValue", ScriptType.INLINE);
-        assertThat(paramParser.lang(), nullValue());
-        token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        try {
-            paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT);
-            fail("Expected ScriptParseException");
-        } catch (ScriptParseException e) {
-            assertThat(e.getMessage(), is("Only one of [foo, foo_file, foo_id] is allowed."));
-        }
-    }
-
-    public void testTokenSingleParameterDelcaredTwiceFileInline() throws IOException {
-        XContentParser parser = XContentHelper.createParser(new BytesArray("{ \"foo_file\" : \"scriptValue\", \"foo\" : \"scriptValue\" }"));
-        Token token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(true));
-        assertParameterValue(paramParser, "foo", "scriptValue", ScriptType.FILE);
-        assertThat(paramParser.lang(), nullValue());
-        token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        try {
-            paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT);
-            fail("Expected ScriptParseException");
-        } catch (ScriptParseException e) {
-            assertThat(e.getMessage(), is("Only one of [foo, foo_file, foo_id] is allowed."));
-        }
-    }
-
-    public void testTokenSingleParameterDelcaredTwiceFileIndexed() throws IOException {
-        XContentParser parser = XContentHelper.createParser(new BytesArray("{ \"foo_file\" : \"scriptValue\", \"foo_id\" : \"scriptValue\" }"));
-        Token token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(true));
-        assertParameterValue(paramParser, "foo", "scriptValue", ScriptType.FILE);
-        assertThat(paramParser.lang(), nullValue());
-        token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        try {
-            paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT);
-            fail("Expected ScriptParseException");
-        } catch (ScriptParseException e) {
-            assertThat(e.getMessage(), is("Only one of [foo, foo_file, foo_id] is allowed."));
-        }
-    }
-
-    public void testTokenSingleParameterDelcaredTwiceIndexedInline() throws IOException {
-        XContentParser parser = XContentHelper.createParser(new BytesArray("{ \"foo_id\" : \"scriptValue\", \"foo\" : \"scriptValue\" }"));
-        Token token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(true));
-        assertParameterValue(paramParser, "foo", "scriptValue", ScriptType.STORED);
-        assertThat(paramParser.lang(), nullValue());
-        token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        try {
-            paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT);
-            fail("Expected ScriptParseException");
-        } catch (ScriptParseException e) {
-            assertThat(e.getMessage(), is("Only one of [foo, foo_file, foo_id] is allowed."));
-        }
-    }
-
-    public void testTokenSingleParameterDelcaredTwiceIndexedFile() throws IOException {
-        XContentParser parser = XContentHelper.createParser(new BytesArray("{ \"foo_id\" : \"scriptValue\", \"foo_file\" : \"scriptValue\" }"));
-        Token token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(true));
-        assertParameterValue(paramParser, "foo", "scriptValue", ScriptType.STORED);
-        assertThat(paramParser.lang(), nullValue());
-        token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        try {
-            paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT);
-            fail("Expected ScriptParseException");
-        } catch (ScriptParseException e) {
-            assertThat(e.getMessage(), is("Only one of [foo, foo_file, foo_id] is allowed."));
-        }
-    }
-
-    public void testTokenMultipleParameters() throws IOException {
-        XContentParser parser = XContentHelper.createParser(new BytesArray("{ \"foo\" : \"fooScriptValue\", \"bar_file\" : \"barScriptValue\", \"baz_id\" : \"bazScriptValue\" }"));
-        Set<String> parameters = new HashSet<>();
-        parameters.add("foo");
-        parameters.add("bar");
-        parameters.add("baz");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        Token token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(true));
-        assertParameterValue(paramParser, "foo", "fooScriptValue", ScriptType.INLINE);
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(true));
-        assertParameterValue(paramParser, "foo", "fooScriptValue", ScriptType.INLINE);
-        assertParameterValue(paramParser, "bar", "barScriptValue", ScriptType.FILE);
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(true));
-        assertParameterValue(paramParser, "foo", "fooScriptValue", ScriptType.INLINE);
-        assertParameterValue(paramParser, "bar", "barScriptValue", ScriptType.FILE);
-        assertParameterValue(paramParser, "baz", "bazScriptValue", ScriptType.STORED);
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-    }
-
-    public void testTokenMultipleParametersWithLang() throws IOException {
-        XContentParser parser = XContentHelper.createParser(new BytesArray("{ \"foo\" : \"fooScriptValue\", \"bar_file\" : \"barScriptValue\", \"lang\" : \"myLang\", \"baz_id\" : \"bazScriptValue\" }"));
-        Set<String> parameters = new HashSet<>();
-        parameters.add("foo");
-        parameters.add("bar");
-        parameters.add("baz");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        Token token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(true));
-        assertParameterValue(paramParser, "foo", "fooScriptValue", ScriptType.INLINE);
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(true));
-        assertParameterValue(paramParser, "foo", "fooScriptValue", ScriptType.INLINE);
-        assertParameterValue(paramParser, "bar", "barScriptValue", ScriptType.FILE);
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(true));
-        assertParameterValue(paramParser, "foo", "fooScriptValue", ScriptType.INLINE);
-        assertParameterValue(paramParser, "bar", "barScriptValue", ScriptType.FILE);
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), equalTo("myLang"));
-        token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(true));
-        assertParameterValue(paramParser, "foo", "fooScriptValue", ScriptType.INLINE);
-        assertParameterValue(paramParser, "bar", "barScriptValue", ScriptType.FILE);
-        assertParameterValue(paramParser, "baz", "bazScriptValue", ScriptType.STORED);
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), equalTo("myLang"));
-    }
-
-    public void testTokenMultipleParametersNotFound() throws IOException {
-        XContentParser parser = XContentHelper.createParser(new BytesArray("{ \"other\" : \"scriptValue\" }"));
-        Set<String> parameters = new HashSet<>();
-        parameters.add("foo");
-        parameters.add("bar");
-        parameters.add("baz");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        Token token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(false));
-        assertThat(paramParser.getScriptParameterValue("other"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-    }
-
-    public void testTokenMultipleParametersSomeNotFound() throws IOException {
-        XContentParser parser = XContentHelper.createParser(new BytesArray("{ \"foo\" : \"fooScriptValue\", \"other_file\" : \"barScriptValue\", \"baz_id\" : \"bazScriptValue\" }"));
-        Set<String> parameters = new HashSet<>();
-        parameters.add("foo");
-        parameters.add("bar");
-        parameters.add("baz");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("other"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("other_file"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        Token token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(true));
-        assertParameterValue(paramParser, "foo", "fooScriptValue", ScriptType.INLINE);
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("other"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("other_file"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(false));
-        assertParameterValue(paramParser, "foo", "fooScriptValue", ScriptType.INLINE);
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("other"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("other_file"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        token = parser.nextToken();
-        while (token != Token.VALUE_STRING) {
-            token = parser.nextToken();
-        }
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(true));
-        assertParameterValue(paramParser, "foo", "fooScriptValue", ScriptType.INLINE);
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertParameterValue(paramParser, "baz", "bazScriptValue", ScriptType.STORED);
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("other"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("other_file"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-    }
-
-    public void testTokenMultipleParametersWrongType() throws IOException {
-        XContentParser parser = XContentHelper.createParser(new BytesArray("{ \"foo\" : \"fooScriptValue\", \"bar_file\" : \"barScriptValue\", \"baz_id\" : \"bazScriptValue\" }"));
-        Set<String> parameters = new HashSet<>();
-        parameters.add("foo");
-        parameters.add("bar");
-        parameters.add("baz");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        assertThat(paramParser.token(parser.currentName(), parser.currentToken(), parser, ParseFieldMatcher.STRICT), equalTo(false));
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-    }
-
-    public void testReservedParameters() {
-        try {
-            new ScriptParameterParser(singleton("lang"));
-            fail("Expected IllegalArgumentException");
-        } catch (IllegalArgumentException e) {
-            assertThat(e.getMessage(), containsString("lang is reserved"));
-        }
-    }
-
-    public void testConfigDefaultInline() throws IOException {
-        Map<String, Object> config = new HashMap<>();
-        config.put("script", "scriptValue");
-        ScriptParameterParser paramParser = new ScriptParameterParser();
-        paramParser.parseConfig(config, true, ParseFieldMatcher.STRICT);
-        assertDefaultParameterValue(paramParser, "scriptValue", ScriptType.INLINE);
-        assertThat(paramParser.lang(), nullValue());
-        assertThat(config.isEmpty(), equalTo(true));
-        config = new HashMap<>();
-        config.put("script", "scriptValue");
-        paramParser = new ScriptParameterParser(null);
-        paramParser.parseConfig(config, true, ParseFieldMatcher.STRICT);
-        assertDefaultParameterValue(paramParser, "scriptValue", ScriptType.INLINE);
-        assertThat(paramParser.lang(), nullValue());
-        assertThat(config.isEmpty(), equalTo(true));
-        config = new HashMap<>();
-        config.put("script", "scriptValue");
-        paramParser = new ScriptParameterParser(new HashSet<String>());
-        paramParser.parseConfig(config, true, ParseFieldMatcher.STRICT);
-        assertDefaultParameterValue(paramParser, "scriptValue", ScriptType.INLINE);
-        assertThat(paramParser.lang(), nullValue());
-        assertThat(config.isEmpty(), equalTo(true));
-    }
-
-    public void testConfigDefaultFile() throws IOException {
-        Map<String, Object> config = new HashMap<>();
-        config.put("script_file", "scriptValue");
-        ScriptParameterParser paramParser = new ScriptParameterParser();
-        paramParser.parseConfig(config, true, ParseFieldMatcher.STRICT);
-        assertDefaultParameterValue(paramParser, "scriptValue", ScriptType.FILE);
-        assertThat(paramParser.lang(), nullValue());
-        assertThat(config.isEmpty(), equalTo(true));
-    }
-
-    public void testConfigDefaultIndexed() throws IOException {
-        Map<String, Object> config = new HashMap<>();
-        config.put("script_id", "scriptValue");
-        ScriptParameterParser paramParser = new ScriptParameterParser();
-        paramParser.parseConfig(config, true, ParseFieldMatcher.STRICT);
-        assertDefaultParameterValue(paramParser, "scriptValue", ScriptType.STORED);
-        assertThat(paramParser.lang(), nullValue());
-        assertThat(config.isEmpty(), equalTo(true));
-    }
-
-    public void testConfigDefaultIndexedNoRemove() throws IOException {
-        Map<String, Object> config = new HashMap<>();
-        config.put("script_id", "scriptValue");
-        ScriptParameterParser paramParser = new ScriptParameterParser();
-        paramParser.parseConfig(config, false, ParseFieldMatcher.STRICT);
-        assertDefaultParameterValue(paramParser, "scriptValue", ScriptType.STORED);
-        assertThat(paramParser.lang(), nullValue());
-        assertThat(config.size(), equalTo(1));
-        assertThat((String) config.get("script_id"), equalTo("scriptValue"));
-    }
-
-    public void testConfigDefaultNotFound() throws IOException {
-        Map<String, Object> config = new HashMap<>();
-        config.put("foo", "bar");
-        ScriptParameterParser paramParser = new ScriptParameterParser();
-        paramParser.parseConfig(config, true, ParseFieldMatcher.STRICT);
-        assertThat(paramParser.getDefaultScriptParameterValue(), nullValue());
-        assertThat(paramParser.getScriptParameterValue("script"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        assertThat(config.size(), equalTo(1));
-        assertThat((String) config.get("foo"), equalTo("bar"));
-    }
-
-    public void testConfigSingleParameter() throws IOException {
-        Map<String, Object> config = new HashMap<>();
-        config.put("foo", "scriptValue");
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        paramParser.parseConfig(config, true, ParseFieldMatcher.STRICT);
-        assertParameterValue(paramParser, "foo", "scriptValue", ScriptType.INLINE);
-        assertThat(paramParser.lang(), nullValue());
-        assertThat(config.isEmpty(), equalTo(true));
-    }
-
-    public void testConfigSingleParameterFile() throws IOException {
-        Map<String, Object> config = new HashMap<>();
-        config.put("foo_file", "scriptValue");
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        paramParser.parseConfig(config, true, ParseFieldMatcher.STRICT);
-        assertParameterValue(paramParser, "foo", "scriptValue", ScriptType.FILE);
-        assertThat(paramParser.lang(), nullValue());
-        assertThat(config.isEmpty(), equalTo(true));
-    }
-
-    public void testConfigSingleParameterIndexed() throws IOException {
-        Map<String, Object> config = new HashMap<>();
-        config.put("foo_id", "scriptValue");
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        paramParser.parseConfig(config, true, ParseFieldMatcher.STRICT);
-        assertParameterValue(paramParser, "foo", "scriptValue", ScriptType.STORED);
-        assertThat(paramParser.lang(), nullValue());
-        assertThat(config.isEmpty(), equalTo(true));
-    }
-
-    public void testConfigSingleParameterDelcaredTwiceInlineFile() throws IOException {
-        Map<String, Object> config = new LinkedHashMap<>();
-        config.put("foo", "scriptValue");
-        config.put("foo_file", "scriptValue");
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        try {
-            paramParser.parseConfig(config, true, ParseFieldMatcher.STRICT);
-            fail("Expected ScriptParseException");
-        } catch (ScriptParseException e) {
-            assertThat(e.getMessage(), is("Only one of [foo, foo_file, foo_id] is allowed."));
-        }
-    }
-
-    public void testConfigSingleParameterDelcaredTwiceInlineIndexed() throws IOException {
-        Map<String, Object> config = new LinkedHashMap<>();
-        config.put("foo", "scriptValue");
-        config.put("foo_id", "scriptValue");
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        try {
-            paramParser.parseConfig(config, true, ParseFieldMatcher.STRICT);
-            fail("Expected ScriptParseException");
-        } catch (ScriptParseException e) {
-            assertThat(e.getMessage(), is("Only one of [foo, foo_file, foo_id] is allowed."));
-        }
-    }
-
-    public void testConfigSingleParameterDelcaredTwiceFileInline() throws IOException {
-        Map<String, Object> config = new LinkedHashMap<>();
-        config.put("foo_file", "scriptValue");
-        config.put("foo", "scriptValue");
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        try {
-            paramParser.parseConfig(config, true, ParseFieldMatcher.STRICT);
-            fail("Expected ScriptParseException");
-        } catch (ScriptParseException e) {
-            assertThat(e.getMessage(), is("Only one of [foo, foo_file, foo_id] is allowed."));
-        }
-    }
-
-    public void testConfigSingleParameterDelcaredTwiceFileIndexed() throws IOException {
-        Map<String, Object> config = new LinkedHashMap<>();
-        config.put("foo_file", "scriptValue");
-        config.put("foo_id", "scriptValue");
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        try {
-            paramParser.parseConfig(config, true, ParseFieldMatcher.STRICT);
-            fail("Expected ScriptParseException");
-        } catch (ScriptParseException e) {
-            assertThat(e.getMessage(), is("Only one of [foo, foo_file, foo_id] is allowed."));
-        }
-    }
-
-    public void testConfigSingleParameterDelcaredTwiceIndexedInline() throws IOException {
-        Map<String, Object> config = new LinkedHashMap<>();
-        config.put("foo_id", "scriptValue");
-        config.put("foo", "scriptValue");
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        try {
-            paramParser.parseConfig(config, true, ParseFieldMatcher.STRICT);
-            fail("Expected ScriptParseException");
-        } catch (ScriptParseException e) {
-            assertThat(e.getMessage(), is("Only one of [foo, foo_file, foo_id] is allowed."));
-        }
-    }
-
-    public void testConfigSingleParameterDelcaredTwiceIndexedFile() throws IOException {
-        Map<String, Object> config = new LinkedHashMap<>();
-        config.put("foo_id", "scriptValue");
-        config.put("foo_file", "scriptValue");
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        try {
-            paramParser.parseConfig(config, true, ParseFieldMatcher.STRICT);
-            fail("Expected ScriptParseException");
-        } catch (ScriptParseException e) {
-            assertThat(e.getMessage(), is("Only one of [foo, foo_file, foo_id] is allowed."));
-        }
-    }
-
-    public void testConfigMultipleParameters() throws IOException {
-        Map<String, Object> config = new HashMap<>();
-        config.put("foo", "fooScriptValue");
-        config.put("bar_file", "barScriptValue");
-        config.put("baz_id", "bazScriptValue");
-        Set<String> parameters = new HashSet<>();
-        parameters.add("foo");
-        parameters.add("bar");
-        parameters.add("baz");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        paramParser.parseConfig(config, true, ParseFieldMatcher.STRICT);
-        assertParameterValue(paramParser, "foo", "fooScriptValue", ScriptType.INLINE);
-        assertParameterValue(paramParser, "bar", "barScriptValue", ScriptType.FILE);
-        assertParameterValue(paramParser, "baz", "bazScriptValue", ScriptType.STORED);
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        assertThat(config.isEmpty(), equalTo(true));
-    }
-
-    public void testConfigMultipleParametersWithLang() throws IOException {
-        Map<String, Object> config = new HashMap<>();
-        config.put("foo", "fooScriptValue");
-        config.put("bar_file", "barScriptValue");
-        config.put("lang", "myLang");
-        config.put("baz_id", "bazScriptValue");
-        Set<String> parameters = new HashSet<>();
-        parameters.add("foo");
-        parameters.add("bar");
-        parameters.add("baz");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        paramParser.parseConfig(config, true, ParseFieldMatcher.STRICT);
-        assertParameterValue(paramParser, "foo", "fooScriptValue", ScriptType.INLINE);
-        assertParameterValue(paramParser, "bar", "barScriptValue", ScriptType.FILE);
-        assertParameterValue(paramParser, "baz", "bazScriptValue", ScriptType.STORED);
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), equalTo("myLang"));
-        assertThat(config.isEmpty(), equalTo(true));
-    }
-
-    public void testConfigMultipleParametersWithLangNoRemove() throws IOException {
-        Map<String, Object> config = new HashMap<>();
-        config.put("foo", "fooScriptValue");
-        config.put("bar_file", "barScriptValue");
-        config.put("lang", "myLang");
-        config.put("baz_id", "bazScriptValue");
-        Set<String> parameters = new HashSet<>();
-        parameters.add("foo");
-        parameters.add("bar");
-        parameters.add("baz");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        paramParser.parseConfig(config, false, ParseFieldMatcher.STRICT);
-        assertParameterValue(paramParser, "foo", "fooScriptValue", ScriptType.INLINE);
-        assertParameterValue(paramParser, "bar", "barScriptValue", ScriptType.FILE);
-        assertParameterValue(paramParser, "baz", "bazScriptValue", ScriptType.STORED);
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), equalTo("myLang"));
-        assertThat(config.size(), equalTo(4));
-        assertThat((String) config.get("foo"), equalTo("fooScriptValue"));
-        assertThat((String) config.get("bar_file"), equalTo("barScriptValue"));
-        assertThat((String) config.get("baz_id"), equalTo("bazScriptValue"));
-        assertThat((String) config.get("lang"), equalTo("myLang"));
-    }
-
-    public void testConfigMultipleParametersNotFound() throws IOException {
-        Map<String, Object> config = new HashMap<>();
-        config.put("other", "scriptValue");
-        Set<String> parameters = new HashSet<>();
-        parameters.add("foo");
-        parameters.add("bar");
-        parameters.add("baz");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        paramParser.parseConfig(config, true, ParseFieldMatcher.STRICT);
-        assertThat(paramParser.getScriptParameterValue("other"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        assertThat(config.size(), equalTo(1));
-        assertThat((String) config.get("other"), equalTo("scriptValue"));
-    }
-
-    public void testConfigMultipleParametersSomeNotFound() throws IOException {
-        Map<String, Object> config = new HashMap<>();
-        config.put("foo", "fooScriptValue");
-        config.put("other_file", "barScriptValue");
-        config.put("baz_id", "bazScriptValue");
-        Set<String> parameters = new HashSet<>();
-        parameters.add("foo");
-        parameters.add("bar");
-        parameters.add("baz");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("other"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("other_file"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        paramParser.parseConfig(config, true, ParseFieldMatcher.STRICT);
-        assertParameterValue(paramParser, "foo", "fooScriptValue", ScriptType.INLINE);
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertParameterValue(paramParser, "baz", "bazScriptValue", ScriptType.STORED);
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("other"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("other_file"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        assertThat(config.size(), equalTo(1));
-        assertThat((String) config.get("other_file"), equalTo("barScriptValue"));
-    }
-
-    public void testConfigMultipleParametersInlineWrongType() throws IOException {
-        Map<String, Object> config = new HashMap<>();
-        config.put("foo", 1L);
-        config.put("bar_file", "barScriptValue");
-        config.put("baz_id", "bazScriptValue");
-        config.put("lang", "myLang");
-        Set<String> parameters = new HashSet<>();
-        parameters.add("foo");
-        parameters.add("bar");
-        parameters.add("baz");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        try {
-            paramParser.parseConfig(config, true, ParseFieldMatcher.STRICT);
-            fail("Expected ScriptParseException");
-        } catch (ScriptParseException e) {
-            assertThat(e.getMessage(), is("Value must be of type String: [foo]"));
-        }
-    }
-
-    public void testConfigMultipleParametersFileWrongType() throws IOException {
-        Map<String, Object> config = new HashMap<>();
-        config.put("foo", "fooScriptValue");
-        config.put("bar_file", 1L);
-        config.put("baz_id", "bazScriptValue");
-        config.put("lang", "myLang");
-        Set<String> parameters = new HashSet<>();
-        parameters.add("foo");
-        parameters.add("bar");
-        parameters.add("baz");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        try {
-            paramParser.parseConfig(config, true, ParseFieldMatcher.STRICT);
-            fail("Expected ScriptParseException");
-        } catch (ScriptParseException e) {
-            assertThat(e.getMessage(), is("Value must be of type String: [bar_file]"));
-        }
-
-    }
-
-    public void testConfigMultipleParametersIndexedWrongType() throws IOException {
-        Map<String, Object> config = new HashMap<>();
-        config.put("foo", "fooScriptValue");
-        config.put("bar_file", "barScriptValue");
-        config.put("baz_id", 1L);
-        config.put("lang", "myLang");
-        Set<String> parameters = new HashSet<>();
-        parameters.add("foo");
-        parameters.add("bar");
-        parameters.add("baz");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        try {
-            paramParser.parseConfig(config, true, ParseFieldMatcher.STRICT);
-            fail("Expected ScriptParseException");
-        } catch (ScriptParseException e) {
-            assertThat(e.getMessage(), is("Value must be of type String: [baz_id]"));
-        }
-    }
-
-    public void testConfigMultipleParametersLangWrongType() throws IOException {
-        Map<String, Object> config = new HashMap<>();
-        config.put("foo", "fooScriptValue");
-        config.put("bar_file", "barScriptValue");
-        config.put("baz_id", "bazScriptValue");
-        config.put("lang", 1L);
-        Set<String> parameters = new HashSet<>();
-        parameters.add("foo");
-        parameters.add("bar");
-        parameters.add("baz");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        try {
-            paramParser.parseConfig(config, true, ParseFieldMatcher.STRICT);
-            fail("Expected ScriptParseException");
-        } catch (ScriptParseException e) {
-            assertThat(e.getMessage(), is("Value must be of type String: [lang]"));
-        }
-    }
-
-    public void testParamsDefaultInline() throws IOException {
-        Map<String, String> config = new HashMap<>();
-        config.put("script", "scriptValue");
-        MapParams params = new MapParams(config);
-        ScriptParameterParser paramParser = new ScriptParameterParser();
-        paramParser.parseParams(params);
-        assertDefaultParameterValue(paramParser, "scriptValue", ScriptType.INLINE);
-        assertThat(paramParser.lang(), nullValue());
-
-        paramParser = new ScriptParameterParser(null);
-        paramParser.parseParams(params);
-        assertDefaultParameterValue(paramParser, "scriptValue", ScriptType.INLINE);
-        assertThat(paramParser.lang(), nullValue());
-
-        paramParser = new ScriptParameterParser(new HashSet<String>());
-        paramParser.parseParams(params);
-        assertDefaultParameterValue(paramParser, "scriptValue", ScriptType.INLINE);
-        assertThat(paramParser.lang(), nullValue());
-    }
-
-    public void testParamsDefaultFile() throws IOException {
-        Map<String, String> config = new HashMap<>();
-        config.put("script_file", "scriptValue");
-        MapParams params = new MapParams(config);
-        ScriptParameterParser paramParser = new ScriptParameterParser();
-        paramParser.parseParams(params);
-        assertDefaultParameterValue(paramParser, "scriptValue", ScriptType.FILE);
-        assertThat(paramParser.lang(), nullValue());
-    }
-
-    public void testParamsDefaultIndexed() throws IOException {
-        Map<String, String> config = new HashMap<>();
-        config.put("script_id", "scriptValue");
-        MapParams params = new MapParams(config);
-        ScriptParameterParser paramParser = new ScriptParameterParser();
-        paramParser.parseParams(params);
-        assertDefaultParameterValue(paramParser, "scriptValue", ScriptType.STORED);
-        assertThat(paramParser.lang(), nullValue());
-    }
-
-    public void testParamsDefaultNotFound() throws IOException {
-        Map<String, String> config = new HashMap<>();
-        config.put("foo", "bar");
-        MapParams params = new MapParams(config);
-        ScriptParameterParser paramParser = new ScriptParameterParser();
-        paramParser.parseParams(params);
-        assertThat(paramParser.getDefaultScriptParameterValue(), nullValue());
-        assertThat(paramParser.getScriptParameterValue("script"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-    }
-
-    public void testParamsSingleParameter() throws IOException {
-        Map<String, String> config = new HashMap<>();
-        config.put("foo", "scriptValue");
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        MapParams params = new MapParams(config);
-        paramParser.parseParams(params);
-        assertParameterValue(paramParser, "foo", "scriptValue", ScriptType.INLINE);
-        assertThat(paramParser.lang(), nullValue());
-    }
-
-    public void testParamsSingleParameterFile() throws IOException {
-        Map<String, String> config = new HashMap<>();
-        config.put("foo_file", "scriptValue");
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        MapParams params = new MapParams(config);
-        paramParser.parseParams(params);
-        assertParameterValue(paramParser, "foo", "scriptValue", ScriptType.FILE);
-        assertThat(paramParser.lang(), nullValue());
-    }
-
-    public void testParamsSingleParameterIndexed() throws IOException {
-        Map<String, String> config = new HashMap<>();
-        config.put("foo_id", "scriptValue");
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        MapParams params = new MapParams(config);
-        paramParser.parseParams(params);
-        assertParameterValue(paramParser, "foo", "scriptValue", ScriptType.STORED);
-        assertThat(paramParser.lang(), nullValue());
-    }
-
-    public void testParamsSingleParameterDelcaredTwiceInlineFile() throws IOException {
-        Map<String, String> config = new LinkedHashMap<>();
-        config.put("foo", "scriptValue");
-        config.put("foo_file", "scriptValue");
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        MapParams params = new MapParams(config);
-        try {
-            paramParser.parseParams(params);
-            fail("Expected ScriptParseException");
-        } catch(ScriptParseException e) {
-            assertThat(e.getMessage(), is("Only one of [foo, foo_file, foo_id] is allowed."));
-        }
-    }
-
-    public void testParamsSingleParameterDelcaredTwiceInlineIndexed() throws IOException {
-        Map<String, String> config = new LinkedHashMap<>();
-        config.put("foo", "scriptValue");
-        config.put("foo_id", "scriptValue");
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        MapParams params = new MapParams(config);
-        try {
-            paramParser.parseParams(params);
-            fail("Expected ScriptParseException");
-        } catch(ScriptParseException e) {
-            assertThat(e.getMessage(), is("Only one of [foo, foo_file, foo_id] is allowed."));
-        }
-    }
-
-    public void testParamsSingleParameterDelcaredTwiceFileInline() throws IOException {
-        Map<String, String> config = new LinkedHashMap<>();
-        config.put("foo_file", "scriptValue");
-        config.put("foo", "scriptValue");
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        MapParams params = new MapParams(config);
-        try {
-            paramParser.parseParams(params);
-            fail("Expected ScriptParseException");
-        } catch(ScriptParseException e) {
-            assertThat(e.getMessage(), is("Only one of [foo, foo_file, foo_id] is allowed."));
-        }
-    }
-
-    public void testParamsSingleParameterDelcaredTwiceFileIndexed() throws IOException {
-        Map<String, String> config = new LinkedHashMap<>();
-        config.put("foo_file", "scriptValue");
-        config.put("foo_id", "scriptValue");
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        MapParams params = new MapParams(config);
-        try {
-            paramParser.parseParams(params);
-            fail("Expected ScriptParseException");
-        } catch(ScriptParseException e) {
-            assertThat(e.getMessage(), is("Only one of [foo, foo_file, foo_id] is allowed."));
-        }
-    }
-
-    public void testParamsSingleParameterDelcaredTwiceIndexedInline() throws IOException {
-        Map<String, String> config = new LinkedHashMap<>();
-        config.put("foo_id", "scriptValue");
-        config.put("foo", "scriptValue");
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        MapParams params = new MapParams(config);
-        try {
-            paramParser.parseParams(params);
-            fail("Expected ScriptParseException");
-        } catch(ScriptParseException e) {
-            assertThat(e.getMessage(), is("Only one of [foo, foo_file, foo_id] is allowed."));
-        }
-    }
-
-    public void testParamsSingleParameterDelcaredTwiceIndexedFile() throws IOException {
-        Map<String, String> config = new LinkedHashMap<>();
-        config.put("foo_id", "scriptValue");
-        config.put("foo_file", "scriptValue");
-        Set<String> parameters = Collections.singleton("foo");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        MapParams params = new MapParams(config);
-        try {
-            paramParser.parseParams(params);
-            fail("Expected ScriptParseException");
-        } catch(ScriptParseException e) {
-            assertThat(e.getMessage(), is("Only one of [foo, foo_file, foo_id] is allowed."));
-        }
-    }
-
-    public void testParamsMultipleParameters() throws IOException {
-        Map<String, String> config = new HashMap<>();
-        config.put("foo", "fooScriptValue");
-        config.put("bar_file", "barScriptValue");
-        config.put("baz_id", "bazScriptValue");
-        Set<String> parameters = new HashSet<>();
-        parameters.add("foo");
-        parameters.add("bar");
-        parameters.add("baz");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        MapParams params = new MapParams(config);
-        paramParser.parseParams(params);
-        assertParameterValue(paramParser, "foo", "fooScriptValue", ScriptType.INLINE);
-        assertParameterValue(paramParser, "bar", "barScriptValue", ScriptType.FILE);
-        assertParameterValue(paramParser, "baz", "bazScriptValue", ScriptType.STORED);
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-    }
-
-    public void testParamsMultipleParametersWithLang() throws IOException {
-        Map<String, String> config = new HashMap<>();
-        config.put("foo", "fooScriptValue");
-        config.put("bar_file", "barScriptValue");
-        config.put("lang", "myLang");
-        config.put("baz_id", "bazScriptValue");
-        Set<String> parameters = new HashSet<>();
-        parameters.add("foo");
-        parameters.add("bar");
-        parameters.add("baz");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        MapParams params = new MapParams(config);
-        paramParser.parseParams(params);
-        assertParameterValue(paramParser, "foo", "fooScriptValue", ScriptType.INLINE);
-        assertParameterValue(paramParser, "bar", "barScriptValue", ScriptType.FILE);
-        assertParameterValue(paramParser, "baz", "bazScriptValue", ScriptType.STORED);
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), equalTo("myLang"));
-    }
-
-    public void testParamsMultipleParametersWithLangNoRemove() throws IOException {
-        Map<String, String> config = new HashMap<>();
-        config.put("foo", "fooScriptValue");
-        config.put("bar_file", "barScriptValue");
-        config.put("lang", "myLang");
-        config.put("baz_id", "bazScriptValue");
-        Set<String> parameters = new HashSet<>();
-        parameters.add("foo");
-        parameters.add("bar");
-        parameters.add("baz");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        MapParams params = new MapParams(config);
-        paramParser.parseParams(params);
-        assertParameterValue(paramParser, "foo", "fooScriptValue", ScriptType.INLINE);
-        assertParameterValue(paramParser, "bar", "barScriptValue", ScriptType.FILE);
-        assertParameterValue(paramParser, "baz", "bazScriptValue", ScriptType.STORED);
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), equalTo("myLang"));
-    }
-
-    public void testParamsMultipleParametersNotFound() throws IOException {
-        Map<String, String> config = new HashMap<>();
-        config.put("other", "scriptValue");
-        Set<String> parameters = new HashSet<>();
-        parameters.add("foo");
-        parameters.add("bar");
-        parameters.add("baz");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        MapParams params = new MapParams(config);
-        paramParser.parseParams(params);
-        assertThat(paramParser.getScriptParameterValue("other"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-    }
-
-    public void testParamsMultipleParametersSomeNotFound() throws IOException {
-        Map<String, String> config = new HashMap<>();
-        config.put("foo", "fooScriptValue");
-        config.put("other_file", "barScriptValue");
-        config.put("baz_id", "bazScriptValue");
-        Set<String> parameters = new HashSet<>();
-        parameters.add("foo");
-        parameters.add("bar");
-        parameters.add("baz");
-        ScriptParameterParser paramParser = new ScriptParameterParser(parameters);
-        assertThat(paramParser.getScriptParameterValue("foo"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("other"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("other_file"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-        MapParams params = new MapParams(config);
-        paramParser.parseParams(params);
-        assertParameterValue(paramParser, "foo", "fooScriptValue", ScriptType.INLINE);
-        assertThat(paramParser.getScriptParameterValue("bar"), nullValue());
-        assertParameterValue(paramParser, "baz", "bazScriptValue", ScriptType.STORED);
-        assertThat(paramParser.getScriptParameterValue("bar_file"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("baz_id"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("other"), nullValue());
-        assertThat(paramParser.getScriptParameterValue("other_file"), nullValue());
-        assertThat(paramParser.lang(), nullValue());
-    }
-
-    private void assertDefaultParameterValue(ScriptParameterParser paramParser, String expectedScript, ScriptType expectedScriptType) throws IOException {
-        ScriptParameterValue defaultValue = paramParser.getDefaultScriptParameterValue();
-        ScriptParameterValue defaultValueByName = paramParser.getScriptParameterValue("script");
-        assertThat(defaultValue.scriptType(), equalTo(expectedScriptType));
-        assertThat(defaultValue.script(), equalTo(expectedScript));
-        assertThat(defaultValueByName.scriptType(), equalTo(expectedScriptType));
-        assertThat(defaultValueByName.script(), equalTo(expectedScript));
-    }
-
-    private void assertParameterValue(ScriptParameterParser paramParser, String parameterName, String expectedScript, ScriptType expectedScriptType) throws IOException {
-        ScriptParameterValue value = paramParser.getScriptParameterValue(parameterName);
-        assertThat(value.scriptType(), equalTo(expectedScriptType));
-        assertThat(value.script(), equalTo(expectedScript));
-    }
-}

+ 2 - 3
core/src/test/java/org/elasticsearch/script/ScriptServiceTests.java

@@ -44,7 +44,6 @@ import java.nio.file.Path;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.Map;
 
 
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.containsString;
@@ -444,12 +443,12 @@ public class ScriptServiceTests extends ESTestCase {
         int maxSize = 0xFFFF;
         int maxSize = 0xFFFF;
         buildScriptService(Settings.EMPTY);
         buildScriptService(Settings.EMPTY);
         // allowed
         // allowed
-        scriptService.validate("_id", "test", new BytesArray("{\"script\":\"" + randomAsciiOfLength(maxSize - 13) + "\"}"));
+        scriptService.validateStoredScript("_id", "test", new BytesArray("{\"script\":\"" + randomAsciiOfLength(maxSize - 13) + "\"}"));
 
 
         // disallowed
         // disallowed
         IllegalArgumentException e = expectThrows(IllegalArgumentException.class,
         IllegalArgumentException e = expectThrows(IllegalArgumentException.class,
                 () -> {
                 () -> {
-                    scriptService.validate("_id", "test", new BytesArray("{\"script\":\"" + randomAsciiOfLength(maxSize - 12) + "\"}"));
+                    scriptService.validateStoredScript("_id", "test", new BytesArray("{\"script\":\"" + randomAsciiOfLength(maxSize - 12) + "\"}"));
                 });
                 });
         assertThat(e.getMessage(), equalTo(
         assertThat(e.getMessage(), equalTo(
                 "Limit of script size in bytes [" + maxSize+ "] has been exceeded for script [_id] with size [" + (maxSize + 1) + "]"));
                 "Limit of script size in bytes [" + maxSize+ "] has been exceeded for script [_id] with size [" + (maxSize + 1) + "]"));

+ 7 - 10
core/src/test/java/org/elasticsearch/search/sort/ScriptSortBuilderTests.java

@@ -192,16 +192,13 @@ public class ScriptSortBuilderTests extends AbstractSortTestCase<ScriptSortBuild
         assertNull(builder.getNestedPath());
         assertNull(builder.getNestedPath());
     }
     }
 
 
-    public void testParseJsonOldStyle() throws IOException {
+    public void testParseJson_simple() throws IOException {
         String scriptSort = "{\n" +
         String scriptSort = "{\n" +
                 "\"_script\" : {\n" +
                 "\"_script\" : {\n" +
-                    "\"type\" : \"number\",\n" +
-                    "\"script\" : \"doc['field_name'].value * factor\",\n" +
-                    "\"params\" : {\n" +
-                        "\"factor\" : 1.1\n" +
-                    "},\n" +
-                    "\"mode\" : \"max\",\n" +
-                    "\"order\" : \"asc\"\n" +
+                "\"type\" : \"number\",\n" +
+                "\"script\" : \"doc['field_name'].value\",\n" +
+                "\"mode\" : \"max\",\n" +
+                "\"order\" : \"asc\"\n" +
                 "} }\n";
                 "} }\n";
         XContentParser parser = XContentFactory.xContent(scriptSort).createParser(scriptSort);
         XContentParser parser = XContentFactory.xContent(scriptSort).createParser(scriptSort);
         parser.nextToken();
         parser.nextToken();
@@ -210,9 +207,9 @@ public class ScriptSortBuilderTests extends AbstractSortTestCase<ScriptSortBuild
 
 
         QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, parser, ParseFieldMatcher.STRICT);
         QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, parser, ParseFieldMatcher.STRICT);
         ScriptSortBuilder builder = ScriptSortBuilder.fromXContent(context, null);
         ScriptSortBuilder builder = ScriptSortBuilder.fromXContent(context, null);
-        assertEquals("doc['field_name'].value * factor", builder.script().getScript());
+        assertEquals("doc['field_name'].value", builder.script().getScript());
         assertNull(builder.script().getLang());
         assertNull(builder.script().getLang());
-        assertEquals(1.1, builder.script().getParams().get("factor"));
+        assertNull(builder.script().getParams());
         assertEquals(ScriptType.INLINE, builder.script().getType());
         assertEquals(ScriptType.INLINE, builder.script().getType());
         assertEquals(ScriptSortType.NUMBER, builder.type());
         assertEquals(ScriptSortType.NUMBER, builder.type());
         assertEquals(SortOrder.ASC, builder.order());
         assertEquals(SortOrder.ASC, builder.order());

+ 1 - 1
core/src/test/resources/org/elasticsearch/action/bulk/simple-bulk4.json

@@ -1,7 +1,7 @@
 { "update" : {"_id" : "1", "_retry_on_conflict" : 2} }
 { "update" : {"_id" : "1", "_retry_on_conflict" : 2} }
 { "doc" : {"field" : "value"} }
 { "doc" : {"field" : "value"} }
 { "update" : { "_id" : "0", "_type" : "type1", "_index" : "index1" } }
 { "update" : { "_id" : "0", "_type" : "type1", "_index" : "index1" } }
-{ "script" : "counter += param1", "lang" : "javascript", "params" : {"param1" : 1}, "upsert" : {"counter" : 1}}
+{ "script" : { "inline" : "counter += param1", "lang" : "javascript", "params" : {"param1" : 1}}, "upsert" : {"counter" : 1}}
 { "delete" : { "_id" : "2" } }
 { "delete" : { "_id" : "2" } }
 { "create" : { "_id" : "3" } }
 { "create" : { "_id" : "3" } }
 { "field1" : "value3" }
 { "field1" : "value3" }

+ 186 - 2
docs/reference/migration/migrate_5_0/scripting.asciidoc

@@ -1,6 +1,186 @@
 [[breaking_50_scripting]]
 [[breaking_50_scripting]]
 === Script related changes
 === Script related changes
 
 
+==== Removed 1.x script and template syntax
+
+The deprecated 1.x syntax of defining inline scripts / templates and referring to file or index base scripts / templates
+have been removed.
+
+The `script` and `params` string parameters can no longer be used and instead the `script` object syntax must be used.
+This applies for the update api, script sort, `script_score` function, `script` query, `scripted_metric` aggregation and
+`script_heuristic` aggregation.
+
+So this usage of inline scripts is no longer allowed:
+
+[source,js]
+-----------------------------------
+{
+  "script_score": {
+    "lang": "groovy",
+    "script": "Math.log(_score * 2) + my_modifier",
+    "params": {
+      "my_modifier": 8
+    }
+  }
+}
+-----------------------------------
+
+and instead this syntax must be used:
+
+[source,js]
+-----------------------------------
+{
+  "script_score": {
+    "script": {
+      "lang": "groovy",
+      "inline": "Math.log(_score * 2) + my_modifier",
+      "params": {
+        "my_modifier": 8
+      }
+    }
+  }
+}
+-----------------------------------
+
+The `script` or `script_file` parameter can no longer be used to refer to file based scripts and templates and instead
+`file` must be used.
+
+This usage of referring to file based scripts is no longer valid:
+
+[source,js]
+-----------------------------------
+{
+  "script_score": {
+    "script": "calculate-score",
+    "params": {
+      "my_modifier": 8
+    }
+  }
+}
+-----------------------------------
+
+This usage is valid:
+
+[source,js]
+-----------------------------------
+{
+  "script_score": {
+    "script": {
+      "lang": "groovy",
+      "file": "calculate-score",
+      "params": {
+        "my_modifier": 8
+      }
+    }
+  }
+}
+-----------------------------------
+
+The `script_id` parameter can no longer be used the refer to indexed based scripts and templates and instead `id` must
+be used.
+
+This usage of referring to indexed scripts is no longer valid:
+
+[source,js]
+-----------------------------------
+{
+  "script_score": {
+    "script_id": "indexedCalculateScore",
+    "params": {
+      "my_modifier": 8
+    }
+  }
+}
+-----------------------------------
+
+This usage is valid:
+
+[source,js]
+-----------------------------------
+{
+  "script_score": {
+    "script": {
+      "id": "indexedCalculateScore",
+      "lang" : "groovy",
+      "params": {
+        "my_modifier": 8
+      }
+    }
+  }
+}
+-----------------------------------
+
+====== Template query
+
+The `query` field in the `template` query can no longer be used.
+This 1.x syntax can no longer be used:
+
+[source,js]
+-----------------------------------
+{
+    "query": {
+        "template": {
+            "query": {"match_{{template}}": {}},
+            "params" : {
+                "template" : "all"
+            }
+        }
+    }
+}
+-----------------------------------
+
+and instead the following syntax should be used:
+
+[source,js]
+-----------------------------------
+{
+    "query": {
+        "template": {
+            "inline": {"match_{{template}}": {}},
+            "params" : {
+                "template" : "all"
+            }
+        }
+    }
+}
+
+===== Search templates:
+
+The top level `template` field in the search template api has been replaced with consistent template / script object
+syntax. This 1.x syntax can no longer be used:
+
+[source,js]
+-----------------------------------
+{
+    "template" : {
+        "query": { "match" : { "{{my_field}}" : "{{my_value}}" } },
+        "size" : "{{my_size}}"
+    },
+    "params" : {
+        "my_field" : "foo",
+        "my_value" : "bar",
+        "my_size" : 5
+    }
+}
+-----------------------------------
+
+and instead the following syntax should be used:
+
+[source,js]
+-----------------------------------
+{
+    "inline" : {
+        "query": { "match" : { "{{my_field}}" : "{{my_value}}" } },
+        "size" : "{{my_size}}"
+    },
+    "params" : {
+        "my_field" : "foo",
+        "my_value" : "bar",
+        "my_size" : 5
+    }
+}
+-----------------------------------
+
 ==== Indexed scripts and templates
 ==== Indexed scripts and templates
 
 
 Indexed scripts and templates have been replaced by <<modules-scripting-stored-scripts,stored scripts>>
 Indexed scripts and templates have been replaced by <<modules-scripting-stored-scripts,stored scripts>>
@@ -13,8 +193,8 @@ If scripts are really large, other options like native scripts should be conside
 Previously indexed scripts in the `.scripts` index will not be used any more as
 Previously indexed scripts in the `.scripts` index will not be used any more as
 Elasticsearch will now try to fetch the scripts from the cluster state. Upon upgrading
 Elasticsearch will now try to fetch the scripts from the cluster state. Upon upgrading
 to 5.x the `.scripts` index will remain to exist, so it can be used by a script to migrate
 to 5.x the `.scripts` index will remain to exist, so it can be used by a script to migrate
-the stored scripts from the `.scripts` index into the cluster state. The format of the scripts
-hasn't changed.
+the stored scripts from the `.scripts` index into the cluster state. The current format of the scripts
+and templates hasn't been changed, only the 1.x format has been removed.
 
 
 ===== Python migration script
 ===== Python migration script
 
 
@@ -104,3 +284,7 @@ engine doing this was the Javascript engine, which registered "js" and
 
 
 The Javascript engine previously registered "js" and "javascript". It now only
 The Javascript engine previously registered "js" and "javascript". It now only
 registers the "js" file extension for on-disk scripts.
 registers the "js" file extension for on-disk scripts.
+
+==== Removed scripting query string parameters from update rest api
+
+The `script`, `script_id` and `scripting_upsert` query string parameters have been removed from the update api.

+ 8 - 3
modules/lang-groovy/src/test/java/org/elasticsearch/messy/tests/BulkTests.java

@@ -455,16 +455,21 @@ public class BulkTests extends ESIntegTestCase {
         byte[] addParent = new BytesArray("{\"index\" : { \"_index\" : \"test\", \"_type\" : \"parent\", \"_id\" : \"parent1\"}}\n" +
         byte[] addParent = new BytesArray("{\"index\" : { \"_index\" : \"test\", \"_type\" : \"parent\", \"_id\" : \"parent1\"}}\n" +
                 "{\"field1\" : \"value1\"}\n").array();
                 "{\"field1\" : \"value1\"}\n").array();
 
 
-        byte[] addChild = new BytesArray("{\"update\" : { \"_id\" : \"child1\", \"_type\" : \"child\", \"_index\" : \"test\", \"parent\" : \"parent1\"} }\n" +
+        byte[] addChild1 = new BytesArray("{\"update\" : { \"_id\" : \"child1\", \"_type\" : \"child\", \"_index\" : \"test\", \"parent\" : \"parent1\"} }\n" +
+                "{ \"script\" : {\"inline\" : \"ctx._source.field2 = 'value2'\"}, \"upsert\" : {\"field1\" : \"value1\"}}\n").array();
+
+        byte[] addChild2 = new BytesArray("{\"update\" : { \"_id\" : \"child1\", \"_type\" : \"child\", \"_index\" : \"test\", \"parent\" : \"parent1\"} }\n" +
                 "{ \"script\" : \"ctx._source.field2 = 'value2'\", \"upsert\" : {\"field1\" : \"value1\"}}\n").array();
                 "{ \"script\" : \"ctx._source.field2 = 'value2'\", \"upsert\" : {\"field1\" : \"value1\"}}\n").array();
 
 
         builder.add(addParent, 0, addParent.length);
         builder.add(addParent, 0, addParent.length);
-        builder.add(addChild, 0, addChild.length);
+        builder.add(addChild1, 0, addChild1.length);
+        builder.add(addChild2, 0, addChild2.length);
 
 
         BulkResponse bulkResponse = builder.get();
         BulkResponse bulkResponse = builder.get();
-        assertThat(bulkResponse.getItems().length, equalTo(2));
+        assertThat(bulkResponse.getItems().length, equalTo(3));
         assertThat(bulkResponse.getItems()[0].isFailed(), equalTo(false));
         assertThat(bulkResponse.getItems()[0].isFailed(), equalTo(false));
         assertThat(bulkResponse.getItems()[1].isFailed(), equalTo(false));
         assertThat(bulkResponse.getItems()[1].isFailed(), equalTo(false));
+        assertThat(bulkResponse.getItems()[2].isFailed(), equalTo(false));
 
 
         client().admin().indices().prepareRefresh("test").get();
         client().admin().indices().prepareRefresh("test").get();
 
 

+ 16 - 11
modules/lang-groovy/src/test/resources/rest-api-spec/test/lang_groovy/15_update.yaml

@@ -18,11 +18,11 @@
           index:  test_1
           index:  test_1
           type:   test
           type:   test
           id:     1
           id:     1
-          script: "1"
           body:
           body:
-            lang:   groovy
-            script: "ctx._source.foo = bar"
-            params: { bar: 'xxx' }
+            script:
+              lang:   groovy
+              inline: "ctx._source.foo = bar"
+              params: { bar: 'xxx' }
 
 
   - match: { _index:   test_1 }
   - match: { _index:   test_1 }
   - match: { _type:    test   }
   - match: { _type:    test   }
@@ -43,8 +43,10 @@
           index:  test_1
           index:  test_1
           type:   test
           type:   test
           id:     1
           id:     1
-          lang:   groovy
-          script: "ctx._source.foo = 'yyy'"
+          body:
+            script:
+              lang:   groovy
+              inline: "ctx._source.foo = 'yyy'"
 
 
   - match: { _index:   test_1 }
   - match: { _index:   test_1 }
   - match: { _type:    test   }
   - match: { _type:    test   }
@@ -67,9 +69,10 @@
           type:   test
           type:   test
           id:     1
           id:     1
           body:
           body:
-            script: "1"
-            lang:   "doesnotexist"
-            params: { bar: 'xxx' }
+            script:
+              inline: "1"
+              lang:   "doesnotexist"
+              params: { bar: 'xxx' }
 
 
   - do:
   - do:
       catch:      /script_lang not supported \[doesnotexist\]/
       catch:      /script_lang not supported \[doesnotexist\]/
@@ -77,6 +80,8 @@
           index:  test_1
           index:  test_1
           type:   test
           type:   test
           id:     1
           id:     1
-          lang:   doesnotexist
-          script: "1"
+          body:
+            script:
+                lang:   doesnotexist
+                inline: "1"
 
 

+ 9 - 6
modules/lang-groovy/src/test/resources/rest-api-spec/test/lang_groovy/25_script_upsert.yaml

@@ -10,8 +10,9 @@
           type:     test
           type:     test
           id:       1
           id:       1
           body:
           body:
-            script: "ctx._source.foo = bar"
-            params: { bar: 'xxx' }
+            script:
+              inline: "ctx._source.foo = bar"
+              params: { bar: 'xxx' }
             upsert: { foo: baz }
             upsert: { foo: baz }
 
 
   - do:
   - do:
@@ -29,8 +30,9 @@
           type:     test
           type:     test
           id:       1
           id:       1
           body:
           body:
-            script: "ctx._source.foo = bar"
-            params: { bar: 'xxx' }
+            script:
+              inline: "ctx._source.foo = bar"
+              params: { bar: 'xxx' }
             upsert: { foo: baz }
             upsert: { foo: baz }
 
 
   - do:
   - do:
@@ -47,8 +49,9 @@
           type:     test
           type:     test
           id:       2
           id:       2
           body:
           body:
-            script: "ctx._source.foo = bar"
-            params: { bar: 'xxx' }
+            script:
+              inline: "ctx._source.foo = bar"
+              params: { bar: 'xxx' }
             upsert: { foo: baz }
             upsert: { foo: baz }
             scripted_upsert: true
             scripted_upsert: true
 
 

+ 6 - 4
modules/lang-groovy/src/test/resources/rest-api-spec/test/lang_groovy/90_missing.yaml

@@ -31,8 +31,9 @@
           type:   test
           type:   test
           id:     1
           id:     1
           body:
           body:
-            script: "ctx._source.foo = bar"
-            params: { bar: 'xxx' }
+            script:
+              inline: "ctx._source.foo = bar"
+              params: { bar: 'xxx' }
 
 
   - do:
   - do:
       update:
       update:
@@ -41,5 +42,6 @@
           id:     1
           id:     1
           ignore: 404
           ignore: 404
           body:
           body:
-            script:       "ctx._source.foo = bar"
-            params:       { bar: 'xxx' }
+            script:
+              inline:       "ctx._source.foo = bar"
+              params:       { bar: 'xxx' }

+ 1 - 1
modules/lang-mustache/src/test/java/org/elasticsearch/messy/tests/TemplateQueryParserTests.java

@@ -153,7 +153,7 @@ public class TemplateQueryParserTests extends ESTestCase {
     }
     }
 
 
     public void testParser() throws IOException {
     public void testParser() throws IOException {
-        String templateString = "{" + "\"query\":{\"match_{{template}}\": {}}," + "\"params\":{\"template\":\"all\"}" + "}";
+        String templateString = "{" + "\"inline\":{\"match_{{template}}\": {}}," + "\"params\":{\"template\":\"all\"}" + "}";
 
 
         XContentParser templateSourceParser = XContentFactory.xContent(templateString).createParser(templateString);
         XContentParser templateSourceParser = XContentFactory.xContent(templateString).createParser(templateString);
         QueryShardContext context = contextFactory.get();
         QueryShardContext context = contextFactory.get();

+ 0 - 9
modules/lang-mustache/src/test/java/org/elasticsearch/messy/tests/TemplateQueryTests.java

@@ -26,12 +26,9 @@ import org.elasticsearch.action.search.template.SearchTemplateAction;
 import org.elasticsearch.action.search.template.SearchTemplateRequest;
 import org.elasticsearch.action.search.template.SearchTemplateRequest;
 import org.elasticsearch.action.search.template.SearchTemplateRequestBuilder;
 import org.elasticsearch.action.search.template.SearchTemplateRequestBuilder;
 import org.elasticsearch.action.search.template.SearchTemplateResponse;
 import org.elasticsearch.action.search.template.SearchTemplateResponse;
-import org.elasticsearch.common.ParseFieldMatcher;
 import org.elasticsearch.common.ParsingException;
 import org.elasticsearch.common.ParsingException;
 import org.elasticsearch.common.bytes.BytesArray;
 import org.elasticsearch.common.bytes.BytesArray;
 import org.elasticsearch.common.settings.Settings;
 import org.elasticsearch.common.settings.Settings;
-import org.elasticsearch.common.xcontent.XContentFactory;
-import org.elasticsearch.common.xcontent.XContentParser;
 import org.elasticsearch.env.Environment;
 import org.elasticsearch.env.Environment;
 import org.elasticsearch.index.query.QueryBuilders;
 import org.elasticsearch.index.query.QueryBuilders;
 import org.elasticsearch.index.query.TemplateQueryBuilder;
 import org.elasticsearch.index.query.TemplateQueryBuilder;
@@ -158,12 +155,6 @@ public class TemplateQueryTests extends ESIntegTestCase {
         assertHitCount(response.getResponse(), 2);
         assertHitCount(response.getResponse(), 2);
     }
     }
 
 
-    private Template parseTemplate(String template) throws IOException {
-        try (XContentParser parser = XContentFactory.xContent(template).createParser(template)) {
-            return TemplateQueryBuilder.parse(parser, ParseFieldMatcher.EMPTY, "params", "template");
-        }
-    }
-
     // Relates to #6318
     // Relates to #6318
     public void testSearchRequestFail() throws Exception {
     public void testSearchRequestFail() throws Exception {
         String query = "{ \"query\": {\"match_all\": {}}, \"size\" : \"{{my_size}}\"  }";
         String query = "{ \"query\": {\"match_all\": {}}, \"size\" : \"{{my_size}}\"  }";

+ 5 - 5
modules/lang-mustache/src/test/resources/rest-api-spec/test/lang_mustache/30_template_query_execution.yaml

@@ -18,31 +18,31 @@
 
 
   - do:
   - do:
       search:
       search:
-        body: { "query": { "template": { "query": { "term": { "text": { "value": "{{template}}" } } }, "params": { "template": "value1" } } } }
+        body: { "query": { "template": { "inline": { "term": { "text": { "value": "{{template}}" } } }, "params": { "template": "value1" } } } }
 
 
   - match: { hits.total: 1 }
   - match: { hits.total: 1 }
 
 
   - do:
   - do:
       search: 
       search: 
-        body: { "query": { "template": { "query": {"match_{{template}}": {}}, "params" : { "template" : "all" } } } }
+        body: { "query": { "template": { "inline": {"match_{{template}}": {}}, "params" : { "template" : "all" } } } }
 
 
   - match: { hits.total: 2 }
   - match: { hits.total: 2 }
 
 
   - do:
   - do:
       search:
       search:
-        body: { "query": { "template": { "query": "{ \"term\": { \"text\": { \"value\": \"{{template}}\" } } }", "params": { "template": "value1" } } } }
+        body: { "query": { "template": { "inline": "{ \"term\": { \"text\": { \"value\": \"{{template}}\" } } }", "params": { "template": "value1" } } } }
 
 
   - match: { hits.total: 1 }
   - match: { hits.total: 1 }
 
 
   - do:
   - do:
       search:
       search:
-        body: { "query": { "template": { "query": "{\"match_{{template}}\": {}}", "params" : { "template" : "all" } } } }
+        body: { "query": { "template": { "inline": "{\"match_{{template}}\": {}}", "params" : { "template" : "all" } } } }
 
 
   - match: { hits.total: 2 }
   - match: { hits.total: 2 }
 
 
   - do:
   - do:
       search:
       search:
-        body: { "query": { "template": { "query": "{\"query_string\": { \"query\" : \"{{query}}\" }}", "params" : { "query" : "text:\"value2 value3\"" } } } }
+        body: { "query": { "template": { "inline": "{\"query_string\": { \"query\" : \"{{query}}\" }}", "params" : { "query" : "text:\"value2 value3\"" } } } }
 
 
 
 
   - match: { hits.total: 1 }
   - match: { hits.total: 1 }

+ 1 - 1
modules/lang-mustache/src/test/resources/rest-api-spec/test/lang_mustache/50_messy_test_msearch.yaml

@@ -28,6 +28,6 @@
       msearch:
       msearch:
         body: 
         body: 
           - index: test_1
           - index: test_1
-          - query: { "template": { "query": { "term": { "foo": { "value": "{{template}}" } } }, "params": { "template": "bar" } } }
+          - query: { "template": { "inline": { "term": { "foo": { "value": "{{template}}" } } }, "params": { "template": "bar" } } }
   - match: { responses.0.hits.total: 1 }
   - match: { responses.0.hits.total: 1 }
 
 

+ 8 - 6
modules/lang-painless/src/test/resources/rest-api-spec/test/plan_a/15_update.yaml

@@ -15,11 +15,11 @@
           index:  test_1
           index:  test_1
           type:   test
           type:   test
           id:     1
           id:     1
-          script: "1"
           body:
           body:
-            lang:   painless
-            script: "ctx._source.foo = params.bar"
-            params: { bar: 'xxx' }
+            script:
+              lang:   painless
+              inline: "ctx._source.foo = params.bar"
+              params: { bar: 'xxx' }
 
 
   - match: { _index:   test_1 }
   - match: { _index:   test_1 }
   - match: { _type:    test   }
   - match: { _type:    test   }
@@ -40,8 +40,10 @@
           index:  test_1
           index:  test_1
           type:   test
           type:   test
           id:     1
           id:     1
-          lang:   painless
-          script: "ctx._source.foo = 'yyy'"
+          body:
+            script:
+              lang:   painless
+              inline: "ctx._source.foo = 'yyy'"
 
 
   - match: { _index:   test_1 }
   - match: { _index:   test_1 }
   - match: { _type:    test   }
   - match: { _type:    test   }

+ 12 - 9
modules/lang-painless/src/test/resources/rest-api-spec/test/plan_a/25_script_upsert.yaml

@@ -7,9 +7,10 @@
           type:     test
           type:     test
           id:       1
           id:       1
           body:
           body:
-            script: "ctx._source.foo = params.bar"
-            lang: "painless"
-            params: { bar: 'xxx' }
+            script:
+              inline: "ctx._source.foo = params.bar"
+              lang: "painless"
+              params: { bar: 'xxx' }
             upsert: { foo: baz }
             upsert: { foo: baz }
 
 
   - do:
   - do:
@@ -27,9 +28,10 @@
           type:     test
           type:     test
           id:       1
           id:       1
           body:
           body:
-            script: "ctx._source.foo = params.bar"
-            lang: "painless"
-            params: { bar: 'xxx' }
+            script:
+              inline: "ctx._source.foo = params.bar"
+              lang: "painless"
+              params: { bar: 'xxx' }
             upsert: { foo: baz }
             upsert: { foo: baz }
 
 
   - do:
   - do:
@@ -46,9 +48,10 @@
           type:     test
           type:     test
           id:       2
           id:       2
           body:
           body:
-            script: "ctx._source.foo = params.bar"
-            lang: "painless"
-            params: { bar: 'xxx' }
+            script:
+              inline: "ctx._source.foo = params.bar"
+              lang: "painless"
+              params: { bar: 'xxx' }
             upsert: { foo: baz }
             upsert: { foo: baz }
             scripted_upsert: true
             scripted_upsert: true
 
 

+ 3 - 2
qa/smoke-test-reindex-with-painless/src/test/resources/rest-api-spec/test/reindex/40_search_failures.yaml

@@ -17,8 +17,9 @@
             index:   source
             index:   source
             query:
             query:
               script:
               script:
-                lang: painless
-                script: throw new IllegalArgumentException("Cats!")
+                script:
+                  lang: painless
+                  inline: throw new IllegalArgumentException("Cats!")
           dest:
           dest:
             index:   dest
             index:   dest
   - match: {created: 0}
   - match: {created: 0}

+ 3 - 2
qa/smoke-test-reindex-with-painless/src/test/resources/rest-api-spec/test/update_by_query/40_search_failure.yaml

@@ -16,8 +16,9 @@
         body:
         body:
           query:
           query:
             script:
             script:
-              lang: painless
-              script: throw new IllegalArgumentException("Cats!")
+              script:
+                lang: painless
+                inline: throw new IllegalArgumentException("Cats!")
   - match: {updated: 0}
   - match: {updated: 0}
   - match: {version_conflicts: 0}
   - match: {version_conflicts: 0}
   - match: {batches: 0}
   - match: {batches: 0}

+ 0 - 10
rest-api-spec/src/main/resources/rest-api-spec/api/update.json

@@ -53,16 +53,6 @@
           "type": "string",
           "type": "string",
           "description": "Specific routing value"
           "description": "Specific routing value"
         },
         },
-        "script": {
-          "description": "The URL-encoded script definition (instead of using request body)"
-        },
-        "script_id": {
-          "description": "The id of a stored script"
-        },
-        "scripted_upsert": {
-          "type": "boolean",
-          "description": "True if the script referenced in script or script_id should be called to perform inserts - defaults to false"
-        },
         "timeout": {
         "timeout": {
           "type": "time",
           "type": "time",
           "description": "Explicit operation timeout"
           "description": "Explicit operation timeout"