diff --git a/buildSrc/src/main/groovy/org/elasticsearch/gradle/precommit/PrecommitTasks.groovy b/buildSrc/src/main/groovy/org/elasticsearch/gradle/precommit/PrecommitTasks.groovy
index d82302c84742e..60469622484e5 100644
--- a/buildSrc/src/main/groovy/org/elasticsearch/gradle/precommit/PrecommitTasks.groovy
+++ b/buildSrc/src/main/groovy/org/elasticsearch/gradle/precommit/PrecommitTasks.groovy
@@ -87,6 +87,7 @@ class PrecommitTasks {
dependsOn(buildResources)
signatureFile = buildResources.copy("forbidden/third-party-audit.txt")
javaHome = project.runtimeJavaHome
+ targetCompatibility = project.runtimeJavaVersion
}
return thirdPartyAuditTask
}
diff --git a/buildSrc/src/main/java/org/elasticsearch/gradle/precommit/ThirdPartyAuditTask.java b/buildSrc/src/main/java/org/elasticsearch/gradle/precommit/ThirdPartyAuditTask.java
index d1939d5c65261..7e4766ada6541 100644
--- a/buildSrc/src/main/java/org/elasticsearch/gradle/precommit/ThirdPartyAuditTask.java
+++ b/buildSrc/src/main/java/org/elasticsearch/gradle/precommit/ThirdPartyAuditTask.java
@@ -23,6 +23,7 @@
import org.elasticsearch.test.NamingConventionsCheck;
import org.gradle.api.DefaultTask;
import org.gradle.api.GradleException;
+import org.gradle.api.JavaVersion;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.file.FileCollection;
import org.gradle.api.tasks.Input;
@@ -66,6 +67,17 @@ public class ThirdPartyAuditTask extends DefaultTask {
private String javaHome;
+ private JavaVersion targetCompatibility;
+
+ @Input
+ public JavaVersion getTargetCompatibility() {
+ return targetCompatibility;
+ }
+
+ public void setTargetCompatibility(JavaVersion targetCompatibility) {
+ this.targetCompatibility = targetCompatibility;
+ }
+
@InputFiles
public Configuration getForbiddenAPIsConfiguration() {
return getProject().getConfigurations().getByName("forbiddenApisCliJar");
@@ -157,10 +169,19 @@ public void runThirdPartyAudit() throws IOException {
private void extractJars(FileCollection jars) {
File jarExpandDir = getJarExpandDir();
+ // We need to clean up to make sure old dependencies don't linger
+ getProject().delete(jarExpandDir);
jars.forEach(jar ->
getProject().copy(spec -> {
spec.from(getProject().zipTree(jar));
spec.into(jarExpandDir);
+ // Exclude classes for multi release jars above target
+ for (int i = Integer.parseInt(targetCompatibility.getMajorVersion()) + 1;
+ i <= Integer.parseInt(JavaVersion.VERSION_HIGHER.getMajorVersion());
+ i++
+ ) {
+ spec.exclude("META-INF/versions/" + i + "/**");
+ }
})
);
}
diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/MLRequestConverters.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/MLRequestConverters.java
index 6c1cc20570102..30e79d1dce2fa 100644
--- a/client/rest-high-level/src/main/java/org/elasticsearch/client/MLRequestConverters.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/MLRequestConverters.java
@@ -24,13 +24,14 @@
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.elasticsearch.client.RequestConverters.EndpointBuilder;
+import org.elasticsearch.client.ml.CloseJobRequest;
+import org.elasticsearch.client.ml.DeleteJobRequest;
+import org.elasticsearch.client.ml.GetBucketsRequest;
+import org.elasticsearch.client.ml.GetJobRequest;
+import org.elasticsearch.client.ml.GetRecordsRequest;
+import org.elasticsearch.client.ml.OpenJobRequest;
+import org.elasticsearch.client.ml.PutJobRequest;
import org.elasticsearch.common.Strings;
-import org.elasticsearch.protocol.xpack.ml.CloseJobRequest;
-import org.elasticsearch.protocol.xpack.ml.DeleteJobRequest;
-import org.elasticsearch.protocol.xpack.ml.GetJobRequest;
-import org.elasticsearch.protocol.xpack.ml.GetBucketsRequest;
-import org.elasticsearch.protocol.xpack.ml.OpenJobRequest;
-import org.elasticsearch.protocol.xpack.ml.PutJobRequest;
import java.io.IOException;
@@ -124,4 +125,18 @@ static Request getBuckets(GetBucketsRequest getBucketsRequest) throws IOExceptio
request.setEntity(createEntity(getBucketsRequest, REQUEST_BODY_CONTENT_TYPE));
return request;
}
+
+ static Request getRecords(GetRecordsRequest getRecordsRequest) throws IOException {
+ String endpoint = new EndpointBuilder()
+ .addPathPartAsIs("_xpack")
+ .addPathPartAsIs("ml")
+ .addPathPartAsIs("anomaly_detectors")
+ .addPathPart(getRecordsRequest.getJobId())
+ .addPathPartAsIs("results")
+ .addPathPartAsIs("records")
+ .build();
+ Request request = new Request(HttpGet.METHOD_NAME, endpoint);
+ request.setEntity(createEntity(getRecordsRequest, REQUEST_BODY_CONTENT_TYPE));
+ return request;
+ }
}
diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/MachineLearningClient.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/MachineLearningClient.java
index c4dcc1eaffc5a..a972f760d2fde 100644
--- a/client/rest-high-level/src/main/java/org/elasticsearch/client/MachineLearningClient.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/MachineLearningClient.java
@@ -19,18 +19,20 @@
package org.elasticsearch.client;
import org.elasticsearch.action.ActionListener;
-import org.elasticsearch.protocol.xpack.ml.CloseJobRequest;
-import org.elasticsearch.protocol.xpack.ml.CloseJobResponse;
-import org.elasticsearch.protocol.xpack.ml.DeleteJobRequest;
-import org.elasticsearch.protocol.xpack.ml.DeleteJobResponse;
-import org.elasticsearch.protocol.xpack.ml.GetBucketsRequest;
-import org.elasticsearch.protocol.xpack.ml.GetBucketsResponse;
-import org.elasticsearch.protocol.xpack.ml.GetJobRequest;
-import org.elasticsearch.protocol.xpack.ml.GetJobResponse;
-import org.elasticsearch.protocol.xpack.ml.OpenJobRequest;
-import org.elasticsearch.protocol.xpack.ml.OpenJobResponse;
-import org.elasticsearch.protocol.xpack.ml.PutJobRequest;
-import org.elasticsearch.protocol.xpack.ml.PutJobResponse;
+import org.elasticsearch.client.ml.CloseJobRequest;
+import org.elasticsearch.client.ml.CloseJobResponse;
+import org.elasticsearch.client.ml.DeleteJobRequest;
+import org.elasticsearch.client.ml.DeleteJobResponse;
+import org.elasticsearch.client.ml.GetBucketsRequest;
+import org.elasticsearch.client.ml.GetBucketsResponse;
+import org.elasticsearch.client.ml.GetJobRequest;
+import org.elasticsearch.client.ml.GetJobResponse;
+import org.elasticsearch.client.ml.GetRecordsRequest;
+import org.elasticsearch.client.ml.GetRecordsResponse;
+import org.elasticsearch.client.ml.OpenJobRequest;
+import org.elasticsearch.client.ml.OpenJobResponse;
+import org.elasticsearch.client.ml.PutJobRequest;
+import org.elasticsearch.client.ml.PutJobResponse;
import java.io.IOException;
import java.util.Collections;
@@ -56,9 +58,9 @@ public final class MachineLearningClient {
* For additional info
* see ML PUT job documentation
*
- * @param request The PutJobRequest containing the {@link org.elasticsearch.protocol.xpack.ml.job.config.Job} settings
+ * @param request The PutJobRequest containing the {@link org.elasticsearch.client.ml.job.config.Job} settings
* @param options Additional request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized
- * @return PutJobResponse with enclosed {@link org.elasticsearch.protocol.xpack.ml.job.config.Job} object
+ * @return PutJobResponse with enclosed {@link org.elasticsearch.client.ml.job.config.Job} object
* @throws IOException when there is a serialization issue sending the request or receiving the response
*/
public PutJobResponse putJob(PutJobRequest request, RequestOptions options) throws IOException {
@@ -75,7 +77,7 @@ public PutJobResponse putJob(PutJobRequest request, RequestOptions options) thro
* For additional info
* see ML PUT job documentation
*
- * @param request The request containing the {@link org.elasticsearch.protocol.xpack.ml.job.config.Job} settings
+ * @param request The request containing the {@link org.elasticsearch.client.ml.job.config.Job} settings
* @param options Additional request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized
* @param listener Listener to be notified upon request completion
*/
@@ -98,7 +100,7 @@ public void putJobAsync(PutJobRequest request, RequestOptions options, ActionLis
* @param request {@link GetJobRequest} Request containing a list of jobId(s) and additional options
* @param options Additional request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized
* @return {@link GetJobResponse} response object containing
- * the {@link org.elasticsearch.protocol.xpack.ml.job.config.Job} objects and the number of jobs found
+ * the {@link org.elasticsearch.client.ml.job.config.Job} objects and the number of jobs found
* @throws IOException when there is a serialization issue sending the request or receiving the response
*/
public GetJobResponse getJob(GetJobRequest request, RequestOptions options) throws IOException {
@@ -285,4 +287,40 @@ public void getBucketsAsync(GetBucketsRequest request, RequestOptions options, A
listener,
Collections.emptySet());
}
+
+ /**
+ * Gets the records for a Machine Learning Job.
+ *
+ * For additional info
+ * see ML GET records documentation
+ *
+ * @param request the request
+ * @param options Additional request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized
+ */
+ public GetRecordsResponse getRecords(GetRecordsRequest request, RequestOptions options) throws IOException {
+ return restHighLevelClient.performRequestAndParseEntity(request,
+ MLRequestConverters::getRecords,
+ options,
+ GetRecordsResponse::fromXContent,
+ Collections.emptySet());
+ }
+
+ /**
+ * Gets the records for a Machine Learning Job, notifies listener once the requested records are retrieved.
+ *
+ * For additional info
+ * see ML GET records documentation
+ *
+ * @param request the request
+ * @param options Additional request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized
+ * @param listener Listener to be notified upon request completion
+ */
+ public void getRecordsAsync(GetRecordsRequest request, RequestOptions options, ActionListener listener) {
+ restHighLevelClient.performRequestAsyncAndParseEntity(request,
+ MLRequestConverters::getRecords,
+ options,
+ GetRecordsResponse::fromXContent,
+ listener,
+ Collections.emptySet());
+ }
}
diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java
index 9dd316a0fb023..15bbde6b5bfae 100644
--- a/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java
@@ -106,6 +106,7 @@
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.VersionType;
import org.elasticsearch.index.rankeval.RankEvalRequest;
+import org.elasticsearch.index.reindex.ReindexRequest;
import org.elasticsearch.protocol.xpack.XPackInfoRequest;
import org.elasticsearch.protocol.xpack.XPackUsageRequest;
import org.elasticsearch.protocol.xpack.license.DeleteLicenseRequest;
@@ -820,6 +821,21 @@ static Request clusterHealth(ClusterHealthRequest healthRequest) {
return request;
}
+ static Request reindex(ReindexRequest reindexRequest) throws IOException {
+ String endpoint = new EndpointBuilder().addPathPart("_reindex").build();
+ Request request = new Request(HttpPost.METHOD_NAME, endpoint);
+ Params params = new Params(request)
+ .withRefresh(reindexRequest.isRefresh())
+ .withTimeout(reindexRequest.getTimeout())
+ .withWaitForActiveShards(reindexRequest.getWaitForActiveShards());
+
+ if (reindexRequest.getScrollTime() != null) {
+ params.putParam("scroll", reindexRequest.getScrollTime());
+ }
+ request.setEntity(createEntity(reindexRequest, REQUEST_BODY_CONTENT_TYPE));
+ return request;
+ }
+
static Request rollover(RolloverRequest rolloverRequest) throws IOException {
String endpoint = new EndpointBuilder().addPathPart(rolloverRequest.getAlias()).addPathPartAsIs("_rollover")
.addPathPart(rolloverRequest.getNewIndexName()).build();
diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java
index c45ec048ae8bd..4ac5bfd080f18 100644
--- a/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java
@@ -64,6 +64,8 @@
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.rankeval.RankEvalRequest;
import org.elasticsearch.index.rankeval.RankEvalResponse;
+import org.elasticsearch.index.reindex.BulkByScrollResponse;
+import org.elasticsearch.index.reindex.ReindexRequest;
import org.elasticsearch.plugins.spi.NamedXContentProvider;
import org.elasticsearch.rest.BytesRestResponse;
import org.elasticsearch.rest.RestStatus;
@@ -395,6 +397,33 @@ public final void bulkAsync(BulkRequest bulkRequest, RequestOptions options, Act
performRequestAsyncAndParseEntity(bulkRequest, RequestConverters::bulk, options, BulkResponse::fromXContent, listener, emptySet());
}
+ /**
+ * Executes a reindex request.
+ * See Reindex API on elastic.co
+ * @param reindexRequest the request
+ * @param options the request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized
+ * @return the response
+ * @throws IOException in case there is a problem sending the request or parsing back the response
+ */
+ public final BulkByScrollResponse reindex(ReindexRequest reindexRequest, RequestOptions options) throws IOException {
+ return performRequestAndParseEntity(
+ reindexRequest, RequestConverters::reindex, options, BulkByScrollResponse::fromXContent, emptySet()
+ );
+ }
+
+ /**
+ * Asynchronously executes a reindex request.
+ * See Reindex API on elastic.co
+ * @param reindexRequest the request
+ * @param options the request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized
+ * @param listener the listener to be notified upon request completion
+ */
+ public final void reindexAsync(ReindexRequest reindexRequest, RequestOptions options, ActionListener listener) {
+ performRequestAsyncAndParseEntity(
+ reindexRequest, RequestConverters::reindex, options, BulkByScrollResponse::fromXContent, listener, emptySet()
+ );
+ }
+
/**
* Pings the remote Elasticsearch cluster and returns true if the ping succeeded, false otherwise
* @param options the request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized
diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/TimedRequest.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/TimedRequest.java
new file mode 100644
index 0000000000000..af8fbe3e72b37
--- /dev/null
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/TimedRequest.java
@@ -0,0 +1,56 @@
+/*
+ * 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.client;
+
+import org.elasticsearch.common.unit.TimeValue;
+
+/**
+ * A base request for any requests that supply timeouts.
+ *
+ * Please note, any requests that use a ackTimeout should set timeout as they
+ * represent the same backing field on the server.
+ */
+public class TimedRequest implements Validatable {
+
+ private TimeValue timeout;
+ private TimeValue masterTimeout;
+
+ public void setTimeout(TimeValue timeout) {
+ this.timeout = timeout;
+
+ }
+
+ public void setMasterTimeout(TimeValue masterTimeout) {
+ this.masterTimeout = masterTimeout;
+ }
+
+ /**
+ * Returns the request timeout
+ */
+ public TimeValue timeout() {
+ return timeout;
+ }
+
+ /**
+ * Returns the timeout for the request to be completed on the master node
+ */
+ public TimeValue masterNodeTimeout() {
+ return masterTimeout;
+ }
+}
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/AbstractResultResponse.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/AbstractResultResponse.java
similarity index 98%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/AbstractResultResponse.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/AbstractResultResponse.java
index 64f350933c9c4..1b609797dd6fe 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/AbstractResultResponse.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/AbstractResultResponse.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
import org.elasticsearch.action.ActionResponse;
import org.elasticsearch.common.ParseField;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/CloseJobRequest.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/CloseJobRequest.java
similarity index 99%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/CloseJobRequest.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/CloseJobRequest.java
index 38f924163061a..19f3df8e4320f 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/CloseJobRequest.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/CloseJobRequest.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
import org.elasticsearch.action.ActionRequest;
import org.elasticsearch.action.ActionRequestValidationException;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/CloseJobResponse.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/CloseJobResponse.java
similarity index 98%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/CloseJobResponse.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/CloseJobResponse.java
index 1b8ff3ca7d4d4..2ac1e0faee34f 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/CloseJobResponse.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/CloseJobResponse.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
import org.elasticsearch.action.ActionResponse;
import org.elasticsearch.common.ParseField;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/DeleteJobRequest.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/DeleteJobRequest.java
similarity index 98%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/DeleteJobRequest.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/DeleteJobRequest.java
index 9f265fd20a8c9..a355f7ec659bb 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/DeleteJobRequest.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/DeleteJobRequest.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
import org.elasticsearch.action.ActionRequest;
import org.elasticsearch.action.ActionRequestValidationException;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/DeleteJobResponse.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/DeleteJobResponse.java
similarity index 97%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/DeleteJobResponse.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/DeleteJobResponse.java
index 795eb784aaff5..86cafd9e09315 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/DeleteJobResponse.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/DeleteJobResponse.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.common.xcontent.XContentParser;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/GetBucketsRequest.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetBucketsRequest.java
similarity index 97%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/GetBucketsRequest.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetBucketsRequest.java
index 4957f9b6ff6e7..f50d92d58dda5 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/GetBucketsRequest.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetBucketsRequest.java
@@ -16,17 +16,17 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
import org.elasticsearch.action.ActionRequest;
import org.elasticsearch.action.ActionRequestValidationException;
+import org.elasticsearch.client.ml.job.config.Job;
+import org.elasticsearch.client.ml.job.results.Result;
+import org.elasticsearch.client.ml.job.util.PageParams;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.xcontent.ObjectParser;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
-import org.elasticsearch.protocol.xpack.ml.job.config.Job;
-import org.elasticsearch.protocol.xpack.ml.job.results.Result;
-import org.elasticsearch.protocol.xpack.ml.job.util.PageParams;
import java.io.IOException;
import java.util.Objects;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/GetBucketsResponse.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetBucketsResponse.java
similarity index 95%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/GetBucketsResponse.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetBucketsResponse.java
index 4350661f68b33..de8736b86d925 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/GetBucketsResponse.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetBucketsResponse.java
@@ -16,12 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
+import org.elasticsearch.client.ml.job.results.Bucket;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
import org.elasticsearch.common.xcontent.XContentParser;
-import org.elasticsearch.protocol.xpack.ml.job.results.Bucket;
import java.io.IOException;
import java.util.List;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/GetJobRequest.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetJobRequest.java
similarity index 93%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/GetJobRequest.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetJobRequest.java
index c3c14726505cf..3de7037e5c8f3 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/GetJobRequest.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetJobRequest.java
@@ -16,10 +16,11 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
import org.elasticsearch.action.ActionRequest;
import org.elasticsearch.action.ActionRequestValidationException;
+import org.elasticsearch.client.ml.job.config.Job;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
import org.elasticsearch.common.xcontent.ToXContentObject;
@@ -32,7 +33,7 @@
import java.util.Objects;
/**
- * Request object to get {@link org.elasticsearch.protocol.xpack.ml.job.config.Job} objects with the matching `jobId`s or
+ * Request object to get {@link Job} objects with the matching `jobId`s or
* `groupName`s.
*
* `_all` explicitly gets all the jobs in the cluster
@@ -66,7 +67,7 @@ public static GetJobRequest getAllJobsRequest() {
}
/**
- * Get the specified {@link org.elasticsearch.protocol.xpack.ml.job.config.Job} configurations via their unique jobIds
+ * Get the specified {@link Job} configurations via their unique jobIds
* @param jobIds must not contain any null values
*/
public GetJobRequest(String... jobIds) {
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/GetJobResponse.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetJobResponse.java
similarity index 96%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/GetJobResponse.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetJobResponse.java
index 4db542dc1526d..0cdf08c6c24a4 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/GetJobResponse.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetJobResponse.java
@@ -16,13 +16,13 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
+import org.elasticsearch.client.ml.job.config.Job;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
import org.elasticsearch.common.xcontent.XContentParser;
-import org.elasticsearch.protocol.xpack.ml.job.config.Job;
import java.io.IOException;
import java.util.List;
diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetRecordsRequest.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetRecordsRequest.java
new file mode 100644
index 0000000000000..0a701f5a1433a
--- /dev/null
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetRecordsRequest.java
@@ -0,0 +1,222 @@
+/*
+ * 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.client.ml;
+
+import org.elasticsearch.client.Validatable;
+import org.elasticsearch.client.ml.job.config.Job;
+import org.elasticsearch.client.ml.job.util.PageParams;
+import org.elasticsearch.common.ParseField;
+import org.elasticsearch.common.xcontent.ObjectParser;
+import org.elasticsearch.common.xcontent.ToXContentObject;
+import org.elasticsearch.common.xcontent.XContentBuilder;
+
+import java.io.IOException;
+import java.util.Objects;
+
+/**
+ * A request to retrieve records of a given job
+ */
+public class GetRecordsRequest implements ToXContentObject, Validatable {
+
+ public static final ParseField EXCLUDE_INTERIM = new ParseField("exclude_interim");
+ public static final ParseField START = new ParseField("start");
+ public static final ParseField END = new ParseField("end");
+ public static final ParseField RECORD_SCORE = new ParseField("record_score");
+ public static final ParseField SORT = new ParseField("sort");
+ public static final ParseField DESCENDING = new ParseField("desc");
+
+ public static final ObjectParser PARSER = new ObjectParser<>("get_buckets_request", GetRecordsRequest::new);
+
+ static {
+ PARSER.declareString((request, jobId) -> request.jobId = jobId, Job.ID);
+ PARSER.declareBoolean(GetRecordsRequest::setExcludeInterim, EXCLUDE_INTERIM);
+ PARSER.declareStringOrNull(GetRecordsRequest::setStart, START);
+ PARSER.declareStringOrNull(GetRecordsRequest::setEnd, END);
+ PARSER.declareObject(GetRecordsRequest::setPageParams, PageParams.PARSER, PageParams.PAGE);
+ PARSER.declareDouble(GetRecordsRequest::setRecordScore, RECORD_SCORE);
+ PARSER.declareString(GetRecordsRequest::setSort, SORT);
+ PARSER.declareBoolean(GetRecordsRequest::setDescending, DESCENDING);
+ }
+
+ private String jobId;
+ private Boolean excludeInterim;
+ private String start;
+ private String end;
+ private PageParams pageParams;
+ private Double recordScore;
+ private String sort;
+ private Boolean descending;
+
+ private GetRecordsRequest() {}
+
+ /**
+ * Constructs a request to retrieve records of a given job
+ * @param jobId id of the job to retrieve records of
+ */
+ public GetRecordsRequest(String jobId) {
+ this.jobId = Objects.requireNonNull(jobId);
+ }
+
+ public String getJobId() {
+ return jobId;
+ }
+
+ public boolean isExcludeInterim() {
+ return excludeInterim;
+ }
+
+ /**
+ * Sets the value of "exclude_interim".
+ * When {@code true}, interim records will be filtered out.
+ * @param excludeInterim value of "exclude_interim" to be set
+ */
+ public void setExcludeInterim(boolean excludeInterim) {
+ this.excludeInterim = excludeInterim;
+ }
+
+ public String getStart() {
+ return start;
+ }
+
+ /**
+ * Sets the value of "start" which is a timestamp.
+ * Only records whose timestamp is on or after the "start" value will be returned.
+ * @param start value of "start" to be set
+ */
+ public void setStart(String start) {
+ this.start = start;
+ }
+
+ public String getEnd() {
+ return end;
+ }
+
+ /**
+ * Sets the value of "end" which is a timestamp.
+ * Only records whose timestamp is before the "end" value will be returned.
+ * @param end value of "end" to be set
+ */
+ public void setEnd(String end) {
+ this.end = end;
+ }
+
+ public PageParams getPageParams() {
+ return pageParams;
+ }
+
+ /**
+ * Sets the paging parameters
+ * @param pageParams The paging parameters
+ */
+ public void setPageParams(PageParams pageParams) {
+ this.pageParams = pageParams;
+ }
+
+ public Double getRecordScore() {
+ return recordScore;
+ }
+
+ /**
+ * Sets the value of "record_score".
+ * Only records with "record_score" equal or greater will be returned.
+ * @param recordScore value of "record_score".
+ */
+ public void setRecordScore(double recordScore) {
+ this.recordScore = recordScore;
+ }
+
+ public String getSort() {
+ return sort;
+ }
+
+ /**
+ * Sets the value of "sort".
+ * Specifies the bucket field to sort on.
+ * @param sort value of "sort".
+ */
+ public void setSort(String sort) {
+ this.sort = sort;
+ }
+
+ public boolean isDescending() {
+ return descending;
+ }
+
+ /**
+ * Sets the value of "desc".
+ * Specifies the sorting order.
+ * @param descending value of "desc"
+ */
+ public void setDescending(boolean descending) {
+ this.descending = descending;
+ }
+
+ @Override
+ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
+ builder.startObject();
+ builder.field(Job.ID.getPreferredName(), jobId);
+ if (excludeInterim != null) {
+ builder.field(EXCLUDE_INTERIM.getPreferredName(), excludeInterim);
+ }
+ if (start != null) {
+ builder.field(START.getPreferredName(), start);
+ }
+ if (end != null) {
+ builder.field(END.getPreferredName(), end);
+ }
+ if (pageParams != null) {
+ builder.field(PageParams.PAGE.getPreferredName(), pageParams);
+ }
+ if (recordScore != null) {
+ builder.field(RECORD_SCORE.getPreferredName(), recordScore);
+ }
+ if (sort != null) {
+ builder.field(SORT.getPreferredName(), sort);
+ }
+ if (descending != null) {
+ builder.field(DESCENDING.getPreferredName(), descending);
+ }
+ builder.endObject();
+ return builder;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(jobId, excludeInterim, recordScore, pageParams, start, end, sort, descending);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ GetRecordsRequest other = (GetRecordsRequest) obj;
+ return Objects.equals(jobId, other.jobId) &&
+ Objects.equals(excludeInterim, other.excludeInterim) &&
+ Objects.equals(recordScore, other.recordScore) &&
+ Objects.equals(pageParams, other.pageParams) &&
+ Objects.equals(start, other.start) &&
+ Objects.equals(end, other.end) &&
+ Objects.equals(sort, other.sort) &&
+ Objects.equals(descending, other.descending);
+ }
+}
diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetRecordsResponse.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetRecordsResponse.java
new file mode 100644
index 0000000000000..99e1152422609
--- /dev/null
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetRecordsResponse.java
@@ -0,0 +1,78 @@
+/*
+ * 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.client.ml;
+
+import org.elasticsearch.client.ml.job.results.AnomalyRecord;
+import org.elasticsearch.common.ParseField;
+import org.elasticsearch.common.xcontent.ConstructingObjectParser;
+import org.elasticsearch.common.xcontent.XContentParser;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * A response containing the requested buckets
+ */
+public class GetRecordsResponse extends AbstractResultResponse {
+
+ public static final ParseField RECORDS = new ParseField("records");
+
+ @SuppressWarnings("unchecked")
+ public static final ConstructingObjectParser PARSER = new ConstructingObjectParser<>("get_records_response",
+ true, a -> new GetRecordsResponse((List) a[0], (long) a[1]));
+
+ static {
+ PARSER.declareObjectArray(ConstructingObjectParser.constructorArg(), AnomalyRecord.PARSER, RECORDS);
+ PARSER.declareLong(ConstructingObjectParser.constructorArg(), COUNT);
+ }
+
+ public static GetRecordsResponse fromXContent(XContentParser parser) throws IOException {
+ return PARSER.parse(parser, null);
+ }
+
+ GetRecordsResponse(List buckets, long count) {
+ super(RECORDS, buckets, count);
+ }
+
+ /**
+ * The retrieved records
+ * @return the retrieved records
+ */
+ public List records() {
+ return results;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(count, results);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ GetRecordsResponse other = (GetRecordsResponse) obj;
+ return count == other.count && Objects.equals(results, other.results);
+ }
+}
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/OpenJobRequest.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/OpenJobRequest.java
similarity index 93%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/OpenJobRequest.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/OpenJobRequest.java
index 658c7d38503e3..5b8e68cd72dc3 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/OpenJobRequest.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/OpenJobRequest.java
@@ -16,19 +16,18 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
import org.elasticsearch.action.ActionRequest;
import org.elasticsearch.action.ActionRequestValidationException;
+import org.elasticsearch.client.ml.job.config.Job;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
-import org.elasticsearch.common.xcontent.ToXContent;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
-import org.elasticsearch.protocol.xpack.ml.job.config.Job;
import java.io.IOException;
import java.util.Objects;
@@ -95,7 +94,7 @@ public ActionRequestValidationException validate() {
}
@Override
- public XContentBuilder toXContent(XContentBuilder builder, ToXContent.Params params) throws IOException {
+ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject();
builder.field(Job.ID.getPreferredName(), jobId);
if (timeout != null) {
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/OpenJobResponse.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/OpenJobResponse.java
similarity index 98%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/OpenJobResponse.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/OpenJobResponse.java
index 3a1e477980439..2536aeeaf78bb 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/OpenJobResponse.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/OpenJobResponse.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
import org.elasticsearch.action.ActionResponse;
import org.elasticsearch.common.ParseField;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/PutJobRequest.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/PutJobRequest.java
similarity index 95%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/PutJobRequest.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/PutJobRequest.java
index bc3fd778c1bd8..de8529de6bb8a 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/PutJobRequest.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/PutJobRequest.java
@@ -16,14 +16,14 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
import org.elasticsearch.action.ActionRequest;
import org.elasticsearch.action.ActionRequestValidationException;
+import org.elasticsearch.client.ml.job.config.Job;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
-import org.elasticsearch.protocol.xpack.ml.job.config.Job;
import java.io.IOException;
import java.util.Objects;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/PutJobResponse.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/PutJobResponse.java
similarity index 88%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/PutJobResponse.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/PutJobResponse.java
index 3fa1b30dd3ebe..6e6cce52e58c2 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/PutJobResponse.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/PutJobResponse.java
@@ -16,13 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
-import org.elasticsearch.common.xcontent.ToXContent;
+import org.elasticsearch.client.ml.job.config.Job;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
-import org.elasticsearch.protocol.xpack.ml.job.config.Job;
import java.io.IOException;
import java.util.Objects;
@@ -47,7 +46,7 @@ public Job getResponse() {
}
@Override
- public XContentBuilder toXContent(XContentBuilder builder, ToXContent.Params params) throws IOException {
+ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
job.toXContent(builder, params);
return builder;
}
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/datafeed/ChunkingConfig.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/datafeed/ChunkingConfig.java
similarity index 98%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/datafeed/ChunkingConfig.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/datafeed/ChunkingConfig.java
index 0b9d9f1204614..10e7b3f974941 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/datafeed/ChunkingConfig.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/datafeed/ChunkingConfig.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.datafeed;
+package org.elasticsearch.client.ml.datafeed;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.ParseField;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/datafeed/DatafeedConfig.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/datafeed/DatafeedConfig.java
similarity index 99%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/datafeed/DatafeedConfig.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/datafeed/DatafeedConfig.java
index 929d4dacb90fa..752752b103885 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/datafeed/DatafeedConfig.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/datafeed/DatafeedConfig.java
@@ -16,8 +16,9 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.datafeed;
+package org.elasticsearch.client.ml.datafeed;
+import org.elasticsearch.client.ml.job.config.Job;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
@@ -27,7 +28,6 @@
import org.elasticsearch.index.query.AbstractQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
-import org.elasticsearch.protocol.xpack.ml.job.config.Job;
import org.elasticsearch.search.aggregations.AggregatorFactories;
import org.elasticsearch.search.builder.SearchSourceBuilder;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/datafeed/DatafeedUpdate.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/datafeed/DatafeedUpdate.java
similarity index 99%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/datafeed/DatafeedUpdate.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/datafeed/DatafeedUpdate.java
index 787bdf06e5ec2..184d5d51481fa 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/datafeed/DatafeedUpdate.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/datafeed/DatafeedUpdate.java
@@ -16,8 +16,9 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.datafeed;
+package org.elasticsearch.client.ml.datafeed;
+import org.elasticsearch.client.ml.job.config.Job;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
@@ -26,7 +27,6 @@
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.query.AbstractQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
-import org.elasticsearch.protocol.xpack.ml.job.config.Job;
import org.elasticsearch.search.aggregations.AggregatorFactories;
import org.elasticsearch.search.builder.SearchSourceBuilder;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/AnalysisConfig.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/AnalysisConfig.java
similarity index 99%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/AnalysisConfig.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/AnalysisConfig.java
index 7baaae52a8bfa..9b759599dda3c 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/AnalysisConfig.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/AnalysisConfig.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.unit.TimeValue;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/AnalysisLimits.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/AnalysisLimits.java
similarity index 98%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/AnalysisLimits.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/AnalysisLimits.java
index f69b9ccbf9ff4..22d26f06fd8ce 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/AnalysisLimits.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/AnalysisLimits.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.ParseField;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/CategorizationAnalyzerConfig.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/CategorizationAnalyzerConfig.java
similarity index 99%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/CategorizationAnalyzerConfig.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/CategorizationAnalyzerConfig.java
index dc7f047b80404..3a2243d6548fd 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/CategorizationAnalyzerConfig.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/CategorizationAnalyzerConfig.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.Strings;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/DataDescription.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/DataDescription.java
similarity index 99%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/DataDescription.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/DataDescription.java
index a3f8c2563b2d8..636b8c6ad5014 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/DataDescription.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/DataDescription.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.xcontent.ObjectParser;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/DefaultDetectorDescription.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/DefaultDetectorDescription.java
similarity index 98%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/DefaultDetectorDescription.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/DefaultDetectorDescription.java
index 081e685fc741b..25b4fbbb2a7ee 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/DefaultDetectorDescription.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/DefaultDetectorDescription.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.Strings;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/DetectionRule.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/DetectionRule.java
similarity index 98%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/DetectionRule.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/DetectionRule.java
index 9a73afe885b1c..bcba8a7d74a61 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/DetectionRule.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/DetectionRule.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.xcontent.ObjectParser;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/Detector.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/Detector.java
similarity index 99%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/Detector.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/Detector.java
index 042d48b700688..e1af60269b52b 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/Detector.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/Detector.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.xcontent.ObjectParser;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/DetectorFunction.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/DetectorFunction.java
similarity index 97%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/DetectorFunction.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/DetectorFunction.java
index 5d9a06948d0fb..932782101ba7c 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/DetectorFunction.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/DetectorFunction.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import java.util.Arrays;
import java.util.Collections;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/FilterRef.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/FilterRef.java
similarity index 98%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/FilterRef.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/FilterRef.java
index 9afbdf4876fd8..b686ad92ae533 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/FilterRef.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/FilterRef.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/Job.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/Job.java
similarity index 99%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/Job.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/Job.java
index 59840cfec2ae0..aff74271f1c0b 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/Job.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/Job.java
@@ -16,8 +16,9 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
+import org.elasticsearch.client.ml.job.util.TimeUtil;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.unit.TimeValue;
@@ -25,7 +26,6 @@
import org.elasticsearch.common.xcontent.ObjectParser.ValueType;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
-import org.elasticsearch.protocol.xpack.ml.job.util.TimeUtil;
import java.io.IOException;
import java.util.Collections;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/MlFilter.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/MlFilter.java
similarity index 98%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/MlFilter.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/MlFilter.java
index bcbc0c295c2d5..e0d1bd0849b3b 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/MlFilter.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/MlFilter.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.ParseField;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/ModelPlotConfig.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/ModelPlotConfig.java
similarity index 98%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/ModelPlotConfig.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/ModelPlotConfig.java
index 59b0252a7660e..b39db054b308b 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/ModelPlotConfig.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/ModelPlotConfig.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/Operator.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/Operator.java
similarity index 97%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/Operator.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/Operator.java
index c3dc52e5a3cb9..37d6275203560 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/Operator.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/Operator.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.ParseField;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/RuleAction.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/RuleAction.java
similarity index 95%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/RuleAction.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/RuleAction.java
index 9e2364b4fd960..05b6ef6e19754 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/RuleAction.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/RuleAction.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import java.util.Locale;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/RuleCondition.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/RuleCondition.java
similarity index 98%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/RuleCondition.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/RuleCondition.java
index ec19547fe13be..14389809bd2fa 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/RuleCondition.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/RuleCondition.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/RuleScope.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/RuleScope.java
similarity index 89%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/RuleScope.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/RuleScope.java
index aa12d5ea2a2bd..8b6886d582524 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/config/RuleScope.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/config/RuleScope.java
@@ -16,11 +16,11 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.xcontent.ContextParser;
-import org.elasticsearch.common.xcontent.LoggingDeprecationHandler;
+import org.elasticsearch.common.xcontent.DeprecationHandler;
import org.elasticsearch.common.xcontent.NamedXContentRegistry;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
@@ -50,7 +50,7 @@ public static ContextParser parser() {
Map value = (Map) entry.getValue();
builder.map(value);
try (XContentParser scopeParser = XContentFactory.xContent(builder.contentType()).createParser(
- NamedXContentRegistry.EMPTY, LoggingDeprecationHandler.INSTANCE, Strings.toString(builder))) {
+ NamedXContentRegistry.EMPTY, DEPRECATION_HANDLER, Strings.toString(builder))) {
scope.put(entry.getKey(), FilterRef.PARSER.parse(scopeParser, null));
}
}
@@ -59,6 +59,15 @@ public static ContextParser parser() {
};
}
+ private static final DeprecationHandler DEPRECATION_HANDLER = new DeprecationHandler() {
+
+ @Override
+ public void usedDeprecatedName(String usedName, String modernName) {}
+
+ @Override
+ public void usedDeprecatedField(String usedName, String replacedWith) {}
+ };
+
private final Map scope;
public RuleScope() {
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/process/DataCounts.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/process/DataCounts.java
similarity index 98%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/process/DataCounts.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/process/DataCounts.java
index e07312d12e1f4..7afef0785fe38 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/process/DataCounts.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/process/DataCounts.java
@@ -16,15 +16,15 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.process;
+package org.elasticsearch.client.ml.job.process;
+import org.elasticsearch.client.ml.job.config.Job;
+import org.elasticsearch.client.ml.job.util.TimeUtil;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
import org.elasticsearch.common.xcontent.ObjectParser.ValueType;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
-import org.elasticsearch.protocol.xpack.ml.job.config.Job;
-import org.elasticsearch.protocol.xpack.ml.job.util.TimeUtil;
import java.io.IOException;
import java.util.Date;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/process/ModelSizeStats.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/process/ModelSizeStats.java
similarity index 97%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/process/ModelSizeStats.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/process/ModelSizeStats.java
index 50f655b4dd7f1..c9a34fe5c98d9 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/process/ModelSizeStats.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/process/ModelSizeStats.java
@@ -16,16 +16,16 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.process;
+package org.elasticsearch.client.ml.job.process;
+import org.elasticsearch.client.ml.job.config.Job;
+import org.elasticsearch.client.ml.job.results.Result;
+import org.elasticsearch.client.ml.job.util.TimeUtil;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
import org.elasticsearch.common.xcontent.ObjectParser.ValueType;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
-import org.elasticsearch.protocol.xpack.ml.job.config.Job;
-import org.elasticsearch.protocol.xpack.ml.job.results.Result;
-import org.elasticsearch.protocol.xpack.ml.job.util.TimeUtil;
import java.io.IOException;
import java.util.Date;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/process/ModelSnapshot.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/process/ModelSnapshot.java
similarity index 98%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/process/ModelSnapshot.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/process/ModelSnapshot.java
index ea5f016993101..603bff0d90653 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/process/ModelSnapshot.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/process/ModelSnapshot.java
@@ -16,16 +16,16 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.process;
+package org.elasticsearch.client.ml.job.process;
import org.elasticsearch.Version;
+import org.elasticsearch.client.ml.job.config.Job;
+import org.elasticsearch.client.ml.job.util.TimeUtil;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.xcontent.ObjectParser;
import org.elasticsearch.common.xcontent.ObjectParser.ValueType;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
-import org.elasticsearch.protocol.xpack.ml.job.config.Job;
-import org.elasticsearch.protocol.xpack.ml.job.util.TimeUtil;
import java.io.IOException;
import java.util.Date;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/process/Quantiles.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/process/Quantiles.java
similarity index 96%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/process/Quantiles.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/process/Quantiles.java
index 1c047d6c30284..795028847a0be 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/process/Quantiles.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/process/Quantiles.java
@@ -16,14 +16,14 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.process;
+package org.elasticsearch.client.ml.job.process;
+import org.elasticsearch.client.ml.job.config.Job;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
import org.elasticsearch.common.xcontent.ObjectParser.ValueType;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
-import org.elasticsearch.protocol.xpack.ml.job.config.Job;
import java.io.IOException;
import java.util.Date;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/AnomalyCause.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/AnomalyCause.java
similarity index 99%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/AnomalyCause.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/AnomalyCause.java
index 7ad57b24fcbdc..4fbe5ac1ff381 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/AnomalyCause.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/AnomalyCause.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.results;
+package org.elasticsearch.client.ml.job.results;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.xcontent.ObjectParser;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/AnomalyRecord.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/AnomalyRecord.java
similarity index 99%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/AnomalyRecord.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/AnomalyRecord.java
index 4747f3a48bdc8..db4483fef4bfd 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/AnomalyRecord.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/AnomalyRecord.java
@@ -16,8 +16,9 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.results;
+package org.elasticsearch.client.ml.job.results;
+import org.elasticsearch.client.ml.job.config.Job;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.time.DateFormatters;
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
@@ -25,7 +26,6 @@
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser.Token;
-import org.elasticsearch.protocol.xpack.ml.job.config.Job;
import java.io.IOException;
import java.time.format.DateTimeFormatter;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/Bucket.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/Bucket.java
similarity index 98%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/Bucket.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/Bucket.java
index cbaf83abbad40..2dfed4c383403 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/Bucket.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/Bucket.java
@@ -16,8 +16,9 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.results;
+package org.elasticsearch.client.ml.job.results;
+import org.elasticsearch.client.ml.job.config.Job;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.time.DateFormatters;
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
@@ -25,7 +26,6 @@
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser.Token;
-import org.elasticsearch.protocol.xpack.ml.job.config.Job;
import java.io.IOException;
import java.time.format.DateTimeFormatter;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/BucketInfluencer.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/BucketInfluencer.java
similarity index 98%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/BucketInfluencer.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/BucketInfluencer.java
index 29d8447cd6a37..6fc2a9b8b2d54 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/BucketInfluencer.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/BucketInfluencer.java
@@ -16,8 +16,9 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.results;
+package org.elasticsearch.client.ml.job.results;
+import org.elasticsearch.client.ml.job.config.Job;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.time.DateFormatters;
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
@@ -25,7 +26,6 @@
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser.Token;
-import org.elasticsearch.protocol.xpack.ml.job.config.Job;
import java.io.IOException;
import java.time.format.DateTimeFormatter;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/CategoryDefinition.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/CategoryDefinition.java
similarity index 98%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/CategoryDefinition.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/CategoryDefinition.java
index 59b59006b33a1..dd65899e67e12 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/CategoryDefinition.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/CategoryDefinition.java
@@ -16,13 +16,13 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.results;
+package org.elasticsearch.client.ml.job.results;
+import org.elasticsearch.client.ml.job.config.Job;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
-import org.elasticsearch.protocol.xpack.ml.job.config.Job;
import java.io.IOException;
import java.util.ArrayList;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/Influence.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/Influence.java
similarity index 98%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/Influence.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/Influence.java
index 53607479d66f4..bfcc545362d3a 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/Influence.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/Influence.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.results;
+package org.elasticsearch.client.ml.job.results;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/Influencer.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/Influencer.java
similarity index 98%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/Influencer.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/Influencer.java
index 51c88883608b0..28ceb243bf6b2 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/Influencer.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/Influencer.java
@@ -16,8 +16,9 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.results;
+package org.elasticsearch.client.ml.job.results;
+import org.elasticsearch.client.ml.job.config.Job;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.time.DateFormatters;
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
@@ -25,7 +26,6 @@
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser.Token;
-import org.elasticsearch.protocol.xpack.ml.job.config.Job;
import java.io.IOException;
import java.time.format.DateTimeFormatter;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/OverallBucket.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/OverallBucket.java
similarity index 98%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/OverallBucket.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/OverallBucket.java
index 4f13b4b26646e..eaf050f8be9fb 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/OverallBucket.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/OverallBucket.java
@@ -16,8 +16,9 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.results;
+package org.elasticsearch.client.ml.job.results;
+import org.elasticsearch.client.ml.job.config.Job;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.time.DateFormatters;
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
@@ -25,7 +26,6 @@
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
-import org.elasticsearch.protocol.xpack.ml.job.config.Job;
import java.io.IOException;
import java.time.format.DateTimeFormatter;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/Result.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/Result.java
similarity index 95%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/Result.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/Result.java
index cce5fa65ebb44..a7f8933a0a131 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/results/Result.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/results/Result.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.results;
+package org.elasticsearch.client.ml.job.results;
import org.elasticsearch.common.ParseField;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/util/PageParams.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/util/PageParams.java
similarity index 98%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/util/PageParams.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/util/PageParams.java
index 2e20e84d7b81b..52d54188f7007 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/util/PageParams.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/util/PageParams.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.util;
+package org.elasticsearch.client.ml.job.util;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.ParseField;
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/util/TimeUtil.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/util/TimeUtil.java
similarity index 97%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/util/TimeUtil.java
rename to client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/util/TimeUtil.java
index 549b196949145..4c21ffb2175b2 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/job/util/TimeUtil.java
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/util/TimeUtil.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.util;
+package org.elasticsearch.client.ml.job.util;
import org.elasticsearch.common.time.DateFormatters;
import org.elasticsearch.common.xcontent.XContentParser;
diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/CrudIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/CrudIT.java
index 89f357477fa06..7978d76c56d70 100644
--- a/client/rest-high-level/src/test/java/org/elasticsearch/client/CrudIT.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/CrudIT.java
@@ -41,12 +41,16 @@
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.bytes.BytesReference;
+import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.ByteSizeUnit;
import org.elasticsearch.common.unit.ByteSizeValue;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.VersionType;
import org.elasticsearch.index.get.GetResult;
+import org.elasticsearch.index.query.IdsQueryBuilder;
+import org.elasticsearch.index.reindex.BulkByScrollResponse;
+import org.elasticsearch.index.reindex.ReindexRequest;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.script.Script;
import org.elasticsearch.script.ScriptType;
@@ -624,6 +628,69 @@ public void testBulk() throws IOException {
validateBulkResponses(nbItems, errors, bulkResponse, bulkRequest);
}
+ public void testReindex() throws IOException {
+ final String sourceIndex = "source1";
+ final String destinationIndex = "dest";
+ {
+ // Prepare
+ Settings settings = Settings.builder()
+ .put("number_of_shards", 1)
+ .put("number_of_replicas", 0)
+ .build();
+ createIndex(sourceIndex, settings);
+ createIndex(destinationIndex, settings);
+ assertEquals(
+ RestStatus.OK,
+ highLevelClient().bulk(
+ new BulkRequest()
+ .add(new IndexRequest(sourceIndex, "type", "1")
+ .source(Collections.singletonMap("foo", "bar"), XContentType.JSON))
+ .add(new IndexRequest(sourceIndex, "type", "2")
+ .source(Collections.singletonMap("foo2", "bar2"), XContentType.JSON))
+ .setRefreshPolicy(RefreshPolicy.IMMEDIATE),
+ RequestOptions.DEFAULT
+ ).status()
+ );
+ }
+ {
+ // test1: create one doc in dest
+ ReindexRequest reindexRequest = new ReindexRequest();
+ reindexRequest.setSourceIndices(sourceIndex);
+ reindexRequest.setDestIndex(destinationIndex);
+ reindexRequest.setSourceQuery(new IdsQueryBuilder().addIds("1").types("type"));
+ reindexRequest.setRefresh(true);
+ BulkByScrollResponse bulkResponse = execute(reindexRequest, highLevelClient()::reindex, highLevelClient()::reindexAsync);
+ assertEquals(1, bulkResponse.getCreated());
+ assertEquals(1, bulkResponse.getTotal());
+ assertEquals(0, bulkResponse.getDeleted());
+ assertEquals(0, bulkResponse.getNoops());
+ assertEquals(0, bulkResponse.getVersionConflicts());
+ assertEquals(1, bulkResponse.getBatches());
+ assertTrue(bulkResponse.getTook().getMillis() > 0);
+ assertEquals(1, bulkResponse.getBatches());
+ assertEquals(0, bulkResponse.getBulkFailures().size());
+ assertEquals(0, bulkResponse.getSearchFailures().size());
+ }
+ {
+ // test2: create 1 and update 1
+ ReindexRequest reindexRequest = new ReindexRequest();
+ reindexRequest.setSourceIndices(sourceIndex);
+ reindexRequest.setDestIndex(destinationIndex);
+ BulkByScrollResponse bulkResponse = execute(reindexRequest, highLevelClient()::reindex, highLevelClient()::reindexAsync);
+ assertEquals(1, bulkResponse.getCreated());
+ assertEquals(2, bulkResponse.getTotal());
+ assertEquals(1, bulkResponse.getUpdated());
+ assertEquals(0, bulkResponse.getDeleted());
+ assertEquals(0, bulkResponse.getNoops());
+ assertEquals(0, bulkResponse.getVersionConflicts());
+ assertEquals(1, bulkResponse.getBatches());
+ assertTrue(bulkResponse.getTook().getMillis() > 0);
+ assertEquals(1, bulkResponse.getBatches());
+ assertEquals(0, bulkResponse.getBulkFailures().size());
+ assertEquals(0, bulkResponse.getSearchFailures().size());
+ }
+ }
+
public void testBulkProcessorIntegration() throws IOException {
int nbItems = randomIntBetween(10, 100);
boolean[] errors = new boolean[nbItems];
diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/MLRequestConvertersTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/MLRequestConvertersTests.java
index 9065cda9cd6fc..43f3ef41a8d73 100644
--- a/client/rest-high-level/src/test/java/org/elasticsearch/client/MLRequestConvertersTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/MLRequestConvertersTests.java
@@ -23,19 +23,19 @@
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
+import org.elasticsearch.client.ml.CloseJobRequest;
+import org.elasticsearch.client.ml.DeleteJobRequest;
+import org.elasticsearch.client.ml.GetBucketsRequest;
+import org.elasticsearch.client.ml.GetJobRequest;
+import org.elasticsearch.client.ml.OpenJobRequest;
+import org.elasticsearch.client.ml.PutJobRequest;
+import org.elasticsearch.client.ml.job.config.AnalysisConfig;
+import org.elasticsearch.client.ml.job.config.Detector;
+import org.elasticsearch.client.ml.job.config.Job;
+import org.elasticsearch.client.ml.job.util.PageParams;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.common.xcontent.json.JsonXContent;
-import org.elasticsearch.protocol.xpack.ml.CloseJobRequest;
-import org.elasticsearch.protocol.xpack.ml.DeleteJobRequest;
-import org.elasticsearch.protocol.xpack.ml.GetBucketsRequest;
-import org.elasticsearch.protocol.xpack.ml.GetJobRequest;
-import org.elasticsearch.protocol.xpack.ml.OpenJobRequest;
-import org.elasticsearch.protocol.xpack.ml.PutJobRequest;
-import org.elasticsearch.protocol.xpack.ml.job.config.AnalysisConfig;
-import org.elasticsearch.protocol.xpack.ml.job.config.Detector;
-import org.elasticsearch.protocol.xpack.ml.job.config.Job;
-import org.elasticsearch.protocol.xpack.ml.job.util.PageParams;
import org.elasticsearch.test.ESTestCase;
import java.io.ByteArrayOutputStream;
diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningGetResultsIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningGetResultsIT.java
index a4f83c347ad13..6c8ca81cea224 100644
--- a/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningGetResultsIT.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningGetResultsIT.java
@@ -21,20 +21,26 @@
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.support.WriteRequest;
+import org.elasticsearch.client.ml.GetBucketsRequest;
+import org.elasticsearch.client.ml.GetBucketsResponse;
+import org.elasticsearch.client.ml.GetRecordsRequest;
+import org.elasticsearch.client.ml.GetRecordsResponse;
+import org.elasticsearch.client.ml.PutJobRequest;
+import org.elasticsearch.client.ml.job.config.Job;
+import org.elasticsearch.client.ml.job.results.AnomalyRecord;
+import org.elasticsearch.client.ml.job.results.Bucket;
+import org.elasticsearch.client.ml.job.util.PageParams;
import org.elasticsearch.common.xcontent.XContentType;
-import org.elasticsearch.protocol.xpack.ml.GetBucketsRequest;
-import org.elasticsearch.protocol.xpack.ml.GetBucketsResponse;
-import org.elasticsearch.protocol.xpack.ml.PutJobRequest;
-import org.elasticsearch.protocol.xpack.ml.job.config.Job;
-import org.elasticsearch.protocol.xpack.ml.job.results.Bucket;
-import org.elasticsearch.protocol.xpack.ml.job.util.PageParams;
import org.junit.After;
import org.junit.Before;
import java.io.IOException;
import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.greaterThan;
+import static org.hamcrest.Matchers.greaterThanOrEqualTo;
import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.lessThan;
import static org.hamcrest.Matchers.lessThanOrEqualTo;
public class MachineLearningGetResultsIT extends ESRestHighLevelClientTestCase {
@@ -47,7 +53,8 @@ public class MachineLearningGetResultsIT extends ESRestHighLevelClientTestCase {
// 2018-08-01T00:00:00Z
private static final long START_TIME_EPOCH_MS = 1533081600000L;
- private BucketStats bucketStats = new BucketStats();
+ private Stats bucketStats = new Stats();
+ private Stats recordStats = new Stats();
@Before
public void createJobAndIndexResults() throws IOException {
@@ -68,7 +75,7 @@ public void createJobAndIndexResults() throws IOException {
// Also index an interim bucket
addBucketIndexRequest(time, true, bulkRequest);
- addRecordIndexRequests(time, true, bulkRequest);
+ addRecordIndexRequest(time, true, bulkRequest);
highLevelClient().bulk(bulkRequest, RequestOptions.DEFAULT);
}
@@ -91,16 +98,21 @@ private void addRecordIndexRequests(long timestamp, boolean isInterim, BulkReque
}
int recordCount = randomIntBetween(1, 3);
for (int i = 0; i < recordCount; ++i) {
- IndexRequest indexRequest = new IndexRequest(RESULTS_INDEX, DOC);
- double recordScore = randomDoubleBetween(0.0, 100.0, true);
- double p = randomDoubleBetween(0.0, 0.05, false);
- indexRequest.source("{\"job_id\":\"" + JOB_ID + "\", \"result_type\":\"record\", \"timestamp\": " + timestamp + "," +
- "\"bucket_span\": 3600,\"is_interim\": " + isInterim + ", \"record_score\": " + recordScore + ", \"probability\": "
- + p + "}", XContentType.JSON);
- bulkRequest.add(indexRequest);
+ addRecordIndexRequest(timestamp, isInterim, bulkRequest);
}
}
+ private void addRecordIndexRequest(long timestamp, boolean isInterim, BulkRequest bulkRequest) {
+ IndexRequest indexRequest = new IndexRequest(RESULTS_INDEX, DOC);
+ double recordScore = randomDoubleBetween(0.0, 100.0, true);
+ recordStats.report(recordScore);
+ double p = randomDoubleBetween(0.0, 0.05, false);
+ indexRequest.source("{\"job_id\":\"" + JOB_ID + "\", \"result_type\":\"record\", \"timestamp\": " + timestamp + "," +
+ "\"bucket_span\": 3600,\"is_interim\": " + isInterim + ", \"record_score\": " + recordScore + ", \"probability\": "
+ + p + "}", XContentType.JSON);
+ bulkRequest.add(indexRequest);
+ }
+
@After
public void deleteJob() throws IOException {
new MlRestTestStateCleaner(logger, client()).clearMlMetadata();
@@ -194,7 +206,73 @@ public void testGetBuckets() throws IOException {
}
}
- private static class BucketStats {
+ public void testGetRecords() throws IOException {
+ MachineLearningClient machineLearningClient = highLevelClient().machineLearning();
+
+ {
+ GetRecordsRequest request = new GetRecordsRequest(JOB_ID);
+
+ GetRecordsResponse response = execute(request, machineLearningClient::getRecords, machineLearningClient::getRecordsAsync);
+
+ assertThat(response.count(), greaterThan(0L));
+ assertThat(response.count(), equalTo(recordStats.totalCount()));
+ }
+ {
+ GetRecordsRequest request = new GetRecordsRequest(JOB_ID);
+ request.setRecordScore(50.0);
+
+ GetRecordsResponse response = execute(request, machineLearningClient::getRecords, machineLearningClient::getRecordsAsync);
+
+ long majorAndCriticalCount = recordStats.majorCount + recordStats.criticalCount;
+ assertThat(response.count(), equalTo(majorAndCriticalCount));
+ assertThat(response.records().size(), equalTo((int) Math.min(100, majorAndCriticalCount)));
+ assertThat(response.records().stream().anyMatch(r -> r.getRecordScore() < 50.0), is(false));
+ }
+ {
+ GetRecordsRequest request = new GetRecordsRequest(JOB_ID);
+ request.setExcludeInterim(true);
+
+ GetRecordsResponse response = execute(request, machineLearningClient::getRecords, machineLearningClient::getRecordsAsync);
+
+ assertThat(response.count(), equalTo(recordStats.totalCount() - 1));
+ }
+ {
+ long end = START_TIME_EPOCH_MS + 10 * 3600000;
+ GetRecordsRequest request = new GetRecordsRequest(JOB_ID);
+ request.setStart(String.valueOf(START_TIME_EPOCH_MS));
+ request.setEnd(String.valueOf(end));
+
+ GetRecordsResponse response = execute(request, machineLearningClient::getRecords, machineLearningClient::getRecordsAsync);
+
+ for (AnomalyRecord record : response.records()) {
+ assertThat(record.getTimestamp().getTime(), greaterThanOrEqualTo(START_TIME_EPOCH_MS));
+ assertThat(record.getTimestamp().getTime(), lessThan(end));
+ }
+ }
+ {
+ GetRecordsRequest request = new GetRecordsRequest(JOB_ID);
+ request.setPageParams(new PageParams(3, 3));
+
+ GetRecordsResponse response = execute(request, machineLearningClient::getRecords, machineLearningClient::getRecordsAsync);
+
+ assertThat(response.records().size(), equalTo(3));
+ }
+ {
+ GetRecordsRequest request = new GetRecordsRequest(JOB_ID);
+ request.setSort("probability");
+ request.setDescending(true);
+
+ GetRecordsResponse response = execute(request, machineLearningClient::getRecords, machineLearningClient::getRecordsAsync);
+
+ double previousProb = 1.0;
+ for (AnomalyRecord record : response.records()) {
+ assertThat(record.getProbability(), lessThanOrEqualTo(previousProb));
+ previousProb = record.getProbability();
+ }
+ }
+ }
+
+ private static class Stats {
// score < 50.0
private long minorCount;
@@ -204,14 +282,18 @@ private static class BucketStats {
// score > 75.0
private long criticalCount;
- private void report(double anomalyScore) {
- if (anomalyScore < 50.0) {
+ private void report(double score) {
+ if (score < 50.0) {
minorCount++;
- } else if (anomalyScore < 75.0) {
+ } else if (score < 75.0) {
majorCount++;
} else {
criticalCount++;
}
}
+
+ private long totalCount() {
+ return minorCount + majorCount + criticalCount;
+ }
}
}
diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningIT.java
index cec5dd7ccf8ff..cb9dbea129d2b 100644
--- a/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningIT.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningIT.java
@@ -19,21 +19,21 @@
package org.elasticsearch.client;
import com.carrotsearch.randomizedtesting.generators.CodepointSetGenerator;
+import org.elasticsearch.client.ml.CloseJobRequest;
+import org.elasticsearch.client.ml.CloseJobResponse;
+import org.elasticsearch.client.ml.DeleteJobRequest;
+import org.elasticsearch.client.ml.DeleteJobResponse;
+import org.elasticsearch.client.ml.GetJobRequest;
+import org.elasticsearch.client.ml.GetJobResponse;
+import org.elasticsearch.client.ml.OpenJobRequest;
+import org.elasticsearch.client.ml.OpenJobResponse;
+import org.elasticsearch.client.ml.PutJobRequest;
+import org.elasticsearch.client.ml.PutJobResponse;
+import org.elasticsearch.client.ml.job.config.AnalysisConfig;
+import org.elasticsearch.client.ml.job.config.DataDescription;
+import org.elasticsearch.client.ml.job.config.Detector;
+import org.elasticsearch.client.ml.job.config.Job;
import org.elasticsearch.common.unit.TimeValue;
-import org.elasticsearch.protocol.xpack.ml.CloseJobRequest;
-import org.elasticsearch.protocol.xpack.ml.CloseJobResponse;
-import org.elasticsearch.protocol.xpack.ml.DeleteJobRequest;
-import org.elasticsearch.protocol.xpack.ml.DeleteJobResponse;
-import org.elasticsearch.protocol.xpack.ml.GetJobRequest;
-import org.elasticsearch.protocol.xpack.ml.GetJobResponse;
-import org.elasticsearch.protocol.xpack.ml.OpenJobRequest;
-import org.elasticsearch.protocol.xpack.ml.OpenJobResponse;
-import org.elasticsearch.protocol.xpack.ml.PutJobRequest;
-import org.elasticsearch.protocol.xpack.ml.PutJobResponse;
-import org.elasticsearch.protocol.xpack.ml.job.config.AnalysisConfig;
-import org.elasticsearch.protocol.xpack.ml.job.config.DataDescription;
-import org.elasticsearch.protocol.xpack.ml.job.config.Detector;
-import org.elasticsearch.protocol.xpack.ml.job.config.Job;
import org.junit.After;
import java.io.IOException;
diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java
index ebabb8f95b594..44b4ae05b57c7 100644
--- a/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java
@@ -116,6 +116,7 @@
import org.elasticsearch.common.xcontent.XContentHelper;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.common.xcontent.XContentType;
+import org.elasticsearch.common.xcontent.json.JsonXContent;
import org.elasticsearch.index.RandomCreateIndexGenerator;
import org.elasticsearch.index.VersionType;
import org.elasticsearch.index.query.QueryBuilder;
@@ -126,6 +127,8 @@
import org.elasticsearch.index.rankeval.RankEvalSpec;
import org.elasticsearch.index.rankeval.RatedRequest;
import org.elasticsearch.index.rankeval.RestRankEvalAction;
+import org.elasticsearch.index.reindex.ReindexRequest;
+import org.elasticsearch.index.reindex.RemoteInfo;
import org.elasticsearch.protocol.xpack.XPackInfoRequest;
import org.elasticsearch.protocol.xpack.migration.IndexUpgradeInfoRequest;
import org.elasticsearch.protocol.xpack.watcher.DeleteWatchRequest;
@@ -172,6 +175,7 @@
import java.util.function.Supplier;
import java.util.stream.Collectors;
+import static java.util.Collections.emptyMap;
import static java.util.Collections.singletonMap;
import static org.elasticsearch.client.RequestConverters.REQUEST_BODY_CONTENT_TYPE;
import static org.elasticsearch.client.RequestConverters.enforceSameContentType;
@@ -179,6 +183,7 @@
import static org.elasticsearch.index.RandomCreateIndexGenerator.randomCreateIndexRequest;
import static org.elasticsearch.index.RandomCreateIndexGenerator.randomIndexSettings;
import static org.elasticsearch.index.alias.RandomAliasActionsGenerator.randomAliasAction;
+import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
import static org.elasticsearch.search.RandomSearchRequestGenerator.randomSearchRequest;
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertToXContentEquivalent;
import static org.hamcrest.CoreMatchers.equalTo;
@@ -407,6 +412,64 @@ public void testUpdateAliases() throws IOException {
assertToXContentBody(indicesAliasesRequest, request.getEntity());
}
+ public void testReindex() throws IOException {
+ ReindexRequest reindexRequest = new ReindexRequest();
+ reindexRequest.setSourceIndices("source_idx");
+ reindexRequest.setDestIndex("dest_idx");
+ Map expectedParams = new HashMap<>();
+ if (randomBoolean()) {
+ XContentBuilder builder = JsonXContent.contentBuilder().prettyPrint();
+ RemoteInfo remoteInfo = new RemoteInfo("http", "remote-host", 9200, null,
+ BytesReference.bytes(matchAllQuery().toXContent(builder, ToXContent.EMPTY_PARAMS)),
+ "user",
+ "pass",
+ emptyMap(),
+ RemoteInfo.DEFAULT_SOCKET_TIMEOUT,
+ RemoteInfo.DEFAULT_CONNECT_TIMEOUT
+ );
+ reindexRequest.setRemoteInfo(remoteInfo);
+ }
+ if (randomBoolean()) {
+ reindexRequest.setSourceDocTypes("doc", "tweet");
+ }
+ if (randomBoolean()) {
+ reindexRequest.setSourceBatchSize(randomInt(100));
+ }
+ if (randomBoolean()) {
+ reindexRequest.setDestDocType("tweet_and_doc");
+ }
+ if (randomBoolean()) {
+ reindexRequest.setDestOpType("create");
+ }
+ if (randomBoolean()) {
+ reindexRequest.setDestPipeline("my_pipeline");
+ }
+ if (randomBoolean()) {
+ reindexRequest.setDestRouting("=cat");
+ }
+ if (randomBoolean()) {
+ reindexRequest.setSize(randomIntBetween(100, 1000));
+ }
+ if (randomBoolean()) {
+ reindexRequest.setAbortOnVersionConflict(false);
+ }
+ if (randomBoolean()) {
+ String ts = randomTimeValue();
+ reindexRequest.setScroll(TimeValue.parseTimeValue(ts, "scroll"));
+ }
+ if (reindexRequest.getRemoteInfo() == null && randomBoolean()) {
+ reindexRequest.setSourceQuery(new TermQueryBuilder("foo", "fooval"));
+ }
+ setRandomTimeout(reindexRequest::setTimeout, ReplicationRequest.DEFAULT_TIMEOUT, expectedParams);
+ setRandomWaitForActiveShards(reindexRequest::setWaitForActiveShards, ActiveShardCount.DEFAULT, expectedParams);
+ expectedParams.put("scroll", reindexRequest.getScrollTime().getStringRep());
+ Request request = RequestConverters.reindex(reindexRequest);
+ assertEquals("/_reindex", request.getEndpoint());
+ assertEquals(HttpPost.METHOD_NAME, request.getMethod());
+ assertEquals(expectedParams, request.getParameters());
+ assertToXContentBody(reindexRequest, request.getEntity());
+ }
+
public void testPutMapping() throws IOException {
PutMappingRequest putMappingRequest = new PutMappingRequest();
diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/RestHighLevelClientTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/RestHighLevelClientTests.java
index 15f2b80b2523e..d2585b6f3f4c2 100644
--- a/client/rest-high-level/src/test/java/org/elasticsearch/client/RestHighLevelClientTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/RestHighLevelClientTests.java
@@ -660,7 +660,6 @@ public void testApiNamingConventions() throws Exception {
"indices.put_alias",
"mtermvectors",
"put_script",
- "reindex",
"reindex_rethrottle",
"render_search_template",
"scripts_painless_execute",
diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/CRUDDocumentationIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/CRUDDocumentationIT.java
index ad41c139ddc37..9c69a2a48361a 100644
--- a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/CRUDDocumentationIT.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/CRUDDocumentationIT.java
@@ -50,6 +50,8 @@
import org.elasticsearch.client.Response;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.Strings;
+import org.elasticsearch.common.bytes.BytesArray;
+import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.ByteSizeUnit;
import org.elasticsearch.common.unit.ByteSizeValue;
import org.elasticsearch.common.unit.TimeValue;
@@ -59,13 +61,22 @@
import org.elasticsearch.common.xcontent.json.JsonXContent;
import org.elasticsearch.index.VersionType;
import org.elasticsearch.index.get.GetResult;
+import org.elasticsearch.index.query.MatchAllQueryBuilder;
+import org.elasticsearch.index.query.TermQueryBuilder;
+import org.elasticsearch.index.reindex.BulkByScrollResponse;
+import org.elasticsearch.index.reindex.ReindexRequest;
+import org.elasticsearch.index.reindex.RemoteInfo;
+import org.elasticsearch.index.reindex.ScrollableHitSource;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.script.Script;
import org.elasticsearch.script.ScriptType;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
+import org.elasticsearch.search.sort.SortOrder;
+import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@@ -750,6 +761,144 @@ public void onFailure(Exception e) {
}
}
+ public void testReindex() throws Exception {
+ RestHighLevelClient client = highLevelClient();
+ {
+ String mapping =
+ "\"doc\": {\n" +
+ " \"properties\": {\n" +
+ " \"user\": {\n" +
+ " \"type\": \"text\"\n" +
+ " },\n" +
+ " \"field1\": {\n" +
+ " \"type\": \"integer\"\n" +
+ " },\n" +
+ " \"field2\": {\n" +
+ " \"type\": \"integer\"\n" +
+ " }\n" +
+ " }\n" +
+ " }";
+ createIndex("source1", Settings.EMPTY, mapping);
+ createIndex("source2", Settings.EMPTY, mapping);
+ createPipeline("my_pipeline");
+ }
+ {
+ // tag::reindex-request
+ ReindexRequest request = new ReindexRequest(); // <1>
+ request.setSourceIndices("source1", "source2"); // <2>
+ request.setDestIndex("dest"); // <3>
+ // end::reindex-request
+ // tag::reindex-request-versionType
+ request.setDestVersionType(VersionType.EXTERNAL); // <1>
+ // end::reindex-request-versionType
+ // tag::reindex-request-opType
+ request.setDestOpType("create"); // <1>
+ // end::reindex-request-opType
+ // tag::reindex-request-conflicts
+ request.setConflicts("proceed"); // <1>
+ // end::reindex-request-conflicts
+ // tag::reindex-request-typeOrQuery
+ request.setSourceDocTypes("doc"); // <1>
+ request.setSourceQuery(new TermQueryBuilder("user", "kimchy")); // <2>
+ // end::reindex-request-typeOrQuery
+ // tag::reindex-request-size
+ request.setSize(10); // <1>
+ // end::reindex-request-size
+ // tag::reindex-request-sourceSize
+ request.setSourceBatchSize(100); // <1>
+ // end::reindex-request-sourceSize
+ // tag::reindex-request-pipeline
+ request.setDestPipeline("my_pipeline"); // <1>
+ // end::reindex-request-pipeline
+ // tag::reindex-request-sort
+ request.addSortField("field1", SortOrder.DESC); // <1>
+ request.addSortField("field2", SortOrder.ASC); // <2>
+ // end::reindex-request-sort
+ // tag::reindex-request-script
+ request.setScript(
+ new Script(
+ ScriptType.INLINE, "painless",
+ "if (ctx._source.user == 'kimchy') {ctx._source.likes++;}",
+ Collections.emptyMap())); // <1>
+ // end::reindex-request-script
+ // tag::reindex-request-remote
+ request.setRemoteInfo(
+ new RemoteInfo(
+ "https", "localhost", 9002, null, new BytesArray(new MatchAllQueryBuilder().toString()),
+ "user", "pass", Collections.emptyMap(), new TimeValue(100, TimeUnit.MILLISECONDS),
+ new TimeValue(100, TimeUnit.SECONDS)
+ )
+ ); // <1>
+ // end::reindex-request-remote
+ request.setRemoteInfo(null); // Remove it for tests
+ // tag::reindex-request-timeout
+ request.setTimeout(TimeValue.timeValueMinutes(2)); // <1>
+ // end::reindex-request-timeout
+ // tag::reindex-request-refresh
+ request.setRefresh(true); // <1>
+ // end::reindex-request-refresh
+ // tag::reindex-request-slices
+ request.setSlices(2); // <1>
+ // end::reindex-request-slices
+ // tag::reindex-request-scroll
+ request.setScroll(TimeValue.timeValueMinutes(10)); // <1>
+ // end::reindex-request-scroll
+
+
+ // tag::reindex-execute
+ BulkByScrollResponse bulkResponse = client.reindex(request, RequestOptions.DEFAULT);
+ // end::reindex-execute
+ assertSame(0, bulkResponse.getSearchFailures().size());
+ assertSame(0, bulkResponse.getBulkFailures().size());
+ // tag::reindex-response
+ TimeValue timeTaken = bulkResponse.getTook(); // <1>
+ boolean timedOut = bulkResponse.isTimedOut(); // <2>
+ long totalDocs = bulkResponse.getTotal(); // <3>
+ long updatedDocs = bulkResponse.getUpdated(); // <4>
+ long createdDocs = bulkResponse.getCreated(); // <5>
+ long deletedDocs = bulkResponse.getDeleted(); // <6>
+ long batches = bulkResponse.getBatches(); // <7>
+ long noops = bulkResponse.getNoops(); // <8>
+ long versionConflicts = bulkResponse.getVersionConflicts(); // <9>
+ long bulkRetries = bulkResponse.getBulkRetries(); // <10>
+ long searchRetries = bulkResponse.getSearchRetries(); // <11>
+ TimeValue throttledMillis = bulkResponse.getStatus().getThrottled(); // <12>
+ TimeValue throttledUntilMillis = bulkResponse.getStatus().getThrottledUntil(); // <13>
+ List searchFailures = bulkResponse.getSearchFailures(); // <14>
+ List bulkFailures = bulkResponse.getBulkFailures(); // <15>
+ // end::reindex-response
+ }
+ {
+ ReindexRequest request = new ReindexRequest();
+ request.setSourceIndices("source1");
+ request.setDestIndex("dest");
+
+ // tag::reindex-execute-listener
+ ActionListener listener = new ActionListener() {
+ @Override
+ public void onResponse(BulkByScrollResponse bulkResponse) {
+ // <1>
+ }
+
+ @Override
+ public void onFailure(Exception e) {
+ // <2>
+ }
+ };
+ // end::reindex-execute-listener
+
+ // Replace the empty listener by a blocking listener in test
+ final CountDownLatch latch = new CountDownLatch(1);
+ listener = new LatchedActionListener<>(listener, latch);
+
+ // tag::reindex-execute-async
+ client.reindexAsync(request, RequestOptions.DEFAULT, listener); // <1>
+ // end::reindex-execute-async
+
+ assertTrue(latch.await(30L, TimeUnit.SECONDS));
+ }
+ }
+
public void testGet() throws Exception {
RestHighLevelClient client = highLevelClient();
{
diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/MlClientDocumentationIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/MlClientDocumentationIT.java
index 683f91dae2eb1..94793f0ab7911 100644
--- a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/MlClientDocumentationIT.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/MlClientDocumentationIT.java
@@ -27,26 +27,29 @@
import org.elasticsearch.client.MlRestTestStateCleaner;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
+import org.elasticsearch.client.ml.CloseJobRequest;
+import org.elasticsearch.client.ml.CloseJobResponse;
+import org.elasticsearch.client.ml.DeleteJobRequest;
+import org.elasticsearch.client.ml.DeleteJobResponse;
+import org.elasticsearch.client.ml.GetBucketsRequest;
+import org.elasticsearch.client.ml.GetBucketsResponse;
+import org.elasticsearch.client.ml.GetJobRequest;
+import org.elasticsearch.client.ml.GetJobResponse;
+import org.elasticsearch.client.ml.GetRecordsRequest;
+import org.elasticsearch.client.ml.GetRecordsResponse;
+import org.elasticsearch.client.ml.OpenJobRequest;
+import org.elasticsearch.client.ml.OpenJobResponse;
+import org.elasticsearch.client.ml.PutJobRequest;
+import org.elasticsearch.client.ml.PutJobResponse;
+import org.elasticsearch.client.ml.job.config.AnalysisConfig;
+import org.elasticsearch.client.ml.job.config.DataDescription;
+import org.elasticsearch.client.ml.job.config.Detector;
+import org.elasticsearch.client.ml.job.config.Job;
+import org.elasticsearch.client.ml.job.results.AnomalyRecord;
+import org.elasticsearch.client.ml.job.results.Bucket;
+import org.elasticsearch.client.ml.job.util.PageParams;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
-import org.elasticsearch.protocol.xpack.ml.CloseJobRequest;
-import org.elasticsearch.protocol.xpack.ml.CloseJobResponse;
-import org.elasticsearch.protocol.xpack.ml.DeleteJobRequest;
-import org.elasticsearch.protocol.xpack.ml.DeleteJobResponse;
-import org.elasticsearch.protocol.xpack.ml.GetBucketsRequest;
-import org.elasticsearch.protocol.xpack.ml.GetBucketsResponse;
-import org.elasticsearch.protocol.xpack.ml.GetJobRequest;
-import org.elasticsearch.protocol.xpack.ml.GetJobResponse;
-import org.elasticsearch.protocol.xpack.ml.OpenJobRequest;
-import org.elasticsearch.protocol.xpack.ml.OpenJobResponse;
-import org.elasticsearch.protocol.xpack.ml.PutJobRequest;
-import org.elasticsearch.protocol.xpack.ml.PutJobResponse;
-import org.elasticsearch.protocol.xpack.ml.job.config.AnalysisConfig;
-import org.elasticsearch.protocol.xpack.ml.job.config.DataDescription;
-import org.elasticsearch.protocol.xpack.ml.job.config.Detector;
-import org.elasticsearch.protocol.xpack.ml.job.config.Job;
-import org.elasticsearch.protocol.xpack.ml.job.results.Bucket;
-import org.elasticsearch.protocol.xpack.ml.job.util.PageParams;
import org.junit.After;
import java.io.IOException;
@@ -454,4 +457,94 @@ public void onFailure(Exception e) {
assertTrue(latch.await(30L, TimeUnit.SECONDS));
}
}
+
+ public void testGetRecords() throws IOException, InterruptedException {
+ RestHighLevelClient client = highLevelClient();
+
+ String jobId = "test-get-records";
+ Job job = MachineLearningIT.buildJob(jobId);
+ client.machineLearning().putJob(new PutJobRequest(job), RequestOptions.DEFAULT);
+
+ // Let us index a record
+ IndexRequest indexRequest = new IndexRequest(".ml-anomalies-shared", "doc");
+ indexRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
+ indexRequest.source("{\"job_id\":\"test-get-records\", \"result_type\":\"record\", \"timestamp\": 1533081600000," +
+ "\"bucket_span\": 600,\"is_interim\": false, \"record_score\": 80.0}", XContentType.JSON);
+ client.index(indexRequest, RequestOptions.DEFAULT);
+
+ {
+ // tag::x-pack-ml-get-records-request
+ GetRecordsRequest request = new GetRecordsRequest(jobId); // <1>
+ // end::x-pack-ml-get-records-request
+
+ // tag::x-pack-ml-get-records-desc
+ request.setDescending(true); // <1>
+ // end::x-pack-ml-get-records-desc
+
+ // tag::x-pack-ml-get-records-end
+ request.setEnd("2018-08-21T00:00:00Z"); // <1>
+ // end::x-pack-ml-get-records-end
+
+ // tag::x-pack-ml-get-records-exclude-interim
+ request.setExcludeInterim(true); // <1>
+ // end::x-pack-ml-get-records-exclude-interim
+
+ // tag::x-pack-ml-get-records-page
+ request.setPageParams(new PageParams(100, 200)); // <1>
+ // end::x-pack-ml-get-records-page
+
+ // Set page params back to null so the response contains the record we indexed
+ request.setPageParams(null);
+
+ // tag::x-pack-ml-get-records-record-score
+ request.setRecordScore(75.0); // <1>
+ // end::x-pack-ml-get-records-record-score
+
+ // tag::x-pack-ml-get-records-sort
+ request.setSort("probability"); // <1>
+ // end::x-pack-ml-get-records-sort
+
+ // tag::x-pack-ml-get-records-start
+ request.setStart("2018-08-01T00:00:00Z"); // <1>
+ // end::x-pack-ml-get-records-start
+
+ // tag::x-pack-ml-get-records-execute
+ GetRecordsResponse response = client.machineLearning().getRecords(request, RequestOptions.DEFAULT);
+ // end::x-pack-ml-get-records-execute
+
+ // tag::x-pack-ml-get-records-response
+ long count = response.count(); // <1>
+ List records = response.records(); // <2>
+ // end::x-pack-ml-get-records-response
+ assertEquals(1, records.size());
+ }
+ {
+ GetRecordsRequest request = new GetRecordsRequest(jobId);
+
+ // tag::x-pack-ml-get-records-listener
+ ActionListener listener =
+ new ActionListener() {
+ @Override
+ public void onResponse(GetRecordsResponse getRecordsResponse) {
+ // <1>
+ }
+
+ @Override
+ public void onFailure(Exception e) {
+ // <2>
+ }
+ };
+ // end::x-pack-ml-get-records-listener
+
+ // Replace the empty listener by a blocking listener in test
+ final CountDownLatch latch = new CountDownLatch(1);
+ listener = new LatchedActionListener<>(listener, latch);
+
+ // tag::x-pack-ml-get-records-execute-async
+ client.machineLearning().getRecordsAsync(request, RequestOptions.DEFAULT, listener); // <1>
+ // end::x-pack-ml-get-records-execute-async
+
+ assertTrue(latch.await(30L, TimeUnit.SECONDS));
+ }
+ }
}
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/CloseJobRequestTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/CloseJobRequestTests.java
similarity index 98%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/CloseJobRequestTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/CloseJobRequestTests.java
index 435504b52983d..cf5f5ca3c0fb8 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/CloseJobRequestTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/CloseJobRequestTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentParser;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/CloseJobResponseTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/CloseJobResponseTests.java
similarity index 96%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/CloseJobResponseTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/CloseJobResponseTests.java
index d161fde536eca..04389a3af7e14 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/CloseJobResponseTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/CloseJobResponseTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractXContentTestCase;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/DeleteJobRequestTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/DeleteJobRequestTests.java
similarity index 93%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/DeleteJobRequestTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/DeleteJobRequestTests.java
index fb8a38fa0c68e..d3ccb98eeb68a 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/DeleteJobRequestTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/DeleteJobRequestTests.java
@@ -16,9 +16,9 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
-import org.elasticsearch.protocol.xpack.ml.job.config.JobTests;
+import org.elasticsearch.client.ml.job.config.JobTests;
import org.elasticsearch.test.ESTestCase;
public class DeleteJobRequestTests extends ESTestCase {
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/DeleteJobResponseTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/DeleteJobResponseTests.java
similarity index 96%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/DeleteJobResponseTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/DeleteJobResponseTests.java
index a73179a08983d..2eb4d51e19180 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/DeleteJobResponseTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/DeleteJobResponseTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractXContentTestCase;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/GetBucketsRequestTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/GetBucketsRequestTests.java
similarity index 96%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/GetBucketsRequestTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/GetBucketsRequestTests.java
index 6364ad339b120..d637988691226 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/GetBucketsRequestTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/GetBucketsRequestTests.java
@@ -16,10 +16,10 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
+import org.elasticsearch.client.ml.job.util.PageParams;
import org.elasticsearch.common.xcontent.XContentParser;
-import org.elasticsearch.protocol.xpack.ml.job.util.PageParams;
import org.elasticsearch.test.AbstractXContentTestCase;
import java.io.IOException;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/GetBucketsResponseTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/GetBucketsResponseTests.java
similarity index 90%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/GetBucketsResponseTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/GetBucketsResponseTests.java
index 889c3e93bc708..7b1934c2dfacb 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/GetBucketsResponseTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/GetBucketsResponseTests.java
@@ -16,11 +16,11 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
+import org.elasticsearch.client.ml.job.results.Bucket;
+import org.elasticsearch.client.ml.job.results.BucketTests;
import org.elasticsearch.common.xcontent.XContentParser;
-import org.elasticsearch.protocol.xpack.ml.job.results.Bucket;
-import org.elasticsearch.protocol.xpack.ml.job.results.BucketTests;
import org.elasticsearch.test.AbstractXContentTestCase;
import java.io.IOException;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/GetJobRequestTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/GetJobRequestTests.java
similarity index 98%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/GetJobRequestTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/GetJobRequestTests.java
index b94b704fbf6e8..77b2109dd7c68 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/GetJobRequestTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/GetJobRequestTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractXContentTestCase;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/GetJobResponseTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/GetJobResponseTests.java
similarity index 90%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/GetJobResponseTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/GetJobResponseTests.java
index 79d4d678b9295..181804c9676fe 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/GetJobResponseTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/GetJobResponseTests.java
@@ -16,11 +16,11 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
+import org.elasticsearch.client.ml.job.config.Job;
+import org.elasticsearch.client.ml.job.config.JobTests;
import org.elasticsearch.common.xcontent.XContentParser;
-import org.elasticsearch.protocol.xpack.ml.job.config.Job;
-import org.elasticsearch.protocol.xpack.ml.job.config.JobTests;
import org.elasticsearch.test.AbstractXContentTestCase;
import java.io.IOException;
diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/GetRecordsRequestTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/GetRecordsRequestTests.java
new file mode 100644
index 0000000000000..226ffe75b01e6
--- /dev/null
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/GetRecordsRequestTests.java
@@ -0,0 +1,72 @@
+/*
+ * 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.client.ml;
+
+import org.elasticsearch.client.ml.job.util.PageParams;
+import org.elasticsearch.common.xcontent.XContentParser;
+import org.elasticsearch.test.AbstractXContentTestCase;
+import org.elasticsearch.test.ESTestCase;
+
+import java.io.IOException;
+
+public class GetRecordsRequestTests extends AbstractXContentTestCase {
+
+ @Override
+ protected GetRecordsRequest createTestInstance() {
+ GetRecordsRequest request = new GetRecordsRequest(ESTestCase.randomAlphaOfLengthBetween(1, 20));
+
+ if (ESTestCase.randomBoolean()) {
+ request.setStart(String.valueOf(ESTestCase.randomLong()));
+ }
+ if (ESTestCase.randomBoolean()) {
+ request.setEnd(String.valueOf(ESTestCase.randomLong()));
+ }
+ if (ESTestCase.randomBoolean()) {
+ request.setExcludeInterim(ESTestCase.randomBoolean());
+ }
+ if (ESTestCase.randomBoolean()) {
+ request.setRecordScore(ESTestCase.randomDouble());
+ }
+ if (ESTestCase.randomBoolean()) {
+ int from = ESTestCase.randomInt(10000);
+ int size = ESTestCase.randomInt(10000);
+ request.setPageParams(new PageParams(from, size));
+ }
+ if (ESTestCase.randomBoolean()) {
+ request.setSort("anomaly_score");
+ }
+ if (ESTestCase.randomBoolean()) {
+ request.setDescending(ESTestCase.randomBoolean());
+ }
+ if (ESTestCase.randomBoolean()) {
+ request.setExcludeInterim(ESTestCase.randomBoolean());
+ }
+ return request;
+ }
+
+ @Override
+ protected GetRecordsRequest doParseInstance(XContentParser parser) throws IOException {
+ return GetRecordsRequest.PARSER.apply(parser, null);
+ }
+
+ @Override
+ protected boolean supportsUnknownFields() {
+ return false;
+ }
+}
diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/GetRecordsResponseTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/GetRecordsResponseTests.java
new file mode 100644
index 0000000000000..be455f716540d
--- /dev/null
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/GetRecordsResponseTests.java
@@ -0,0 +1,54 @@
+/*
+ * 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.client.ml;
+
+import org.elasticsearch.client.ml.job.results.AnomalyRecord;
+import org.elasticsearch.client.ml.job.results.AnomalyRecordTests;
+import org.elasticsearch.common.xcontent.XContentParser;
+import org.elasticsearch.test.AbstractXContentTestCase;
+import org.elasticsearch.test.ESTestCase;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class GetRecordsResponseTests extends AbstractXContentTestCase {
+
+ @Override
+ protected GetRecordsResponse createTestInstance() {
+ String jobId = ESTestCase.randomAlphaOfLength(20);
+ int listSize = ESTestCase.randomInt(10);
+ List records = new ArrayList<>(listSize);
+ for (int j = 0; j < listSize; j++) {
+ AnomalyRecord record = AnomalyRecordTests.createTestInstance(jobId);
+ records.add(record);
+ }
+ return new GetRecordsResponse(records, listSize);
+ }
+
+ @Override
+ protected GetRecordsResponse doParseInstance(XContentParser parser) throws IOException {
+ return GetRecordsResponse.fromXContent(parser);
+ }
+
+ @Override
+ protected boolean supportsUnknownFields() {
+ return true;
+ }
+}
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/OpenJobRequestTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/OpenJobRequestTests.java
similarity index 93%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/OpenJobRequestTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/OpenJobRequestTests.java
index 242f0cf4e8a5a..c6ce34364462c 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/OpenJobRequestTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/OpenJobRequestTests.java
@@ -16,11 +16,11 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
+import org.elasticsearch.client.ml.job.config.JobTests;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentParser;
-import org.elasticsearch.protocol.xpack.ml.job.config.JobTests;
import org.elasticsearch.test.AbstractXContentTestCase;
import java.io.IOException;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/OpenJobResponseTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/OpenJobResponseTests.java
similarity index 96%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/OpenJobResponseTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/OpenJobResponseTests.java
index aadfb236d3a9b..7f177c6e1ef82 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/OpenJobResponseTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/OpenJobResponseTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractXContentTestCase;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/PutJobRequestTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/PutJobRequestTests.java
similarity index 89%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/PutJobRequestTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/PutJobRequestTests.java
index 165934224b905..b58d849de1fbc 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/PutJobRequestTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/PutJobRequestTests.java
@@ -16,11 +16,11 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
+import org.elasticsearch.client.ml.job.config.Job;
+import org.elasticsearch.client.ml.job.config.JobTests;
import org.elasticsearch.common.xcontent.XContentParser;
-import org.elasticsearch.protocol.xpack.ml.job.config.Job;
-import org.elasticsearch.protocol.xpack.ml.job.config.JobTests;
import org.elasticsearch.test.AbstractXContentTestCase;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/PutJobResponseTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/PutJobResponseTests.java
similarity index 92%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/PutJobResponseTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/PutJobResponseTests.java
index ed91e33635b29..1f435783d0f18 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/PutJobResponseTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/PutJobResponseTests.java
@@ -16,10 +16,10 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.client.ml;
+import org.elasticsearch.client.ml.job.config.JobTests;
import org.elasticsearch.common.xcontent.XContentParser;
-import org.elasticsearch.protocol.xpack.ml.job.config.JobTests;
import org.elasticsearch.test.AbstractXContentTestCase;
import java.io.IOException;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/datafeed/ChunkingConfigTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/datafeed/ChunkingConfigTests.java
similarity index 97%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/datafeed/ChunkingConfigTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/datafeed/ChunkingConfigTests.java
index c835788bb1c98..c1c0daaa9384f 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/datafeed/ChunkingConfigTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/datafeed/ChunkingConfigTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.datafeed;
+package org.elasticsearch.client.ml.datafeed;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentParser;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/datafeed/DatafeedConfigTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/datafeed/DatafeedConfigTests.java
similarity index 99%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/datafeed/DatafeedConfigTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/datafeed/DatafeedConfigTests.java
index f45d88d318e01..462eb1466511d 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/datafeed/DatafeedConfigTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/datafeed/DatafeedConfigTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.datafeed;
+package org.elasticsearch.client.ml.datafeed;
import com.carrotsearch.randomizedtesting.generators.CodepointSetGenerator;
import org.elasticsearch.common.settings.Settings;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/datafeed/DatafeedUpdateTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/datafeed/DatafeedUpdateTests.java
similarity index 98%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/datafeed/DatafeedUpdateTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/datafeed/DatafeedUpdateTests.java
index edbef8461e053..3dddad3c01676 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/datafeed/DatafeedUpdateTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/datafeed/DatafeedUpdateTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.datafeed;
+package org.elasticsearch.client.ml.datafeed;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/AnalysisConfigTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/AnalysisConfigTests.java
similarity index 99%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/AnalysisConfigTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/AnalysisConfigTests.java
index 34f12fc067e75..7b76688f4d31b 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/AnalysisConfigTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/AnalysisConfigTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/AnalysisLimitsTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/AnalysisLimitsTests.java
similarity index 98%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/AnalysisLimitsTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/AnalysisLimitsTests.java
index 5003da10780d4..cb14d19300d99 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/AnalysisLimitsTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/AnalysisLimitsTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.xcontent.DeprecationHandler;
import org.elasticsearch.common.xcontent.NamedXContentRegistry;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/CategorizationAnalyzerConfigTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/CategorizationAnalyzerConfigTests.java
similarity index 98%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/CategorizationAnalyzerConfigTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/CategorizationAnalyzerConfigTests.java
index 36fb51ed10e72..889926e00d6fb 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/CategorizationAnalyzerConfigTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/CategorizationAnalyzerConfigTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractXContentTestCase;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/DataDescriptionTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/DataDescriptionTests.java
similarity index 98%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/DataDescriptionTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/DataDescriptionTests.java
index 8ca2dc494f3c5..9c1f361ce0e8d 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/DataDescriptionTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/DataDescriptionTests.java
@@ -16,12 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.xcontent.XContentParser;
-import org.elasticsearch.protocol.xpack.ml.job.config.DataDescription.DataFormat;
import org.elasticsearch.test.AbstractXContentTestCase;
+import static org.elasticsearch.client.ml.job.config.DataDescription.DataFormat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.nullValue;
import static org.hamcrest.core.Is.is;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/DetectionRuleTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/DetectionRuleTests.java
similarity index 98%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/DetectionRuleTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/DetectionRuleTests.java
index bc70a404894ab..32c6ca426ca05 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/DetectionRuleTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/DetectionRuleTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractXContentTestCase;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/DetectorTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/DetectorTests.java
similarity index 99%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/DetectorTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/DetectorTests.java
index 0b1ba892acd30..7801447e724fd 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/DetectorTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/DetectorTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractXContentTestCase;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/FilterRefTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/FilterRefTests.java
similarity index 96%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/FilterRefTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/FilterRefTests.java
index 00862e5307b9e..cdc79b83524a0 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/FilterRefTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/FilterRefTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractXContentTestCase;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/JobTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/JobTests.java
similarity index 99%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/JobTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/JobTests.java
index 61931743403e0..1946f70a230d9 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/JobTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/JobTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import com.carrotsearch.randomizedtesting.generators.CodepointSetGenerator;
import org.elasticsearch.common.settings.Settings;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/MlFilterTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/MlFilterTests.java
similarity index 98%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/MlFilterTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/MlFilterTests.java
index 6c595e2d6da15..5e218a8dce7df 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/MlFilterTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/MlFilterTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractXContentTestCase;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/ModelPlotConfigTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/ModelPlotConfigTests.java
similarity index 96%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/ModelPlotConfigTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/ModelPlotConfigTests.java
index 23f13c732123a..50f1b49f41443 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/ModelPlotConfigTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/ModelPlotConfigTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractXContentTestCase;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/RuleConditionTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/RuleConditionTests.java
similarity index 98%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/RuleConditionTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/RuleConditionTests.java
index 4348ea194d01b..3386d3fdc52e2 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/RuleConditionTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/RuleConditionTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractXContentTestCase;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/RuleScopeTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/RuleScopeTests.java
similarity index 97%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/RuleScopeTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/RuleScopeTests.java
index ac97e457ac470..2231b913251ed 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/config/RuleScopeTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/config/RuleScopeTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.config;
+package org.elasticsearch.client.ml.job.config;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractXContentTestCase;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/process/DataCountsTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/process/DataCountsTests.java
similarity index 98%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/process/DataCountsTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/process/DataCountsTests.java
index 2232e8c88d924..7c261e8d4c915 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/process/DataCountsTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/process/DataCountsTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.process;
+package org.elasticsearch.client.ml.job.process;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractXContentTestCase;
@@ -113,7 +113,7 @@ private void assertAllFieldsGreaterThanZero(DataCounts stats) throws Exception {
private static DataCounts createCounts(
long processedRecordCount, long processedFieldCount, long inputBytes, long inputFieldCount,
- long invalidDateCount, long missingFieldCount, long outOfOrderTimeStampCount,
+ long invalidDateCount, long missingFieldCount, long outOfOrderTimeStampCount,
long emptyBucketCount, long sparseBucketCount, long bucketCount,
long earliestRecordTime, long latestRecordTime, long lastDataTimeStamp, long latestEmptyBucketTimeStamp,
long latestSparseBucketTimeStamp) {
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/process/ModelSizeStatsTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/process/ModelSizeStatsTests.java
similarity index 96%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/process/ModelSizeStatsTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/process/ModelSizeStatsTests.java
index e3341123fb007..4a12a75f2b17d 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/process/ModelSizeStatsTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/process/ModelSizeStatsTests.java
@@ -16,15 +16,16 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.process;
+package org.elasticsearch.client.ml.job.process;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractXContentTestCase;
-import org.elasticsearch.protocol.xpack.ml.job.process.ModelSizeStats.MemoryStatus;
import java.util.Date;
+import static org.elasticsearch.client.ml.job.process.ModelSizeStats.MemoryStatus;
+
public class ModelSizeStatsTests extends AbstractXContentTestCase {
public void testDefaultConstructor() {
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/process/ModelSnapshotTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/process/ModelSnapshotTests.java
similarity index 99%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/process/ModelSnapshotTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/process/ModelSnapshotTests.java
index 8c6a9bd83c915..9669f9bfa4f4e 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/process/ModelSnapshotTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/process/ModelSnapshotTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.process;
+package org.elasticsearch.client.ml.job.process;
import org.elasticsearch.Version;
import org.elasticsearch.common.unit.TimeValue;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/process/QuantilesTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/process/QuantilesTests.java
similarity index 98%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/process/QuantilesTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/process/QuantilesTests.java
index 77ae21bc6f89a..24c70f6d68f66 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/process/QuantilesTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/process/QuantilesTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.process;
+package org.elasticsearch.client.ml.job.process;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentParser;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/AnomalyCauseTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/AnomalyCauseTests.java
similarity index 98%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/AnomalyCauseTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/AnomalyCauseTests.java
index 070b9f18b4dc4..3ac6a0b6ec4db 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/AnomalyCauseTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/AnomalyCauseTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.results;
+package org.elasticsearch.client.ml.job.results;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractXContentTestCase;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/AnomalyRecordTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/AnomalyRecordTests.java
similarity index 96%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/AnomalyRecordTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/AnomalyRecordTests.java
index d4cadb19796b5..a857cd3d9b10f 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/AnomalyRecordTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/AnomalyRecordTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.results;
+package org.elasticsearch.client.ml.job.results;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractXContentTestCase;
@@ -33,7 +33,7 @@ protected AnomalyRecord createTestInstance() {
return createTestInstance("foo");
}
- public AnomalyRecord createTestInstance(String jobId) {
+ public static AnomalyRecord createTestInstance(String jobId) {
AnomalyRecord anomalyRecord = new AnomalyRecord(jobId, new Date(randomNonNegativeLong()), randomNonNegativeLong());
anomalyRecord.setActual(Collections.singletonList(randomDouble()));
anomalyRecord.setTypical(Collections.singletonList(randomDouble()));
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/BucketInfluencerTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/BucketInfluencerTests.java
similarity index 99%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/BucketInfluencerTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/BucketInfluencerTests.java
index 7e4c166d1fd67..7b8ba13839849 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/BucketInfluencerTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/BucketInfluencerTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.results;
+package org.elasticsearch.client.ml.job.results;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractXContentTestCase;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/BucketTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/BucketTests.java
similarity index 98%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/BucketTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/BucketTests.java
index 0eb988d8eb82b..b9fac88faccc0 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/BucketTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/BucketTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.results;
+package org.elasticsearch.client.ml.job.results;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractXContentTestCase;
@@ -70,7 +70,7 @@ public static Bucket createTestInstance(String jobId) {
int size = randomInt(10);
List records = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
- AnomalyRecord anomalyRecord = new AnomalyRecordTests().createTestInstance(jobId);
+ AnomalyRecord anomalyRecord = AnomalyRecordTests.createTestInstance(jobId);
records.add(anomalyRecord);
}
bucket.setRecords(records);
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/CategoryDefinitionTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/CategoryDefinitionTests.java
similarity index 98%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/CategoryDefinitionTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/CategoryDefinitionTests.java
index 28ef4a5ecb241..27e15a1600d38 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/CategoryDefinitionTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/CategoryDefinitionTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.results;
+package org.elasticsearch.client.ml.job.results;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractXContentTestCase;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/InfluenceTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/InfluenceTests.java
similarity index 96%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/InfluenceTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/InfluenceTests.java
index b029997d015fa..89b2e5dbcbb6d 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/InfluenceTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/InfluenceTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.results;
+package org.elasticsearch.client.ml.job.results;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractXContentTestCase;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/InfluencerTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/InfluencerTests.java
similarity index 97%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/InfluencerTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/InfluencerTests.java
index 8125a1a5c725f..ef83af39958de 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/InfluencerTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/InfluencerTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.results;
+package org.elasticsearch.client.ml.job.results;
import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.xcontent.XContentHelper;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/OverallBucketTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/OverallBucketTests.java
similarity index 97%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/OverallBucketTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/OverallBucketTests.java
index babd7410d57ce..9ee6a2025b692 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/job/results/OverallBucketTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/results/OverallBucketTests.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.job.results;
+package org.elasticsearch.client.ml.job.results;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractXContentTestCase;
diff --git a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/util/PageParamsTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/util/PageParamsTests.java
similarity index 92%
rename from x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/util/PageParamsTests.java
rename to client/rest-high-level/src/test/java/org/elasticsearch/client/ml/util/PageParamsTests.java
index 6bd51e93c6f37..f74cedf1437d1 100644
--- a/x-pack/protocol/src/test/java/org/elasticsearch/protocol/xpack/ml/util/PageParamsTests.java
+++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/util/PageParamsTests.java
@@ -16,10 +16,10 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.elasticsearch.protocol.xpack.ml.util;
+package org.elasticsearch.client.ml.util;
+import org.elasticsearch.client.ml.job.util.PageParams;
import org.elasticsearch.common.xcontent.XContentParser;
-import org.elasticsearch.protocol.xpack.ml.job.util.PageParams;
import org.elasticsearch.test.AbstractXContentTestCase;
public class PageParamsTests extends AbstractXContentTestCase {
diff --git a/distribution/tools/plugin-cli/build.gradle b/distribution/tools/plugin-cli/build.gradle
index c47786299bc2f..38be8db42ff6a 100644
--- a/distribution/tools/plugin-cli/build.gradle
+++ b/distribution/tools/plugin-cli/build.gradle
@@ -39,3 +39,9 @@ test {
// TODO: find a way to add permissions for the tests in this module
systemProperty 'tests.security.manager', 'false'
}
+
+if (project.inFipsJvm) {
+ // FIPS JVM includes manny classes from bouncycastle which count as jar hell for the third party audit,
+ // rather than provide a long list of exclusions, disable the check on FIPS.
+ thirdPartyAudit.enabled = false
+}
diff --git a/docs/java-rest/high-level/document/reindex.asciidoc b/docs/java-rest/high-level/document/reindex.asciidoc
new file mode 100644
index 0000000000000..b6d98b42dc509
--- /dev/null
+++ b/docs/java-rest/high-level/document/reindex.asciidoc
@@ -0,0 +1,215 @@
+[[java-rest-high-document-reindex]]
+=== Reindex API
+
+[[java-rest-high-document-reindex-request]]
+==== Reindex Request
+
+A `ReindexRequest` can be used to copy documents from one or more indexes into a destination index.
+
+It requires an existing source index and a target index which may or may not exist pre-request. Reindex does not attempt
+to set up the destination index. It does not copy the settings of the source index. You should set up the destination
+index prior to running a _reindex action, including setting up mappings, shard counts, replicas, etc.
+
+The simplest form of a `ReindexRequest` looks like follows:
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/CRUDDocumentationIT.java[reindex-request]
+--------------------------------------------------
+<1> Creates the `ReindexRequest`
+<2> Adds a list of sources to copy from
+<3> Adds the destination index
+
+The `dest` element can be configured like the index API to control optimistic concurrency control. Just leaving out
+`versionType` (as above) or setting it to internal will cause Elasticsearch to blindly dump documents into the target.
+Setting `versionType` to external will cause Elasticsearch to preserve the version from the source, create any documents
+that are missing, and update any documents that have an older version in the destination index than they do in the
+source index.
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/CRUDDocumentationIT.java[reindex-request-versionType]
+--------------------------------------------------
+<1> Set the versionType to `EXTERNAL`
+
+Setting `opType` to `create` will cause `_reindex` to only create missing documents in the target index. All existing
+documents will cause a version conflict. The default `opType` is `index`.
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/CRUDDocumentationIT.java[reindex-request-opType]
+--------------------------------------------------
+<1> Set the opType to `create`
+
+By default version conflicts abort the `_reindex` process but you can just count them by settings it to `proceed`
+in the request body
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/CRUDDocumentationIT.java[reindex-request-conflicts]
+--------------------------------------------------
+<1> Set `proceed` on version conflict
+
+You can limit the documents by adding a type to the source or by adding a query.
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/CRUDDocumentationIT.java[reindex-request-typeOrQuery]
+--------------------------------------------------
+<1> Only copy `doc` type
+<2> Only copy documents which have field `user` set to `kimchy`
+
+It’s also possible to limit the number of processed documents by setting size.
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/CRUDDocumentationIT.java[reindex-request-size]
+--------------------------------------------------
+<1> Only copy 10 documents
+
+By default `_reindex` uses batches of 1000. You can change the batch size with `sourceBatchSize`.
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/CRUDDocumentationIT.java[reindex-request-sourceSize]
+--------------------------------------------------
+<1> Use batches of 100 documents
+
+Reindex can also use the ingest feature by specifying a `pipeline`.
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/CRUDDocumentationIT.java[reindex-request-pipeline]
+--------------------------------------------------
+<1> set pipeline to `my_pipeline`
+
+If you want a particular set of documents from the source index you’ll need to use sort. If possible, prefer a more
+selective query to size and sort.
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/CRUDDocumentationIT.java[reindex-request-sort]
+--------------------------------------------------
+<1> add descending sort to`field1`
+<2> add ascending sort to `field2`
+
+`ReindexRequest` also supports a `script` that modifies the document. It allows you to also change the document's
+metadata. The following example illustrates that.
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/CRUDDocumentationIT.java[reindex-request-script]
+--------------------------------------------------
+<1> `setScript` to increment the `likes` field on all documents with user `kimchy`.
+
+`ReindexRequest` supports reindexing from a remote Elasticsearch cluster. When using a remote cluster the query should be
+specified inside the `RemoteInfo` object and not using `setSourceQuery`. If both the remote info and the source query are
+set it results in a validation error during the request. The reason for this is that the remote Elasticsearch may not
+understand queries built by the modern query builders. The remote cluster support works all the way back to Elasticsearch
+0.90 and the query language has changed since then. When reaching older versions, it is safer to write the query by hand
+in JSON.
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/CRUDDocumentationIT.java[reindex-request-remote]
+--------------------------------------------------
+<1> set remote elastic cluster
+
+`ReindexRequest` also helps in automatically parallelizing using `sliced-scroll` to
+slice on `_uid`. Use `setSlices` to specify the number of slices to use.
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/CRUDDocumentationIT.java[reindex-request-slices]
+--------------------------------------------------
+<1> set number of slices to use
+
+`ReindexRequest` uses the `scroll` parameter to control how long it keeps the "search context" alive.
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/CRUDDocumentationIT.java[reindex-request-scroll]
+--------------------------------------------------
+<1> set scroll time
+
+
+==== Optional arguments
+In addition to the options above the following arguments can optionally be also provided:
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/CRUDDocumentationIT.java[reindex-request-timeout]
+--------------------------------------------------
+<1> Timeout to wait for the reindex request to be performed as a `TimeValue`
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/CRUDDocumentationIT.java[reindex-request-refresh]
+--------------------------------------------------
+<1> Refresh index after calling reindex
+
+
+[[java-rest-high-document-reindex-sync]]
+==== Synchronous Execution
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/CRUDDocumentationIT.java[reindex-execute]
+--------------------------------------------------
+
+[[java-rest-high-document-reindex-async]]
+==== Asynchronous Execution
+
+The asynchronous execution of a reindex request requires both the `ReindexRequest`
+instance and an `ActionListener` instance to be passed to the asynchronous
+method:
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/CRUDDocumentationIT.java[reindex-execute-async]
+--------------------------------------------------
+<1> The `ReindexRequest` to execute and the `ActionListener` to use when
+the execution completes
+
+The asynchronous method does not block and returns immediately. Once it is
+completed the `ActionListener` is called back using the `onResponse` method
+if the execution successfully completed or using the `onFailure` method if
+it failed.
+
+A typical listener for `BulkByScrollResponse` looks like:
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/CRUDDocumentationIT.java[reindex-execute-listener]
+--------------------------------------------------
+<1> Called when the execution is successfully completed. The response is
+provided as an argument and contains a list of individual results for each
+operation that was executed. Note that one or more operations might have
+failed while the others have been successfully executed.
+<2> Called when the whole `ReindexRequest` fails. In this case the raised
+exception is provided as an argument and no operation has been executed.
+
+[[java-rest-high-document-reindex-response]]
+==== Reindex Response
+
+The returned `BulkByScrollResponse` contains information about the executed operations and
+ allows to iterate over each result as follows:
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/CRUDDocumentationIT.java[reindex-response]
+--------------------------------------------------
+<1> Get total time taken
+<2> Check if the request timed out
+<3> Get total number of docs processed
+<4> Number of docs that were updated
+<5> Number of docs that were created
+<6> Number of docs that were deleted
+<7> Number of batches that were executed
+<8> Number of skipped docs
+<9> Number of version conflicts
+<10> Number of times request had to retry bulk index operations
+<11> Number of times request had to retry search operations
+<12> The total time this request has throttled itself not including the current throttle time if it is currently sleeping
+<13> Remaining delay of any current throttle sleep or 0 if not sleeping
+<14> Failures during search phase
+<15> Failures during bulk index operation
diff --git a/docs/java-rest/high-level/ml/get-records.asciidoc b/docs/java-rest/high-level/ml/get-records.asciidoc
new file mode 100644
index 0000000000000..40cc185225ee8
--- /dev/null
+++ b/docs/java-rest/high-level/ml/get-records.asciidoc
@@ -0,0 +1,113 @@
+[[java-rest-high-x-pack-ml-get-records]]
+=== Get Records API
+
+The Get Records API retrieves one or more record results.
+It accepts a `GetRecordsRequest` object and responds
+with a `GetRecordsResponse` object.
+
+[[java-rest-high-x-pack-ml-get-records-request]]
+==== Get Records Request
+
+A `GetRecordsRequest` object gets created with an existing non-null `jobId`.
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/MlClientDocumentationIT.java[x-pack-ml-get-records-request]
+--------------------------------------------------
+<1> Constructing a new request referencing an existing `jobId`
+
+==== Optional Arguments
+The following arguments are optional:
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/MlClientDocumentationIT.java[x-pack-ml-get-records-desc]
+--------------------------------------------------
+<1> If `true`, the records are sorted in descending order. Defaults to `false`.
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/MlClientDocumentationIT.java[x-pack-ml-get-records-end]
+--------------------------------------------------
+<1> Records with timestamps earlier than this time will be returned.
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/MlClientDocumentationIT.java[x-pack-ml-get-records-exclude-interim]
+--------------------------------------------------
+<1> If `true`, interim results will be excluded. Defaults to `false`.
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/MlClientDocumentationIT.java[x-pack-ml-get-records-page]
+--------------------------------------------------
+<1> The page parameters `from` and `size`. `from` specifies the number of records to skip.
+`size` specifies the maximum number of records to get. Defaults to `0` and `100` respectively.
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/MlClientDocumentationIT.java[x-pack-ml-get-records-record-score]
+--------------------------------------------------
+<1> Records with record_score greater or equal than this value will be returned.
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/MlClientDocumentationIT.java[x-pack-ml-get-records-sort]
+--------------------------------------------------
+<1> The field to sort records on. Defaults to `influencer_score`.
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/MlClientDocumentationIT.java[x-pack-ml-get-records-end]
+--------------------------------------------------
+<1> Records with timestamps on or after this time will be returned.
+
+[[java-rest-high-x-pack-ml-get-records-execution]]
+==== Execution
+
+The request can be executed through the `MachineLearningClient` contained
+in the `RestHighLevelClient` object, accessed via the `machineLearningClient()` method.
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/MlClientDocumentationIT.java[x-pack-ml-get-records-execute]
+--------------------------------------------------
+
+
+[[java-rest-high-x-pack-ml-get-records-execution-async]]
+==== Asynchronous Execution
+
+The request can also be executed asynchronously:
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/MlClientDocumentationIT.java[x-pack-ml-get-records-execute-async]
+--------------------------------------------------
+<1> The `GetRecordsRequest` to execute and the `ActionListener` to use when
+the execution completes
+
+The asynchronous method does not block and returns immediately. Once it is
+completed the `ActionListener` is called back with the `onResponse` method
+if the execution is successful or the `onFailure` method if the execution
+failed.
+
+A typical listener for `GetRecordsResponse` looks like:
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/MlClientDocumentationIT.java[x-pack-ml-get-records-listener]
+--------------------------------------------------
+<1> `onResponse` is called back when the action is completed successfully
+<2> `onFailure` is called back when some unexpected error occurs
+
+[[java-rest-high-snapshot-ml-get-records-response]]
+==== Get Records Response
+
+The returned `GetRecordsResponse` contains the requested records:
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{doc-tests}/MlClientDocumentationIT.java[x-pack-ml-get-records-response]
+--------------------------------------------------
+<1> The count of records that were matched
+<2> The records retrieved
\ No newline at end of file
diff --git a/docs/java-rest/high-level/supported-apis.asciidoc b/docs/java-rest/high-level/supported-apis.asciidoc
index e04e391f3e0b7..2b72ca74f6aa9 100644
--- a/docs/java-rest/high-level/supported-apis.asciidoc
+++ b/docs/java-rest/high-level/supported-apis.asciidoc
@@ -15,6 +15,7 @@ Single document APIs::
Multi-document APIs::
* <>
* <>
+* <>
include::document/index.asciidoc[]
include::document/get.asciidoc[]
@@ -23,6 +24,7 @@ include::document/delete.asciidoc[]
include::document/update.asciidoc[]
include::document/bulk.asciidoc[]
include::document/multi-get.asciidoc[]
+include::document/reindex.asciidoc[]
== Search APIs
@@ -210,6 +212,7 @@ The Java High Level REST Client supports the following Machine Learning APIs:
* <>
* <>
* <>
+* <>
include::ml/put-job.asciidoc[]
include::ml/get-job.asciidoc[]
@@ -217,6 +220,7 @@ include::ml/delete-job.asciidoc[]
include::ml/open-job.asciidoc[]
include::ml/close-job.asciidoc[]
include::ml/get-buckets.asciidoc[]
+include::ml/get-records.asciidoc[]
== Migration APIs
diff --git a/docs/reference/commands/certgen.asciidoc b/docs/reference/commands/certgen.asciidoc
index 3a8b15fbd28c8..956a4637ed31f 100644
--- a/docs/reference/commands/certgen.asciidoc
+++ b/docs/reference/commands/certgen.asciidoc
@@ -1,9 +1,9 @@
[role="xpack"]
[testenv="gold+"]
[[certgen]]
-== certgen
+== elasticsearch-certgen
-deprecated[6.1,Replaced by <>.]
+deprecated[6.1,Replaced by <>.]
The `elasticsearch-certgen` command simplifies the creation of certificate
authorities (CA), certificate signing requests (CSR), and signed certificates
diff --git a/docs/reference/commands/saml-metadata.asciidoc b/docs/reference/commands/saml-metadata.asciidoc
index 069c7135c0144..5309f83288f89 100644
--- a/docs/reference/commands/saml-metadata.asciidoc
+++ b/docs/reference/commands/saml-metadata.asciidoc
@@ -1,7 +1,7 @@
[role="xpack"]
[testenv="gold+"]
[[saml-metadata]]
-== saml-metadata
+== elasticsearch-saml-metadata
The `elasticsearch-saml-metadata` command can be used to generate a SAML 2.0 Service
Provider Metadata file.
diff --git a/docs/reference/commands/users-command.asciidoc b/docs/reference/commands/users-command.asciidoc
index e53e0815c5d7b..cf678f2138dfb 100644
--- a/docs/reference/commands/users-command.asciidoc
+++ b/docs/reference/commands/users-command.asciidoc
@@ -1,10 +1,7 @@
[role="xpack"]
[testenv="gold+"]
[[users-command]]
-== Users Command
-++++
-users
-++++
+== elasticsearch-users
If you use file-based user authentication, the `elasticsearch-users` command
enables you to add and remove users, assign user roles, and manage passwords.
diff --git a/docs/reference/images/msi_installer/msi_installer_configuration.png b/docs/reference/images/msi_installer/msi_installer_configuration.png
index 058df78792fbb..36bae6cc5199d 100644
Binary files a/docs/reference/images/msi_installer/msi_installer_configuration.png and b/docs/reference/images/msi_installer/msi_installer_configuration.png differ
diff --git a/docs/reference/images/msi_installer/msi_installer_help.png b/docs/reference/images/msi_installer/msi_installer_help.png
index 9b63c512100de..458b0821c1f04 100644
Binary files a/docs/reference/images/msi_installer/msi_installer_help.png and b/docs/reference/images/msi_installer/msi_installer_help.png differ
diff --git a/docs/reference/images/msi_installer/msi_installer_installing.png b/docs/reference/images/msi_installer/msi_installer_installing.png
index 498d927ce2f5e..590c52371a74e 100644
Binary files a/docs/reference/images/msi_installer/msi_installer_installing.png and b/docs/reference/images/msi_installer/msi_installer_installing.png differ
diff --git a/docs/reference/images/msi_installer/msi_installer_locations.png b/docs/reference/images/msi_installer/msi_installer_locations.png
index a8c816089748d..ba7151e3714de 100644
Binary files a/docs/reference/images/msi_installer/msi_installer_locations.png and b/docs/reference/images/msi_installer/msi_installer_locations.png differ
diff --git a/docs/reference/images/msi_installer/msi_installer_no_service.png b/docs/reference/images/msi_installer/msi_installer_no_service.png
index d26bb75f265f6..fbe9a0510c795 100644
Binary files a/docs/reference/images/msi_installer/msi_installer_no_service.png and b/docs/reference/images/msi_installer/msi_installer_no_service.png differ
diff --git a/docs/reference/images/msi_installer/msi_installer_plugins.png b/docs/reference/images/msi_installer/msi_installer_plugins.png
index 3a6901a18e220..e58f426a47dc7 100644
Binary files a/docs/reference/images/msi_installer/msi_installer_plugins.png and b/docs/reference/images/msi_installer/msi_installer_plugins.png differ
diff --git a/docs/reference/images/msi_installer/msi_installer_selected_plugins.png b/docs/reference/images/msi_installer/msi_installer_selected_plugins.png
index 8a817c81f8dfd..e58f426a47dc7 100644
Binary files a/docs/reference/images/msi_installer/msi_installer_selected_plugins.png and b/docs/reference/images/msi_installer/msi_installer_selected_plugins.png differ
diff --git a/docs/reference/images/msi_installer/msi_installer_service.png b/docs/reference/images/msi_installer/msi_installer_service.png
index b1445fa2d6af3..c7fae13637b76 100644
Binary files a/docs/reference/images/msi_installer/msi_installer_service.png and b/docs/reference/images/msi_installer/msi_installer_service.png differ
diff --git a/docs/reference/images/msi_installer/msi_installer_success.png b/docs/reference/images/msi_installer/msi_installer_success.png
index 337cbc9eb509b..3a58467ae18fc 100644
Binary files a/docs/reference/images/msi_installer/msi_installer_success.png and b/docs/reference/images/msi_installer/msi_installer_success.png differ
diff --git a/docs/reference/images/msi_installer/msi_installer_uninstall.png b/docs/reference/images/msi_installer/msi_installer_uninstall.png
index 26c9bcb7c9a09..6b5b69a576841 100644
Binary files a/docs/reference/images/msi_installer/msi_installer_uninstall.png and b/docs/reference/images/msi_installer/msi_installer_uninstall.png differ
diff --git a/docs/reference/images/msi_installer/msi_installer_upgrade_configuration.png b/docs/reference/images/msi_installer/msi_installer_upgrade_configuration.png
index a72fdf2ff912f..7ca413bb299e4 100644
Binary files a/docs/reference/images/msi_installer/msi_installer_upgrade_configuration.png and b/docs/reference/images/msi_installer/msi_installer_upgrade_configuration.png differ
diff --git a/docs/reference/images/msi_installer/msi_installer_upgrade_notice.png b/docs/reference/images/msi_installer/msi_installer_upgrade_notice.png
index a4842b8d6d01c..e5ee18b520807 100644
Binary files a/docs/reference/images/msi_installer/msi_installer_upgrade_notice.png and b/docs/reference/images/msi_installer/msi_installer_upgrade_notice.png differ
diff --git a/docs/reference/images/msi_installer/msi_installer_upgrade_plugins.png b/docs/reference/images/msi_installer/msi_installer_upgrade_plugins.png
index 6399c99baacff..3e7496505f742 100644
Binary files a/docs/reference/images/msi_installer/msi_installer_upgrade_plugins.png and b/docs/reference/images/msi_installer/msi_installer_upgrade_plugins.png differ
diff --git a/docs/reference/images/msi_installer/msi_installer_xpack.png b/docs/reference/images/msi_installer/msi_installer_xpack.png
index 3f5f6d975940e..e457a578877bb 100644
Binary files a/docs/reference/images/msi_installer/msi_installer_xpack.png and b/docs/reference/images/msi_installer/msi_installer_xpack.png differ
diff --git a/docs/reference/migration/migrate_7_0/search.asciidoc b/docs/reference/migration/migrate_7_0/search.asciidoc
index 76367115e1302..a7d32896e9723 100644
--- a/docs/reference/migration/migrate_7_0/search.asciidoc
+++ b/docs/reference/migration/migrate_7_0/search.asciidoc
@@ -54,6 +54,13 @@ Setting `request_cache:true` on a query that creates a scroll (`scroll=1m`)
has been deprecated in 6 and will now return a `400 - Bad request`.
Scroll queries are not meant to be cached.
+==== Scroll queries cannot use `rescore` anymore
+Including a rescore clause on a query that creates a scroll (`scroll=1m`) has
+been deprecated in 6.5 and will now return a `400 - Bad request`. Allowing
+rescore on scroll queries would break the scroll sort. In the 6.x line, the
+rescore clause was silently ignored (for scroll queries), and it was allowed in
+the 5.x line.
+
==== Term Suggesters supported distance algorithms
The following string distance algorithms were given additional names in 6.2 and
diff --git a/docs/reference/setup/install/windows.asciidoc b/docs/reference/setup/install/windows.asciidoc
index f5e248598ca9f..f2e9077e20ed1 100644
--- a/docs/reference/setup/install/windows.asciidoc
+++ b/docs/reference/setup/install/windows.asciidoc
@@ -47,21 +47,21 @@ aside panel with additional information for each input:
image::images/msi_installer/msi_installer_help.png[]
Within the first screen, select the directory for the installation. In addition, select directories for where
-data, logs and configuration will reside or <>:
+data, logs and configuration will be placed or <>:
[[msi-installer-locations]]
image::images/msi_installer/msi_installer_locations.png[]
Then select whether to install as a service or start Elasticsearch manually as needed. When
-installing as a service, you can also decide which account to run the service under as well
-as whether the service should be started after installation and when Windows is started or
-restarted:
+installing as a service, you can also configure the Windows account to run the service with,
+whether the service should be started after installation and the Windows startup behaviour:
[[msi-installer-service]]
image::images/msi_installer/msi_installer_service.png[]
-IMPORTANT: When selecting an account to run the service with, be sure that the chosen account
-has sufficient privileges to access the installation and other deployment directories chosen.
+IMPORTANT: When selecting a Windows account to run the service with, be sure that the chosen account
+has sufficient privileges to access the installation and other deployment directories chosen. Also
+ensure the account is able to run Windows services.
Common configuration settings are exposed within the Configuration section, allowing the cluster
name, node name and roles to be set, in addition to memory and network settings:
@@ -69,28 +69,26 @@ name, node name and roles to be set, in addition to memory and network settings:
[[msi-installer-configuration]]
image::images/msi_installer/msi_installer_configuration.png[]
-A list of common plugins that can be downloaded and installed as
-part of the installation, with the option to configure a HTTPS proxy through which to download:
+A list of common plugins that can be downloaded and installed as part of the installation, with the option to configure a HTTPS proxy through which to download these plugins.
+
+TIP: Ensure the installation machine has access to the internet and that any corporate firewalls in place are configured to allow downloads from `artifacts.elastic.co`:
[[msi-installer-selected-plugins]]
image::images/msi_installer/msi_installer_selected_plugins.png[]
-Upon choosing to install {xpack} plugin, an additional step allows a choice of the type of {xpack}
-license to install, in addition to {security} configuration and built-in user configuration:
+As of version 6.3.0, X-Pack is now https://www.elastic.co/products/x-pack/open[bundled by default]. The final step allows a choice of the type of X-Pack license to install, in addition to security configuration and built-in user configuration:
[[msi-installer-xpack]]
image::images/msi_installer/msi_installer_xpack.png[]
-NOTE: {xpack} includes a choice of a Trial or Basic license for 30 days. After that, you can obtain one of the
-https://www.elastic.co/subscriptions[available subscriptions] or {ref}/security-settings.html[disable Security].
-The Basic license is free and includes the https://www.elastic.co/products/x-pack/monitoring[Monitoring] extension.
+NOTE: X-Pack includes a choice of a Trial or Basic license. A Trial license is valid for 30 days, after which you can obtain one of the available subscriptions. The Basic license is free and perpetual. Consult the https://www.elastic.co/subscriptions[available subscriptions] for further details on which features are available under which license.
-After clicking the install button, the installer will begin installation:
+After clicking the install button, the installation will begin:
[[msi-installer-installing]]
image::images/msi_installer/msi_installer_installing.png[]
-and will indicate when it has been successfully installed:
+...and will indicate when it has been successfully installed:
[[msi-installer-success]]
image::images/msi_installer/msi_installer_success.png[]
@@ -107,7 +105,7 @@ then running:
msiexec.exe /i elasticsearch-{version}.msi /qn
--------------------------------------------
-By default, msiexec does not wait for the installation process to complete, since it runs in the
+By default, `msiexec.exe` does not wait for the installation process to complete, since it runs in the
Windows subsystem. To wait on the process to finish and ensure that `%ERRORLEVEL%` is set
accordingly, it is recommended to use `start /wait` to create a process and wait for it to exit
@@ -132,13 +130,13 @@ Supported Windows Installer command line arguments can be viewed using
msiexec.exe /help
--------------------------------------------
-or by consulting the https://msdn.microsoft.com/en-us/library/windows/desktop/aa367988(v=vs.85).aspx[Windows Installer SDK Command-Line Options].
+...or by consulting the https://msdn.microsoft.com/en-us/library/windows/desktop/aa367988(v=vs.85).aspx[Windows Installer SDK Command-Line Options].
[[msi-command-line-options]]
==== Command line options
All settings exposed within the GUI are also available as command line arguments (referred to
-as _properties_ within Windows Installer documentation) that can be passed to msiexec:
+as _properties_ within Windows Installer documentation) that can be passed to `msiexec.exe`:
[horizontal]
`INSTALLDIR`::
@@ -282,47 +280,46 @@ as _properties_ within Windows Installer documentation) that can be passed to ms
`XPACKLICENSE`::
- When installing {xpack} plugin, the type of license to install,
- either `Basic` or `Trial`. Defaults to `Basic`
+ The type of X-Pack license to install, either `Basic` or `Trial`. Defaults to `Basic`
`XPACKSECURITYENABLED`::
- When installing {xpack} plugin with a `Trial` license, whether {security} should be enabled.
+ When installing with a `Trial` license, whether X-Pack Security should be enabled.
Defaults to `true`
`BOOTSTRAPPASSWORD`::
- When installing {xpack} plugin with a `Trial` license and {security} enabled, the password to
+ When installing with a `Trial` license and X-Pack Security enabled, the password to
used to bootstrap the cluster and persisted as the `bootstrap.password` setting in the keystore.
Defaults to a randomized value.
`SKIPSETTINGPASSWORDS`::
- When installing {xpack} plugin with a `Trial` license and {security} enabled, whether the
+ When installing with a `Trial` license and X-Pack Security enabled, whether the
installation should skip setting up the built-in users `elastic`, `kibana` and `logstash_system`.
Defaults to `false`
`ELASTICUSERPASSWORD`::
- When installing {xpack} plugin with a `Trial` license and {security} enabled, the password
+ When installing with a `Trial` license and X-Pack Security enabled, the password
to use for the built-in user `elastic`. Defaults to `""`
`KIBANAUSERPASSWORD`::
- When installing {xpack} plugin with a `Trial` license and {security} enabled, the password
+ When installing with a `Trial` license and X-Pack Security enabled, the password
to use for the built-in user `kibana`. Defaults to `""`
`LOGSTASHSYSTEMUSERPASSWORD`::
- When installing {xpack} plugin with a `Trial` license and {security} enabled, the password
+ When installing with a `Trial` license and X-Pack Security enabled, the password
to use for the built-in user `logstash_system`. Defaults to `""`
To pass a value, simply append the property name and value using the format `=""` to
-the installation command. For example, to use a different installation directory to the default one and to install https://www.elastic.co/products/x-pack[{xpack}]:
+the installation command. For example, to use a different installation directory to the default one and to install https://www.elastic.co/products/x-pack[X-Pack]:
["source","sh",subs="attributes,callouts"]
--------------------------------------------
-start /wait msiexec.exe /i elasticsearch-{version}.msi /qn INSTALLDIR="C:\Custom Install Directory" PLUGINS="x-pack"
+start /wait msiexec.exe /i elasticsearch-{version}.msi /qn INSTALLDIR="C:\Custom Install Directory\{version}" PLUGINS="x-pack"
--------------------------------------------
Consult the https://msdn.microsoft.com/en-us/library/windows/desktop/aa367988(v=vs.85).aspx[Windows Installer SDK Command-Line Options]
@@ -330,9 +327,10 @@ for additional rules related to values containing quotation marks.
ifdef::include-xpack[]
[[msi-installer-enable-indices]]
-==== Enable automatic creation of {xpack} indices
+==== Enable automatic creation of X-Pack indices
+
-{xpack} will try to automatically create a number of indices within {es}.
+X-Pack will try to automatically create a number of indices within Elasticsearch.
include::xpack-indices.asciidoc[]
endif::include-xpack[]
@@ -344,7 +342,7 @@ include::msi-windows-start.asciidoc[]
==== Configuring Elasticsearch on the command line
Elasticsearch loads its configuration from the `%ES_PATH_CONF%\elasticsearch.yml`
-file by default. The format of this config file is explained in
+file by default. The format of this config file is explained in
<>.
Any settings that can be specified in the config file can also be specified on
@@ -393,10 +391,11 @@ with PowerShell:
[source,powershell]
--------------------------------------------
-Get-Service Elasticsearch | Stop-Service | Start-Service
+Get-Service Elasticsearch | Stop-Service
+Get-Service Elasticsearch | Start-Service
--------------------------------------------
-Changes can be made to jvm.options and elasticsearch.yml configuration files to configure the
+Changes can be made to `jvm.options` and `elasticsearch.yml` configuration files to configure the
service after installation. Most changes (like JVM settings) will require a restart of the
service in order to take effect.
@@ -404,16 +403,16 @@ service in order to take effect.
==== Upgrade using the graphical user interface (GUI)
The `.msi` package supports upgrading an installed version of Elasticsearch to a newer
-version of Elasticsearch. The upgrade process through the GUI handles upgrading all
+version. The upgrade process through the GUI handles upgrading all
installed plugins as well as retaining both your data and configuration.
-Downloading and clicking on a newer version of the `.msi` package will launch the GUI wizard.
-The first step will list the read only properties from the previous installation:
+Downloading and double-clicking on a newer version of the `.msi` package will launch the GUI wizard.
+The first step will list the read-only properties from the previous installation:
[[msi-installer-upgrade-notice]]
image::images/msi_installer/msi_installer_upgrade_notice.png[]
-The following configuration step allows certain configuration options to be changed:
+The next step allows certain configuration options to be changed:
[[msi-installer-upgrade-configuration]]
image::images/msi_installer/msi_installer_upgrade_configuration.png[]
@@ -434,11 +433,11 @@ The `.msi` can also upgrade Elasticsearch using the command line.
A command line upgrade requires passing the **same** command line properties as
used at first install time; the Windows Installer does not remember these properties.
-For example, if you originally installed with the command line options `PLUGINS="x-pack"` and
+For example, if you originally installed with the command line options `PLUGINS="ingest-geoip"` and
`LOCKMEMORY="true"`, then you must pass these same values when performing an
upgrade from the command line.
-The **exception** to this is `INSTALLDIR` (if originally specified), which must be a different directory to the
+The **exception** to this is the `INSTALLDIR` parameter (if originally specified), which must be a different directory to the
current installation.
If setting `INSTALLDIR`, the final directory in the path **must** be the version of Elasticsearch e.g.
@@ -466,9 +465,8 @@ start /wait msiexec.exe /i elasticsearch-{version}.msi /qn /l upgrade.log
The `.msi` package handles uninstallation of all directories and files added as part of installation.
-WARNING: Uninstallation will remove **all** directories and their contents created as part of
-installation, **including data within the data directory**. If you wish to retain your data upon
-uninstallation, it is recommended that you make a copy of the data directory before uninstallation.
+WARNING: Uninstallation will remove **all** contents created as part of
+installation, **except for data, config or logs directories**. It is recommended that you make a copy of your data directory before upgrading or consider using the snapshot API.
MSI installer packages do not provide a GUI for uninstallation. An installed program can be uninstalled
by pressing the Windows key and typing `add or remove programs` to open the system settings.
diff --git a/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/IngestCommonPlugin.java b/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/IngestCommonPlugin.java
index b85bf085dabbb..1ed8b6058e6c9 100644
--- a/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/IngestCommonPlugin.java
+++ b/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/IngestCommonPlugin.java
@@ -82,6 +82,7 @@ public Map getProcessors(Processor.Parameters paramet
processors.put(KeyValueProcessor.TYPE, new KeyValueProcessor.Factory());
processors.put(URLDecodeProcessor.TYPE, new URLDecodeProcessor.Factory());
processors.put(BytesProcessor.TYPE, new BytesProcessor.Factory());
+ processors.put(PipelineProcessor.TYPE, new PipelineProcessor.Factory(parameters.ingestService));
processors.put(DissectProcessor.TYPE, new DissectProcessor.Factory());
return Collections.unmodifiableMap(processors);
}
diff --git a/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/PipelineProcessor.java b/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/PipelineProcessor.java
new file mode 100644
index 0000000000000..77ffdb919193f
--- /dev/null
+++ b/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/PipelineProcessor.java
@@ -0,0 +1,74 @@
+/*
+ * 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.ingest.common;
+
+import java.util.Map;
+import org.elasticsearch.ingest.AbstractProcessor;
+import org.elasticsearch.ingest.ConfigurationUtils;
+import org.elasticsearch.ingest.IngestDocument;
+import org.elasticsearch.ingest.IngestService;
+import org.elasticsearch.ingest.Pipeline;
+import org.elasticsearch.ingest.Processor;
+
+public class PipelineProcessor extends AbstractProcessor {
+
+ public static final String TYPE = "pipeline";
+
+ private final String pipelineName;
+
+ private final IngestService ingestService;
+
+ private PipelineProcessor(String tag, String pipelineName, IngestService ingestService) {
+ super(tag);
+ this.pipelineName = pipelineName;
+ this.ingestService = ingestService;
+ }
+
+ @Override
+ public void execute(IngestDocument ingestDocument) throws Exception {
+ Pipeline pipeline = ingestService.getPipeline(pipelineName);
+ if (pipeline == null) {
+ throw new IllegalStateException("Pipeline processor configured for non-existent pipeline [" + pipelineName + ']');
+ }
+ ingestDocument.executePipeline(pipeline);
+ }
+
+ @Override
+ public String getType() {
+ return TYPE;
+ }
+
+ public static final class Factory implements Processor.Factory {
+
+ private final IngestService ingestService;
+
+ public Factory(IngestService ingestService) {
+ this.ingestService = ingestService;
+ }
+
+ @Override
+ public PipelineProcessor create(Map registry, String processorTag,
+ Map config) throws Exception {
+ String pipeline =
+ ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "pipeline");
+ return new PipelineProcessor(processorTag, pipeline, ingestService);
+ }
+ }
+}
diff --git a/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/PipelineProcessorTests.java b/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/PipelineProcessorTests.java
new file mode 100644
index 0000000000000..5baf3cf822d72
--- /dev/null
+++ b/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/PipelineProcessorTests.java
@@ -0,0 +1,115 @@
+/*
+ * 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.ingest.common;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import org.elasticsearch.ElasticsearchException;
+import org.elasticsearch.ingest.CompoundProcessor;
+import org.elasticsearch.ingest.IngestDocument;
+import org.elasticsearch.ingest.IngestService;
+import org.elasticsearch.ingest.Pipeline;
+import org.elasticsearch.ingest.Processor;
+import org.elasticsearch.ingest.RandomDocumentPicks;
+import org.elasticsearch.test.ESTestCase;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class PipelineProcessorTests extends ESTestCase {
+
+ public void testExecutesPipeline() throws Exception {
+ String pipelineId = "pipeline";
+ IngestService ingestService = mock(IngestService.class);
+ CompletableFuture invoked = new CompletableFuture<>();
+ IngestDocument testIngestDocument = RandomDocumentPicks.randomIngestDocument(random(), new HashMap<>());
+ Pipeline pipeline = new Pipeline(
+ pipelineId, null, null,
+ new CompoundProcessor(new Processor() {
+ @Override
+ public void execute(final IngestDocument ingestDocument) throws Exception {
+ invoked.complete(ingestDocument);
+ }
+
+ @Override
+ public String getType() {
+ return null;
+ }
+
+ @Override
+ public String getTag() {
+ return null;
+ }
+ })
+ );
+ when(ingestService.getPipeline(pipelineId)).thenReturn(pipeline);
+ PipelineProcessor.Factory factory = new PipelineProcessor.Factory(ingestService);
+ Map config = new HashMap<>();
+ config.put("pipeline", pipelineId);
+ factory.create(Collections.emptyMap(), null, config).execute(testIngestDocument);
+ assertEquals(testIngestDocument, invoked.get());
+ }
+
+ public void testThrowsOnMissingPipeline() throws Exception {
+ IngestService ingestService = mock(IngestService.class);
+ IngestDocument testIngestDocument = RandomDocumentPicks.randomIngestDocument(random(), new HashMap<>());
+ PipelineProcessor.Factory factory = new PipelineProcessor.Factory(ingestService);
+ Map config = new HashMap<>();
+ config.put("pipeline", "missingPipelineId");
+ IllegalStateException e = expectThrows(
+ IllegalStateException.class,
+ () -> factory.create(Collections.emptyMap(), null, config).execute(testIngestDocument)
+ );
+ assertEquals(
+ "Pipeline processor configured for non-existent pipeline [missingPipelineId]", e.getMessage()
+ );
+ }
+
+ public void testThrowsOnRecursivePipelineInvocations() throws Exception {
+ String innerPipelineId = "inner";
+ String outerPipelineId = "outer";
+ IngestService ingestService = mock(IngestService.class);
+ IngestDocument testIngestDocument = RandomDocumentPicks.randomIngestDocument(random(), new HashMap<>());
+ Map outerConfig = new HashMap<>();
+ outerConfig.put("pipeline", innerPipelineId);
+ PipelineProcessor.Factory factory = new PipelineProcessor.Factory(ingestService);
+ Pipeline outer = new Pipeline(
+ outerPipelineId, null, null,
+ new CompoundProcessor(factory.create(Collections.emptyMap(), null, outerConfig))
+ );
+ Map innerConfig = new HashMap<>();
+ innerConfig.put("pipeline", outerPipelineId);
+ Pipeline inner = new Pipeline(
+ innerPipelineId, null, null,
+ new CompoundProcessor(factory.create(Collections.emptyMap(), null, innerConfig))
+ );
+ when(ingestService.getPipeline(outerPipelineId)).thenReturn(outer);
+ when(ingestService.getPipeline(innerPipelineId)).thenReturn(inner);
+ outerConfig.put("pipeline", innerPipelineId);
+ ElasticsearchException e = expectThrows(
+ ElasticsearchException.class,
+ () -> factory.create(Collections.emptyMap(), null, outerConfig).execute(testIngestDocument)
+ );
+ assertEquals(
+ "Recursive invocation of pipeline [inner] detected.", e.getRootCause().getMessage()
+ );
+ }
+}
diff --git a/modules/ingest-common/src/test/resources/rest-api-spec/test/ingest/10_basic.yml b/modules/ingest-common/src/test/resources/rest-api-spec/test/ingest/10_basic.yml
index 86557946ac0dd..eb23b7840ee6a 100644
--- a/modules/ingest-common/src/test/resources/rest-api-spec/test/ingest/10_basic.yml
+++ b/modules/ingest-common/src/test/resources/rest-api-spec/test/ingest/10_basic.yml
@@ -10,9 +10,11 @@
- contains: { nodes.$master.modules: { name: ingest-common } }
- contains: { nodes.$master.ingest.processors: { type: append } }
+ - contains: { nodes.$master.ingest.processors: { type: bytes } }
- contains: { nodes.$master.ingest.processors: { type: convert } }
- contains: { nodes.$master.ingest.processors: { type: date } }
- contains: { nodes.$master.ingest.processors: { type: date_index_name } }
+ - contains: { nodes.$master.ingest.processors: { type: dissect } }
- contains: { nodes.$master.ingest.processors: { type: dot_expander } }
- contains: { nodes.$master.ingest.processors: { type: fail } }
- contains: { nodes.$master.ingest.processors: { type: foreach } }
@@ -30,4 +32,3 @@
- contains: { nodes.$master.ingest.processors: { type: split } }
- contains: { nodes.$master.ingest.processors: { type: trim } }
- contains: { nodes.$master.ingest.processors: { type: uppercase } }
- - contains: { nodes.$master.ingest.processors: { type: bytes } }
diff --git a/modules/ingest-common/src/test/resources/rest-api-spec/test/ingest/210_pipeline_processor.yml b/modules/ingest-common/src/test/resources/rest-api-spec/test/ingest/210_pipeline_processor.yml
new file mode 100644
index 0000000000000..355ba2d42104a
--- /dev/null
+++ b/modules/ingest-common/src/test/resources/rest-api-spec/test/ingest/210_pipeline_processor.yml
@@ -0,0 +1,113 @@
+---
+teardown:
+- do:
+ ingest.delete_pipeline:
+ id: "inner"
+ ignore: 404
+
+- do:
+ ingest.delete_pipeline:
+ id: "outer"
+ ignore: 404
+
+---
+"Test Pipeline Processor with Simple Inner Pipeline":
+- do:
+ ingest.put_pipeline:
+ id: "inner"
+ body: >
+ {
+ "description" : "inner pipeline",
+ "processors" : [
+ {
+ "set" : {
+ "field": "foo",
+ "value": "bar"
+ }
+ },
+ {
+ "set" : {
+ "field": "baz",
+ "value": "blub"
+ }
+ }
+ ]
+ }
+- match: { acknowledged: true }
+
+- do:
+ ingest.put_pipeline:
+ id: "outer"
+ body: >
+ {
+ "description" : "outer pipeline",
+ "processors" : [
+ {
+ "pipeline" : {
+ "pipeline": "inner"
+ }
+ }
+ ]
+ }
+- match: { acknowledged: true }
+
+- do:
+ index:
+ index: test
+ type: test
+ id: 1
+ pipeline: "outer"
+ body: {}
+
+- do:
+ get:
+ index: test
+ type: test
+ id: 1
+- match: { _source.foo: "bar" }
+- match: { _source.baz: "blub" }
+
+---
+"Test Pipeline Processor with Circular Pipelines":
+- do:
+ ingest.put_pipeline:
+ id: "outer"
+ body: >
+ {
+ "description" : "outer pipeline",
+ "processors" : [
+ {
+ "pipeline" : {
+ "pipeline": "inner"
+ }
+ }
+ ]
+ }
+- match: { acknowledged: true }
+
+- do:
+ ingest.put_pipeline:
+ id: "inner"
+ body: >
+ {
+ "description" : "inner pipeline",
+ "processors" : [
+ {
+ "pipeline" : {
+ "pipeline": "outer"
+ }
+ }
+ ]
+ }
+- match: { acknowledged: true }
+
+- do:
+ catch: /illegal_state_exception/
+ index:
+ index: test
+ type: test
+ id: 1
+ pipeline: "outer"
+ body: {}
+- match: { error.root_cause.0.type: "exception" }
+- match: { error.root_cause.0.reason: "java.lang.IllegalArgumentException: java.lang.IllegalStateException: Recursive invocation of pipeline [inner] detected." }
diff --git a/modules/lang-mustache/src/test/java/org/elasticsearch/script/mustache/SearchTemplateWithoutContentIT.java b/modules/lang-mustache/src/test/java/org/elasticsearch/script/mustache/SearchTemplateWithoutContentIT.java
index cbc6adf6be227..023d3b246761d 100644
--- a/modules/lang-mustache/src/test/java/org/elasticsearch/script/mustache/SearchTemplateWithoutContentIT.java
+++ b/modules/lang-mustache/src/test/java/org/elasticsearch/script/mustache/SearchTemplateWithoutContentIT.java
@@ -19,6 +19,7 @@
package org.elasticsearch.script.mustache;
+import org.elasticsearch.client.Request;
import org.elasticsearch.client.ResponseException;
import org.elasticsearch.test.rest.ESRestTestCase;
@@ -30,14 +31,14 @@ public class SearchTemplateWithoutContentIT extends ESRestTestCase {
public void testSearchTemplateMissingBody() throws IOException {
ResponseException responseException = expectThrows(ResponseException.class, () -> client().performRequest(
- randomBoolean() ? "POST" : "GET", "/_search/template"));
+ new Request(randomBoolean() ? "POST" : "GET", "/_search/template")));
assertEquals(400, responseException.getResponse().getStatusLine().getStatusCode());
assertThat(responseException.getMessage(), containsString("request body or source parameter is required"));
}
public void testMultiSearchTemplateMissingBody() throws IOException {
ResponseException responseException = expectThrows(ResponseException.class, () -> client().performRequest(
- randomBoolean() ? "POST" : "GET", "/_msearch/template"));
+ new Request(randomBoolean() ? "POST" : "GET", "/_msearch/template")));
assertEquals(400, responseException.getResponse().getStatusLine().getStatusCode());
assertThat(responseException.getMessage(), containsString("request body or source parameter is required"));
}
diff --git a/modules/lang-painless/spi/src/main/java/org/elasticsearch/painless/spi/Whitelist.java b/modules/lang-painless/spi/src/main/java/org/elasticsearch/painless/spi/Whitelist.java
index c38325edd1424..7acbff6cb0b93 100644
--- a/modules/lang-painless/spi/src/main/java/org/elasticsearch/painless/spi/Whitelist.java
+++ b/modules/lang-painless/spi/src/main/java/org/elasticsearch/painless/spi/Whitelist.java
@@ -61,9 +61,12 @@ public final class Whitelist {
/** The {@link List} of all the whitelisted Painless classes. */
public final List whitelistClasses;
+ public final List whitelistBindings;
+
/** Standard constructor. All values must be not {@code null}. */
- public Whitelist(ClassLoader classLoader, List whitelistClasses) {
+ public Whitelist(ClassLoader classLoader, List whitelistClasses, List whitelistBindings) {
this.classLoader = Objects.requireNonNull(classLoader);
this.whitelistClasses = Collections.unmodifiableList(Objects.requireNonNull(whitelistClasses));
+ this.whitelistBindings = Collections.unmodifiableList(Objects.requireNonNull(whitelistBindings));
}
}
diff --git a/modules/lang-painless/spi/src/main/java/org/elasticsearch/painless/spi/WhitelistBinding.java b/modules/lang-painless/spi/src/main/java/org/elasticsearch/painless/spi/WhitelistBinding.java
new file mode 100644
index 0000000000000..364dbbb09ca9b
--- /dev/null
+++ b/modules/lang-painless/spi/src/main/java/org/elasticsearch/painless/spi/WhitelistBinding.java
@@ -0,0 +1,67 @@
+/*
+ * 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.painless.spi;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * A binding represents a method call that stores state. Each binding class must have exactly one
+ * public constructor and one public method excluding those inherited directly from {@link Object}.
+ * The canonical type name parameters provided must match those of the constructor and method combined.
+ * The constructor for a binding class will be called when the binding method is called for the first
+ * time at which point state may be stored for the arguments passed into the constructor. The method
+ * for a binding class will be called each time the binding method is called and may use the previously
+ * stored state.
+ */
+public class WhitelistBinding {
+
+ /** Information about where this constructor was whitelisted from. */
+ public final String origin;
+
+ /** The Java class name this binding represents. */
+ public final String targetJavaClassName;
+
+ /** The method name for this binding. */
+ public final String methodName;
+
+ /**
+ * The canonical type name for the return type.
+ */
+ public final String returnCanonicalTypeName;
+
+ /**
+ * A {@link List} of {@link String}s that are the Painless type names for the parameters of the
+ * constructor which can be used to look up the Java constructor through reflection.
+ */
+ public final List canonicalTypeNameParameters;
+
+ /** Standard constructor. All values must be not {@code null}. */
+ public WhitelistBinding(String origin, String targetJavaClassName,
+ String methodName, String returnCanonicalTypeName, List canonicalTypeNameParameters) {
+
+ this.origin = Objects.requireNonNull(origin);
+ this.targetJavaClassName = Objects.requireNonNull(targetJavaClassName);
+
+ this.methodName = Objects.requireNonNull(methodName);
+ this.returnCanonicalTypeName = Objects.requireNonNull(returnCanonicalTypeName);
+ this.canonicalTypeNameParameters = Objects.requireNonNull(canonicalTypeNameParameters);
+ }
+}
diff --git a/modules/lang-painless/spi/src/main/java/org/elasticsearch/painless/spi/WhitelistClass.java b/modules/lang-painless/spi/src/main/java/org/elasticsearch/painless/spi/WhitelistClass.java
index 0b216ae5c2953..7b3eb75aa3ecd 100644
--- a/modules/lang-painless/spi/src/main/java/org/elasticsearch/painless/spi/WhitelistClass.java
+++ b/modules/lang-painless/spi/src/main/java/org/elasticsearch/painless/spi/WhitelistClass.java
@@ -62,9 +62,8 @@ public final class WhitelistClass {
/** Standard constructor. All values must be not {@code null}. */
public WhitelistClass(String origin, String javaClassName, boolean noImport,
- List whitelistConstructors,
- List whitelistMethods,
- List whitelistFields) {
+ List whitelistConstructors, List whitelistMethods, List whitelistFields)
+ {
this.origin = Objects.requireNonNull(origin);
this.javaClassName = Objects.requireNonNull(javaClassName);
diff --git a/modules/lang-painless/spi/src/main/java/org/elasticsearch/painless/spi/WhitelistLoader.java b/modules/lang-painless/spi/src/main/java/org/elasticsearch/painless/spi/WhitelistLoader.java
index a4a0076626a9c..0279c82f1b67b 100644
--- a/modules/lang-painless/spi/src/main/java/org/elasticsearch/painless/spi/WhitelistLoader.java
+++ b/modules/lang-painless/spi/src/main/java/org/elasticsearch/painless/spi/WhitelistLoader.java
@@ -133,6 +133,7 @@ public final class WhitelistLoader {
*/
public static Whitelist loadFromResourceFiles(Class> resource, String... filepaths) {
List whitelistClasses = new ArrayList<>();
+ List whitelistBindings = new ArrayList<>();
// Execute a single pass through the whitelist text files. This will gather all the
// constructors, methods, augmented methods, and fields for each whitelisted class.
@@ -141,8 +142,9 @@ public static Whitelist loadFromResourceFiles(Class> resource, String... filep
int number = -1;
try (LineNumberReader reader = new LineNumberReader(
- new InputStreamReader(resource.getResourceAsStream(filepath), StandardCharsets.UTF_8))) {
+ new InputStreamReader(resource.getResourceAsStream(filepath), StandardCharsets.UTF_8))) {
+ String parseType = null;
String whitelistClassOrigin = null;
String javaClassName = null;
boolean noImport = false;
@@ -165,7 +167,11 @@ public static Whitelist loadFromResourceFiles(Class> resource, String... filep
// Ensure the final token of the line is '{'.
if (line.endsWith("{") == false) {
throw new IllegalArgumentException(
- "invalid class definition: failed to parse class opening bracket [" + line + "]");
+ "invalid class definition: failed to parse class opening bracket [" + line + "]");
+ }
+
+ if (parseType != null) {
+ throw new IllegalArgumentException("invalid definition: cannot embed class definition [" + line + "]");
}
// Parse the Java class name.
@@ -178,6 +184,7 @@ public static Whitelist loadFromResourceFiles(Class> resource, String... filep
throw new IllegalArgumentException("invalid class definition: failed to parse class name [" + line + "]");
}
+ parseType = "class";
whitelistClassOrigin = "[" + filepath + "]:[" + number + "]";
javaClassName = tokens[0];
@@ -185,34 +192,117 @@ public static Whitelist loadFromResourceFiles(Class> resource, String... filep
whitelistConstructors = new ArrayList<>();
whitelistMethods = new ArrayList<>();
whitelistFields = new ArrayList<>();
+ } else if (line.startsWith("static ")) {
+ // Ensure the final token of the line is '{'.
+ if (line.endsWith("{") == false) {
+ throw new IllegalArgumentException(
+ "invalid static definition: failed to parse static opening bracket [" + line + "]");
+ }
- // Handle the end of a class, by creating a new WhitelistClass with all the previously gathered
- // constructors, methods, augmented methods, and fields, and adding it to the list of whitelisted classes.
+ if (parseType != null) {
+ throw new IllegalArgumentException("invalid definition: cannot embed static definition [" + line + "]");
+ }
+
+ parseType = "static";
+
+ // Handle the end of a definition and reset all previously gathered values.
// Expects the following format: '}' '\n'
} else if (line.equals("}")) {
- if (javaClassName == null) {
- throw new IllegalArgumentException("invalid class definition: extraneous closing bracket");
+ if (parseType == null) {
+ throw new IllegalArgumentException("invalid definition: extraneous closing bracket");
}
- whitelistClasses.add(new WhitelistClass(whitelistClassOrigin, javaClassName, noImport,
- whitelistConstructors, whitelistMethods, whitelistFields));
+ // Create a new WhitelistClass with all the previously gathered constructors, methods,
+ // augmented methods, and fields, and add it to the list of whitelisted classes.
+ if ("class".equals(parseType)) {
+ whitelistClasses.add(new WhitelistClass(whitelistClassOrigin, javaClassName, noImport,
+ whitelistConstructors, whitelistMethods, whitelistFields));
+
+ whitelistClassOrigin = null;
+ javaClassName = null;
+ noImport = false;
+ whitelistConstructors = null;
+ whitelistMethods = null;
+ whitelistFields = null;
+ }
- // Set all the variables to null to ensure a new class definition is found before other parsable values.
- whitelistClassOrigin = null;
- javaClassName = null;
- noImport = false;
- whitelistConstructors = null;
- whitelistMethods = null;
- whitelistFields = null;
+ // Reset the parseType.
+ parseType = null;
- // Handle all other valid cases.
- } else {
+ // Handle static definition types.
+ // Expects the following format: ID ID '(' ( ID ( ',' ID )* )? ')' 'bound_to' ID '\n'
+ } else if ("static".equals(parseType)) {
+ // Mark the origin of this parsable object.
+ String origin = "[" + filepath + "]:[" + number + "]";
+
+ // Parse the tokens prior to the method parameters.
+ int parameterStartIndex = line.indexOf('(');
+
+ if (parameterStartIndex == -1) {
+ throw new IllegalArgumentException(
+ "illegal static definition: start of method parameters not found [" + line + "]");
+ }
+
+ String[] tokens = line.substring(0, parameterStartIndex).trim().split("\\s+");
+
+ String methodName;
+
+ // Based on the number of tokens, look up the Java method name.
+ if (tokens.length == 2) {
+ methodName = tokens[1];
+ } else {
+ throw new IllegalArgumentException("invalid method definition: unexpected format [" + line + "]");
+ }
+
+ String returnCanonicalTypeName = tokens[0];
+
+ // Parse the method parameters.
+ int parameterEndIndex = line.indexOf(')');
+
+ if (parameterEndIndex == -1) {
+ throw new IllegalArgumentException(
+ "illegal static definition: end of method parameters not found [" + line + "]");
+ }
+
+ String[] canonicalTypeNameParameters =
+ line.substring(parameterStartIndex + 1, parameterEndIndex).replaceAll("\\s+", "").split(",");
+
+ // Handle the case for a method with no parameters.
+ if ("".equals(canonicalTypeNameParameters[0])) {
+ canonicalTypeNameParameters = new String[0];
+ }
+
+ // Parse the static type and class.
+ tokens = line.substring(parameterEndIndex + 1).trim().split("\\s+");
+
+ String staticType;
+ String targetJavaClassName;
+
+ // Based on the number of tokens, look up the type and class.
+ if (tokens.length == 2) {
+ staticType = tokens[0];
+ targetJavaClassName = tokens[1];
+ } else {
+ throw new IllegalArgumentException("invalid static definition: unexpected format [" + line + "]");
+ }
+
+ // Check the static type is valid.
+ if ("bound_to".equals(staticType) == false) {
+ throw new IllegalArgumentException(
+ "invalid static definition: unexpected static type [" + staticType + "] [" + line + "]");
+ }
+
+ whitelistBindings.add(new WhitelistBinding(origin, targetJavaClassName,
+ methodName, returnCanonicalTypeName, Arrays.asList(canonicalTypeNameParameters)));
+
+ // Handle class definition types.
+ } else if ("class".equals(parseType)) {
// Mark the origin of this parsable object.
String origin = "[" + filepath + "]:[" + number + "]";
// Ensure we have a defined class before adding any constructors, methods, augmented methods, or fields.
- if (javaClassName == null) {
- throw new IllegalArgumentException("invalid object definition: expected a class name [" + line + "]");
+ if (parseType == null) {
+ throw new IllegalArgumentException("invalid definition: expected one of ['class', 'static'] [" + line + "]");
}
// Handle the case for a constructor definition.
@@ -221,7 +311,7 @@ public static Whitelist loadFromResourceFiles(Class> resource, String... filep
// Ensure the final token of the line is ')'.
if (line.endsWith(")") == false) {
throw new IllegalArgumentException(
- "invalid constructor definition: expected a closing parenthesis [" + line + "]");
+ "invalid constructor definition: expected a closing parenthesis [" + line + "]");
}
// Parse the constructor parameters.
@@ -234,34 +324,34 @@ public static Whitelist loadFromResourceFiles(Class> resource, String... filep
whitelistConstructors.add(new WhitelistConstructor(origin, Arrays.asList(tokens)));
- // Handle the case for a method or augmented method definition.
- // Expects the following format: ID ID? ID '(' ( ID ( ',' ID )* )? ')' '\n'
+ // Handle the case for a method or augmented method definition.
+ // Expects the following format: ID ID? ID '(' ( ID ( ',' ID )* )? ')' '\n'
} else if (line.contains("(")) {
// Ensure the final token of the line is ')'.
if (line.endsWith(")") == false) {
throw new IllegalArgumentException(
- "invalid method definition: expected a closing parenthesis [" + line + "]");
+ "invalid method definition: expected a closing parenthesis [" + line + "]");
}
// Parse the tokens prior to the method parameters.
int parameterIndex = line.indexOf('(');
- String[] tokens = line.trim().substring(0, parameterIndex).split("\\s+");
+ String[] tokens = line.substring(0, parameterIndex).trim().split("\\s+");
- String javaMethodName;
+ String methodName;
String javaAugmentedClassName;
// Based on the number of tokens, look up the Java method name and if provided the Java augmented class.
if (tokens.length == 2) {
- javaMethodName = tokens[1];
+ methodName = tokens[1];
javaAugmentedClassName = null;
} else if (tokens.length == 3) {
- javaMethodName = tokens[2];
+ methodName = tokens[2];
javaAugmentedClassName = tokens[1];
} else {
throw new IllegalArgumentException("invalid method definition: unexpected format [" + line + "]");
}
- String painlessReturnTypeName = tokens[0];
+ String returnCanonicalTypeName = tokens[0];
// Parse the method parameters.
tokens = line.substring(parameterIndex + 1, line.length() - 1).replaceAll("\\s+", "").split(",");
@@ -271,11 +361,11 @@ public static Whitelist loadFromResourceFiles(Class> resource, String... filep
tokens = new String[0];
}
- whitelistMethods.add(new WhitelistMethod(origin, javaAugmentedClassName, javaMethodName,
- painlessReturnTypeName, Arrays.asList(tokens)));
+ whitelistMethods.add(new WhitelistMethod(origin, javaAugmentedClassName, methodName,
+ returnCanonicalTypeName, Arrays.asList(tokens)));
- // Handle the case for a field definition.
- // Expects the following format: ID ID '\n'
+ // Handle the case for a field definition.
+ // Expects the following format: ID ID '\n'
} else {
// Parse the field tokens.
String[] tokens = line.split("\\s+");
@@ -287,20 +377,23 @@ public static Whitelist loadFromResourceFiles(Class> resource, String... filep
whitelistFields.add(new WhitelistField(origin, tokens[1], tokens[0]));
}
+ } else {
+ throw new IllegalArgumentException("invalid definition: unable to parse line [" + line + "]");
}
}
// Ensure all classes end with a '}' token before the end of the file.
if (javaClassName != null) {
- throw new IllegalArgumentException("invalid class definition: expected closing bracket");
+ throw new IllegalArgumentException("invalid definition: expected closing bracket");
}
} catch (Exception exception) {
throw new RuntimeException("error in [" + filepath + "] at line [" + number + "]", exception);
}
}
+
ClassLoader loader = AccessController.doPrivileged((PrivilegedAction)resource::getClassLoader);
- return new Whitelist(loader, whitelistClasses);
+ return new Whitelist(loader, whitelistClasses, whitelistBindings);
}
private WhitelistLoader() {}
diff --git a/modules/lang-painless/spi/src/main/java/org/elasticsearch/painless/spi/WhitelistMethod.java b/modules/lang-painless/spi/src/main/java/org/elasticsearch/painless/spi/WhitelistMethod.java
index 5cd023a3591ad..f450ee0238d19 100644
--- a/modules/lang-painless/spi/src/main/java/org/elasticsearch/painless/spi/WhitelistMethod.java
+++ b/modules/lang-painless/spi/src/main/java/org/elasticsearch/painless/spi/WhitelistMethod.java
@@ -67,7 +67,8 @@ public class WhitelistMethod {
* is augmented as described in the class documentation.
*/
public WhitelistMethod(String origin, String augmentedCanonicalClassName, String methodName,
- String returnCanonicalTypeName, List canonicalTypeNameParameters) {
+ String returnCanonicalTypeName, List canonicalTypeNameParameters) {
+
this.origin = Objects.requireNonNull(origin);
this.augmentedCanonicalClassName = augmentedCanonicalClassName;
this.methodName = methodName;
diff --git a/modules/lang-painless/src/main/antlr/PainlessParser.g4 b/modules/lang-painless/src/main/antlr/PainlessParser.g4
index 5292b4d195056..27db9222f32ef 100644
--- a/modules/lang-painless/src/main/antlr/PainlessParser.g4
+++ b/modules/lang-painless/src/main/antlr/PainlessParser.g4
@@ -22,7 +22,7 @@ parser grammar PainlessParser;
options { tokenVocab=PainlessLexer; }
source
- : function* statement* dstatement? EOF
+ : function* statement* EOF
;
function
@@ -35,7 +35,7 @@ parameters
statement
: rstatement
- | dstatement SEMICOLON
+ | dstatement ( SEMICOLON | EOF )
;
// Note we use a predicate on the if/else case here to prevent the
diff --git a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/package-info.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/BindingTest.java
similarity index 74%
rename from x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/package-info.java
rename to modules/lang-painless/src/main/java/org/elasticsearch/painless/BindingTest.java
index b1e4c6c0d4e54..1dcbce037b264 100644
--- a/x-pack/protocol/src/main/java/org/elasticsearch/protocol/xpack/ml/package-info.java
+++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/BindingTest.java
@@ -17,8 +17,16 @@
* under the License.
*/
-/**
- * Request and Response objects for the default distribution's Machine
- * Learning APIs.
- */
-package org.elasticsearch.protocol.xpack.ml;
+package org.elasticsearch.painless;
+
+public class BindingTest {
+ public int state;
+
+ public BindingTest(int state0, int state1) {
+ this.state = state0 + state1;
+ }
+
+ public int testAddWithState(int stateless) {
+ return stateless + state;
+ }
+}
diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/Globals.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/Globals.java
index 83eb74d827f88..d18cf2780cf3c 100644
--- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/Globals.java
+++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/Globals.java
@@ -31,6 +31,7 @@
public class Globals {
private final Map syntheticMethods = new HashMap<>();
private final Map constantInitializers = new HashMap<>();
+ private final Map> bindings = new HashMap<>();
private final BitSet statements;
/** Create a new Globals from the set of statement boundaries */
@@ -54,7 +55,15 @@ public void addConstantInitializer(Constant constant) {
throw new IllegalStateException("constant initializer: " + constant.name + " already exists");
}
}
-
+
+ /** Adds a new binding to be written as a local variable */
+ public String addBinding(Class> type) {
+ String name = "$binding$" + bindings.size();
+ bindings.put(name, type);
+
+ return name;
+ }
+
/** Returns the current synthetic methods */
public Map getSyntheticMethods() {
return syntheticMethods;
@@ -64,7 +73,12 @@ public Map getSyntheticMethods() {
public Map getConstantInitializers() {
return constantInitializers;
}
-
+
+ /** Returns the current bindings */
+ public Map> getBindings() {
+ return bindings;
+ }
+
/** Returns the set of statement boundaries */
public BitSet getStatements() {
return statements;
diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/PainlessLexer.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/PainlessLexer.java
index 7fa10f6e9fbf2..feebacc60687b 100644
--- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/PainlessLexer.java
+++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/PainlessLexer.java
@@ -1,17 +1,13 @@
// ANTLR GENERATED CODE: DO NOT EDIT
package org.elasticsearch.painless.antlr;
-
-import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.Lexer;
-import org.antlr.v4.runtime.RuleContext;
-import org.antlr.v4.runtime.RuntimeMetaData;
-import org.antlr.v4.runtime.Vocabulary;
-import org.antlr.v4.runtime.VocabularyImpl;
-import org.antlr.v4.runtime.atn.ATN;
-import org.antlr.v4.runtime.atn.ATNDeserializer;
-import org.antlr.v4.runtime.atn.LexerATNSimulator;
-import org.antlr.v4.runtime.atn.PredictionContextCache;
+import org.antlr.v4.runtime.CharStream;
+import org.antlr.v4.runtime.Token;
+import org.antlr.v4.runtime.TokenStream;
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.atn.*;
import org.antlr.v4.runtime.dfa.DFA;
+import org.antlr.v4.runtime.misc.*;
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
abstract class PainlessLexer extends Lexer {
@@ -21,16 +17,16 @@ abstract class PainlessLexer extends Lexer {
protected static final PredictionContextCache _sharedContextCache =
new PredictionContextCache();
public static final int
- WS=1, COMMENT=2, LBRACK=3, RBRACK=4, LBRACE=5, RBRACE=6, LP=7, RP=8, DOT=9,
- NSDOT=10, COMMA=11, SEMICOLON=12, IF=13, IN=14, ELSE=15, WHILE=16, DO=17,
- FOR=18, CONTINUE=19, BREAK=20, RETURN=21, NEW=22, TRY=23, CATCH=24, THROW=25,
- THIS=26, INSTANCEOF=27, BOOLNOT=28, BWNOT=29, MUL=30, DIV=31, REM=32,
- ADD=33, SUB=34, LSH=35, RSH=36, USH=37, LT=38, LTE=39, GT=40, GTE=41,
- EQ=42, EQR=43, NE=44, NER=45, BWAND=46, XOR=47, BWOR=48, BOOLAND=49, BOOLOR=50,
- COND=51, COLON=52, ELVIS=53, REF=54, ARROW=55, FIND=56, MATCH=57, INCR=58,
- DECR=59, ASSIGN=60, AADD=61, ASUB=62, AMUL=63, ADIV=64, AREM=65, AAND=66,
- AXOR=67, AOR=68, ALSH=69, ARSH=70, AUSH=71, OCTAL=72, HEX=73, INTEGER=74,
- DECIMAL=75, STRING=76, REGEX=77, TRUE=78, FALSE=79, NULL=80, TYPE=81,
+ WS=1, COMMENT=2, LBRACK=3, RBRACK=4, LBRACE=5, RBRACE=6, LP=7, RP=8, DOT=9,
+ NSDOT=10, COMMA=11, SEMICOLON=12, IF=13, IN=14, ELSE=15, WHILE=16, DO=17,
+ FOR=18, CONTINUE=19, BREAK=20, RETURN=21, NEW=22, TRY=23, CATCH=24, THROW=25,
+ THIS=26, INSTANCEOF=27, BOOLNOT=28, BWNOT=29, MUL=30, DIV=31, REM=32,
+ ADD=33, SUB=34, LSH=35, RSH=36, USH=37, LT=38, LTE=39, GT=40, GTE=41,
+ EQ=42, EQR=43, NE=44, NER=45, BWAND=46, XOR=47, BWOR=48, BOOLAND=49, BOOLOR=50,
+ COND=51, COLON=52, ELVIS=53, REF=54, ARROW=55, FIND=56, MATCH=57, INCR=58,
+ DECR=59, ASSIGN=60, AADD=61, ASUB=62, AMUL=63, ADIV=64, AREM=65, AAND=66,
+ AXOR=67, AOR=68, ALSH=69, ARSH=70, AUSH=71, OCTAL=72, HEX=73, INTEGER=74,
+ DECIMAL=75, STRING=76, REGEX=77, TRUE=78, FALSE=79, NULL=80, TYPE=81,
ID=82, DOTINTEGER=83, DOTID=84;
public static final int AFTER_DOT = 1;
public static String[] modeNames = {
@@ -38,39 +34,39 @@ abstract class PainlessLexer extends Lexer {
};
public static final String[] ruleNames = {
- "WS", "COMMENT", "LBRACK", "RBRACK", "LBRACE", "RBRACE", "LP", "RP", "DOT",
- "NSDOT", "COMMA", "SEMICOLON", "IF", "IN", "ELSE", "WHILE", "DO", "FOR",
- "CONTINUE", "BREAK", "RETURN", "NEW", "TRY", "CATCH", "THROW", "THIS",
- "INSTANCEOF", "BOOLNOT", "BWNOT", "MUL", "DIV", "REM", "ADD", "SUB", "LSH",
- "RSH", "USH", "LT", "LTE", "GT", "GTE", "EQ", "EQR", "NE", "NER", "BWAND",
- "XOR", "BWOR", "BOOLAND", "BOOLOR", "COND", "COLON", "ELVIS", "REF", "ARROW",
- "FIND", "MATCH", "INCR", "DECR", "ASSIGN", "AADD", "ASUB", "AMUL", "ADIV",
- "AREM", "AAND", "AXOR", "AOR", "ALSH", "ARSH", "AUSH", "OCTAL", "HEX",
- "INTEGER", "DECIMAL", "STRING", "REGEX", "TRUE", "FALSE", "NULL", "TYPE",
+ "WS", "COMMENT", "LBRACK", "RBRACK", "LBRACE", "RBRACE", "LP", "RP", "DOT",
+ "NSDOT", "COMMA", "SEMICOLON", "IF", "IN", "ELSE", "WHILE", "DO", "FOR",
+ "CONTINUE", "BREAK", "RETURN", "NEW", "TRY", "CATCH", "THROW", "THIS",
+ "INSTANCEOF", "BOOLNOT", "BWNOT", "MUL", "DIV", "REM", "ADD", "SUB", "LSH",
+ "RSH", "USH", "LT", "LTE", "GT", "GTE", "EQ", "EQR", "NE", "NER", "BWAND",
+ "XOR", "BWOR", "BOOLAND", "BOOLOR", "COND", "COLON", "ELVIS", "REF", "ARROW",
+ "FIND", "MATCH", "INCR", "DECR", "ASSIGN", "AADD", "ASUB", "AMUL", "ADIV",
+ "AREM", "AAND", "AXOR", "AOR", "ALSH", "ARSH", "AUSH", "OCTAL", "HEX",
+ "INTEGER", "DECIMAL", "STRING", "REGEX", "TRUE", "FALSE", "NULL", "TYPE",
"ID", "DOTINTEGER", "DOTID"
};
private static final String[] _LITERAL_NAMES = {
- null, null, null, "'{'", "'}'", "'['", "']'", "'('", "')'", "'.'", "'?.'",
- "','", "';'", "'if'", "'in'", "'else'", "'while'", "'do'", "'for'", "'continue'",
- "'break'", "'return'", "'new'", "'try'", "'catch'", "'throw'", "'this'",
- "'instanceof'", "'!'", "'~'", "'*'", "'/'", "'%'", "'+'", "'-'", "'<<'",
- "'>>'", "'>>>'", "'<'", "'<='", "'>'", "'>='", "'=='", "'==='", "'!='",
- "'!=='", "'&'", "'^'", "'|'", "'&&'", "'||'", "'?'", "':'", "'?:'", "'::'",
- "'->'", "'=~'", "'==~'", "'++'", "'--'", "'='", "'+='", "'-='", "'*='",
- "'/='", "'%='", "'&='", "'^='", "'|='", "'<<='", "'>>='", "'>>>='", null,
+ null, null, null, "'{'", "'}'", "'['", "']'", "'('", "')'", "'.'", "'?.'",
+ "','", "';'", "'if'", "'in'", "'else'", "'while'", "'do'", "'for'", "'continue'",
+ "'break'", "'return'", "'new'", "'try'", "'catch'", "'throw'", "'this'",
+ "'instanceof'", "'!'", "'~'", "'*'", "'/'", "'%'", "'+'", "'-'", "'<<'",
+ "'>>'", "'>>>'", "'<'", "'<='", "'>'", "'>='", "'=='", "'==='", "'!='",
+ "'!=='", "'&'", "'^'", "'|'", "'&&'", "'||'", "'?'", "':'", "'?:'", "'::'",
+ "'->'", "'=~'", "'==~'", "'++'", "'--'", "'='", "'+='", "'-='", "'*='",
+ "'/='", "'%='", "'&='", "'^='", "'|='", "'<<='", "'>>='", "'>>>='", null,
null, null, null, null, null, "'true'", "'false'", "'null'"
};
private static final String[] _SYMBOLIC_NAMES = {
- null, "WS", "COMMENT", "LBRACK", "RBRACK", "LBRACE", "RBRACE", "LP", "RP",
- "DOT", "NSDOT", "COMMA", "SEMICOLON", "IF", "IN", "ELSE", "WHILE", "DO",
- "FOR", "CONTINUE", "BREAK", "RETURN", "NEW", "TRY", "CATCH", "THROW",
- "THIS", "INSTANCEOF", "BOOLNOT", "BWNOT", "MUL", "DIV", "REM", "ADD",
- "SUB", "LSH", "RSH", "USH", "LT", "LTE", "GT", "GTE", "EQ", "EQR", "NE",
- "NER", "BWAND", "XOR", "BWOR", "BOOLAND", "BOOLOR", "COND", "COLON", "ELVIS",
- "REF", "ARROW", "FIND", "MATCH", "INCR", "DECR", "ASSIGN", "AADD", "ASUB",
- "AMUL", "ADIV", "AREM", "AAND", "AXOR", "AOR", "ALSH", "ARSH", "AUSH",
- "OCTAL", "HEX", "INTEGER", "DECIMAL", "STRING", "REGEX", "TRUE", "FALSE",
+ null, "WS", "COMMENT", "LBRACK", "RBRACK", "LBRACE", "RBRACE", "LP", "RP",
+ "DOT", "NSDOT", "COMMA", "SEMICOLON", "IF", "IN", "ELSE", "WHILE", "DO",
+ "FOR", "CONTINUE", "BREAK", "RETURN", "NEW", "TRY", "CATCH", "THROW",
+ "THIS", "INSTANCEOF", "BOOLNOT", "BWNOT", "MUL", "DIV", "REM", "ADD",
+ "SUB", "LSH", "RSH", "USH", "LT", "LTE", "GT", "GTE", "EQ", "EQR", "NE",
+ "NER", "BWAND", "XOR", "BWOR", "BOOLAND", "BOOLOR", "COND", "COLON", "ELVIS",
+ "REF", "ARROW", "FIND", "MATCH", "INCR", "DECR", "ASSIGN", "AADD", "ASUB",
+ "AMUL", "ADIV", "AREM", "AAND", "AXOR", "AOR", "ALSH", "ARSH", "AUSH",
+ "OCTAL", "HEX", "INTEGER", "DECIMAL", "STRING", "REGEX", "TRUE", "FALSE",
"NULL", "TYPE", "ID", "DOTINTEGER", "DOTID"
};
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/PainlessParser.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/PainlessParser.java
index bef57d22e9ea9..5a823ecfda308 100644
--- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/PainlessParser.java
+++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/PainlessParser.java
@@ -1,25 +1,13 @@
// ANTLR GENERATED CODE: DO NOT EDIT
package org.elasticsearch.painless.antlr;
-
-import org.antlr.v4.runtime.FailedPredicateException;
-import org.antlr.v4.runtime.NoViableAltException;
-import org.antlr.v4.runtime.Parser;
-import org.antlr.v4.runtime.ParserRuleContext;
-import org.antlr.v4.runtime.RecognitionException;
-import org.antlr.v4.runtime.RuleContext;
-import org.antlr.v4.runtime.RuntimeMetaData;
-import org.antlr.v4.runtime.TokenStream;
-import org.antlr.v4.runtime.Vocabulary;
-import org.antlr.v4.runtime.VocabularyImpl;
-import org.antlr.v4.runtime.atn.ATN;
-import org.antlr.v4.runtime.atn.ATNDeserializer;
-import org.antlr.v4.runtime.atn.ParserATNSimulator;
-import org.antlr.v4.runtime.atn.PredictionContextCache;
+import org.antlr.v4.runtime.atn.*;
import org.antlr.v4.runtime.dfa.DFA;
-import org.antlr.v4.runtime.tree.ParseTreeVisitor;
-import org.antlr.v4.runtime.tree.TerminalNode;
-
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.misc.*;
+import org.antlr.v4.runtime.tree.*;
import java.util.List;
+import java.util.Iterator;
+import java.util.ArrayList;
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
class PainlessParser extends Parser {
@@ -29,57 +17,57 @@ class PainlessParser extends Parser {
protected static final PredictionContextCache _sharedContextCache =
new PredictionContextCache();
public static final int
- WS=1, COMMENT=2, LBRACK=3, RBRACK=4, LBRACE=5, RBRACE=6, LP=7, RP=8, DOT=9,
- NSDOT=10, COMMA=11, SEMICOLON=12, IF=13, IN=14, ELSE=15, WHILE=16, DO=17,
- FOR=18, CONTINUE=19, BREAK=20, RETURN=21, NEW=22, TRY=23, CATCH=24, THROW=25,
- THIS=26, INSTANCEOF=27, BOOLNOT=28, BWNOT=29, MUL=30, DIV=31, REM=32,
- ADD=33, SUB=34, LSH=35, RSH=36, USH=37, LT=38, LTE=39, GT=40, GTE=41,
- EQ=42, EQR=43, NE=44, NER=45, BWAND=46, XOR=47, BWOR=48, BOOLAND=49, BOOLOR=50,
- COND=51, COLON=52, ELVIS=53, REF=54, ARROW=55, FIND=56, MATCH=57, INCR=58,
- DECR=59, ASSIGN=60, AADD=61, ASUB=62, AMUL=63, ADIV=64, AREM=65, AAND=66,
- AXOR=67, AOR=68, ALSH=69, ARSH=70, AUSH=71, OCTAL=72, HEX=73, INTEGER=74,
- DECIMAL=75, STRING=76, REGEX=77, TRUE=78, FALSE=79, NULL=80, TYPE=81,
+ WS=1, COMMENT=2, LBRACK=3, RBRACK=4, LBRACE=5, RBRACE=6, LP=7, RP=8, DOT=9,
+ NSDOT=10, COMMA=11, SEMICOLON=12, IF=13, IN=14, ELSE=15, WHILE=16, DO=17,
+ FOR=18, CONTINUE=19, BREAK=20, RETURN=21, NEW=22, TRY=23, CATCH=24, THROW=25,
+ THIS=26, INSTANCEOF=27, BOOLNOT=28, BWNOT=29, MUL=30, DIV=31, REM=32,
+ ADD=33, SUB=34, LSH=35, RSH=36, USH=37, LT=38, LTE=39, GT=40, GTE=41,
+ EQ=42, EQR=43, NE=44, NER=45, BWAND=46, XOR=47, BWOR=48, BOOLAND=49, BOOLOR=50,
+ COND=51, COLON=52, ELVIS=53, REF=54, ARROW=55, FIND=56, MATCH=57, INCR=58,
+ DECR=59, ASSIGN=60, AADD=61, ASUB=62, AMUL=63, ADIV=64, AREM=65, AAND=66,
+ AXOR=67, AOR=68, ALSH=69, ARSH=70, AUSH=71, OCTAL=72, HEX=73, INTEGER=74,
+ DECIMAL=75, STRING=76, REGEX=77, TRUE=78, FALSE=79, NULL=80, TYPE=81,
ID=82, DOTINTEGER=83, DOTID=84;
public static final int
- RULE_source = 0, RULE_function = 1, RULE_parameters = 2, RULE_statement = 3,
- RULE_rstatement = 4, RULE_dstatement = 5, RULE_trailer = 6, RULE_block = 7,
- RULE_empty = 8, RULE_initializer = 9, RULE_afterthought = 10, RULE_declaration = 11,
- RULE_decltype = 12, RULE_declvar = 13, RULE_trap = 14, RULE_expression = 15,
- RULE_unary = 16, RULE_chain = 17, RULE_primary = 18, RULE_postfix = 19,
- RULE_postdot = 20, RULE_callinvoke = 21, RULE_fieldaccess = 22, RULE_braceaccess = 23,
- RULE_arrayinitializer = 24, RULE_listinitializer = 25, RULE_mapinitializer = 26,
- RULE_maptoken = 27, RULE_arguments = 28, RULE_argument = 29, RULE_lambda = 30,
+ RULE_source = 0, RULE_function = 1, RULE_parameters = 2, RULE_statement = 3,
+ RULE_rstatement = 4, RULE_dstatement = 5, RULE_trailer = 6, RULE_block = 7,
+ RULE_empty = 8, RULE_initializer = 9, RULE_afterthought = 10, RULE_declaration = 11,
+ RULE_decltype = 12, RULE_declvar = 13, RULE_trap = 14, RULE_expression = 15,
+ RULE_unary = 16, RULE_chain = 17, RULE_primary = 18, RULE_postfix = 19,
+ RULE_postdot = 20, RULE_callinvoke = 21, RULE_fieldaccess = 22, RULE_braceaccess = 23,
+ RULE_arrayinitializer = 24, RULE_listinitializer = 25, RULE_mapinitializer = 26,
+ RULE_maptoken = 27, RULE_arguments = 28, RULE_argument = 29, RULE_lambda = 30,
RULE_lamtype = 31, RULE_funcref = 32;
public static final String[] ruleNames = {
- "source", "function", "parameters", "statement", "rstatement", "dstatement",
- "trailer", "block", "empty", "initializer", "afterthought", "declaration",
- "decltype", "declvar", "trap", "expression", "unary", "chain", "primary",
- "postfix", "postdot", "callinvoke", "fieldaccess", "braceaccess", "arrayinitializer",
- "listinitializer", "mapinitializer", "maptoken", "arguments", "argument",
+ "source", "function", "parameters", "statement", "rstatement", "dstatement",
+ "trailer", "block", "empty", "initializer", "afterthought", "declaration",
+ "decltype", "declvar", "trap", "expression", "unary", "chain", "primary",
+ "postfix", "postdot", "callinvoke", "fieldaccess", "braceaccess", "arrayinitializer",
+ "listinitializer", "mapinitializer", "maptoken", "arguments", "argument",
"lambda", "lamtype", "funcref"
};
private static final String[] _LITERAL_NAMES = {
- null, null, null, "'{'", "'}'", "'['", "']'", "'('", "')'", "'.'", "'?.'",
- "','", "';'", "'if'", "'in'", "'else'", "'while'", "'do'", "'for'", "'continue'",
- "'break'", "'return'", "'new'", "'try'", "'catch'", "'throw'", "'this'",
- "'instanceof'", "'!'", "'~'", "'*'", "'/'", "'%'", "'+'", "'-'", "'<<'",
- "'>>'", "'>>>'", "'<'", "'<='", "'>'", "'>='", "'=='", "'==='", "'!='",
- "'!=='", "'&'", "'^'", "'|'", "'&&'", "'||'", "'?'", "':'", "'?:'", "'::'",
- "'->'", "'=~'", "'==~'", "'++'", "'--'", "'='", "'+='", "'-='", "'*='",
- "'/='", "'%='", "'&='", "'^='", "'|='", "'<<='", "'>>='", "'>>>='", null,
+ null, null, null, "'{'", "'}'", "'['", "']'", "'('", "')'", "'.'", "'?.'",
+ "','", "';'", "'if'", "'in'", "'else'", "'while'", "'do'", "'for'", "'continue'",
+ "'break'", "'return'", "'new'", "'try'", "'catch'", "'throw'", "'this'",
+ "'instanceof'", "'!'", "'~'", "'*'", "'/'", "'%'", "'+'", "'-'", "'<<'",
+ "'>>'", "'>>>'", "'<'", "'<='", "'>'", "'>='", "'=='", "'==='", "'!='",
+ "'!=='", "'&'", "'^'", "'|'", "'&&'", "'||'", "'?'", "':'", "'?:'", "'::'",
+ "'->'", "'=~'", "'==~'", "'++'", "'--'", "'='", "'+='", "'-='", "'*='",
+ "'/='", "'%='", "'&='", "'^='", "'|='", "'<<='", "'>>='", "'>>>='", null,
null, null, null, null, null, "'true'", "'false'", "'null'"
};
private static final String[] _SYMBOLIC_NAMES = {
- null, "WS", "COMMENT", "LBRACK", "RBRACK", "LBRACE", "RBRACE", "LP", "RP",
- "DOT", "NSDOT", "COMMA", "SEMICOLON", "IF", "IN", "ELSE", "WHILE", "DO",
- "FOR", "CONTINUE", "BREAK", "RETURN", "NEW", "TRY", "CATCH", "THROW",
- "THIS", "INSTANCEOF", "BOOLNOT", "BWNOT", "MUL", "DIV", "REM", "ADD",
- "SUB", "LSH", "RSH", "USH", "LT", "LTE", "GT", "GTE", "EQ", "EQR", "NE",
- "NER", "BWAND", "XOR", "BWOR", "BOOLAND", "BOOLOR", "COND", "COLON", "ELVIS",
- "REF", "ARROW", "FIND", "MATCH", "INCR", "DECR", "ASSIGN", "AADD", "ASUB",
- "AMUL", "ADIV", "AREM", "AAND", "AXOR", "AOR", "ALSH", "ARSH", "AUSH",
- "OCTAL", "HEX", "INTEGER", "DECIMAL", "STRING", "REGEX", "TRUE", "FALSE",
+ null, "WS", "COMMENT", "LBRACK", "RBRACK", "LBRACE", "RBRACE", "LP", "RP",
+ "DOT", "NSDOT", "COMMA", "SEMICOLON", "IF", "IN", "ELSE", "WHILE", "DO",
+ "FOR", "CONTINUE", "BREAK", "RETURN", "NEW", "TRY", "CATCH", "THROW",
+ "THIS", "INSTANCEOF", "BOOLNOT", "BWNOT", "MUL", "DIV", "REM", "ADD",
+ "SUB", "LSH", "RSH", "USH", "LT", "LTE", "GT", "GTE", "EQ", "EQR", "NE",
+ "NER", "BWAND", "XOR", "BWOR", "BOOLAND", "BOOLOR", "COND", "COLON", "ELVIS",
+ "REF", "ARROW", "FIND", "MATCH", "INCR", "DECR", "ASSIGN", "AADD", "ASUB",
+ "AMUL", "ADIV", "AREM", "AAND", "AXOR", "AOR", "ALSH", "ARSH", "AUSH",
+ "OCTAL", "HEX", "INTEGER", "DECIMAL", "STRING", "REGEX", "TRUE", "FALSE",
"NULL", "TYPE", "ID", "DOTINTEGER", "DOTID"
};
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@@ -145,9 +133,6 @@ public List statement() {
public StatementContext statement(int i) {
return getRuleContext(StatementContext.class,i);
}
- public DstatementContext dstatement() {
- return getRuleContext(DstatementContext.class,0);
- }
public SourceContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@@ -177,7 +162,7 @@ public final SourceContext source() throws RecognitionException {
setState(66);
function();
}
- }
+ }
}
setState(71);
_errHandler.sync(this);
@@ -185,30 +170,19 @@ public final SourceContext source() throws RecognitionException {
}
setState(75);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,1,_ctx);
- while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
- if ( _alt==1 ) {
- {
- {
- setState(72);
- statement();
- }
- }
- }
- setState(77);
- _errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,1,_ctx);
- }
- setState(79);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << DO) | (1L << CONTINUE) | (1L << BREAK) | (1L << RETURN) | (1L << NEW) | (1L << THROW) | (1L << BOOLNOT) | (1L << BWNOT) | (1L << ADD) | (1L << SUB) | (1L << INCR) | (1L << DECR))) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (OCTAL - 72)) | (1L << (HEX - 72)) | (1L << (INTEGER - 72)) | (1L << (DECIMAL - 72)) | (1L << (STRING - 72)) | (1L << (REGEX - 72)) | (1L << (TRUE - 72)) | (1L << (FALSE - 72)) | (1L << (NULL - 72)) | (1L << (TYPE - 72)) | (1L << (ID - 72)))) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << IF) | (1L << WHILE) | (1L << DO) | (1L << FOR) | (1L << CONTINUE) | (1L << BREAK) | (1L << RETURN) | (1L << NEW) | (1L << TRY) | (1L << THROW) | (1L << BOOLNOT) | (1L << BWNOT) | (1L << ADD) | (1L << SUB) | (1L << INCR) | (1L << DECR))) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (OCTAL - 72)) | (1L << (HEX - 72)) | (1L << (INTEGER - 72)) | (1L << (DECIMAL - 72)) | (1L << (STRING - 72)) | (1L << (REGEX - 72)) | (1L << (TRUE - 72)) | (1L << (FALSE - 72)) | (1L << (NULL - 72)) | (1L << (TYPE - 72)) | (1L << (ID - 72)))) != 0)) {
{
- setState(78);
- dstatement();
+ {
+ setState(72);
+ statement();
+ }
}
+ setState(77);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
}
-
- setState(81);
+ setState(78);
match(EOF);
}
}
@@ -251,13 +225,13 @@ public final FunctionContext function() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(83);
+ setState(80);
decltype();
- setState(84);
+ setState(81);
match(ID);
- setState(85);
+ setState(82);
parameters();
- setState(86);
+ setState(83);
block();
}
}
@@ -307,38 +281,38 @@ public final ParametersContext parameters() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(88);
+ setState(85);
match(LP);
- setState(100);
+ setState(97);
_la = _input.LA(1);
if (_la==TYPE) {
{
- setState(89);
+ setState(86);
decltype();
- setState(90);
+ setState(87);
match(ID);
- setState(97);
+ setState(94);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==COMMA) {
{
{
- setState(91);
+ setState(88);
match(COMMA);
- setState(92);
+ setState(89);
decltype();
- setState(93);
+ setState(90);
match(ID);
}
}
- setState(99);
+ setState(96);
_errHandler.sync(this);
_la = _input.LA(1);
}
}
}
- setState(102);
+ setState(99);
match(RP);
}
}
@@ -361,6 +335,7 @@ public DstatementContext dstatement() {
return getRuleContext(DstatementContext.class,0);
}
public TerminalNode SEMICOLON() { return getToken(PainlessParser.SEMICOLON, 0); }
+ public TerminalNode EOF() { return getToken(PainlessParser.EOF, 0); }
public StatementContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@@ -375,8 +350,9 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final StatementContext statement() throws RecognitionException {
StatementContext _localctx = new StatementContext(_ctx, getState());
enterRule(_localctx, 6, RULE_statement);
+ int _la;
try {
- setState(108);
+ setState(105);
switch (_input.LA(1)) {
case IF:
case WHILE:
@@ -384,7 +360,7 @@ public final StatementContext statement() throws RecognitionException {
case TRY:
enterOuterAlt(_localctx, 1);
{
- setState(104);
+ setState(101);
rstatement();
}
break;
@@ -415,10 +391,15 @@ public final StatementContext statement() throws RecognitionException {
case ID:
enterOuterAlt(_localctx, 2);
{
- setState(105);
+ setState(102);
dstatement();
- setState(106);
- match(SEMICOLON);
+ setState(103);
+ _la = _input.LA(1);
+ if ( !(_la==EOF || _la==SEMICOLON) ) {
+ _errHandler.recoverInline(this);
+ } else {
+ consume();
+ }
}
break;
default:
@@ -441,7 +422,7 @@ public RstatementContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@Override public int getRuleIndex() { return RULE_rstatement; }
-
+
public RstatementContext() { }
public void copyFrom(RstatementContext ctx) {
super.copyFrom(ctx);
@@ -584,37 +565,37 @@ public final RstatementContext rstatement() throws RecognitionException {
int _la;
try {
int _alt;
- setState(170);
+ setState(167);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,12,_ctx) ) {
case 1:
_localctx = new IfContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(110);
+ setState(107);
match(IF);
- setState(111);
+ setState(108);
match(LP);
- setState(112);
+ setState(109);
expression(0);
- setState(113);
+ setState(110);
match(RP);
- setState(114);
+ setState(111);
trailer();
- setState(118);
+ setState(115);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,5,_ctx) ) {
case 1:
{
- setState(115);
+ setState(112);
match(ELSE);
- setState(116);
+ setState(113);
trailer();
}
break;
case 2:
{
- setState(117);
+ setState(114);
if (!( _input.LA(1) != ELSE )) throw new FailedPredicateException(this, " _input.LA(1) != ELSE ");
}
break;
@@ -625,15 +606,15 @@ public final RstatementContext rstatement() throws RecognitionException {
_localctx = new WhileContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(120);
+ setState(117);
match(WHILE);
- setState(121);
+ setState(118);
match(LP);
- setState(122);
+ setState(119);
expression(0);
- setState(123);
+ setState(120);
match(RP);
- setState(126);
+ setState(123);
switch (_input.LA(1)) {
case LBRACK:
case LBRACE:
@@ -666,13 +647,13 @@ public final RstatementContext rstatement() throws RecognitionException {
case TYPE:
case ID:
{
- setState(124);
+ setState(121);
trailer();
}
break;
case SEMICOLON:
{
- setState(125);
+ setState(122);
empty();
}
break;
@@ -685,44 +666,44 @@ public final RstatementContext rstatement() throws RecognitionException {
_localctx = new ForContext(_localctx);
enterOuterAlt(_localctx, 3);
{
- setState(128);
+ setState(125);
match(FOR);
- setState(129);
+ setState(126);
match(LP);
- setState(131);
+ setState(128);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << NEW) | (1L << BOOLNOT) | (1L << BWNOT) | (1L << ADD) | (1L << SUB) | (1L << INCR) | (1L << DECR))) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (OCTAL - 72)) | (1L << (HEX - 72)) | (1L << (INTEGER - 72)) | (1L << (DECIMAL - 72)) | (1L << (STRING - 72)) | (1L << (REGEX - 72)) | (1L << (TRUE - 72)) | (1L << (FALSE - 72)) | (1L << (NULL - 72)) | (1L << (TYPE - 72)) | (1L << (ID - 72)))) != 0)) {
{
- setState(130);
+ setState(127);
initializer();
}
}
- setState(133);
+ setState(130);
match(SEMICOLON);
- setState(135);
+ setState(132);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << NEW) | (1L << BOOLNOT) | (1L << BWNOT) | (1L << ADD) | (1L << SUB) | (1L << INCR) | (1L << DECR))) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (OCTAL - 72)) | (1L << (HEX - 72)) | (1L << (INTEGER - 72)) | (1L << (DECIMAL - 72)) | (1L << (STRING - 72)) | (1L << (REGEX - 72)) | (1L << (TRUE - 72)) | (1L << (FALSE - 72)) | (1L << (NULL - 72)) | (1L << (TYPE - 72)) | (1L << (ID - 72)))) != 0)) {
{
- setState(134);
+ setState(131);
expression(0);
}
}
- setState(137);
+ setState(134);
match(SEMICOLON);
- setState(139);
+ setState(136);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << NEW) | (1L << BOOLNOT) | (1L << BWNOT) | (1L << ADD) | (1L << SUB) | (1L << INCR) | (1L << DECR))) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (OCTAL - 72)) | (1L << (HEX - 72)) | (1L << (INTEGER - 72)) | (1L << (DECIMAL - 72)) | (1L << (STRING - 72)) | (1L << (REGEX - 72)) | (1L << (TRUE - 72)) | (1L << (FALSE - 72)) | (1L << (NULL - 72)) | (1L << (TYPE - 72)) | (1L << (ID - 72)))) != 0)) {
{
- setState(138);
+ setState(135);
afterthought();
}
}
- setState(141);
+ setState(138);
match(RP);
- setState(144);
+ setState(141);
switch (_input.LA(1)) {
case LBRACK:
case LBRACE:
@@ -755,13 +736,13 @@ public final RstatementContext rstatement() throws RecognitionException {
case TYPE:
case ID:
{
- setState(142);
+ setState(139);
trailer();
}
break;
case SEMICOLON:
{
- setState(143);
+ setState(140);
empty();
}
break;
@@ -774,21 +755,21 @@ public final RstatementContext rstatement() throws RecognitionException {
_localctx = new EachContext(_localctx);
enterOuterAlt(_localctx, 4);
{
- setState(146);
+ setState(143);
match(FOR);
- setState(147);
+ setState(144);
match(LP);
- setState(148);
+ setState(145);
decltype();
- setState(149);
+ setState(146);
match(ID);
- setState(150);
+ setState(147);
match(COLON);
- setState(151);
+ setState(148);
expression(0);
- setState(152);
+ setState(149);
match(RP);
- setState(153);
+ setState(150);
trailer();
}
break;
@@ -796,19 +777,19 @@ public final RstatementContext rstatement() throws RecognitionException {
_localctx = new IneachContext(_localctx);
enterOuterAlt(_localctx, 5);
{
- setState(155);
+ setState(152);
match(FOR);
- setState(156);
+ setState(153);
match(LP);
- setState(157);
+ setState(154);
match(ID);
- setState(158);
+ setState(155);
match(IN);
- setState(159);
+ setState(156);
expression(0);
- setState(160);
+ setState(157);
match(RP);
- setState(161);
+ setState(158);
trailer();
}
break;
@@ -816,11 +797,11 @@ public final RstatementContext rstatement() throws RecognitionException {
_localctx = new TryContext(_localctx);
enterOuterAlt(_localctx, 6);
{
- setState(163);
+ setState(160);
match(TRY);
- setState(164);
+ setState(161);
block();
- setState(166);
+ setState(163);
_errHandler.sync(this);
_alt = 1;
do {
@@ -828,7 +809,7 @@ public final RstatementContext rstatement() throws RecognitionException {
case 1:
{
{
- setState(165);
+ setState(162);
trap();
}
}
@@ -836,9 +817,9 @@ public final RstatementContext rstatement() throws RecognitionException {
default:
throw new NoViableAltException(this);
}
- setState(168);
+ setState(165);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,12,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,11,_ctx);
} while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
}
break;
@@ -860,7 +841,7 @@ public DstatementContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@Override public int getRuleIndex() { return RULE_dstatement; }
-
+
public DstatementContext() { }
public void copyFrom(DstatementContext ctx) {
super.copyFrom(ctx);
@@ -953,24 +934,24 @@ public final DstatementContext dstatement() throws RecognitionException {
DstatementContext _localctx = new DstatementContext(_ctx, getState());
enterRule(_localctx, 10, RULE_dstatement);
try {
- setState(187);
+ setState(184);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) {
case 1:
_localctx = new DoContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(172);
+ setState(169);
match(DO);
- setState(173);
+ setState(170);
block();
- setState(174);
+ setState(171);
match(WHILE);
- setState(175);
+ setState(172);
match(LP);
- setState(176);
+ setState(173);
expression(0);
- setState(177);
+ setState(174);
match(RP);
}
break;
@@ -978,7 +959,7 @@ public final DstatementContext dstatement() throws RecognitionException {
_localctx = new DeclContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(179);
+ setState(176);
declaration();
}
break;
@@ -986,7 +967,7 @@ public final DstatementContext dstatement() throws RecognitionException {
_localctx = new ContinueContext(_localctx);
enterOuterAlt(_localctx, 3);
{
- setState(180);
+ setState(177);
match(CONTINUE);
}
break;
@@ -994,7 +975,7 @@ public final DstatementContext dstatement() throws RecognitionException {
_localctx = new BreakContext(_localctx);
enterOuterAlt(_localctx, 4);
{
- setState(181);
+ setState(178);
match(BREAK);
}
break;
@@ -1002,9 +983,9 @@ public final DstatementContext dstatement() throws RecognitionException {
_localctx = new ReturnContext(_localctx);
enterOuterAlt(_localctx, 5);
{
- setState(182);
+ setState(179);
match(RETURN);
- setState(183);
+ setState(180);
expression(0);
}
break;
@@ -1012,9 +993,9 @@ public final DstatementContext dstatement() throws RecognitionException {
_localctx = new ThrowContext(_localctx);
enterOuterAlt(_localctx, 6);
{
- setState(184);
+ setState(181);
match(THROW);
- setState(185);
+ setState(182);
expression(0);
}
break;
@@ -1022,7 +1003,7 @@ public final DstatementContext dstatement() throws RecognitionException {
_localctx = new ExprContext(_localctx);
enterOuterAlt(_localctx, 7);
{
- setState(186);
+ setState(183);
expression(0);
}
break;
@@ -1061,12 +1042,12 @@ public final TrailerContext trailer() throws RecognitionException {
TrailerContext _localctx = new TrailerContext(_ctx, getState());
enterRule(_localctx, 12, RULE_trailer);
try {
- setState(191);
+ setState(188);
switch (_input.LA(1)) {
case LBRACK:
enterOuterAlt(_localctx, 1);
{
- setState(189);
+ setState(186);
block();
}
break;
@@ -1101,7 +1082,7 @@ public final TrailerContext trailer() throws RecognitionException {
case ID:
enterOuterAlt(_localctx, 2);
{
- setState(190);
+ setState(187);
statement();
}
break;
@@ -1151,34 +1132,34 @@ public final BlockContext block() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(193);
+ setState(190);
match(LBRACK);
- setState(197);
+ setState(194);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,16,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,15,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(194);
+ setState(191);
statement();
}
- }
+ }
}
- setState(199);
+ setState(196);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,16,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,15,_ctx);
}
- setState(201);
+ setState(198);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << DO) | (1L << CONTINUE) | (1L << BREAK) | (1L << RETURN) | (1L << NEW) | (1L << THROW) | (1L << BOOLNOT) | (1L << BWNOT) | (1L << ADD) | (1L << SUB) | (1L << INCR) | (1L << DECR))) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (OCTAL - 72)) | (1L << (HEX - 72)) | (1L << (INTEGER - 72)) | (1L << (DECIMAL - 72)) | (1L << (STRING - 72)) | (1L << (REGEX - 72)) | (1L << (TRUE - 72)) | (1L << (FALSE - 72)) | (1L << (NULL - 72)) | (1L << (TYPE - 72)) | (1L << (ID - 72)))) != 0)) {
{
- setState(200);
+ setState(197);
dstatement();
}
}
- setState(203);
+ setState(200);
match(RBRACK);
}
}
@@ -1212,7 +1193,7 @@ public final EmptyContext empty() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(205);
+ setState(202);
match(SEMICOLON);
}
}
@@ -1249,20 +1230,20 @@ public final InitializerContext initializer() throws RecognitionException {
InitializerContext _localctx = new InitializerContext(_ctx, getState());
enterRule(_localctx, 18, RULE_initializer);
try {
- setState(209);
+ setState(206);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,17,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(207);
+ setState(204);
declaration();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(208);
+ setState(205);
expression(0);
}
break;
@@ -1300,7 +1281,7 @@ public final AfterthoughtContext afterthought() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(211);
+ setState(208);
expression(0);
}
}
@@ -1347,23 +1328,23 @@ public final DeclarationContext declaration() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(213);
+ setState(210);
decltype();
- setState(214);
+ setState(211);
declvar();
- setState(219);
+ setState(216);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==COMMA) {
{
{
- setState(215);
+ setState(212);
match(COMMA);
- setState(216);
+ setState(213);
declvar();
}
}
- setState(221);
+ setState(218);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -1408,25 +1389,25 @@ public final DecltypeContext decltype() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(222);
+ setState(219);
match(TYPE);
- setState(227);
+ setState(224);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,20,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,19,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(223);
+ setState(220);
match(LBRACE);
- setState(224);
+ setState(221);
match(RBRACE);
}
- }
+ }
}
- setState(229);
+ setState(226);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,20,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,19,_ctx);
}
}
}
@@ -1465,15 +1446,15 @@ public final DeclvarContext declvar() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(230);
+ setState(227);
match(ID);
- setState(233);
+ setState(230);
_la = _input.LA(1);
if (_la==ASSIGN) {
{
- setState(231);
+ setState(228);
match(ASSIGN);
- setState(232);
+ setState(229);
expression(0);
}
}
@@ -1517,17 +1498,17 @@ public final TrapContext trap() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(235);
+ setState(232);
match(CATCH);
- setState(236);
+ setState(233);
match(LP);
- setState(237);
+ setState(234);
match(TYPE);
- setState(238);
+ setState(235);
match(ID);
- setState(239);
+ setState(236);
match(RP);
- setState(240);
+ setState(237);
block();
}
}
@@ -1547,7 +1528,7 @@ public ExpressionContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@Override public int getRuleIndex() { return RULE_expression; }
-
+
public ExpressionContext() { }
public void copyFrom(ExpressionContext ctx) {
super.copyFrom(ctx);
@@ -1723,35 +1704,35 @@ private ExpressionContext expression(int _p) throws RecognitionException {
_ctx = _localctx;
_prevctx = _localctx;
- setState(243);
+ setState(240);
unary();
}
_ctx.stop = _input.LT(-1);
- setState(295);
+ setState(292);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,23,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,22,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
if ( _parseListeners!=null ) triggerExitRuleEvent();
_prevctx = _localctx;
{
- setState(293);
+ setState(290);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,21,_ctx) ) {
case 1:
{
_localctx = new BinaryContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(245);
+ setState(242);
if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)");
- setState(246);
+ setState(243);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << MUL) | (1L << DIV) | (1L << REM))) != 0)) ) {
_errHandler.recoverInline(this);
} else {
consume();
}
- setState(247);
+ setState(244);
expression(16);
}
break;
@@ -1759,16 +1740,16 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new BinaryContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(248);
+ setState(245);
if (!(precpred(_ctx, 14))) throw new FailedPredicateException(this, "precpred(_ctx, 14)");
- setState(249);
+ setState(246);
_la = _input.LA(1);
if ( !(_la==ADD || _la==SUB) ) {
_errHandler.recoverInline(this);
} else {
consume();
}
- setState(250);
+ setState(247);
expression(15);
}
break;
@@ -1776,16 +1757,16 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new BinaryContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(251);
+ setState(248);
if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)");
- setState(252);
+ setState(249);
_la = _input.LA(1);
if ( !(_la==FIND || _la==MATCH) ) {
_errHandler.recoverInline(this);
} else {
consume();
}
- setState(253);
+ setState(250);
expression(14);
}
break;
@@ -1793,16 +1774,16 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new BinaryContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(254);
+ setState(251);
if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)");
- setState(255);
+ setState(252);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << LSH) | (1L << RSH) | (1L << USH))) != 0)) ) {
_errHandler.recoverInline(this);
} else {
consume();
}
- setState(256);
+ setState(253);
expression(13);
}
break;
@@ -1810,16 +1791,16 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new CompContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(257);
+ setState(254);
if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)");
- setState(258);
+ setState(255);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << LT) | (1L << LTE) | (1L << GT) | (1L << GTE))) != 0)) ) {
_errHandler.recoverInline(this);
} else {
consume();
}
- setState(259);
+ setState(256);
expression(12);
}
break;
@@ -1827,16 +1808,16 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new CompContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(260);
+ setState(257);
if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)");
- setState(261);
+ setState(258);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << EQ) | (1L << EQR) | (1L << NE) | (1L << NER))) != 0)) ) {
_errHandler.recoverInline(this);
} else {
consume();
}
- setState(262);
+ setState(259);
expression(10);
}
break;
@@ -1844,11 +1825,11 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new BinaryContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(263);
+ setState(260);
if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)");
- setState(264);
+ setState(261);
match(BWAND);
- setState(265);
+ setState(262);
expression(9);
}
break;
@@ -1856,11 +1837,11 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new BinaryContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(266);
+ setState(263);
if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
- setState(267);
+ setState(264);
match(XOR);
- setState(268);
+ setState(265);
expression(8);
}
break;
@@ -1868,11 +1849,11 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new BinaryContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(269);
+ setState(266);
if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)");
- setState(270);
+ setState(267);
match(BWOR);
- setState(271);
+ setState(268);
expression(7);
}
break;
@@ -1880,11 +1861,11 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new BoolContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(272);
+ setState(269);
if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)");
- setState(273);
+ setState(270);
match(BOOLAND);
- setState(274);
+ setState(271);
expression(6);
}
break;
@@ -1892,11 +1873,11 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new BoolContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(275);
+ setState(272);
if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)");
- setState(276);
+ setState(273);
match(BOOLOR);
- setState(277);
+ setState(274);
expression(5);
}
break;
@@ -1904,15 +1885,15 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new ConditionalContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(278);
+ setState(275);
if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)");
- setState(279);
+ setState(276);
match(COND);
- setState(280);
+ setState(277);
expression(0);
- setState(281);
+ setState(278);
match(COLON);
- setState(282);
+ setState(279);
expression(3);
}
break;
@@ -1920,11 +1901,11 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new ElvisContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(284);
+ setState(281);
if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)");
- setState(285);
+ setState(282);
match(ELVIS);
- setState(286);
+ setState(283);
expression(2);
}
break;
@@ -1932,16 +1913,16 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new AssignmentContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(287);
+ setState(284);
if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
- setState(288);
+ setState(285);
_la = _input.LA(1);
if ( !(((((_la - 60)) & ~0x3f) == 0 && ((1L << (_la - 60)) & ((1L << (ASSIGN - 60)) | (1L << (AADD - 60)) | (1L << (ASUB - 60)) | (1L << (AMUL - 60)) | (1L << (ADIV - 60)) | (1L << (AREM - 60)) | (1L << (AAND - 60)) | (1L << (AXOR - 60)) | (1L << (AOR - 60)) | (1L << (ALSH - 60)) | (1L << (ARSH - 60)) | (1L << (AUSH - 60)))) != 0)) ) {
_errHandler.recoverInline(this);
} else {
consume();
}
- setState(289);
+ setState(286);
expression(1);
}
break;
@@ -1949,20 +1930,20 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new InstanceofContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(290);
+ setState(287);
if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)");
- setState(291);
+ setState(288);
match(INSTANCEOF);
- setState(292);
+ setState(289);
decltype();
}
break;
}
- }
+ }
}
- setState(297);
+ setState(294);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,23,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,22,_ctx);
}
}
}
@@ -1982,7 +1963,7 @@ public UnaryContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@Override public int getRuleIndex() { return RULE_unary; }
-
+
public UnaryContext() { }
public void copyFrom(UnaryContext ctx) {
super.copyFrom(ctx);
@@ -2062,21 +2043,21 @@ public final UnaryContext unary() throws RecognitionException {
enterRule(_localctx, 32, RULE_unary);
int _la;
try {
- setState(311);
+ setState(308);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,24,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,23,_ctx) ) {
case 1:
_localctx = new PreContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(298);
+ setState(295);
_la = _input.LA(1);
if ( !(_la==INCR || _la==DECR) ) {
_errHandler.recoverInline(this);
} else {
consume();
}
- setState(299);
+ setState(296);
chain();
}
break;
@@ -2084,9 +2065,9 @@ public final UnaryContext unary() throws RecognitionException {
_localctx = new PostContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(300);
+ setState(297);
chain();
- setState(301);
+ setState(298);
_la = _input.LA(1);
if ( !(_la==INCR || _la==DECR) ) {
_errHandler.recoverInline(this);
@@ -2099,7 +2080,7 @@ public final UnaryContext unary() throws RecognitionException {
_localctx = new ReadContext(_localctx);
enterOuterAlt(_localctx, 3);
{
- setState(303);
+ setState(300);
chain();
}
break;
@@ -2107,14 +2088,14 @@ public final UnaryContext unary() throws RecognitionException {
_localctx = new OperatorContext(_localctx);
enterOuterAlt(_localctx, 4);
{
- setState(304);
+ setState(301);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << BOOLNOT) | (1L << BWNOT) | (1L << ADD) | (1L << SUB))) != 0)) ) {
_errHandler.recoverInline(this);
} else {
consume();
}
- setState(305);
+ setState(302);
unary();
}
break;
@@ -2122,13 +2103,13 @@ public final UnaryContext unary() throws RecognitionException {
_localctx = new CastContext(_localctx);
enterOuterAlt(_localctx, 5);
{
- setState(306);
+ setState(303);
match(LP);
- setState(307);
+ setState(304);
decltype();
- setState(308);
+ setState(305);
match(RP);
- setState(309);
+ setState(306);
unary();
}
break;
@@ -2150,7 +2131,7 @@ public ChainContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@Override public int getRuleIndex() { return RULE_chain; }
-
+
public ChainContext() { }
public void copyFrom(ChainContext ctx) {
super.copyFrom(ctx);
@@ -2210,30 +2191,30 @@ public final ChainContext chain() throws RecognitionException {
enterRule(_localctx, 34, RULE_chain);
try {
int _alt;
- setState(329);
+ setState(326);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,27,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,26,_ctx) ) {
case 1:
_localctx = new DynamicContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(313);
+ setState(310);
primary();
- setState(317);
+ setState(314);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,25,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,24,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(314);
+ setState(311);
postfix();
}
- }
+ }
}
- setState(319);
+ setState(316);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,25,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,24,_ctx);
}
}
break;
@@ -2241,25 +2222,25 @@ public final ChainContext chain() throws RecognitionException {
_localctx = new StaticContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(320);
+ setState(317);
decltype();
- setState(321);
+ setState(318);
postdot();
- setState(325);
+ setState(322);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,26,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,25,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(322);
+ setState(319);
postfix();
}
- }
+ }
}
- setState(327);
+ setState(324);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,26,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,25,_ctx);
}
}
break;
@@ -2267,7 +2248,7 @@ public final ChainContext chain() throws RecognitionException {
_localctx = new NewarrayContext(_localctx);
enterOuterAlt(_localctx, 3);
{
- setState(328);
+ setState(325);
arrayinitializer();
}
break;
@@ -2289,7 +2270,7 @@ public PrimaryContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@Override public int getRuleIndex() { return RULE_primary; }
-
+
public PrimaryContext() { }
public void copyFrom(PrimaryContext ctx) {
super.copyFrom(ctx);
@@ -2427,18 +2408,18 @@ public final PrimaryContext primary() throws RecognitionException {
enterRule(_localctx, 36, RULE_primary);
int _la;
try {
- setState(349);
+ setState(346);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,27,_ctx) ) {
case 1:
_localctx = new PrecedenceContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(331);
+ setState(328);
match(LP);
- setState(332);
+ setState(329);
expression(0);
- setState(333);
+ setState(330);
match(RP);
}
break;
@@ -2446,7 +2427,7 @@ public final PrimaryContext primary() throws RecognitionException {
_localctx = new NumericContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(335);
+ setState(332);
_la = _input.LA(1);
if ( !(((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (OCTAL - 72)) | (1L << (HEX - 72)) | (1L << (INTEGER - 72)) | (1L << (DECIMAL - 72)))) != 0)) ) {
_errHandler.recoverInline(this);
@@ -2459,7 +2440,7 @@ public final PrimaryContext primary() throws RecognitionException {
_localctx = new TrueContext(_localctx);
enterOuterAlt(_localctx, 3);
{
- setState(336);
+ setState(333);
match(TRUE);
}
break;
@@ -2467,7 +2448,7 @@ public final PrimaryContext primary() throws RecognitionException {
_localctx = new FalseContext(_localctx);
enterOuterAlt(_localctx, 4);
{
- setState(337);
+ setState(334);
match(FALSE);
}
break;
@@ -2475,7 +2456,7 @@ public final PrimaryContext primary() throws RecognitionException {
_localctx = new NullContext(_localctx);
enterOuterAlt(_localctx, 5);
{
- setState(338);
+ setState(335);
match(NULL);
}
break;
@@ -2483,7 +2464,7 @@ public final PrimaryContext primary() throws RecognitionException {
_localctx = new StringContext(_localctx);
enterOuterAlt(_localctx, 6);
{
- setState(339);
+ setState(336);
match(STRING);
}
break;
@@ -2491,7 +2472,7 @@ public final PrimaryContext primary() throws RecognitionException {
_localctx = new RegexContext(_localctx);
enterOuterAlt(_localctx, 7);
{
- setState(340);
+ setState(337);
match(REGEX);
}
break;
@@ -2499,7 +2480,7 @@ public final PrimaryContext primary() throws RecognitionException {
_localctx = new ListinitContext(_localctx);
enterOuterAlt(_localctx, 8);
{
- setState(341);
+ setState(338);
listinitializer();
}
break;
@@ -2507,7 +2488,7 @@ public final PrimaryContext primary() throws RecognitionException {
_localctx = new MapinitContext(_localctx);
enterOuterAlt(_localctx, 9);
{
- setState(342);
+ setState(339);
mapinitializer();
}
break;
@@ -2515,7 +2496,7 @@ public final PrimaryContext primary() throws RecognitionException {
_localctx = new VariableContext(_localctx);
enterOuterAlt(_localctx, 10);
{
- setState(343);
+ setState(340);
match(ID);
}
break;
@@ -2523,9 +2504,9 @@ public final PrimaryContext primary() throws RecognitionException {
_localctx = new CalllocalContext(_localctx);
enterOuterAlt(_localctx, 11);
{
- setState(344);
+ setState(341);
match(ID);
- setState(345);
+ setState(342);
arguments();
}
break;
@@ -2533,11 +2514,11 @@ public final PrimaryContext primary() throws RecognitionException {
_localctx = new NewobjectContext(_localctx);
enterOuterAlt(_localctx, 12);
{
- setState(346);
+ setState(343);
match(NEW);
- setState(347);
+ setState(344);
match(TYPE);
- setState(348);
+ setState(345);
arguments();
}
break;
@@ -2579,27 +2560,27 @@ public final PostfixContext postfix() throws RecognitionException {
PostfixContext _localctx = new PostfixContext(_ctx, getState());
enterRule(_localctx, 38, RULE_postfix);
try {
- setState(354);
+ setState(351);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,29,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(351);
+ setState(348);
callinvoke();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(352);
+ setState(349);
fieldaccess();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(353);
+ setState(350);
braceaccess();
}
break;
@@ -2638,20 +2619,20 @@ public final PostdotContext postdot() throws RecognitionException {
PostdotContext _localctx = new PostdotContext(_ctx, getState());
enterRule(_localctx, 40, RULE_postdot);
try {
- setState(358);
+ setState(355);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,30,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,29,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(356);
+ setState(353);
callinvoke();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(357);
+ setState(354);
fieldaccess();
}
break;
@@ -2693,16 +2674,16 @@ public final CallinvokeContext callinvoke() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(360);
+ setState(357);
_la = _input.LA(1);
if ( !(_la==DOT || _la==NSDOT) ) {
_errHandler.recoverInline(this);
} else {
consume();
}
- setState(361);
+ setState(358);
match(DOTID);
- setState(362);
+ setState(359);
arguments();
}
}
@@ -2740,14 +2721,14 @@ public final FieldaccessContext fieldaccess() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(364);
+ setState(361);
_la = _input.LA(1);
if ( !(_la==DOT || _la==NSDOT) ) {
_errHandler.recoverInline(this);
} else {
consume();
}
- setState(365);
+ setState(362);
_la = _input.LA(1);
if ( !(_la==DOTINTEGER || _la==DOTID) ) {
_errHandler.recoverInline(this);
@@ -2790,11 +2771,11 @@ public final BraceaccessContext braceaccess() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(367);
+ setState(364);
match(LBRACE);
- setState(368);
+ setState(365);
expression(0);
- setState(369);
+ setState(366);
match(RBRACE);
}
}
@@ -2814,7 +2795,7 @@ public ArrayinitializerContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@Override public int getRuleIndex() { return RULE_arrayinitializer; }
-
+
public ArrayinitializerContext() { }
public void copyFrom(ArrayinitializerContext ctx) {
super.copyFrom(ctx);
@@ -2890,18 +2871,18 @@ public final ArrayinitializerContext arrayinitializer() throws RecognitionExcept
int _la;
try {
int _alt;
- setState(412);
+ setState(409);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) {
case 1:
_localctx = new NewstandardarrayContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(371);
+ setState(368);
match(NEW);
- setState(372);
+ setState(369);
match(TYPE);
- setState(377);
+ setState(374);
_errHandler.sync(this);
_alt = 1;
do {
@@ -2909,11 +2890,11 @@ public final ArrayinitializerContext arrayinitializer() throws RecognitionExcept
case 1:
{
{
- setState(373);
+ setState(370);
match(LBRACE);
- setState(374);
+ setState(371);
expression(0);
- setState(375);
+ setState(372);
match(RBRACE);
}
}
@@ -2921,32 +2902,32 @@ public final ArrayinitializerContext arrayinitializer() throws RecognitionExcept
default:
throw new NoViableAltException(this);
}
- setState(379);
+ setState(376);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,31,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,30,_ctx);
} while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
- setState(388);
+ setState(385);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,33,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) {
case 1:
{
- setState(381);
+ setState(378);
postdot();
- setState(385);
+ setState(382);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,32,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,31,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(382);
+ setState(379);
postfix();
}
- }
+ }
}
- setState(387);
+ setState(384);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,32,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,31,_ctx);
}
}
break;
@@ -2957,58 +2938,58 @@ public final ArrayinitializerContext arrayinitializer() throws RecognitionExcept
_localctx = new NewinitializedarrayContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(390);
+ setState(387);
match(NEW);
- setState(391);
+ setState(388);
match(TYPE);
- setState(392);
+ setState(389);
match(LBRACE);
- setState(393);
+ setState(390);
match(RBRACE);
- setState(394);
+ setState(391);
match(LBRACK);
- setState(403);
+ setState(400);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << NEW) | (1L << BOOLNOT) | (1L << BWNOT) | (1L << ADD) | (1L << SUB) | (1L << INCR) | (1L << DECR))) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (OCTAL - 72)) | (1L << (HEX - 72)) | (1L << (INTEGER - 72)) | (1L << (DECIMAL - 72)) | (1L << (STRING - 72)) | (1L << (REGEX - 72)) | (1L << (TRUE - 72)) | (1L << (FALSE - 72)) | (1L << (NULL - 72)) | (1L << (TYPE - 72)) | (1L << (ID - 72)))) != 0)) {
{
- setState(395);
+ setState(392);
expression(0);
- setState(400);
+ setState(397);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==COMMA) {
{
{
- setState(396);
+ setState(393);
match(COMMA);
- setState(397);
+ setState(394);
expression(0);
}
}
- setState(402);
+ setState(399);
_errHandler.sync(this);
_la = _input.LA(1);
}
}
}
- setState(405);
+ setState(402);
match(RBRACK);
- setState(409);
+ setState(406);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,36,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,35,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(406);
+ setState(403);
postfix();
}
- }
+ }
}
- setState(411);
+ setState(408);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,36,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,35,_ctx);
}
}
break;
@@ -3054,42 +3035,42 @@ public final ListinitializerContext listinitializer() throws RecognitionExceptio
enterRule(_localctx, 50, RULE_listinitializer);
int _la;
try {
- setState(427);
+ setState(424);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(414);
+ setState(411);
match(LBRACE);
- setState(415);
+ setState(412);
expression(0);
- setState(420);
+ setState(417);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==COMMA) {
{
{
- setState(416);
+ setState(413);
match(COMMA);
- setState(417);
+ setState(414);
expression(0);
}
}
- setState(422);
+ setState(419);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(423);
+ setState(420);
match(RBRACE);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(425);
+ setState(422);
match(LBRACE);
- setState(426);
+ setState(423);
match(RBRACE);
}
break;
@@ -3136,44 +3117,44 @@ public final MapinitializerContext mapinitializer() throws RecognitionException
enterRule(_localctx, 52, RULE_mapinitializer);
int _la;
try {
- setState(443);
+ setState(440);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,40,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(429);
+ setState(426);
match(LBRACE);
- setState(430);
+ setState(427);
maptoken();
- setState(435);
+ setState(432);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==COMMA) {
{
{
- setState(431);
+ setState(428);
match(COMMA);
- setState(432);
+ setState(429);
maptoken();
}
}
- setState(437);
+ setState(434);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(438);
+ setState(435);
match(RBRACE);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(440);
+ setState(437);
match(LBRACE);
- setState(441);
+ setState(438);
match(COLON);
- setState(442);
+ setState(439);
match(RBRACE);
}
break;
@@ -3215,11 +3196,11 @@ public final MaptokenContext maptoken() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(445);
+ setState(442);
expression(0);
- setState(446);
+ setState(443);
match(COLON);
- setState(447);
+ setState(444);
expression(0);
}
}
@@ -3266,34 +3247,34 @@ public final ArgumentsContext arguments() throws RecognitionException {
enterOuterAlt(_localctx, 1);
{
{
- setState(449);
+ setState(446);
match(LP);
- setState(458);
+ setState(455);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << NEW) | (1L << THIS) | (1L << BOOLNOT) | (1L << BWNOT) | (1L << ADD) | (1L << SUB) | (1L << INCR) | (1L << DECR))) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (OCTAL - 72)) | (1L << (HEX - 72)) | (1L << (INTEGER - 72)) | (1L << (DECIMAL - 72)) | (1L << (STRING - 72)) | (1L << (REGEX - 72)) | (1L << (TRUE - 72)) | (1L << (FALSE - 72)) | (1L << (NULL - 72)) | (1L << (TYPE - 72)) | (1L << (ID - 72)))) != 0)) {
{
- setState(450);
+ setState(447);
argument();
- setState(455);
+ setState(452);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==COMMA) {
{
{
- setState(451);
+ setState(448);
match(COMMA);
- setState(452);
+ setState(449);
argument();
}
}
- setState(457);
+ setState(454);
_errHandler.sync(this);
_la = _input.LA(1);
}
}
}
- setState(460);
+ setState(457);
match(RP);
}
}
@@ -3334,27 +3315,27 @@ public final ArgumentContext argument() throws RecognitionException {
ArgumentContext _localctx = new ArgumentContext(_ctx, getState());
enterRule(_localctx, 58, RULE_argument);
try {
- setState(465);
+ setState(462);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,43,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(462);
+ setState(459);
expression(0);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(463);
+ setState(460);
lambda();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(464);
+ setState(461);
funcref();
}
break;
@@ -3409,58 +3390,58 @@ public final LambdaContext lambda() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(480);
+ setState(477);
switch (_input.LA(1)) {
case TYPE:
case ID:
{
- setState(467);
+ setState(464);
lamtype();
}
break;
case LP:
{
- setState(468);
+ setState(465);
match(LP);
- setState(477);
+ setState(474);
_la = _input.LA(1);
if (_la==TYPE || _la==ID) {
{
- setState(469);
+ setState(466);
lamtype();
- setState(474);
+ setState(471);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==COMMA) {
{
{
- setState(470);
+ setState(467);
match(COMMA);
- setState(471);
+ setState(468);
lamtype();
}
}
- setState(476);
+ setState(473);
_errHandler.sync(this);
_la = _input.LA(1);
}
}
}
- setState(479);
+ setState(476);
match(RP);
}
break;
default:
throw new NoViableAltException(this);
}
- setState(482);
+ setState(479);
match(ARROW);
- setState(485);
+ setState(482);
switch (_input.LA(1)) {
case LBRACK:
{
- setState(483);
+ setState(480);
block();
}
break;
@@ -3485,7 +3466,7 @@ public final LambdaContext lambda() throws RecognitionException {
case TYPE:
case ID:
{
- setState(484);
+ setState(481);
expression(0);
}
break;
@@ -3528,16 +3509,16 @@ public final LamtypeContext lamtype() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(488);
+ setState(485);
_la = _input.LA(1);
if (_la==TYPE) {
{
- setState(487);
+ setState(484);
decltype();
}
}
- setState(490);
+ setState(487);
match(ID);
}
}
@@ -3557,7 +3538,7 @@ public FuncrefContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@Override public int getRuleIndex() { return RULE_funcref; }
-
+
public FuncrefContext() { }
public void copyFrom(FuncrefContext ctx) {
super.copyFrom(ctx);
@@ -3616,18 +3597,18 @@ public final FuncrefContext funcref() throws RecognitionException {
FuncrefContext _localctx = new FuncrefContext(_ctx, getState());
enterRule(_localctx, 64, RULE_funcref);
try {
- setState(505);
+ setState(502);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) {
case 1:
_localctx = new ClassfuncrefContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(492);
+ setState(489);
match(TYPE);
- setState(493);
+ setState(490);
match(REF);
- setState(494);
+ setState(491);
match(ID);
}
break;
@@ -3635,11 +3616,11 @@ public final FuncrefContext funcref() throws RecognitionException {
_localctx = new ConstructorfuncrefContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(495);
+ setState(492);
decltype();
- setState(496);
+ setState(493);
match(REF);
- setState(497);
+ setState(494);
match(NEW);
}
break;
@@ -3647,11 +3628,11 @@ public final FuncrefContext funcref() throws RecognitionException {
_localctx = new CapturingfuncrefContext(_localctx);
enterOuterAlt(_localctx, 3);
{
- setState(499);
+ setState(496);
match(ID);
- setState(500);
+ setState(497);
match(REF);
- setState(501);
+ setState(498);
match(ID);
}
break;
@@ -3659,11 +3640,11 @@ public final FuncrefContext funcref() throws RecognitionException {
_localctx = new LocalfuncrefContext(_localctx);
enterOuterAlt(_localctx, 4);
{
- setState(502);
+ setState(499);
match(THIS);
- setState(503);
+ setState(500);
match(REF);
- setState(504);
+ setState(501);
match(ID);
}
break;
@@ -3733,200 +3714,198 @@ private boolean expression_sempred(ExpressionContext _localctx, int predIndex) {
}
public static final String _serializedATN =
- "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3V\u01fe\4\2\t\2\4"+
+ "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3V\u01fb\4\2\t\2\4"+
"\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+
"\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
"\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+
"\t!\4\"\t\"\3\2\7\2F\n\2\f\2\16\2I\13\2\3\2\7\2L\n\2\f\2\16\2O\13\2\3"+
- "\2\5\2R\n\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\7"+
- "\4b\n\4\f\4\16\4e\13\4\5\4g\n\4\3\4\3\4\3\5\3\5\3\5\3\5\5\5o\n\5\3\6\3"+
- "\6\3\6\3\6\3\6\3\6\3\6\3\6\5\6y\n\6\3\6\3\6\3\6\3\6\3\6\3\6\5\6\u0081"+
- "\n\6\3\6\3\6\3\6\5\6\u0086\n\6\3\6\3\6\5\6\u008a\n\6\3\6\3\6\5\6\u008e"+
- "\n\6\3\6\3\6\3\6\5\6\u0093\n\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6"+
- "\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\6\6\u00a9\n\6\r\6\16\6\u00aa"+
- "\5\6\u00ad\n\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7"+
- "\3\7\5\7\u00be\n\7\3\b\3\b\5\b\u00c2\n\b\3\t\3\t\7\t\u00c6\n\t\f\t\16"+
- "\t\u00c9\13\t\3\t\5\t\u00cc\n\t\3\t\3\t\3\n\3\n\3\13\3\13\5\13\u00d4\n"+
- "\13\3\f\3\f\3\r\3\r\3\r\3\r\7\r\u00dc\n\r\f\r\16\r\u00df\13\r\3\16\3\16"+
- "\3\16\7\16\u00e4\n\16\f\16\16\16\u00e7\13\16\3\17\3\17\3\17\5\17\u00ec"+
- "\n\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21"+
- "\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+
+ "\2\3\2\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\7\4_\n\4\f\4\16"+
+ "\4b\13\4\5\4d\n\4\3\4\3\4\3\5\3\5\3\5\3\5\5\5l\n\5\3\6\3\6\3\6\3\6\3\6"+
+ "\3\6\3\6\3\6\5\6v\n\6\3\6\3\6\3\6\3\6\3\6\3\6\5\6~\n\6\3\6\3\6\3\6\5\6"+
+ "\u0083\n\6\3\6\3\6\5\6\u0087\n\6\3\6\3\6\5\6\u008b\n\6\3\6\3\6\3\6\5\6"+
+ "\u0090\n\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6"+
+ "\3\6\3\6\3\6\3\6\3\6\6\6\u00a6\n\6\r\6\16\6\u00a7\5\6\u00aa\n\6\3\7\3"+
+ "\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\5\7\u00bb\n\7\3"+
+ "\b\3\b\5\b\u00bf\n\b\3\t\3\t\7\t\u00c3\n\t\f\t\16\t\u00c6\13\t\3\t\5\t"+
+ "\u00c9\n\t\3\t\3\t\3\n\3\n\3\13\3\13\5\13\u00d1\n\13\3\f\3\f\3\r\3\r\3"+
+ "\r\3\r\7\r\u00d9\n\r\f\r\16\r\u00dc\13\r\3\16\3\16\3\16\7\16\u00e1\n\16"+
+ "\f\16\16\16\u00e4\13\16\3\17\3\17\3\17\5\17\u00e9\n\17\3\20\3\20\3\20"+
+ "\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+
"\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+
"\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+
- "\3\21\3\21\3\21\7\21\u0128\n\21\f\21\16\21\u012b\13\21\3\22\3\22\3\22"+
- "\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\5\22\u013a\n\22\3\23"+
- "\3\23\7\23\u013e\n\23\f\23\16\23\u0141\13\23\3\23\3\23\3\23\7\23\u0146"+
- "\n\23\f\23\16\23\u0149\13\23\3\23\5\23\u014c\n\23\3\24\3\24\3\24\3\24"+
- "\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24"+
- "\5\24\u0160\n\24\3\25\3\25\3\25\5\25\u0165\n\25\3\26\3\26\5\26\u0169\n"+
- "\26\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\32\3\32\3"+
- "\32\3\32\3\32\3\32\6\32\u017c\n\32\r\32\16\32\u017d\3\32\3\32\7\32\u0182"+
- "\n\32\f\32\16\32\u0185\13\32\5\32\u0187\n\32\3\32\3\32\3\32\3\32\3\32"+
- "\3\32\3\32\3\32\7\32\u0191\n\32\f\32\16\32\u0194\13\32\5\32\u0196\n\32"+
- "\3\32\3\32\7\32\u019a\n\32\f\32\16\32\u019d\13\32\5\32\u019f\n\32\3\33"+
- "\3\33\3\33\3\33\7\33\u01a5\n\33\f\33\16\33\u01a8\13\33\3\33\3\33\3\33"+
- "\3\33\5\33\u01ae\n\33\3\34\3\34\3\34\3\34\7\34\u01b4\n\34\f\34\16\34\u01b7"+
- "\13\34\3\34\3\34\3\34\3\34\3\34\5\34\u01be\n\34\3\35\3\35\3\35\3\35\3"+
- "\36\3\36\3\36\3\36\7\36\u01c8\n\36\f\36\16\36\u01cb\13\36\5\36\u01cd\n"+
- "\36\3\36\3\36\3\37\3\37\3\37\5\37\u01d4\n\37\3 \3 \3 \3 \3 \7 \u01db\n"+
- " \f \16 \u01de\13 \5 \u01e0\n \3 \5 \u01e3\n \3 \3 \3 \5 \u01e8\n \3!"+
- "\5!\u01eb\n!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\""+
- "\5\"\u01fc\n\"\3\"\2\3 #\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&("+
- "*,.\60\62\64\668:<>@B\2\16\3\2 \"\3\2#$\3\2:;\3\2%\'\3\2(+\3\2,/\3\2>"+
- "I\3\2<=\4\2\36\37#$\3\2JM\3\2\13\f\3\2UV\u0237\2G\3\2\2\2\4U\3\2\2\2\6"+
- "Z\3\2\2\2\bn\3\2\2\2\n\u00ac\3\2\2\2\f\u00bd\3\2\2\2\16\u00c1\3\2\2\2"+
- "\20\u00c3\3\2\2\2\22\u00cf\3\2\2\2\24\u00d3\3\2\2\2\26\u00d5\3\2\2\2\30"+
- "\u00d7\3\2\2\2\32\u00e0\3\2\2\2\34\u00e8\3\2\2\2\36\u00ed\3\2\2\2 \u00f4"+
- "\3\2\2\2\"\u0139\3\2\2\2$\u014b\3\2\2\2&\u015f\3\2\2\2(\u0164\3\2\2\2"+
- "*\u0168\3\2\2\2,\u016a\3\2\2\2.\u016e\3\2\2\2\60\u0171\3\2\2\2\62\u019e"+
- "\3\2\2\2\64\u01ad\3\2\2\2\66\u01bd\3\2\2\28\u01bf\3\2\2\2:\u01c3\3\2\2"+
- "\2<\u01d3\3\2\2\2>\u01e2\3\2\2\2@\u01ea\3\2\2\2B\u01fb\3\2\2\2DF\5\4\3"+
- "\2ED\3\2\2\2FI\3\2\2\2GE\3\2\2\2GH\3\2\2\2HM\3\2\2\2IG\3\2\2\2JL\5\b\5"+
- "\2KJ\3\2\2\2LO\3\2\2\2MK\3\2\2\2MN\3\2\2\2NQ\3\2\2\2OM\3\2\2\2PR\5\f\7"+
- "\2QP\3\2\2\2QR\3\2\2\2RS\3\2\2\2ST\7\2\2\3T\3\3\2\2\2UV\5\32\16\2VW\7"+
- "T\2\2WX\5\6\4\2XY\5\20\t\2Y\5\3\2\2\2Zf\7\t\2\2[\\\5\32\16\2\\c\7T\2\2"+
- "]^\7\r\2\2^_\5\32\16\2_`\7T\2\2`b\3\2\2\2a]\3\2\2\2be\3\2\2\2ca\3\2\2"+
- "\2cd\3\2\2\2dg\3\2\2\2ec\3\2\2\2f[\3\2\2\2fg\3\2\2\2gh\3\2\2\2hi\7\n\2"+
- "\2i\7\3\2\2\2jo\5\n\6\2kl\5\f\7\2lm\7\16\2\2mo\3\2\2\2nj\3\2\2\2nk\3\2"+
- "\2\2o\t\3\2\2\2pq\7\17\2\2qr\7\t\2\2rs\5 \21\2st\7\n\2\2tx\5\16\b\2uv"+
- "\7\21\2\2vy\5\16\b\2wy\6\6\2\2xu\3\2\2\2xw\3\2\2\2y\u00ad\3\2\2\2z{\7"+
- "\22\2\2{|\7\t\2\2|}\5 \21\2}\u0080\7\n\2\2~\u0081\5\16\b\2\177\u0081\5"+
- "\22\n\2\u0080~\3\2\2\2\u0080\177\3\2\2\2\u0081\u00ad\3\2\2\2\u0082\u0083"+
- "\7\24\2\2\u0083\u0085\7\t\2\2\u0084\u0086\5\24\13\2\u0085\u0084\3\2\2"+
- "\2\u0085\u0086\3\2\2\2\u0086\u0087\3\2\2\2\u0087\u0089\7\16\2\2\u0088"+
- "\u008a\5 \21\2\u0089\u0088\3\2\2\2\u0089\u008a\3\2\2\2\u008a\u008b\3\2"+
- "\2\2\u008b\u008d\7\16\2\2\u008c\u008e\5\26\f\2\u008d\u008c\3\2\2\2\u008d"+
- "\u008e\3\2\2\2\u008e\u008f\3\2\2\2\u008f\u0092\7\n\2\2\u0090\u0093\5\16"+
- "\b\2\u0091\u0093\5\22\n\2\u0092\u0090\3\2\2\2\u0092\u0091\3\2\2\2\u0093"+
- "\u00ad\3\2\2\2\u0094\u0095\7\24\2\2\u0095\u0096\7\t\2\2\u0096\u0097\5"+
- "\32\16\2\u0097\u0098\7T\2\2\u0098\u0099\7\66\2\2\u0099\u009a\5 \21\2\u009a"+
- "\u009b\7\n\2\2\u009b\u009c\5\16\b\2\u009c\u00ad\3\2\2\2\u009d\u009e\7"+
- "\24\2\2\u009e\u009f\7\t\2\2\u009f\u00a0\7T\2\2\u00a0\u00a1\7\20\2\2\u00a1"+
- "\u00a2\5 \21\2\u00a2\u00a3\7\n\2\2\u00a3\u00a4\5\16\b\2\u00a4\u00ad\3"+
- "\2\2\2\u00a5\u00a6\7\31\2\2\u00a6\u00a8\5\20\t\2\u00a7\u00a9\5\36\20\2"+
- "\u00a8\u00a7\3\2\2\2\u00a9\u00aa\3\2\2\2\u00aa\u00a8\3\2\2\2\u00aa\u00ab"+
- "\3\2\2\2\u00ab\u00ad\3\2\2\2\u00acp\3\2\2\2\u00acz\3\2\2\2\u00ac\u0082"+
- "\3\2\2\2\u00ac\u0094\3\2\2\2\u00ac\u009d\3\2\2\2\u00ac\u00a5\3\2\2\2\u00ad"+
- "\13\3\2\2\2\u00ae\u00af\7\23\2\2\u00af\u00b0\5\20\t\2\u00b0\u00b1\7\22"+
- "\2\2\u00b1\u00b2\7\t\2\2\u00b2\u00b3\5 \21\2\u00b3\u00b4\7\n\2\2\u00b4"+
- "\u00be\3\2\2\2\u00b5\u00be\5\30\r\2\u00b6\u00be\7\25\2\2\u00b7\u00be\7"+
- "\26\2\2\u00b8\u00b9\7\27\2\2\u00b9\u00be\5 \21\2\u00ba\u00bb\7\33\2\2"+
- "\u00bb\u00be\5 \21\2\u00bc\u00be\5 \21\2\u00bd\u00ae\3\2\2\2\u00bd\u00b5"+
- "\3\2\2\2\u00bd\u00b6\3\2\2\2\u00bd\u00b7\3\2\2\2\u00bd\u00b8\3\2\2\2\u00bd"+
- "\u00ba\3\2\2\2\u00bd\u00bc\3\2\2\2\u00be\r\3\2\2\2\u00bf\u00c2\5\20\t"+
- "\2\u00c0\u00c2\5\b\5\2\u00c1\u00bf\3\2\2\2\u00c1\u00c0\3\2\2\2\u00c2\17"+
- "\3\2\2\2\u00c3\u00c7\7\5\2\2\u00c4\u00c6\5\b\5\2\u00c5\u00c4\3\2\2\2\u00c6"+
- "\u00c9\3\2\2\2\u00c7\u00c5\3\2\2\2\u00c7\u00c8\3\2\2\2\u00c8\u00cb\3\2"+
- "\2\2\u00c9\u00c7\3\2\2\2\u00ca\u00cc\5\f\7\2\u00cb\u00ca\3\2\2\2\u00cb"+
- "\u00cc\3\2\2\2\u00cc\u00cd\3\2\2\2\u00cd\u00ce\7\6\2\2\u00ce\21\3\2\2"+
- "\2\u00cf\u00d0\7\16\2\2\u00d0\23\3\2\2\2\u00d1\u00d4\5\30\r\2\u00d2\u00d4"+
- "\5 \21\2\u00d3\u00d1\3\2\2\2\u00d3\u00d2\3\2\2\2\u00d4\25\3\2\2\2\u00d5"+
- "\u00d6\5 \21\2\u00d6\27\3\2\2\2\u00d7\u00d8\5\32\16\2\u00d8\u00dd\5\34"+
- "\17\2\u00d9\u00da\7\r\2\2\u00da\u00dc\5\34\17\2\u00db\u00d9\3\2\2\2\u00dc"+
- "\u00df\3\2\2\2\u00dd\u00db\3\2\2\2\u00dd\u00de\3\2\2\2\u00de\31\3\2\2"+
- "\2\u00df\u00dd\3\2\2\2\u00e0\u00e5\7S\2\2\u00e1\u00e2\7\7\2\2\u00e2\u00e4"+
- "\7\b\2\2\u00e3\u00e1\3\2\2\2\u00e4\u00e7\3\2\2\2\u00e5\u00e3\3\2\2\2\u00e5"+
- "\u00e6\3\2\2\2\u00e6\33\3\2\2\2\u00e7\u00e5\3\2\2\2\u00e8\u00eb\7T\2\2"+
- "\u00e9\u00ea\7>\2\2\u00ea\u00ec\5 \21\2\u00eb\u00e9\3\2\2\2\u00eb\u00ec"+
- "\3\2\2\2\u00ec\35\3\2\2\2\u00ed\u00ee\7\32\2\2\u00ee\u00ef\7\t\2\2\u00ef"+
- "\u00f0\7S\2\2\u00f0\u00f1\7T\2\2\u00f1\u00f2\7\n\2\2\u00f2\u00f3\5\20"+
- "\t\2\u00f3\37\3\2\2\2\u00f4\u00f5\b\21\1\2\u00f5\u00f6\5\"\22\2\u00f6"+
- "\u0129\3\2\2\2\u00f7\u00f8\f\21\2\2\u00f8\u00f9\t\2\2\2\u00f9\u0128\5"+
- " \21\22\u00fa\u00fb\f\20\2\2\u00fb\u00fc\t\3\2\2\u00fc\u0128\5 \21\21"+
- "\u00fd\u00fe\f\17\2\2\u00fe\u00ff\t\4\2\2\u00ff\u0128\5 \21\20\u0100\u0101"+
- "\f\16\2\2\u0101\u0102\t\5\2\2\u0102\u0128\5 \21\17\u0103\u0104\f\r\2\2"+
- "\u0104\u0105\t\6\2\2\u0105\u0128\5 \21\16\u0106\u0107\f\13\2\2\u0107\u0108"+
- "\t\7\2\2\u0108\u0128\5 \21\f\u0109\u010a\f\n\2\2\u010a\u010b\7\60\2\2"+
- "\u010b\u0128\5 \21\13\u010c\u010d\f\t\2\2\u010d\u010e\7\61\2\2\u010e\u0128"+
- "\5 \21\n\u010f\u0110\f\b\2\2\u0110\u0111\7\62\2\2\u0111\u0128\5 \21\t"+
- "\u0112\u0113\f\7\2\2\u0113\u0114\7\63\2\2\u0114\u0128\5 \21\b\u0115\u0116"+
- "\f\6\2\2\u0116\u0117\7\64\2\2\u0117\u0128\5 \21\7\u0118\u0119\f\5\2\2"+
- "\u0119\u011a\7\65\2\2\u011a\u011b\5 \21\2\u011b\u011c\7\66\2\2\u011c\u011d"+
- "\5 \21\5\u011d\u0128\3\2\2\2\u011e\u011f\f\4\2\2\u011f\u0120\7\67\2\2"+
- "\u0120\u0128\5 \21\4\u0121\u0122\f\3\2\2\u0122\u0123\t\b\2\2\u0123\u0128"+
- "\5 \21\3\u0124\u0125\f\f\2\2\u0125\u0126\7\35\2\2\u0126\u0128\5\32\16"+
- "\2\u0127\u00f7\3\2\2\2\u0127\u00fa\3\2\2\2\u0127\u00fd\3\2\2\2\u0127\u0100"+
- "\3\2\2\2\u0127\u0103\3\2\2\2\u0127\u0106\3\2\2\2\u0127\u0109\3\2\2\2\u0127"+
- "\u010c\3\2\2\2\u0127\u010f\3\2\2\2\u0127\u0112\3\2\2\2\u0127\u0115\3\2"+
- "\2\2\u0127\u0118\3\2\2\2\u0127\u011e\3\2\2\2\u0127\u0121\3\2\2\2\u0127"+
- "\u0124\3\2\2\2\u0128\u012b\3\2\2\2\u0129\u0127\3\2\2\2\u0129\u012a\3\2"+
- "\2\2\u012a!\3\2\2\2\u012b\u0129\3\2\2\2\u012c\u012d\t\t\2\2\u012d\u013a"+
- "\5$\23\2\u012e\u012f\5$\23\2\u012f\u0130\t\t\2\2\u0130\u013a\3\2\2\2\u0131"+
- "\u013a\5$\23\2\u0132\u0133\t\n\2\2\u0133\u013a\5\"\22\2\u0134\u0135\7"+
- "\t\2\2\u0135\u0136\5\32\16\2\u0136\u0137\7\n\2\2\u0137\u0138\5\"\22\2"+
- "\u0138\u013a\3\2\2\2\u0139\u012c\3\2\2\2\u0139\u012e\3\2\2\2\u0139\u0131"+
- "\3\2\2\2\u0139\u0132\3\2\2\2\u0139\u0134\3\2\2\2\u013a#\3\2\2\2\u013b"+
- "\u013f\5&\24\2\u013c\u013e\5(\25\2\u013d\u013c\3\2\2\2\u013e\u0141\3\2"+
- "\2\2\u013f\u013d\3\2\2\2\u013f\u0140\3\2\2\2\u0140\u014c\3\2\2\2\u0141"+
- "\u013f\3\2\2\2\u0142\u0143\5\32\16\2\u0143\u0147\5*\26\2\u0144\u0146\5"+
- "(\25\2\u0145\u0144\3\2\2\2\u0146\u0149\3\2\2\2\u0147\u0145\3\2\2\2\u0147"+
- "\u0148\3\2\2\2\u0148\u014c\3\2\2\2\u0149\u0147\3\2\2\2\u014a\u014c\5\62"+
- "\32\2\u014b\u013b\3\2\2\2\u014b\u0142\3\2\2\2\u014b\u014a\3\2\2\2\u014c"+
- "%\3\2\2\2\u014d\u014e\7\t\2\2\u014e\u014f\5 \21\2\u014f\u0150\7\n\2\2"+
- "\u0150\u0160\3\2\2\2\u0151\u0160\t\13\2\2\u0152\u0160\7P\2\2\u0153\u0160"+
- "\7Q\2\2\u0154\u0160\7R\2\2\u0155\u0160\7N\2\2\u0156\u0160\7O\2\2\u0157"+
- "\u0160\5\64\33\2\u0158\u0160\5\66\34\2\u0159\u0160\7T\2\2\u015a\u015b"+
- "\7T\2\2\u015b\u0160\5:\36\2\u015c\u015d\7\30\2\2\u015d\u015e\7S\2\2\u015e"+
- "\u0160\5:\36\2\u015f\u014d\3\2\2\2\u015f\u0151\3\2\2\2\u015f\u0152\3\2"+
- "\2\2\u015f\u0153\3\2\2\2\u015f\u0154\3\2\2\2\u015f\u0155\3\2\2\2\u015f"+
- "\u0156\3\2\2\2\u015f\u0157\3\2\2\2\u015f\u0158\3\2\2\2\u015f\u0159\3\2"+
- "\2\2\u015f\u015a\3\2\2\2\u015f\u015c\3\2\2\2\u0160\'\3\2\2\2\u0161\u0165"+
- "\5,\27\2\u0162\u0165\5.\30\2\u0163\u0165\5\60\31\2\u0164\u0161\3\2\2\2"+
- "\u0164\u0162\3\2\2\2\u0164\u0163\3\2\2\2\u0165)\3\2\2\2\u0166\u0169\5"+
- ",\27\2\u0167\u0169\5.\30\2\u0168\u0166\3\2\2\2\u0168\u0167\3\2\2\2\u0169"+
- "+\3\2\2\2\u016a\u016b\t\f\2\2\u016b\u016c\7V\2\2\u016c\u016d\5:\36\2\u016d"+
- "-\3\2\2\2\u016e\u016f\t\f\2\2\u016f\u0170\t\r\2\2\u0170/\3\2\2\2\u0171"+
- "\u0172\7\7\2\2\u0172\u0173\5 \21\2\u0173\u0174\7\b\2\2\u0174\61\3\2\2"+
- "\2\u0175\u0176\7\30\2\2\u0176\u017b\7S\2\2\u0177\u0178\7\7\2\2\u0178\u0179"+
- "\5 \21\2\u0179\u017a\7\b\2\2\u017a\u017c\3\2\2\2\u017b\u0177\3\2\2\2\u017c"+
- "\u017d\3\2\2\2\u017d\u017b\3\2\2\2\u017d\u017e\3\2\2\2\u017e\u0186\3\2"+
- "\2\2\u017f\u0183\5*\26\2\u0180\u0182\5(\25\2\u0181\u0180\3\2\2\2\u0182"+
- "\u0185\3\2\2\2\u0183\u0181\3\2\2\2\u0183\u0184\3\2\2\2\u0184\u0187\3\2"+
- "\2\2\u0185\u0183\3\2\2\2\u0186\u017f\3\2\2\2\u0186\u0187\3\2\2\2\u0187"+
- "\u019f\3\2\2\2\u0188\u0189\7\30\2\2\u0189\u018a\7S\2\2\u018a\u018b\7\7"+
- "\2\2\u018b\u018c\7\b\2\2\u018c\u0195\7\5\2\2\u018d\u0192\5 \21\2\u018e"+
- "\u018f\7\r\2\2\u018f\u0191\5 \21\2\u0190\u018e\3\2\2\2\u0191\u0194\3\2"+
- "\2\2\u0192\u0190\3\2\2\2\u0192\u0193\3\2\2\2\u0193\u0196\3\2\2\2\u0194"+
- "\u0192\3\2\2\2\u0195\u018d\3\2\2\2\u0195\u0196\3\2\2\2\u0196\u0197\3\2"+
- "\2\2\u0197\u019b\7\6\2\2\u0198\u019a\5(\25\2\u0199\u0198\3\2\2\2\u019a"+
- "\u019d\3\2\2\2\u019b\u0199\3\2\2\2\u019b\u019c\3\2\2\2\u019c\u019f\3\2"+
- "\2\2\u019d\u019b\3\2\2\2\u019e\u0175\3\2\2\2\u019e\u0188\3\2\2\2\u019f"+
- "\63\3\2\2\2\u01a0\u01a1\7\7\2\2\u01a1\u01a6\5 \21\2\u01a2\u01a3\7\r\2"+
- "\2\u01a3\u01a5\5 \21\2\u01a4\u01a2\3\2\2\2\u01a5\u01a8\3\2\2\2\u01a6\u01a4"+
- "\3\2\2\2\u01a6\u01a7\3\2\2\2\u01a7\u01a9\3\2\2\2\u01a8\u01a6\3\2\2\2\u01a9"+
- "\u01aa\7\b\2\2\u01aa\u01ae\3\2\2\2\u01ab\u01ac\7\7\2\2\u01ac\u01ae\7\b"+
- "\2\2\u01ad\u01a0\3\2\2\2\u01ad\u01ab\3\2\2\2\u01ae\65\3\2\2\2\u01af\u01b0"+
- "\7\7\2\2\u01b0\u01b5\58\35\2\u01b1\u01b2\7\r\2\2\u01b2\u01b4\58\35\2\u01b3"+
- "\u01b1\3\2\2\2\u01b4\u01b7\3\2\2\2\u01b5\u01b3\3\2\2\2\u01b5\u01b6\3\2"+
- "\2\2\u01b6\u01b8\3\2\2\2\u01b7\u01b5\3\2\2\2\u01b8\u01b9\7\b\2\2\u01b9"+
- "\u01be\3\2\2\2\u01ba\u01bb\7\7\2\2\u01bb\u01bc\7\66\2\2\u01bc\u01be\7"+
- "\b\2\2\u01bd\u01af\3\2\2\2\u01bd\u01ba\3\2\2\2\u01be\67\3\2\2\2\u01bf"+
- "\u01c0\5 \21\2\u01c0\u01c1\7\66\2\2\u01c1\u01c2\5 \21\2\u01c29\3\2\2\2"+
- "\u01c3\u01cc\7\t\2\2\u01c4\u01c9\5<\37\2\u01c5\u01c6\7\r\2\2\u01c6\u01c8"+
- "\5<\37\2\u01c7\u01c5\3\2\2\2\u01c8\u01cb\3\2\2\2\u01c9\u01c7\3\2\2\2\u01c9"+
- "\u01ca\3\2\2\2\u01ca\u01cd\3\2\2\2\u01cb\u01c9\3\2\2\2\u01cc\u01c4\3\2"+
- "\2\2\u01cc\u01cd\3\2\2\2\u01cd\u01ce\3\2\2\2\u01ce\u01cf\7\n\2\2\u01cf"+
- ";\3\2\2\2\u01d0\u01d4\5 \21\2\u01d1\u01d4\5> \2\u01d2\u01d4\5B\"\2\u01d3"+
- "\u01d0\3\2\2\2\u01d3\u01d1\3\2\2\2\u01d3\u01d2\3\2\2\2\u01d4=\3\2\2\2"+
- "\u01d5\u01e3\5@!\2\u01d6\u01df\7\t\2\2\u01d7\u01dc\5@!\2\u01d8\u01d9\7"+
- "\r\2\2\u01d9\u01db\5@!\2\u01da\u01d8\3\2\2\2\u01db\u01de\3\2\2\2\u01dc"+
- "\u01da\3\2\2\2\u01dc\u01dd\3\2\2\2\u01dd\u01e0\3\2\2\2\u01de\u01dc\3\2"+
- "\2\2\u01df\u01d7\3\2\2\2\u01df\u01e0\3\2\2\2\u01e0\u01e1\3\2\2\2\u01e1"+
- "\u01e3\7\n\2\2\u01e2\u01d5\3\2\2\2\u01e2\u01d6\3\2\2\2\u01e3\u01e4\3\2"+
- "\2\2\u01e4\u01e7\79\2\2\u01e5\u01e8\5\20\t\2\u01e6\u01e8\5 \21\2\u01e7"+
- "\u01e5\3\2\2\2\u01e7\u01e6\3\2\2\2\u01e8?\3\2\2\2\u01e9\u01eb\5\32\16"+
- "\2\u01ea\u01e9\3\2\2\2\u01ea\u01eb\3\2\2\2\u01eb\u01ec\3\2\2\2\u01ec\u01ed"+
- "\7T\2\2\u01edA\3\2\2\2\u01ee\u01ef\7S\2\2\u01ef\u01f0\78\2\2\u01f0\u01fc"+
- "\7T\2\2\u01f1\u01f2\5\32\16\2\u01f2\u01f3\78\2\2\u01f3\u01f4\7\30\2\2"+
- "\u01f4\u01fc\3\2\2\2\u01f5\u01f6\7T\2\2\u01f6\u01f7\78\2\2\u01f7\u01fc"+
- "\7T\2\2\u01f8\u01f9\7\34\2\2\u01f9\u01fa\78\2\2\u01fa\u01fc\7T\2\2\u01fb"+
- "\u01ee\3\2\2\2\u01fb\u01f1\3\2\2\2\u01fb\u01f5\3\2\2\2\u01fb\u01f8\3\2"+
- "\2\2\u01fcC\3\2\2\2\65GMQcfnx\u0080\u0085\u0089\u008d\u0092\u00aa\u00ac"+
- "\u00bd\u00c1\u00c7\u00cb\u00d3\u00dd\u00e5\u00eb\u0127\u0129\u0139\u013f"+
- "\u0147\u014b\u015f\u0164\u0168\u017d\u0183\u0186\u0192\u0195\u019b\u019e"+
- "\u01a6\u01ad\u01b5\u01bd\u01c9\u01cc\u01d3\u01dc\u01df\u01e2\u01e7\u01ea"+
- "\u01fb";
+ "\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\7\21"+
+ "\u0125\n\21\f\21\16\21\u0128\13\21\3\22\3\22\3\22\3\22\3\22\3\22\3\22"+
+ "\3\22\3\22\3\22\3\22\3\22\3\22\5\22\u0137\n\22\3\23\3\23\7\23\u013b\n"+
+ "\23\f\23\16\23\u013e\13\23\3\23\3\23\3\23\7\23\u0143\n\23\f\23\16\23\u0146"+
+ "\13\23\3\23\5\23\u0149\n\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3"+
+ "\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\5\24\u015d\n\24\3\25"+
+ "\3\25\3\25\5\25\u0162\n\25\3\26\3\26\5\26\u0166\n\26\3\27\3\27\3\27\3"+
+ "\27\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\6"+
+ "\32\u0179\n\32\r\32\16\32\u017a\3\32\3\32\7\32\u017f\n\32\f\32\16\32\u0182"+
+ "\13\32\5\32\u0184\n\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\7\32\u018e"+
+ "\n\32\f\32\16\32\u0191\13\32\5\32\u0193\n\32\3\32\3\32\7\32\u0197\n\32"+
+ "\f\32\16\32\u019a\13\32\5\32\u019c\n\32\3\33\3\33\3\33\3\33\7\33\u01a2"+
+ "\n\33\f\33\16\33\u01a5\13\33\3\33\3\33\3\33\3\33\5\33\u01ab\n\33\3\34"+
+ "\3\34\3\34\3\34\7\34\u01b1\n\34\f\34\16\34\u01b4\13\34\3\34\3\34\3\34"+
+ "\3\34\3\34\5\34\u01bb\n\34\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\7\36"+
+ "\u01c5\n\36\f\36\16\36\u01c8\13\36\5\36\u01ca\n\36\3\36\3\36\3\37\3\37"+
+ "\3\37\5\37\u01d1\n\37\3 \3 \3 \3 \3 \7 \u01d8\n \f \16 \u01db\13 \5 \u01dd"+
+ "\n \3 \5 \u01e0\n \3 \3 \3 \5 \u01e5\n \3!\5!\u01e8\n!\3!\3!\3\"\3\"\3"+
+ "\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\5\"\u01f9\n\"\3\"\2\3 #\2\4"+
+ "\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@B\2\17\3"+
+ "\3\16\16\3\2 \"\3\2#$\3\2:;\3\2%\'\3\2(+\3\2,/\3\2>I\3\2<=\4\2\36\37#"+
+ "$\3\2JM\3\2\13\f\3\2UV\u0233\2G\3\2\2\2\4R\3\2\2\2\6W\3\2\2\2\bk\3\2\2"+
+ "\2\n\u00a9\3\2\2\2\f\u00ba\3\2\2\2\16\u00be\3\2\2\2\20\u00c0\3\2\2\2\22"+
+ "\u00cc\3\2\2\2\24\u00d0\3\2\2\2\26\u00d2\3\2\2\2\30\u00d4\3\2\2\2\32\u00dd"+
+ "\3\2\2\2\34\u00e5\3\2\2\2\36\u00ea\3\2\2\2 \u00f1\3\2\2\2\"\u0136\3\2"+
+ "\2\2$\u0148\3\2\2\2&\u015c\3\2\2\2(\u0161\3\2\2\2*\u0165\3\2\2\2,\u0167"+
+ "\3\2\2\2.\u016b\3\2\2\2\60\u016e\3\2\2\2\62\u019b\3\2\2\2\64\u01aa\3\2"+
+ "\2\2\66\u01ba\3\2\2\28\u01bc\3\2\2\2:\u01c0\3\2\2\2<\u01d0\3\2\2\2>\u01df"+
+ "\3\2\2\2@\u01e7\3\2\2\2B\u01f8\3\2\2\2DF\5\4\3\2ED\3\2\2\2FI\3\2\2\2G"+
+ "E\3\2\2\2GH\3\2\2\2HM\3\2\2\2IG\3\2\2\2JL\5\b\5\2KJ\3\2\2\2LO\3\2\2\2"+
+ "MK\3\2\2\2MN\3\2\2\2NP\3\2\2\2OM\3\2\2\2PQ\7\2\2\3Q\3\3\2\2\2RS\5\32\16"+
+ "\2ST\7T\2\2TU\5\6\4\2UV\5\20\t\2V\5\3\2\2\2Wc\7\t\2\2XY\5\32\16\2Y`\7"+
+ "T\2\2Z[\7\r\2\2[\\\5\32\16\2\\]\7T\2\2]_\3\2\2\2^Z\3\2\2\2_b\3\2\2\2`"+
+ "^\3\2\2\2`a\3\2\2\2ad\3\2\2\2b`\3\2\2\2cX\3\2\2\2cd\3\2\2\2de\3\2\2\2"+
+ "ef\7\n\2\2f\7\3\2\2\2gl\5\n\6\2hi\5\f\7\2ij\t\2\2\2jl\3\2\2\2kg\3\2\2"+
+ "\2kh\3\2\2\2l\t\3\2\2\2mn\7\17\2\2no\7\t\2\2op\5 \21\2pq\7\n\2\2qu\5\16"+
+ "\b\2rs\7\21\2\2sv\5\16\b\2tv\6\6\2\2ur\3\2\2\2ut\3\2\2\2v\u00aa\3\2\2"+
+ "\2wx\7\22\2\2xy\7\t\2\2yz\5 \21\2z}\7\n\2\2{~\5\16\b\2|~\5\22\n\2}{\3"+
+ "\2\2\2}|\3\2\2\2~\u00aa\3\2\2\2\177\u0080\7\24\2\2\u0080\u0082\7\t\2\2"+
+ "\u0081\u0083\5\24\13\2\u0082\u0081\3\2\2\2\u0082\u0083\3\2\2\2\u0083\u0084"+
+ "\3\2\2\2\u0084\u0086\7\16\2\2\u0085\u0087\5 \21\2\u0086\u0085\3\2\2\2"+
+ "\u0086\u0087\3\2\2\2\u0087\u0088\3\2\2\2\u0088\u008a\7\16\2\2\u0089\u008b"+
+ "\5\26\f\2\u008a\u0089\3\2\2\2\u008a\u008b\3\2\2\2\u008b\u008c\3\2\2\2"+
+ "\u008c\u008f\7\n\2\2\u008d\u0090\5\16\b\2\u008e\u0090\5\22\n\2\u008f\u008d"+
+ "\3\2\2\2\u008f\u008e\3\2\2\2\u0090\u00aa\3\2\2\2\u0091\u0092\7\24\2\2"+
+ "\u0092\u0093\7\t\2\2\u0093\u0094\5\32\16\2\u0094\u0095\7T\2\2\u0095\u0096"+
+ "\7\66\2\2\u0096\u0097\5 \21\2\u0097\u0098\7\n\2\2\u0098\u0099\5\16\b\2"+
+ "\u0099\u00aa\3\2\2\2\u009a\u009b\7\24\2\2\u009b\u009c\7\t\2\2\u009c\u009d"+
+ "\7T\2\2\u009d\u009e\7\20\2\2\u009e\u009f\5 \21\2\u009f\u00a0\7\n\2\2\u00a0"+
+ "\u00a1\5\16\b\2\u00a1\u00aa\3\2\2\2\u00a2\u00a3\7\31\2\2\u00a3\u00a5\5"+
+ "\20\t\2\u00a4\u00a6\5\36\20\2\u00a5\u00a4\3\2\2\2\u00a6\u00a7\3\2\2\2"+
+ "\u00a7\u00a5\3\2\2\2\u00a7\u00a8\3\2\2\2\u00a8\u00aa\3\2\2\2\u00a9m\3"+
+ "\2\2\2\u00a9w\3\2\2\2\u00a9\177\3\2\2\2\u00a9\u0091\3\2\2\2\u00a9\u009a"+
+ "\3\2\2\2\u00a9\u00a2\3\2\2\2\u00aa\13\3\2\2\2\u00ab\u00ac\7\23\2\2\u00ac"+
+ "\u00ad\5\20\t\2\u00ad\u00ae\7\22\2\2\u00ae\u00af\7\t\2\2\u00af\u00b0\5"+
+ " \21\2\u00b0\u00b1\7\n\2\2\u00b1\u00bb\3\2\2\2\u00b2\u00bb\5\30\r\2\u00b3"+
+ "\u00bb\7\25\2\2\u00b4\u00bb\7\26\2\2\u00b5\u00b6\7\27\2\2\u00b6\u00bb"+
+ "\5 \21\2\u00b7\u00b8\7\33\2\2\u00b8\u00bb\5 \21\2\u00b9\u00bb\5 \21\2"+
+ "\u00ba\u00ab\3\2\2\2\u00ba\u00b2\3\2\2\2\u00ba\u00b3\3\2\2\2\u00ba\u00b4"+
+ "\3\2\2\2\u00ba\u00b5\3\2\2\2\u00ba\u00b7\3\2\2\2\u00ba\u00b9\3\2\2\2\u00bb"+
+ "\r\3\2\2\2\u00bc\u00bf\5\20\t\2\u00bd\u00bf\5\b\5\2\u00be\u00bc\3\2\2"+
+ "\2\u00be\u00bd\3\2\2\2\u00bf\17\3\2\2\2\u00c0\u00c4\7\5\2\2\u00c1\u00c3"+
+ "\5\b\5\2\u00c2\u00c1\3\2\2\2\u00c3\u00c6\3\2\2\2\u00c4\u00c2\3\2\2\2\u00c4"+
+ "\u00c5\3\2\2\2\u00c5\u00c8\3\2\2\2\u00c6\u00c4\3\2\2\2\u00c7\u00c9\5\f"+
+ "\7\2\u00c8\u00c7\3\2\2\2\u00c8\u00c9\3\2\2\2\u00c9\u00ca\3\2\2\2\u00ca"+
+ "\u00cb\7\6\2\2\u00cb\21\3\2\2\2\u00cc\u00cd\7\16\2\2\u00cd\23\3\2\2\2"+
+ "\u00ce\u00d1\5\30\r\2\u00cf\u00d1\5 \21\2\u00d0\u00ce\3\2\2\2\u00d0\u00cf"+
+ "\3\2\2\2\u00d1\25\3\2\2\2\u00d2\u00d3\5 \21\2\u00d3\27\3\2\2\2\u00d4\u00d5"+
+ "\5\32\16\2\u00d5\u00da\5\34\17\2\u00d6\u00d7\7\r\2\2\u00d7\u00d9\5\34"+
+ "\17\2\u00d8\u00d6\3\2\2\2\u00d9\u00dc\3\2\2\2\u00da\u00d8\3\2\2\2\u00da"+
+ "\u00db\3\2\2\2\u00db\31\3\2\2\2\u00dc\u00da\3\2\2\2\u00dd\u00e2\7S\2\2"+
+ "\u00de\u00df\7\7\2\2\u00df\u00e1\7\b\2\2\u00e0\u00de\3\2\2\2\u00e1\u00e4"+
+ "\3\2\2\2\u00e2\u00e0\3\2\2\2\u00e2\u00e3\3\2\2\2\u00e3\33\3\2\2\2\u00e4"+
+ "\u00e2\3\2\2\2\u00e5\u00e8\7T\2\2\u00e6\u00e7\7>\2\2\u00e7\u00e9\5 \21"+
+ "\2\u00e8\u00e6\3\2\2\2\u00e8\u00e9\3\2\2\2\u00e9\35\3\2\2\2\u00ea\u00eb"+
+ "\7\32\2\2\u00eb\u00ec\7\t\2\2\u00ec\u00ed\7S\2\2\u00ed\u00ee\7T\2\2\u00ee"+
+ "\u00ef\7\n\2\2\u00ef\u00f0\5\20\t\2\u00f0\37\3\2\2\2\u00f1\u00f2\b\21"+
+ "\1\2\u00f2\u00f3\5\"\22\2\u00f3\u0126\3\2\2\2\u00f4\u00f5\f\21\2\2\u00f5"+
+ "\u00f6\t\3\2\2\u00f6\u0125\5 \21\22\u00f7\u00f8\f\20\2\2\u00f8\u00f9\t"+
+ "\4\2\2\u00f9\u0125\5 \21\21\u00fa\u00fb\f\17\2\2\u00fb\u00fc\t\5\2\2\u00fc"+
+ "\u0125\5 \21\20\u00fd\u00fe\f\16\2\2\u00fe\u00ff\t\6\2\2\u00ff\u0125\5"+
+ " \21\17\u0100\u0101\f\r\2\2\u0101\u0102\t\7\2\2\u0102\u0125\5 \21\16\u0103"+
+ "\u0104\f\13\2\2\u0104\u0105\t\b\2\2\u0105\u0125\5 \21\f\u0106\u0107\f"+
+ "\n\2\2\u0107\u0108\7\60\2\2\u0108\u0125\5 \21\13\u0109\u010a\f\t\2\2\u010a"+
+ "\u010b\7\61\2\2\u010b\u0125\5 \21\n\u010c\u010d\f\b\2\2\u010d\u010e\7"+
+ "\62\2\2\u010e\u0125\5 \21\t\u010f\u0110\f\7\2\2\u0110\u0111\7\63\2\2\u0111"+
+ "\u0125\5 \21\b\u0112\u0113\f\6\2\2\u0113\u0114\7\64\2\2\u0114\u0125\5"+
+ " \21\7\u0115\u0116\f\5\2\2\u0116\u0117\7\65\2\2\u0117\u0118\5 \21\2\u0118"+
+ "\u0119\7\66\2\2\u0119\u011a\5 \21\5\u011a\u0125\3\2\2\2\u011b\u011c\f"+
+ "\4\2\2\u011c\u011d\7\67\2\2\u011d\u0125\5 \21\4\u011e\u011f\f\3\2\2\u011f"+
+ "\u0120\t\t\2\2\u0120\u0125\5 \21\3\u0121\u0122\f\f\2\2\u0122\u0123\7\35"+
+ "\2\2\u0123\u0125\5\32\16\2\u0124\u00f4\3\2\2\2\u0124\u00f7\3\2\2\2\u0124"+
+ "\u00fa\3\2\2\2\u0124\u00fd\3\2\2\2\u0124\u0100\3\2\2\2\u0124\u0103\3\2"+
+ "\2\2\u0124\u0106\3\2\2\2\u0124\u0109\3\2\2\2\u0124\u010c\3\2\2\2\u0124"+
+ "\u010f\3\2\2\2\u0124\u0112\3\2\2\2\u0124\u0115\3\2\2\2\u0124\u011b\3\2"+
+ "\2\2\u0124\u011e\3\2\2\2\u0124\u0121\3\2\2\2\u0125\u0128\3\2\2\2\u0126"+
+ "\u0124\3\2\2\2\u0126\u0127\3\2\2\2\u0127!\3\2\2\2\u0128\u0126\3\2\2\2"+
+ "\u0129\u012a\t\n\2\2\u012a\u0137\5$\23\2\u012b\u012c\5$\23\2\u012c\u012d"+
+ "\t\n\2\2\u012d\u0137\3\2\2\2\u012e\u0137\5$\23\2\u012f\u0130\t\13\2\2"+
+ "\u0130\u0137\5\"\22\2\u0131\u0132\7\t\2\2\u0132\u0133\5\32\16\2\u0133"+
+ "\u0134\7\n\2\2\u0134\u0135\5\"\22\2\u0135\u0137\3\2\2\2\u0136\u0129\3"+
+ "\2\2\2\u0136\u012b\3\2\2\2\u0136\u012e\3\2\2\2\u0136\u012f\3\2\2\2\u0136"+
+ "\u0131\3\2\2\2\u0137#\3\2\2\2\u0138\u013c\5&\24\2\u0139\u013b\5(\25\2"+
+ "\u013a\u0139\3\2\2\2\u013b\u013e\3\2\2\2\u013c\u013a\3\2\2\2\u013c\u013d"+
+ "\3\2\2\2\u013d\u0149\3\2\2\2\u013e\u013c\3\2\2\2\u013f\u0140\5\32\16\2"+
+ "\u0140\u0144\5*\26\2\u0141\u0143\5(\25\2\u0142\u0141\3\2\2\2\u0143\u0146"+
+ "\3\2\2\2\u0144\u0142\3\2\2\2\u0144\u0145\3\2\2\2\u0145\u0149\3\2\2\2\u0146"+
+ "\u0144\3\2\2\2\u0147\u0149\5\62\32\2\u0148\u0138\3\2\2\2\u0148\u013f\3"+
+ "\2\2\2\u0148\u0147\3\2\2\2\u0149%\3\2\2\2\u014a\u014b\7\t\2\2\u014b\u014c"+
+ "\5 \21\2\u014c\u014d\7\n\2\2\u014d\u015d\3\2\2\2\u014e\u015d\t\f\2\2\u014f"+
+ "\u015d\7P\2\2\u0150\u015d\7Q\2\2\u0151\u015d\7R\2\2\u0152\u015d\7N\2\2"+
+ "\u0153\u015d\7O\2\2\u0154\u015d\5\64\33\2\u0155\u015d\5\66\34\2\u0156"+
+ "\u015d\7T\2\2\u0157\u0158\7T\2\2\u0158\u015d\5:\36\2\u0159\u015a\7\30"+
+ "\2\2\u015a\u015b\7S\2\2\u015b\u015d\5:\36\2\u015c\u014a\3\2\2\2\u015c"+
+ "\u014e\3\2\2\2\u015c\u014f\3\2\2\2\u015c\u0150\3\2\2\2\u015c\u0151\3\2"+
+ "\2\2\u015c\u0152\3\2\2\2\u015c\u0153\3\2\2\2\u015c\u0154\3\2\2\2\u015c"+
+ "\u0155\3\2\2\2\u015c\u0156\3\2\2\2\u015c\u0157\3\2\2\2\u015c\u0159\3\2"+
+ "\2\2\u015d\'\3\2\2\2\u015e\u0162\5,\27\2\u015f\u0162\5.\30\2\u0160\u0162"+
+ "\5\60\31\2\u0161\u015e\3\2\2\2\u0161\u015f\3\2\2\2\u0161\u0160\3\2\2\2"+
+ "\u0162)\3\2\2\2\u0163\u0166\5,\27\2\u0164\u0166\5.\30\2\u0165\u0163\3"+
+ "\2\2\2\u0165\u0164\3\2\2\2\u0166+\3\2\2\2\u0167\u0168\t\r\2\2\u0168\u0169"+
+ "\7V\2\2\u0169\u016a\5:\36\2\u016a-\3\2\2\2\u016b\u016c\t\r\2\2\u016c\u016d"+
+ "\t\16\2\2\u016d/\3\2\2\2\u016e\u016f\7\7\2\2\u016f\u0170\5 \21\2\u0170"+
+ "\u0171\7\b\2\2\u0171\61\3\2\2\2\u0172\u0173\7\30\2\2\u0173\u0178\7S\2"+
+ "\2\u0174\u0175\7\7\2\2\u0175\u0176\5 \21\2\u0176\u0177\7\b\2\2\u0177\u0179"+
+ "\3\2\2\2\u0178\u0174\3\2\2\2\u0179\u017a\3\2\2\2\u017a\u0178\3\2\2\2\u017a"+
+ "\u017b\3\2\2\2\u017b\u0183\3\2\2\2\u017c\u0180\5*\26\2\u017d\u017f\5("+
+ "\25\2\u017e\u017d\3\2\2\2\u017f\u0182\3\2\2\2\u0180\u017e\3\2\2\2\u0180"+
+ "\u0181\3\2\2\2\u0181\u0184\3\2\2\2\u0182\u0180\3\2\2\2\u0183\u017c\3\2"+
+ "\2\2\u0183\u0184\3\2\2\2\u0184\u019c\3\2\2\2\u0185\u0186\7\30\2\2\u0186"+
+ "\u0187\7S\2\2\u0187\u0188\7\7\2\2\u0188\u0189\7\b\2\2\u0189\u0192\7\5"+
+ "\2\2\u018a\u018f\5 \21\2\u018b\u018c\7\r\2\2\u018c\u018e\5 \21\2\u018d"+
+ "\u018b\3\2\2\2\u018e\u0191\3\2\2\2\u018f\u018d\3\2\2\2\u018f\u0190\3\2"+
+ "\2\2\u0190\u0193\3\2\2\2\u0191\u018f\3\2\2\2\u0192\u018a\3\2\2\2\u0192"+
+ "\u0193\3\2\2\2\u0193\u0194\3\2\2\2\u0194\u0198\7\6\2\2\u0195\u0197\5("+
+ "\25\2\u0196\u0195\3\2\2\2\u0197\u019a\3\2\2\2\u0198\u0196\3\2\2\2\u0198"+
+ "\u0199\3\2\2\2\u0199\u019c\3\2\2\2\u019a\u0198\3\2\2\2\u019b\u0172\3\2"+
+ "\2\2\u019b\u0185\3\2\2\2\u019c\63\3\2\2\2\u019d\u019e\7\7\2\2\u019e\u01a3"+
+ "\5 \21\2\u019f\u01a0\7\r\2\2\u01a0\u01a2\5 \21\2\u01a1\u019f\3\2\2\2\u01a2"+
+ "\u01a5\3\2\2\2\u01a3\u01a1\3\2\2\2\u01a3\u01a4\3\2\2\2\u01a4\u01a6\3\2"+
+ "\2\2\u01a5\u01a3\3\2\2\2\u01a6\u01a7\7\b\2\2\u01a7\u01ab\3\2\2\2\u01a8"+
+ "\u01a9\7\7\2\2\u01a9\u01ab\7\b\2\2\u01aa\u019d\3\2\2\2\u01aa\u01a8\3\2"+
+ "\2\2\u01ab\65\3\2\2\2\u01ac\u01ad\7\7\2\2\u01ad\u01b2\58\35\2\u01ae\u01af"+
+ "\7\r\2\2\u01af\u01b1\58\35\2\u01b0\u01ae\3\2\2\2\u01b1\u01b4\3\2\2\2\u01b2"+
+ "\u01b0\3\2\2\2\u01b2\u01b3\3\2\2\2\u01b3\u01b5\3\2\2\2\u01b4\u01b2\3\2"+
+ "\2\2\u01b5\u01b6\7\b\2\2\u01b6\u01bb\3\2\2\2\u01b7\u01b8\7\7\2\2\u01b8"+
+ "\u01b9\7\66\2\2\u01b9\u01bb\7\b\2\2\u01ba\u01ac\3\2\2\2\u01ba\u01b7\3"+
+ "\2\2\2\u01bb\67\3\2\2\2\u01bc\u01bd\5 \21\2\u01bd\u01be\7\66\2\2\u01be"+
+ "\u01bf\5 \21\2\u01bf9\3\2\2\2\u01c0\u01c9\7\t\2\2\u01c1\u01c6\5<\37\2"+
+ "\u01c2\u01c3\7\r\2\2\u01c3\u01c5\5<\37\2\u01c4\u01c2\3\2\2\2\u01c5\u01c8"+
+ "\3\2\2\2\u01c6\u01c4\3\2\2\2\u01c6\u01c7\3\2\2\2\u01c7\u01ca\3\2\2\2\u01c8"+
+ "\u01c6\3\2\2\2\u01c9\u01c1\3\2\2\2\u01c9\u01ca\3\2\2\2\u01ca\u01cb\3\2"+
+ "\2\2\u01cb\u01cc\7\n\2\2\u01cc;\3\2\2\2\u01cd\u01d1\5 \21\2\u01ce\u01d1"+
+ "\5> \2\u01cf\u01d1\5B\"\2\u01d0\u01cd\3\2\2\2\u01d0\u01ce\3\2\2\2\u01d0"+
+ "\u01cf\3\2\2\2\u01d1=\3\2\2\2\u01d2\u01e0\5@!\2\u01d3\u01dc\7\t\2\2\u01d4"+
+ "\u01d9\5@!\2\u01d5\u01d6\7\r\2\2\u01d6\u01d8\5@!\2\u01d7\u01d5\3\2\2\2"+
+ "\u01d8\u01db\3\2\2\2\u01d9\u01d7\3\2\2\2\u01d9\u01da\3\2\2\2\u01da\u01dd"+
+ "\3\2\2\2\u01db\u01d9\3\2\2\2\u01dc\u01d4\3\2\2\2\u01dc\u01dd\3\2\2\2\u01dd"+
+ "\u01de\3\2\2\2\u01de\u01e0\7\n\2\2\u01df\u01d2\3\2\2\2\u01df\u01d3\3\2"+
+ "\2\2\u01e0\u01e1\3\2\2\2\u01e1\u01e4\79\2\2\u01e2\u01e5\5\20\t\2\u01e3"+
+ "\u01e5\5 \21\2\u01e4\u01e2\3\2\2\2\u01e4\u01e3\3\2\2\2\u01e5?\3\2\2\2"+
+ "\u01e6\u01e8\5\32\16\2\u01e7\u01e6\3\2\2\2\u01e7\u01e8\3\2\2\2\u01e8\u01e9"+
+ "\3\2\2\2\u01e9\u01ea\7T\2\2\u01eaA\3\2\2\2\u01eb\u01ec\7S\2\2\u01ec\u01ed"+
+ "\78\2\2\u01ed\u01f9\7T\2\2\u01ee\u01ef\5\32\16\2\u01ef\u01f0\78\2\2\u01f0"+
+ "\u01f1\7\30\2\2\u01f1\u01f9\3\2\2\2\u01f2\u01f3\7T\2\2\u01f3\u01f4\78"+
+ "\2\2\u01f4\u01f9\7T\2\2\u01f5\u01f6\7\34\2\2\u01f6\u01f7\78\2\2\u01f7"+
+ "\u01f9\7T\2\2\u01f8\u01eb\3\2\2\2\u01f8\u01ee\3\2\2\2\u01f8\u01f2\3\2"+
+ "\2\2\u01f8\u01f5\3\2\2\2\u01f9C\3\2\2\2\64GM`cku}\u0082\u0086\u008a\u008f"+
+ "\u00a7\u00a9\u00ba\u00be\u00c4\u00c8\u00d0\u00da\u00e2\u00e8\u0124\u0126"+
+ "\u0136\u013c\u0144\u0148\u015c\u0161\u0165\u017a\u0180\u0183\u018f\u0192"+
+ "\u0198\u019b\u01a3\u01aa\u01b2\u01ba\u01c6\u01c9\u01d0\u01d9\u01dc\u01df"+
+ "\u01e4\u01e7\u01f8";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/Walker.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/Walker.java
index 6c8d3a62e065b..dc5c164244d96 100644
--- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/Walker.java
+++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/Walker.java
@@ -261,10 +261,6 @@ public ANode visitSource(SourceContext ctx) {
statements.add((AStatement)visit(statement));
}
- if (ctx.dstatement() != null) {
- statements.add((AStatement)visit(ctx.dstatement()));
- }
-
return new SSource(scriptClassInfo, settings, sourceName, debugStream, (MainMethodReserved)reserved.pop(),
location(ctx), functions, globals, statements);
}
diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessBinding.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessBinding.java
new file mode 100644
index 0000000000000..41178dd5d7506
--- /dev/null
+++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessBinding.java
@@ -0,0 +1,41 @@
+/*
+ * 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.painless.lookup;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.List;
+
+public class PainlessBinding {
+
+ public final Constructor> javaConstructor;
+ public final Method javaMethod;
+
+ public final Class> returnType;
+ public final List> typeParameters;
+
+ PainlessBinding(Constructor> javaConstructor, Method javaMethod, Class> returnType, List> typeParameters) {
+ this.javaConstructor = javaConstructor;
+ this.javaMethod = javaMethod;
+
+ this.returnType = returnType;
+ this.typeParameters = typeParameters;
+ }
+}
diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessClass.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessClass.java
index 50bb79dcfbdf5..f5d6c97bb2f3e 100644
--- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessClass.java
+++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessClass.java
@@ -24,6 +24,7 @@
import java.util.Map;
public final class PainlessClass {
+
public final Map constructors;
public final Map staticMethods;
diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessClassBuilder.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessClassBuilder.java
index a61215e9ed749..92100d1bda0c0 100644
--- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessClassBuilder.java
+++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessClassBuilder.java
@@ -24,6 +24,7 @@
import java.util.Map;
final class PainlessClassBuilder {
+
final Map constructors;
final Map staticMethods;
diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessConstructor.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessConstructor.java
index 76597c1a29d65..a3dc6c8122bd6 100644
--- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessConstructor.java
+++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessConstructor.java
@@ -25,6 +25,7 @@
import java.util.List;
public class PainlessConstructor {
+
public final Constructor> javaConstructor;
public final List> typeParameters;
public final MethodHandle methodHandle;
diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessField.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessField.java
index a55d6c3730ebd..9567e97331c7a 100644
--- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessField.java
+++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessField.java
@@ -23,6 +23,7 @@
import java.lang.reflect.Field;
public final class PainlessField {
+
public final Field javaField;
public final Class> typeParameter;
diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessLookup.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessLookup.java
index 55855a3cb1efb..2d6ed3e361dc3 100644
--- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessLookup.java
+++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessLookup.java
@@ -37,12 +37,17 @@ public final class PainlessLookup {
private final Map> canonicalClassNamesToClasses;
private final Map, PainlessClass> classesToPainlessClasses;
- PainlessLookup(Map> canonicalClassNamesToClasses, Map, PainlessClass> classesToPainlessClasses) {
+ private final Map painlessMethodKeysToPainlessBindings;
+
+ PainlessLookup(Map> canonicalClassNamesToClasses, Map, PainlessClass> classesToPainlessClasses,
+ Map painlessMethodKeysToPainlessBindings) {
Objects.requireNonNull(canonicalClassNamesToClasses);
Objects.requireNonNull(classesToPainlessClasses);
this.canonicalClassNamesToClasses = Collections.unmodifiableMap(canonicalClassNamesToClasses);
this.classesToPainlessClasses = Collections.unmodifiableMap(classesToPainlessClasses);
+
+ this.painlessMethodKeysToPainlessBindings = Collections.unmodifiableMap(painlessMethodKeysToPainlessBindings);
}
public boolean isValidCanonicalClassName(String canonicalClassName) {
@@ -162,6 +167,14 @@ public PainlessField lookupPainlessField(Class> targetClass, boolean isStatic,
return painlessField;
}
+ public PainlessBinding lookupPainlessBinding(String methodName, int arity) {
+ Objects.requireNonNull(methodName);
+
+ String painlessMethodKey = buildPainlessMethodKey(methodName, arity);
+
+ return painlessMethodKeysToPainlessBindings.get(painlessMethodKey);
+ }
+
public PainlessMethod lookupFunctionalInterfacePainlessMethod(Class> targetClass) {
PainlessClass targetPainlessClass = classesToPainlessClasses.get(targetClass);
diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessLookupBuilder.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessLookupBuilder.java
index c8353b54c9f44..7adc816252059 100644
--- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessLookupBuilder.java
+++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessLookupBuilder.java
@@ -20,6 +20,7 @@
package org.elasticsearch.painless.lookup;
import org.elasticsearch.painless.spi.Whitelist;
+import org.elasticsearch.painless.spi.WhitelistBinding;
import org.elasticsearch.painless.spi.WhitelistClass;
import org.elasticsearch.painless.spi.WhitelistConstructor;
import org.elasticsearch.painless.spi.WhitelistField;
@@ -52,11 +53,11 @@ public final class PainlessLookupBuilder {
private static class PainlessConstructorCacheKey {
- private final Class> targetType;
+ private final Class> targetClass;
private final List> typeParameters;
- private PainlessConstructorCacheKey(Class> targetType, List> typeParameters) {
- this.targetType = targetType;
+ private PainlessConstructorCacheKey(Class> targetClass, List> typeParameters) {
+ this.targetClass = targetClass;
this.typeParameters = Collections.unmodifiableList(typeParameters);
}
@@ -72,25 +73,27 @@ public boolean equals(Object object) {
PainlessConstructorCacheKey that = (PainlessConstructorCacheKey)object;
- return Objects.equals(targetType, that.targetType) &&
+ return Objects.equals(targetClass, that.targetClass) &&
Objects.equals(typeParameters, that.typeParameters);
}
@Override
public int hashCode() {
- return Objects.hash(targetType, typeParameters);
+ return Objects.hash(targetClass, typeParameters);
}
}
private static class PainlessMethodCacheKey {
- private final Class> targetType;
+ private final Class> targetClass;
private final String methodName;
+ private final Class> returnType;
private final List> typeParameters;
- private PainlessMethodCacheKey(Class> targetType, String methodName, List> typeParameters) {
- this.targetType = targetType;
+ private PainlessMethodCacheKey(Class> targetClass, String methodName, Class> returnType, List> typeParameters) {
+ this.targetClass = targetClass;
this.methodName = methodName;
+ this.returnType = returnType;
this.typeParameters = Collections.unmodifiableList(typeParameters);
}
@@ -106,25 +109,26 @@ public boolean equals(Object object) {
PainlessMethodCacheKey that = (PainlessMethodCacheKey)object;
- return Objects.equals(targetType, that.targetType) &&
+ return Objects.equals(targetClass, that.targetClass) &&
Objects.equals(methodName, that.methodName) &&
+ Objects.equals(returnType, that.returnType) &&
Objects.equals(typeParameters, that.typeParameters);
}
@Override
public int hashCode() {
- return Objects.hash(targetType, methodName, typeParameters);
+ return Objects.hash(targetClass, methodName, returnType, typeParameters);
}
}
private static class PainlessFieldCacheKey {
- private final Class> targetType;
+ private final Class> targetClass;
private final String fieldName;
private final Class> typeParameter;
- private PainlessFieldCacheKey(Class> targetType, String fieldName, Class> typeParameter) {
- this.targetType = targetType;
+ private PainlessFieldCacheKey(Class> targetClass, String fieldName, Class> typeParameter) {
+ this.targetClass = targetClass;
this.fieldName = fieldName;
this.typeParameter = typeParameter;
}
@@ -141,20 +145,61 @@ public boolean equals(Object object) {
PainlessFieldCacheKey that = (PainlessFieldCacheKey) object;
- return Objects.equals(targetType, that.targetType) &&
+ return Objects.equals(targetClass, that.targetClass) &&
Objects.equals(fieldName, that.fieldName) &&
Objects.equals(typeParameter, that.typeParameter);
}
@Override
public int hashCode() {
- return Objects.hash(targetType, fieldName, typeParameter);
+ return Objects.hash(targetClass, fieldName, typeParameter);
}
}
- private static final Map painlessConstuctorCache = new HashMap<>();
- private static final Map painlessMethodCache = new HashMap<>();
- private static final Map painlessFieldCache = new HashMap<>();
+ private static class PainlessBindingCacheKey {
+
+ private final Class> targetClass;
+ private final String methodName;
+ private final Class> methodReturnType;
+ private final List> methodTypeParameters;
+
+ private PainlessBindingCacheKey(Class> targetClass,
+ String methodName, Class> returnType, List> typeParameters) {
+
+ this.targetClass = targetClass;
+ this.methodName = methodName;
+ this.methodReturnType = returnType;
+ this.methodTypeParameters = Collections.unmodifiableList(typeParameters);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ if (this == object) {
+ return true;
+ }
+
+ if (object == null || getClass() != object.getClass()) {
+ return false;
+ }
+
+ PainlessBindingCacheKey that = (PainlessBindingCacheKey)object;
+
+ return Objects.equals(targetClass, that.targetClass) &&
+ Objects.equals(methodName, that.methodName) &&
+ Objects.equals(methodReturnType, that.methodReturnType) &&
+ Objects.equals(methodTypeParameters, that.methodTypeParameters);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(targetClass, methodName, methodReturnType, methodTypeParameters);
+ }
+ }
+
+ private static final Map painlessConstructorCache = new HashMap<>();
+ private static final Map painlessMethodCache = new HashMap<>();
+ private static final Map painlessFieldCache = new HashMap<>();
+ private static final Map painlessBindingCache = new HashMap<>();
private static final Pattern CLASS_NAME_PATTERN = Pattern.compile("^[_a-zA-Z][._a-zA-Z0-9]*$");
private static final Pattern METHOD_NAME_PATTERN = Pattern.compile("^[_a-zA-Z][_a-zA-Z0-9]*$");
@@ -197,6 +242,14 @@ public static PainlessLookup buildFromWhitelists(List whitelists) {
targetCanonicalClassName, whitelistField.fieldName, whitelistField.canonicalTypeNameParameter);
}
}
+
+ for (WhitelistBinding whitelistBinding : whitelist.whitelistBindings) {
+ origin = whitelistBinding.origin;
+ painlessLookupBuilder.addPainlessBinding(
+ whitelist.classLoader, whitelistBinding.targetJavaClassName,
+ whitelistBinding.methodName, whitelistBinding.returnCanonicalTypeName,
+ whitelistBinding.canonicalTypeNameParameters);
+ }
}
} catch (Exception exception) {
throw new IllegalArgumentException("error loading whitelist(s) " + origin, exception);
@@ -208,9 +261,13 @@ public static PainlessLookup buildFromWhitelists(List whitelists) {
private final Map> canonicalClassNamesToClasses;
private final Map, PainlessClassBuilder> classesToPainlessClassBuilders;
+ private final Map painlessMethodKeysToPainlessBindings;
+
public PainlessLookupBuilder() {
canonicalClassNamesToClasses = new HashMap<>();
classesToPainlessClassBuilders = new HashMap<>();
+
+ painlessMethodKeysToPainlessBindings = new HashMap<>();
}
private Class> canonicalTypeNameToType(String canonicalTypeName) {
@@ -392,7 +449,7 @@ public void addPainlessConstructor(Class> targetClass, List> typePara
MethodType methodType = methodHandle.type();
- painlessConstructor = painlessConstuctorCache.computeIfAbsent(
+ painlessConstructor = painlessConstructorCache.computeIfAbsent(
new PainlessConstructorCacheKey(targetClass, typeParameters),
key -> new PainlessConstructor(javaConstructor, typeParameters, methodHandle, methodType)
);
@@ -439,7 +496,7 @@ public void addPainlessMethod(ClassLoader classLoader, String targetCanonicalCla
Class> typeParameter = canonicalTypeNameToType(canonicalTypeNameParameter);
if (typeParameter == null) {
- throw new IllegalArgumentException("parameter type [" + canonicalTypeNameParameter + "] not found for method " +
+ throw new IllegalArgumentException("type parameter [" + canonicalTypeNameParameter + "] not found for method " +
"[[" + targetCanonicalClassName + "], [" + methodName + "], " + canonicalTypeNameParameters + "]");
}
@@ -449,7 +506,7 @@ public void addPainlessMethod(ClassLoader classLoader, String targetCanonicalCla
Class> returnType = canonicalTypeNameToType(returnCanonicalTypeName);
if (returnType == null) {
- throw new IllegalArgumentException("parameter type [" + returnCanonicalTypeName + "] not found for method " +
+ throw new IllegalArgumentException("return type [" + returnCanonicalTypeName + "] not found for method " +
"[[" + targetCanonicalClassName + "], [" + methodName + "], " + canonicalTypeNameParameters + "]");
}
@@ -548,7 +605,7 @@ public void addPainlessMethod(Class> targetClass, Class> augmentedClass, Str
MethodType methodType = methodHandle.type();
painlessMethod = painlessMethodCache.computeIfAbsent(
- new PainlessMethodCacheKey(targetClass, methodName, typeParameters),
+ new PainlessMethodCacheKey(targetClass, methodName, returnType, typeParameters),
key -> new PainlessMethod(javaMethod, targetClass, returnType, typeParameters, methodHandle, methodType));
painlessClassBuilder.staticMethods.put(painlessMethodKey, painlessMethod);
@@ -588,7 +645,7 @@ public void addPainlessMethod(Class> targetClass, Class> augmentedClass, Str
MethodType methodType = methodHandle.type();
painlessMethod = painlessMethodCache.computeIfAbsent(
- new PainlessMethodCacheKey(targetClass, methodName, typeParameters),
+ new PainlessMethodCacheKey(targetClass, methodName, returnType, typeParameters),
key -> new PainlessMethod(javaMethod, targetClass, returnType, typeParameters, methodHandle, methodType));
painlessClassBuilder.methods.put(painlessMethodKey, painlessMethod);
@@ -731,6 +788,183 @@ public void addPainlessField(Class> targetClass, String fieldName, Class> ty
}
}
+ public void addPainlessBinding(ClassLoader classLoader, String targetJavaClassName,
+ String methodName, String returnCanonicalTypeName, List canonicalTypeNameParameters) {
+
+ Objects.requireNonNull(classLoader);
+ Objects.requireNonNull(targetJavaClassName);
+ Objects.requireNonNull(methodName);
+ Objects.requireNonNull(returnCanonicalTypeName);
+ Objects.requireNonNull(canonicalTypeNameParameters);
+
+ Class> targetClass;
+
+ try {
+ targetClass = Class.forName(targetJavaClassName, true, classLoader);
+ } catch (ClassNotFoundException cnfe) {
+ throw new IllegalArgumentException("class [" + targetJavaClassName + "] not found", cnfe);
+ }
+
+ String targetCanonicalClassName = typeToCanonicalTypeName(targetClass);
+ List> typeParameters = new ArrayList<>(canonicalTypeNameParameters.size());
+
+ for (String canonicalTypeNameParameter : canonicalTypeNameParameters) {
+ Class> typeParameter = canonicalTypeNameToType(canonicalTypeNameParameter);
+
+ if (typeParameter == null) {
+ throw new IllegalArgumentException("type parameter [" + canonicalTypeNameParameter + "] not found for binding " +
+ "[[" + targetCanonicalClassName + "], [" + methodName + "], " + canonicalTypeNameParameters + "]");
+ }
+
+ typeParameters.add(typeParameter);
+ }
+
+ Class> returnType = canonicalTypeNameToType(returnCanonicalTypeName);
+
+ if (returnType == null) {
+ throw new IllegalArgumentException("return type [" + returnCanonicalTypeName + "] not found for binding " +
+ "[[" + targetCanonicalClassName + "], [" + methodName + "], " + canonicalTypeNameParameters + "]");
+ }
+
+ addPainlessBinding(targetClass, methodName, returnType, typeParameters);
+ }
+
+ public void addPainlessBinding(Class> targetClass, String methodName, Class> returnType, List> typeParameters) {
+
+ Objects.requireNonNull(targetClass);
+ Objects.requireNonNull(methodName);
+ Objects.requireNonNull(returnType);
+ Objects.requireNonNull(typeParameters);
+
+ if (targetClass == def.class) {
+ throw new IllegalArgumentException("cannot add binding as reserved class [" + DEF_CLASS_NAME + "]");
+ }
+
+ String targetCanonicalClassName = typeToCanonicalTypeName(targetClass);
+
+ Constructor>[] javaConstructors = targetClass.getConstructors();
+ Constructor> javaConstructor = null;
+
+ for (Constructor> eachJavaConstructor : javaConstructors) {
+ if (eachJavaConstructor.getDeclaringClass() == targetClass) {
+ if (javaConstructor != null) {
+ throw new IllegalArgumentException("binding [" + targetCanonicalClassName + "] cannot have multiple constructors");
+ }
+
+ javaConstructor = eachJavaConstructor;
+ }
+ }
+
+ if (javaConstructor == null) {
+ throw new IllegalArgumentException("binding [" + targetCanonicalClassName + "] must have exactly one constructor");
+ }
+
+ int constructorTypeParametersSize = javaConstructor.getParameterCount();
+
+ for (int typeParameterIndex = 0; typeParameterIndex < constructorTypeParametersSize; ++typeParameterIndex) {
+ Class> typeParameter = typeParameters.get(typeParameterIndex);
+
+ if (isValidType(typeParameter) == false) {
+ throw new IllegalArgumentException("type parameter [" + typeToCanonicalTypeName(typeParameter) + "] not found " +
+ "for binding [[" + targetCanonicalClassName + "], " + typesToCanonicalTypeNames(typeParameters) + "]");
+ }
+
+ Class> javaTypeParameter = javaConstructor.getParameterTypes()[typeParameterIndex];
+
+ if (isValidType(javaTypeParameter) == false) {
+ throw new IllegalArgumentException("type parameter [" + typeToCanonicalTypeName(typeParameter) + "] not found " +
+ "for binding [[" + targetCanonicalClassName + "], " + typesToCanonicalTypeNames(typeParameters) + "]");
+ }
+
+ if (javaTypeParameter != typeToJavaType(typeParameter)) {
+ throw new IllegalArgumentException("type parameter [" + typeToCanonicalTypeName(javaTypeParameter) + "] " +
+ "does not match the specified type parameter [" + typeToCanonicalTypeName(typeParameter) + "] " +
+ "for binding [[" + targetClass.getCanonicalName() + "], " + typesToCanonicalTypeNames(typeParameters) + "]");
+ }
+ }
+
+ if (METHOD_NAME_PATTERN.matcher(methodName).matches() == false) {
+ throw new IllegalArgumentException(
+ "invalid method name [" + methodName + "] for binding [" + targetCanonicalClassName + "].");
+ }
+
+ Method[] javaMethods = targetClass.getMethods();
+ Method javaMethod = null;
+
+ for (Method eachJavaMethod : javaMethods) {
+ if (eachJavaMethod.getDeclaringClass() == targetClass) {
+ if (javaMethod != null) {
+ throw new IllegalArgumentException("binding [" + targetCanonicalClassName + "] cannot have multiple methods");
+ }
+
+ javaMethod = eachJavaMethod;
+ }
+ }
+
+ if (javaMethod == null) {
+ throw new IllegalArgumentException("binding [" + targetCanonicalClassName + "] must have exactly one method");
+ }
+
+ int methodTypeParametersSize = javaMethod.getParameterCount();
+
+ for (int typeParameterIndex = 0; typeParameterIndex < methodTypeParametersSize; ++typeParameterIndex) {
+ Class> typeParameter = typeParameters.get(typeParameterIndex);
+
+ if (isValidType(typeParameter) == false) {
+ throw new IllegalArgumentException("type parameter [" + typeToCanonicalTypeName(typeParameter) + "] not found " +
+ "for binding [[" + targetCanonicalClassName + "], " + typesToCanonicalTypeNames(typeParameters) + "]");
+ }
+
+ Class> javaTypeParameter = javaMethod.getParameterTypes()[typeParameterIndex];
+
+ if (isValidType(javaTypeParameter) == false) {
+ throw new IllegalArgumentException("type parameter [" + typeToCanonicalTypeName(typeParameter) + "] not found " +
+ "for binding [[" + targetCanonicalClassName + "], " + typesToCanonicalTypeNames(typeParameters) + "]");
+ }
+
+ if (javaTypeParameter != typeToJavaType(typeParameter)) {
+ throw new IllegalArgumentException("type parameter [" + typeToCanonicalTypeName(javaTypeParameter) + "] " +
+ "does not match the specified type parameter [" + typeToCanonicalTypeName(typeParameter) + "] " +
+ "for binding [[" + targetClass.getCanonicalName() + "], " + typesToCanonicalTypeNames(typeParameters) + "]");
+ }
+ }
+
+ if (javaMethod.getReturnType() != typeToJavaType(returnType)) {
+ throw new IllegalArgumentException("return type [" + typeToCanonicalTypeName(javaMethod.getReturnType()) + "] " +
+ "does not match the specified returned type [" + typeToCanonicalTypeName(returnType) + "] " +
+ "for binding [[" + targetClass.getCanonicalName() + "], [" + methodName + "], " +
+ typesToCanonicalTypeNames(typeParameters) + "]");
+ }
+
+ String painlessMethodKey = buildPainlessMethodKey(methodName, constructorTypeParametersSize + methodTypeParametersSize);
+ PainlessBinding painlessBinding = painlessMethodKeysToPainlessBindings.get(painlessMethodKey);
+
+ if (painlessBinding == null) {
+ Constructor> finalJavaConstructor = javaConstructor;
+ Method finalJavaMethod = javaMethod;
+
+ painlessBinding = painlessBindingCache.computeIfAbsent(
+ new PainlessBindingCacheKey(targetClass, methodName, returnType, typeParameters),
+ key -> new PainlessBinding(finalJavaConstructor, finalJavaMethod, returnType, typeParameters));
+
+ painlessMethodKeysToPainlessBindings.put(painlessMethodKey, painlessBinding);
+ } else if (painlessBinding.javaConstructor.equals(javaConstructor) == false ||
+ painlessBinding.javaMethod.equals(javaMethod) == false ||
+ painlessBinding.returnType != returnType ||
+ painlessBinding.typeParameters.equals(typeParameters) == false) {
+ throw new IllegalArgumentException("cannot have bindings " +
+ "[[" + targetCanonicalClassName + "], " +
+ "[" + methodName + "], " +
+ "[" + typeToCanonicalTypeName(returnType) + "], " +
+ typesToCanonicalTypeNames(typeParameters) + "] and " +
+ "[[" + targetCanonicalClassName + "], " +
+ "[" + methodName + "], " +
+ "[" + typeToCanonicalTypeName(painlessBinding.returnType) + "], " +
+ typesToCanonicalTypeNames(painlessBinding.typeParameters) + "] and " +
+ "with the same name and arity but different constructors or methods");
+ }
+ }
+
public PainlessLookup build() {
copyPainlessClassMembers();
cacheRuntimeHandles();
@@ -742,7 +976,7 @@ public PainlessLookup build() {
classesToPainlessClasses.put(painlessClassBuilderEntry.getKey(), painlessClassBuilderEntry.getValue().build());
}
- return new PainlessLookup(canonicalClassNamesToClasses, classesToPainlessClasses);
+ return new PainlessLookup(canonicalClassNamesToClasses, classesToPainlessClasses, painlessMethodKeysToPainlessBindings);
}
private void copyPainlessClassMembers() {
diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessMethod.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessMethod.java
index 9dd143a402865..89462170ae5e8 100644
--- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessMethod.java
+++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessMethod.java
@@ -26,6 +26,7 @@
import java.util.List;
public class PainlessMethod {
+
public final Method javaMethod;
public final Class> targetClass;
public final Class> returnType;
diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/node/ECallLocal.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/node/ECallLocal.java
index 1f9973df19224..8ae6ad9723da4 100644
--- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/node/ECallLocal.java
+++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/node/ECallLocal.java
@@ -24,8 +24,12 @@
import org.elasticsearch.painless.Locals.LocalMethod;
import org.elasticsearch.painless.Location;
import org.elasticsearch.painless.MethodWriter;
+import org.elasticsearch.painless.lookup.PainlessBinding;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.Type;
import org.objectweb.asm.commons.Method;
+import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Set;
@@ -41,6 +45,7 @@ public final class ECallLocal extends AExpression {
private final List arguments;
private LocalMethod method = null;
+ private PainlessBinding binding = null;
public ECallLocal(Location location, String name, List arguments) {
super(location);
@@ -60,32 +65,71 @@ void extractVariables(Set variables) {
void analyze(Locals locals) {
method = locals.getMethod(name, arguments.size());
+
if (method == null) {
- throw createError(new IllegalArgumentException("Unknown call [" + name + "] with [" + arguments.size() + "] arguments."));
+ binding = locals.getPainlessLookup().lookupPainlessBinding(name, arguments.size());
+
+ if (binding == null) {
+ throw createError(new IllegalArgumentException("Unknown call [" + name + "] with [" + arguments.size() + "] arguments."));
+ }
}
+ List> typeParameters = new ArrayList<>(method == null ? binding.typeParameters : method.typeParameters);
+
for (int argument = 0; argument < arguments.size(); ++argument) {
AExpression expression = arguments.get(argument);
- expression.expected = method.typeParameters.get(argument);
+ expression.expected = typeParameters.get(argument);
expression.internal = true;
expression.analyze(locals);
arguments.set(argument, expression.cast(locals));
}
statement = true;
- actual = method.returnType;
+ actual = method == null ? binding.returnType : method.returnType;
}
@Override
void write(MethodWriter writer, Globals globals) {
writer.writeDebugInfo(location);
- for (AExpression argument : arguments) {
- argument.write(writer, globals);
- }
+ if (method == null) {
+ String name = globals.addBinding(binding.javaConstructor.getDeclaringClass());
+ Type type = Type.getType(binding.javaConstructor.getDeclaringClass());
+ int javaConstructorParameterCount = binding.javaConstructor.getParameterCount();
+
+ Label nonNull = new Label();
- writer.invokeStatic(CLASS_TYPE, new Method(method.name, method.methodType.toMethodDescriptorString()));
+ writer.loadThis();
+ writer.getField(CLASS_TYPE, name, type);
+ writer.ifNonNull(nonNull);
+ writer.loadThis();
+ writer.newInstance(type);
+ writer.dup();
+
+ for (int argument = 0; argument < javaConstructorParameterCount; ++argument) {
+ arguments.get(argument).write(writer, globals);
+ }
+
+ writer.invokeConstructor(type, Method.getMethod(binding.javaConstructor));
+ writer.putField(CLASS_TYPE, name, type);
+
+ writer.mark(nonNull);
+ writer.loadThis();
+ writer.getField(CLASS_TYPE, name, type);
+
+ for (int argument = 0; argument < binding.javaMethod.getParameterCount(); ++argument) {
+ arguments.get(argument + javaConstructorParameterCount).write(writer, globals);
+ }
+
+ writer.invokeVirtual(type, Method.getMethod(binding.javaMethod));
+ } else {
+ for (AExpression argument : arguments) {
+ argument.write(writer, globals);
+ }
+
+ writer.invokeStatic(CLASS_TYPE, new Method(method.name, method.methodType.toMethodDescriptorString()));
+ }
}
@Override
diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/node/SSource.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/node/SSource.java
index 0f7445a38c44c..8abd3c7185d87 100644
--- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/node/SSource.java
+++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/node/SSource.java
@@ -359,6 +359,13 @@ public void write() {
clinit.endMethod();
}
+ // Write binding variables
+ for (Map.Entry> binding : globals.getBindings().entrySet()) {
+ String name = binding.getKey();
+ String descriptor = Type.getType(binding.getValue()).getDescriptor();
+ visitor.visitField(Opcodes.ACC_PRIVATE, name, descriptor, null, null).visitEnd();
+ }
+
// Write any needsVarName methods for used variables
for (org.objectweb.asm.commons.Method needsMethod : scriptClassInfo.getNeedsMethods()) {
String name = needsMethod.getName();
diff --git a/modules/lang-painless/src/main/resources/org/elasticsearch/painless/spi/org.elasticsearch.txt b/modules/lang-painless/src/main/resources/org/elasticsearch/painless/spi/org.elasticsearch.txt
index a3ff479533bd2..65f50bbc3834c 100644
--- a/modules/lang-painless/src/main/resources/org/elasticsearch/painless/spi/org.elasticsearch.txt
+++ b/modules/lang-painless/src/main/resources/org/elasticsearch/painless/spi/org.elasticsearch.txt
@@ -132,24 +132,6 @@ class org.elasticsearch.index.mapper.IpFieldMapper$IpFieldType$IpScriptDocValues
List getValues()
}
-# for testing.
-# currently FeatureTest exposes overloaded constructor, field load store, and overloaded static methods
-class org.elasticsearch.painless.FeatureTest no_import {
- int z
- ()
- (int,int)
- int getX()
- int getY()
- void setX(int)
- void setY(int)
- boolean overloadedStatic()
- boolean overloadedStatic(boolean)
- Object twoFunctionsOfX(Function,Function)
- void listInput(List)
- int org.elasticsearch.painless.FeatureTestAugmentation getTotal()
- int org.elasticsearch.painless.FeatureTestAugmentation addToTotal(int)
-}
-
class org.elasticsearch.search.lookup.FieldLookup {
def getValue()
List getValues()
@@ -174,4 +156,26 @@ class org.elasticsearch.index.similarity.ScriptedSimilarity$Term {
class org.elasticsearch.index.similarity.ScriptedSimilarity$Doc {
int getLength()
float getFreq()
+}
+
+# for testing
+class org.elasticsearch.painless.FeatureTest no_import {
+ int z
+ ()
+ (int,int)
+ int getX()
+ int getY()
+ void setX(int)
+ void setY(int)
+ boolean overloadedStatic()
+ boolean overloadedStatic(boolean)
+ Object twoFunctionsOfX(Function,Function)
+ void listInput(List)
+ int org.elasticsearch.painless.FeatureTestAugmentation getTotal()
+ int org.elasticsearch.painless.FeatureTestAugmentation addToTotal(int)
+}
+
+# for testing
+static {
+ int testAddWithState(int, int, int) bound_to org.elasticsearch.painless.BindingTest
}
\ No newline at end of file
diff --git a/modules/lang-painless/src/test/java/org/elasticsearch/painless/BasicAPITests.java b/modules/lang-painless/src/test/java/org/elasticsearch/painless/BasicAPITests.java
index 0b13694524b0c..25866c8d668a3 100644
--- a/modules/lang-painless/src/test/java/org/elasticsearch/painless/BasicAPITests.java
+++ b/modules/lang-painless/src/test/java/org/elasticsearch/painless/BasicAPITests.java
@@ -129,4 +129,8 @@ public void testPublicMemberAccess() {
assertEquals(5, exec("org.elasticsearch.painless.FeatureTest ft = new org.elasticsearch.painless.FeatureTest();" +
"ft.z = 5; return ft.z;"));
}
+
+ public void testNoSemicolon() {
+ assertEquals(true, exec("def x = true; if (x) return x"));
+ }
}
diff --git a/modules/lang-painless/src/test/java/org/elasticsearch/painless/BindingsTests.java b/modules/lang-painless/src/test/java/org/elasticsearch/painless/BindingsTests.java
new file mode 100644
index 0000000000000..c6d4e1974c14b
--- /dev/null
+++ b/modules/lang-painless/src/test/java/org/elasticsearch/painless/BindingsTests.java
@@ -0,0 +1,64 @@
+/*
+ * 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.painless;
+
+import org.elasticsearch.script.ExecutableScript;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+public class BindingsTests extends ScriptTestCase {
+
+ public void testBasicBinding() {
+ assertEquals(15, exec("testAddWithState(4, 5, 6)"));
+ }
+
+ public void testRepeatedBinding() {
+ String script = "testAddWithState(4, 5, params.test)";
+ Map params = new HashMap<>();
+ ExecutableScript.Factory factory = scriptEngine.compile(null, script, ExecutableScript.CONTEXT, Collections.emptyMap());
+ ExecutableScript executableScript = factory.newInstance(params);
+
+ executableScript.setNextVar("test", 5);
+ assertEquals(14, executableScript.run());
+
+ executableScript.setNextVar("test", 4);
+ assertEquals(13, executableScript.run());
+
+ executableScript.setNextVar("test", 7);
+ assertEquals(16, executableScript.run());
+ }
+
+ public void testBoundBinding() {
+ String script = "testAddWithState(4, params.bound, params.test)";
+ Map params = new HashMap<>();
+ ExecutableScript.Factory factory = scriptEngine.compile(null, script, ExecutableScript.CONTEXT, Collections.emptyMap());
+ ExecutableScript executableScript = factory.newInstance(params);
+
+ executableScript.setNextVar("test", 5);
+ executableScript.setNextVar("bound", 1);
+ assertEquals(10, executableScript.run());
+
+ executableScript.setNextVar("test", 4);
+ executableScript.setNextVar("bound", 2);
+ assertEquals(9, executableScript.run());
+ }
+}
diff --git a/modules/lang-painless/src/test/java/org/elasticsearch/painless/RegexTests.java b/modules/lang-painless/src/test/java/org/elasticsearch/painless/RegexTests.java
index 8143c39ce6f6b..81c139662e7c8 100644
--- a/modules/lang-painless/src/test/java/org/elasticsearch/painless/RegexTests.java
+++ b/modules/lang-painless/src/test/java/org/elasticsearch/painless/RegexTests.java
@@ -278,6 +278,6 @@ public void testBogusRegexFlag() {
IllegalArgumentException e = expectScriptThrows(IllegalArgumentException.class, () -> {
exec("/asdf/b", false); // Not picky so we get a non-assertion error
});
- assertEquals("invalid sequence of tokens near ['b'].", e.getMessage());
+ assertEquals("unexpected token ['b'] was expecting one of [{, ';'}].", e.getMessage());
}
}
diff --git a/modules/lang-painless/src/test/java/org/elasticsearch/painless/WhenThingsGoWrongTests.java b/modules/lang-painless/src/test/java/org/elasticsearch/painless/WhenThingsGoWrongTests.java
index f2d93aa759d07..79d2fe0c53deb 100644
--- a/modules/lang-painless/src/test/java/org/elasticsearch/painless/WhenThingsGoWrongTests.java
+++ b/modules/lang-painless/src/test/java/org/elasticsearch/painless/WhenThingsGoWrongTests.java
@@ -255,7 +255,7 @@ public void testRCurlyNotDelim() {
// We don't want PICKY here so we get the normal error message
exec("def i = 1} return 1", emptyMap(), emptyMap(), null, false);
});
- assertEquals("invalid sequence of tokens near ['}'].", e.getMessage());
+ assertEquals("unexpected token ['}'] was expecting one of [{, ';'}].", e.getMessage());
}
public void testBadBoxingCast() {
diff --git a/modules/lang-painless/src/test/resources/rest-api-spec/test/painless/50_script_doc_values.yml b/modules/lang-painless/src/test/resources/rest-api-spec/test/painless/50_script_doc_values.yml
index 4c3c204d2d9ca..617b8df61b6bd 100644
--- a/modules/lang-painless/src/test/resources/rest-api-spec/test/painless/50_script_doc_values.yml
+++ b/modules/lang-painless/src/test/resources/rest-api-spec/test/painless/50_script_doc_values.yml
@@ -95,7 +95,7 @@ setup:
field:
script:
source: "doc.date.get(0)"
- - match: { hits.hits.0.fields.field.0: '2017-01-01T12:11:12Z' }
+ - match: { hits.hits.0.fields.field.0: '2017-01-01T12:11:12.000Z' }
- do:
search:
@@ -104,7 +104,7 @@ setup:
field:
script:
source: "doc.date.value"
- - match: { hits.hits.0.fields.field.0: '2017-01-01T12:11:12Z' }
+ - match: { hits.hits.0.fields.field.0: '2017-01-01T12:11:12.000Z' }
---
"geo_point":
diff --git a/modules/reindex/src/main/java/org/elasticsearch/index/reindex/RestReindexAction.java b/modules/reindex/src/main/java/org/elasticsearch/index/reindex/RestReindexAction.java
index a5520c90b0ff5..50d01535d7ff0 100644
--- a/modules/reindex/src/main/java/org/elasticsearch/index/reindex/RestReindexAction.java
+++ b/modules/reindex/src/main/java/org/elasticsearch/index/reindex/RestReindexAction.java
@@ -20,7 +20,6 @@
package org.elasticsearch.index.reindex;
import org.elasticsearch.action.index.IndexRequest;
-import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.client.node.NodeClient;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.Strings;
@@ -118,7 +117,7 @@ protected ReindexRequest buildRequest(RestRequest request) throws IOException {
throw new IllegalArgumentException("_reindex doesn't support [pipeline] as a query parameter. "
+ "Specify it in the [dest] object instead.");
}
- ReindexRequest internal = new ReindexRequest(new SearchRequest(), new IndexRequest());
+ ReindexRequest internal = new ReindexRequest();
try (XContentParser parser = request.contentParser()) {
PARSER.parse(parser, internal, null);
}
diff --git a/modules/reindex/src/test/java/org/elasticsearch/index/reindex/ReindexMetadataTests.java b/modules/reindex/src/test/java/org/elasticsearch/index/reindex/ReindexMetadataTests.java
index 4611f9dcbcddb..ec34da777b533 100644
--- a/modules/reindex/src/test/java/org/elasticsearch/index/reindex/ReindexMetadataTests.java
+++ b/modules/reindex/src/test/java/org/elasticsearch/index/reindex/ReindexMetadataTests.java
@@ -21,7 +21,6 @@
import org.elasticsearch.index.reindex.ScrollableHitSource.Hit;
import org.elasticsearch.action.index.IndexRequest;
-import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.common.settings.Settings;
/**
@@ -73,7 +72,7 @@ protected TestAction action() {
@Override
protected ReindexRequest request() {
- return new ReindexRequest(new SearchRequest(), new IndexRequest());
+ return new ReindexRequest();
}
private class TestAction extends TransportReindexAction.AsyncIndexBySearchAction {
diff --git a/modules/reindex/src/test/java/org/elasticsearch/index/reindex/ReindexScriptTests.java b/modules/reindex/src/test/java/org/elasticsearch/index/reindex/ReindexScriptTests.java
index 6d3ce558c7567..a90b60357c4ff 100644
--- a/modules/reindex/src/test/java/org/elasticsearch/index/reindex/ReindexScriptTests.java
+++ b/modules/reindex/src/test/java/org/elasticsearch/index/reindex/ReindexScriptTests.java
@@ -20,7 +20,6 @@
package org.elasticsearch.index.reindex;
import org.elasticsearch.action.index.IndexRequest;
-import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.common.lucene.uid.Versions;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.script.ScriptService;
@@ -100,7 +99,7 @@ public void testSetRouting() throws Exception {
@Override
protected ReindexRequest request() {
- return new ReindexRequest(new SearchRequest(), new IndexRequest());
+ return new ReindexRequest();
}
@Override
diff --git a/modules/reindex/src/test/java/org/elasticsearch/index/reindex/ReindexWithoutContentIT.java b/modules/reindex/src/test/java/org/elasticsearch/index/reindex/ReindexWithoutContentIT.java
index f580b1400c3bd..73745ca690d74 100644
--- a/modules/reindex/src/test/java/org/elasticsearch/index/reindex/ReindexWithoutContentIT.java
+++ b/modules/reindex/src/test/java/org/elasticsearch/index/reindex/ReindexWithoutContentIT.java
@@ -19,6 +19,7 @@
package org.elasticsearch.index.reindex;
+import org.elasticsearch.client.Request;
import org.elasticsearch.client.ResponseException;
import org.elasticsearch.test.rest.ESRestTestCase;
@@ -30,7 +31,7 @@ public class ReindexWithoutContentIT extends ESRestTestCase {
public void testReindexMissingBody() throws IOException {
ResponseException responseException = expectThrows(ResponseException.class, () -> client().performRequest(
- "POST", "/_reindex"));
+ new Request("POST", "/_reindex")));
assertEquals(400, responseException.getResponse().getStatusLine().getStatusCode());
assertThat(responseException.getMessage(), containsString("request body is required"));
}
diff --git a/modules/reindex/src/test/java/org/elasticsearch/index/reindex/RestReindexActionTests.java b/modules/reindex/src/test/java/org/elasticsearch/index/reindex/RestReindexActionTests.java
index b06948b90581a..70e29ed12c5b4 100644
--- a/modules/reindex/src/test/java/org/elasticsearch/index/reindex/RestReindexActionTests.java
+++ b/modules/reindex/src/test/java/org/elasticsearch/index/reindex/RestReindexActionTests.java
@@ -19,8 +19,6 @@
package org.elasticsearch.index.reindex;
-import org.elasticsearch.action.index.IndexRequest;
-import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.common.bytes.BytesArray;
import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.settings.Settings;
@@ -144,7 +142,7 @@ public void testReindexFromRemoteRequestParsing() throws IOException {
request = BytesReference.bytes(b);
}
try (XContentParser p = createParser(JsonXContent.jsonXContent, request)) {
- ReindexRequest r = new ReindexRequest(new SearchRequest(), new IndexRequest());
+ ReindexRequest r = new ReindexRequest();
RestReindexAction.PARSER.parse(p, r, null);
assertEquals("localhost", r.getRemoteInfo().getHost());
assertArrayEquals(new String[] {"source"}, r.getSearchRequest().indices());
diff --git a/modules/reindex/src/test/java/org/elasticsearch/index/reindex/RoundTripTests.java b/modules/reindex/src/test/java/org/elasticsearch/index/reindex/RoundTripTests.java
index 0efedf449b562..cc848900b7815 100644
--- a/modules/reindex/src/test/java/org/elasticsearch/index/reindex/RoundTripTests.java
+++ b/modules/reindex/src/test/java/org/elasticsearch/index/reindex/RoundTripTests.java
@@ -20,7 +20,6 @@
package org.elasticsearch.index.reindex;
import org.elasticsearch.Version;
-import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.common.bytes.BytesArray;
import org.elasticsearch.common.bytes.BytesReference;
@@ -47,7 +46,7 @@
*/
public class RoundTripTests extends ESTestCase {
public void testReindexRequest() throws IOException {
- ReindexRequest reindex = new ReindexRequest(new SearchRequest(), new IndexRequest());
+ ReindexRequest reindex = new ReindexRequest();
randomRequest(reindex);
reindex.getDestination().version(randomFrom(Versions.MATCH_ANY, Versions.MATCH_DELETED, 12L, 1L, 123124L, 12L));
reindex.getDestination().index("test");
diff --git a/modules/transport-netty4/build.gradle b/modules/transport-netty4/build.gradle
index 12ce5ce7d4a8f..e7c36ff506ed3 100644
--- a/modules/transport-netty4/build.gradle
+++ b/modules/transport-netty4/build.gradle
@@ -83,7 +83,6 @@ thirdPartyAudit.excludes = [
'io.netty.internal.tcnative.SSLContext',
// from io.netty.handler.ssl.util.BouncyCastleSelfSignedCertGenerator (netty)
- 'org.bouncycastle.asn1.x500.X500Name',
'org.bouncycastle.cert.X509v3CertificateBuilder',
'org.bouncycastle.cert.jcajce.JcaX509CertificateConverter',
'org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder',
@@ -163,3 +162,11 @@ thirdPartyAudit.excludes = [
'org.conscrypt.Conscrypt',
'org.conscrypt.HandshakeListener'
]
+
+if (project.inFipsJvm == false) {
+ // BouncyCastleFIPS provides this class, so the exclusion is invalid when running CI in
+ // a FIPS JVM with BouncyCastleFIPS Provider
+ thirdPartyAudit.excludes += [
+ 'org.bouncycastle.asn1.x500.X500Name'
+ ]
+}
diff --git a/modules/transport-netty4/src/test/java/org/elasticsearch/rest/Netty4BadRequestIT.java b/modules/transport-netty4/src/test/java/org/elasticsearch/rest/Netty4BadRequestIT.java
index 17a62b3a440ef..cfda71f10096e 100644
--- a/modules/transport-netty4/src/test/java/org/elasticsearch/rest/Netty4BadRequestIT.java
+++ b/modules/transport-netty4/src/test/java/org/elasticsearch/rest/Netty4BadRequestIT.java
@@ -32,7 +32,6 @@
import java.io.IOException;
import java.nio.charset.Charset;
-import java.util.Collections;
import java.util.Map;
import static org.elasticsearch.rest.RestStatus.BAD_REQUEST;
@@ -71,7 +70,7 @@ public void testBadRequest() throws IOException {
final ResponseException e =
expectThrows(
ResponseException.class,
- () -> client().performRequest(randomFrom("GET", "POST", "PUT"), path, Collections.emptyMap()));
+ () -> client().performRequest(new Request(randomFrom("GET", "POST", "PUT"), path)));
assertThat(e.getResponse().getStatusLine().getStatusCode(), equalTo(BAD_REQUEST.getStatus()));
assertThat(e, hasToString(containsString("too_long_frame_exception")));
assertThat(e, hasToString(matches("An HTTP line is larger than \\d+ bytes")));
diff --git a/plugins/ingest-attachment/build.gradle b/plugins/ingest-attachment/build.gradle
index 6cd55f682c8b4..f55104f2a96fc 100644
--- a/plugins/ingest-attachment/build.gradle
+++ b/plugins/ingest-attachment/build.gradle
@@ -2141,3 +2141,9 @@ if (project.runtimeJavaVersion > JavaVersion.VERSION_1_8) {
'javax.xml.bind.Unmarshaller'
]
}
+
+if (project.inFipsJvm) {
+ // FIPS JVM includes manny classes from bouncycastle which count as jar hell for the third party audit,
+ // rather than provide a long list of exclusions, disable the check on FIPS.
+ thirdPartyAudit.enabled = false
+}
diff --git a/plugins/transport-nio/build.gradle b/plugins/transport-nio/build.gradle
index 07605bfee29b3..cb8916b857c23 100644
--- a/plugins/transport-nio/build.gradle
+++ b/plugins/transport-nio/build.gradle
@@ -62,7 +62,6 @@ thirdPartyAudit.excludes = [
'io.netty.internal.tcnative.SSLContext',
// from io.netty.handler.ssl.util.BouncyCastleSelfSignedCertGenerator (netty)
- 'org.bouncycastle.asn1.x500.X500Name',
'org.bouncycastle.cert.X509v3CertificateBuilder',
'org.bouncycastle.cert.jcajce.JcaX509CertificateConverter',
'org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder',
@@ -141,4 +140,11 @@ thirdPartyAudit.excludes = [
'org.conscrypt.BufferAllocator',
'org.conscrypt.Conscrypt',
'org.conscrypt.HandshakeListener'
-]
\ No newline at end of file
+]
+if (project.inFipsJvm == false) {
+ // BouncyCastleFIPS provides this class, so the exclusion is invalid when running CI in
+ // a FIPS JVM with BouncyCastleFIPS Provider
+ thirdPartyAudit.excludes += [
+ 'org.bouncycastle.asn1.x500.X500Name'
+ ]
+}
\ No newline at end of file
diff --git a/server/build.gradle b/server/build.gradle
index aaef6d87e6174..edc3f427dfda9 100644
--- a/server/build.gradle
+++ b/server/build.gradle
@@ -304,21 +304,6 @@ thirdPartyAudit.excludes = [
'com.google.common.geometry.S2LatLng',
]
-if (project.runtimeJavaVersion <= JavaVersion.VERSION_1_8) {
- thirdPartyAudit.excludes += [
- // Used by Log4J 2.11.1
- 'java.io.ObjectInputFilter',
- 'java.io.ObjectInputFilter$Config',
- 'java.io.ObjectInputFilter$FilterInfo',
- 'java.io.ObjectInputFilter$Status',
- // added in 9
- 'java.lang.ProcessHandle',
- 'java.lang.StackWalker',
- 'java.lang.StackWalker$Option',
- 'java.lang.StackWalker$StackFrame'
- ]
-}
-
if (project.runtimeJavaVersion > JavaVersion.VERSION_1_8) {
thirdPartyAudit.excludes += ['javax.xml.bind.DatatypeConverter']
}
diff --git a/server/src/main/java/org/elasticsearch/action/ActionModule.java b/server/src/main/java/org/elasticsearch/action/ActionModule.java
index 58efce77c9fd8..b3ec72d527099 100644
--- a/server/src/main/java/org/elasticsearch/action/ActionModule.java
+++ b/server/src/main/java/org/elasticsearch/action/ActionModule.java
@@ -131,9 +131,7 @@
import org.elasticsearch.action.admin.indices.shards.IndicesShardStoresAction;
import org.elasticsearch.action.admin.indices.shards.TransportIndicesShardStoresAction;
import org.elasticsearch.action.admin.indices.shrink.ResizeAction;
-import org.elasticsearch.action.admin.indices.shrink.ShrinkAction;
import org.elasticsearch.action.admin.indices.shrink.TransportResizeAction;
-import org.elasticsearch.action.admin.indices.shrink.TransportShrinkAction;
import org.elasticsearch.action.admin.indices.stats.IndicesStatsAction;
import org.elasticsearch.action.admin.indices.stats.TransportIndicesStatsAction;
import org.elasticsearch.action.admin.indices.template.delete.DeleteIndexTemplateAction;
@@ -446,7 +444,6 @@ public void reg
actions.register(IndicesSegmentsAction.INSTANCE, TransportIndicesSegmentsAction.class);
actions.register(IndicesShardStoresAction.INSTANCE, TransportIndicesShardStoresAction.class);
actions.register(CreateIndexAction.INSTANCE, TransportCreateIndexAction.class);
- actions.register(ShrinkAction.INSTANCE, TransportShrinkAction.class);
actions.register(ResizeAction.INSTANCE, TransportResizeAction.class);
actions.register(RolloverAction.INSTANCE, TransportRolloverAction.class);
actions.register(DeleteIndexAction.INSTANCE, TransportDeleteIndexAction.class);
diff --git a/server/src/main/java/org/elasticsearch/action/admin/indices/shrink/TransportShrinkAction.java b/server/src/main/java/org/elasticsearch/action/admin/indices/shrink/TransportShrinkAction.java
deleted file mode 100644
index acc88251970f3..0000000000000
--- a/server/src/main/java/org/elasticsearch/action/admin/indices/shrink/TransportShrinkAction.java
+++ /dev/null
@@ -1,46 +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.action.admin.indices.shrink;
-
-import org.elasticsearch.action.support.ActionFilters;
-import org.elasticsearch.client.Client;
-import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
-import org.elasticsearch.cluster.metadata.MetaDataCreateIndexService;
-import org.elasticsearch.cluster.service.ClusterService;
-import org.elasticsearch.common.inject.Inject;
-import org.elasticsearch.common.settings.Settings;
-import org.elasticsearch.threadpool.ThreadPool;
-import org.elasticsearch.transport.TransportService;
-
-/**
- * Main class to initiate shrinking an index into a new index
- * This class is only here for backwards compatibility. It will be replaced by
- * TransportResizeAction in 7.x once this is backported
- */
-public class TransportShrinkAction extends TransportResizeAction {
-
- @Inject
- public TransportShrinkAction(Settings settings, TransportService transportService, ClusterService clusterService,
- ThreadPool threadPool, MetaDataCreateIndexService createIndexService,
- ActionFilters actionFilters, IndexNameExpressionResolver indexNameExpressionResolver, Client client) {
- super(settings, ShrinkAction.NAME, transportService, clusterService, threadPool, createIndexService, actionFilters,
- indexNameExpressionResolver, client);
- }
-}
diff --git a/server/src/main/java/org/elasticsearch/action/bulk/BulkItemResponse.java b/server/src/main/java/org/elasticsearch/action/bulk/BulkItemResponse.java
index 9b9be3a41476e..838293b8b1f65 100644
--- a/server/src/main/java/org/elasticsearch/action/bulk/BulkItemResponse.java
+++ b/server/src/main/java/org/elasticsearch/action/bulk/BulkItemResponse.java
@@ -28,11 +28,13 @@
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.common.CheckedConsumer;
+import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.io.stream.Streamable;
import org.elasticsearch.common.io.stream.Writeable;
+import org.elasticsearch.common.xcontent.ConstructingObjectParser;
import org.elasticsearch.common.xcontent.StatusToXContentObject;
import org.elasticsearch.common.xcontent.ToXContentFragment;
import org.elasticsearch.common.xcontent.XContentBuilder;
@@ -42,6 +44,8 @@
import java.io.IOException;
+import static org.elasticsearch.common.xcontent.ConstructingObjectParser.constructorArg;
+import static org.elasticsearch.common.xcontent.ConstructingObjectParser.optionalConstructorArg;
import static org.elasticsearch.common.xcontent.XContentParserUtils.ensureExpectedToken;
import static org.elasticsearch.common.xcontent.XContentParserUtils.throwUnknownField;
@@ -161,11 +165,11 @@ public static BulkItemResponse fromXContent(XContentParser parser, int id) throw
* Represents a failure.
*/
public static class Failure implements Writeable, ToXContentFragment {
- static final String INDEX_FIELD = "index";
- static final String TYPE_FIELD = "type";
- static final String ID_FIELD = "id";
- static final String CAUSE_FIELD = "cause";
- static final String STATUS_FIELD = "status";
+ public static final String INDEX_FIELD = "index";
+ public static final String TYPE_FIELD = "type";
+ public static final String ID_FIELD = "id";
+ public static final String CAUSE_FIELD = "cause";
+ public static final String STATUS_FIELD = "status";
private final String index;
private final String type;
@@ -175,6 +179,23 @@ public static class Failure implements Writeable, ToXContentFragment {
private final long seqNo;
private final boolean aborted;
+ public static ConstructingObjectParser PARSER =
+ new ConstructingObjectParser<>(
+ "bulk_failures",
+ true,
+ a ->
+ new Failure(
+ (String)a[0], (String)a[1], (String)a[2], (Exception)a[3], RestStatus.fromCode((int)a[4])
+ )
+ );
+ static {
+ PARSER.declareString(constructorArg(), new ParseField(INDEX_FIELD));
+ PARSER.declareString(constructorArg(), new ParseField(TYPE_FIELD));
+ PARSER.declareString(optionalConstructorArg(), new ParseField(ID_FIELD));
+ PARSER.declareObject(constructorArg(), (p, c) -> ElasticsearchException.fromXContent(p), new ParseField(CAUSE_FIELD));
+ PARSER.declareInt(constructorArg(), new ParseField(STATUS_FIELD));
+ }
+
/**
* For write failures before operation was assigned a sequence number.
*
@@ -322,6 +343,10 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
return builder;
}
+ public static Failure fromXContent(XContentParser parser) {
+ return PARSER.apply(parser, null);
+ }
+
@Override
public String toString() {
return Strings.toString(this);
diff --git a/server/src/main/java/org/elasticsearch/action/search/SearchPhaseExecutionException.java b/server/src/main/java/org/elasticsearch/action/search/SearchPhaseExecutionException.java
index 3d3737b0638cd..fa532777e9dce 100644
--- a/server/src/main/java/org/elasticsearch/action/search/SearchPhaseExecutionException.java
+++ b/server/src/main/java/org/elasticsearch/action/search/SearchPhaseExecutionException.java
@@ -134,11 +134,10 @@ private static String buildMessage(String phaseName, String msg, ShardSearchFail
@Override
protected void metadataToXContent(XContentBuilder builder, Params params) throws IOException {
builder.field("phase", phaseName);
- final boolean group = params.paramAsBoolean("group_shard_failures", true); // we group by default
- builder.field("grouped", group); // notify that it's grouped
+ builder.field("grouped", true); // notify that it's grouped
builder.field("failed_shards");
builder.startArray();
- ShardOperationFailedException[] failures = group ? ExceptionsHelper.groupBy(shardFailures) : shardFailures;
+ ShardOperationFailedException[] failures = ExceptionsHelper.groupBy(shardFailures);
for (ShardOperationFailedException failure : failures) {
builder.startObject();
failure.toXContent(builder, params);
diff --git a/server/src/main/java/org/elasticsearch/action/search/SearchRequest.java b/server/src/main/java/org/elasticsearch/action/search/SearchRequest.java
index e560e53ed7b64..dd7f687294383 100644
--- a/server/src/main/java/org/elasticsearch/action/search/SearchRequest.java
+++ b/server/src/main/java/org/elasticsearch/action/search/SearchRequest.java
@@ -184,6 +184,10 @@ public ActionRequestValidationException validate() {
if (source != null && source.size() == 0 && scroll != null) {
validationException = addValidationError("[size] cannot be [0] in a scroll context", validationException);
}
+ if (source != null && source.rescores() != null && source.rescores().isEmpty() == false && scroll != null) {
+ validationException =
+ addValidationError("using [rescore] is not allowed in a scroll context", validationException);
+ }
return validationException;
}
diff --git a/server/src/main/java/org/elasticsearch/common/time/DateFormatters.java b/server/src/main/java/org/elasticsearch/common/time/DateFormatters.java
index 37efff5a0bebd..4017e43b071fd 100644
--- a/server/src/main/java/org/elasticsearch/common/time/DateFormatters.java
+++ b/server/src/main/java/org/elasticsearch/common/time/DateFormatters.java
@@ -48,6 +48,7 @@
import static java.time.temporal.ChronoField.MILLI_OF_SECOND;
import static java.time.temporal.ChronoField.MINUTE_OF_HOUR;
import static java.time.temporal.ChronoField.MONTH_OF_YEAR;
+import static java.time.temporal.ChronoField.NANO_OF_SECOND;
import static java.time.temporal.ChronoField.SECOND_OF_MINUTE;
public class DateFormatters {
@@ -81,7 +82,7 @@ public class DateFormatters {
.appendFraction(MILLI_OF_SECOND, 3, 3, true)
.optionalEnd()
.optionalStart()
- .appendOffset("+HHmm", "Z")
+ .appendZoneOrOffsetId()
.optionalEnd()
.optionalEnd()
.toFormatter(Locale.ROOT);
@@ -95,7 +96,7 @@ public class DateFormatters {
.appendFraction(MILLI_OF_SECOND, 3, 3, true)
.optionalEnd()
.optionalStart()
- .appendZoneOrOffsetId()
+ .appendOffset("+HHmm", "Z")
.optionalEnd()
.optionalEnd()
.toFormatter(Locale.ROOT);
@@ -106,6 +107,40 @@ public class DateFormatters {
private static final CompoundDateTimeFormatter STRICT_DATE_OPTIONAL_TIME =
new CompoundDateTimeFormatter(STRICT_DATE_OPTIONAL_TIME_FORMATTER_1, STRICT_DATE_OPTIONAL_TIME_FORMATTER_2);
+ private static final DateTimeFormatter STRICT_DATE_OPTIONAL_TIME_FORMATTER_WITH_NANOS_1 = new DateTimeFormatterBuilder()
+ .append(STRICT_YEAR_MONTH_DAY_FORMATTER)
+ .optionalStart()
+ .appendLiteral('T')
+ .append(STRICT_HOUR_MINUTE_SECOND_FORMATTER)
+ .optionalStart()
+ .appendFraction(NANO_OF_SECOND, 3, 9, true)
+ .optionalEnd()
+ .optionalStart()
+ .appendZoneOrOffsetId()
+ .optionalEnd()
+ .optionalEnd()
+ .toFormatter(Locale.ROOT);
+
+ private static final DateTimeFormatter STRICT_DATE_OPTIONAL_TIME_FORMATTER_WITH_NANOS_2 = new DateTimeFormatterBuilder()
+ .append(STRICT_YEAR_MONTH_DAY_FORMATTER)
+ .optionalStart()
+ .appendLiteral('T')
+ .append(STRICT_HOUR_MINUTE_SECOND_FORMATTER)
+ .optionalStart()
+ .appendFraction(NANO_OF_SECOND, 3, 9, true)
+ .optionalEnd()
+ .optionalStart()
+ .appendOffset("+HHmm", "Z")
+ .optionalEnd()
+ .optionalEnd()
+ .toFormatter(Locale.ROOT);
+
+ /**
+ * Returns a generic ISO datetime parser where the date is mandatory and the time is optional with nanosecond resolution.
+ */
+ private static final CompoundDateTimeFormatter STRICT_DATE_OPTIONAL_TIME_NANOS =
+ new CompoundDateTimeFormatter(STRICT_DATE_OPTIONAL_TIME_FORMATTER_WITH_NANOS_1, STRICT_DATE_OPTIONAL_TIME_FORMATTER_WITH_NANOS_2);
+
/////////////////////////////////////////
//
// BEGIN basic time formatters
@@ -1326,6 +1361,8 @@ public static CompoundDateTimeFormatter forPattern(String input, Locale locale)
return STRICT_DATE_HOUR_MINUTE_SECOND_MILLIS;
} else if ("strictDateOptionalTime".equals(input) || "strict_date_optional_time".equals(input)) {
return STRICT_DATE_OPTIONAL_TIME;
+ } else if ("strictDateOptionalTimeNanos".equals(input) || "strict_date_optional_time_nanos".equals(input)) {
+ return STRICT_DATE_OPTIONAL_TIME_NANOS;
} else if ("strictDateTime".equals(input) || "strict_date_time".equals(input)) {
return STRICT_DATE_TIME;
} else if ("strictDateTimeNoMillis".equals(input) || "strict_date_time_no_millis".equals(input)) {
diff --git a/server/src/main/java/org/elasticsearch/common/xcontent/XContentElasticsearchExtension.java b/server/src/main/java/org/elasticsearch/common/xcontent/XContentElasticsearchExtension.java
index 38abe90ad46dc..5793bcf8a0e49 100644
--- a/server/src/main/java/org/elasticsearch/common/xcontent/XContentElasticsearchExtension.java
+++ b/server/src/main/java/org/elasticsearch/common/xcontent/XContentElasticsearchExtension.java
@@ -21,6 +21,8 @@
import org.apache.lucene.util.BytesRef;
import org.elasticsearch.common.bytes.BytesReference;
+import org.elasticsearch.common.time.CompoundDateTimeFormatter;
+import org.elasticsearch.common.time.DateFormatters;
import org.elasticsearch.common.unit.ByteSizeValue;
import org.elasticsearch.common.unit.TimeValue;
import org.joda.time.DateTime;
@@ -33,6 +35,19 @@
import org.joda.time.tz.CachedDateTimeZone;
import org.joda.time.tz.FixedDateTimeZone;
+import java.time.DayOfWeek;
+import java.time.Duration;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.Month;
+import java.time.MonthDay;
+import java.time.OffsetDateTime;
+import java.time.OffsetTime;
+import java.time.Period;
+import java.time.Year;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
@@ -49,6 +64,9 @@
public class XContentElasticsearchExtension implements XContentBuilderExtension {
public static final DateTimeFormatter DEFAULT_DATE_PRINTER = ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC);
+ public static final CompoundDateTimeFormatter DEFAULT_FORMATTER = DateFormatters.forPattern("strict_date_optional_time_nanos");
+ public static final CompoundDateTimeFormatter LOCAL_TIME_FORMATTER = DateFormatters.forPattern("HH:mm:ss.SSS");
+ public static final CompoundDateTimeFormatter OFFSET_TIME_FORMATTER = DateFormatters.forPattern("HH:mm:ss.SSSZZZZZ");
@Override
public Map, XContentBuilder.Writer> getXContentWriters() {
@@ -62,6 +80,19 @@ public Map, XContentBuilder.Writer> getXContentWriters() {
writers.put(MutableDateTime.class, XContentBuilder::timeValue);
writers.put(DateTime.class, XContentBuilder::timeValue);
writers.put(TimeValue.class, (b, v) -> b.value(v.toString()));
+ writers.put(ZonedDateTime.class, XContentBuilder::timeValue);
+ writers.put(OffsetDateTime.class, XContentBuilder::timeValue);
+ writers.put(OffsetTime.class, XContentBuilder::timeValue);
+ writers.put(java.time.Instant.class, XContentBuilder::timeValue);
+ writers.put(LocalDateTime.class, XContentBuilder::timeValue);
+ writers.put(LocalDate.class, XContentBuilder::timeValue);
+ writers.put(LocalTime.class, XContentBuilder::timeValue);
+ writers.put(DayOfWeek.class, (b, v) -> b.value(v.toString()));
+ writers.put(Month.class, (b, v) -> b.value(v.toString()));
+ writers.put(MonthDay.class, (b, v) -> b.value(v.toString()));
+ writers.put(Year.class, (b, v) -> b.value(v.toString()));
+ writers.put(Duration.class, (b, v) -> b.value(v.toString()));
+ writers.put(Period.class, (b, v) -> b.value(v.toString()));
writers.put(BytesReference.class, (b, v) -> {
if (v == null) {
@@ -102,6 +133,14 @@ public Map, Function