Merge branch 'master' into index-lifecycle

This commit is contained in:
Colin Goodheart-Smithe 2018-06-11 09:47:26 +01:00
commit 9ee492a3f0
No known key found for this signature in database
GPG Key ID: F975E7BDD739B3C7
462 changed files with 12224 additions and 7394 deletions

3
Vagrantfile vendored
View File

@ -31,6 +31,9 @@ Vagrant.configure(2) do |config|
# Give the box more memory and cpu because our tests are beasts! # Give the box more memory and cpu because our tests are beasts!
vbox.memory = Integer(ENV['VAGRANT_MEMORY'] || 8192) vbox.memory = Integer(ENV['VAGRANT_MEMORY'] || 8192)
vbox.cpus = Integer(ENV['VAGRANT_CPUS'] || 4) vbox.cpus = Integer(ENV['VAGRANT_CPUS'] || 4)
# see https://github.com/hashicorp/vagrant/issues/9524
vbox.customize ["modifyvm", :id, "--audio", "none"]
end end
# Switch the default share for the project root from /vagrant to # Switch the default share for the project root from /vagrant to

View File

@ -205,9 +205,9 @@ subprojects {
"org.elasticsearch.gradle:build-tools:${version}": ':build-tools', "org.elasticsearch.gradle:build-tools:${version}": ':build-tools',
"org.elasticsearch:rest-api-spec:${version}": ':rest-api-spec', "org.elasticsearch:rest-api-spec:${version}": ':rest-api-spec',
"org.elasticsearch:elasticsearch:${version}": ':server', "org.elasticsearch:elasticsearch:${version}": ':server',
"org.elasticsearch:elasticsearch-cli:${version}": ':server:cli', "org.elasticsearch:elasticsearch-cli:${version}": ':libs:cli',
"org.elasticsearch:elasticsearch-core:${version}": ':libs:elasticsearch-core', "org.elasticsearch:elasticsearch-core:${version}": ':libs:core',
"org.elasticsearch:elasticsearch-nio:${version}": ':libs:elasticsearch-nio', "org.elasticsearch:elasticsearch-nio:${version}": ':libs:nio',
"org.elasticsearch:elasticsearch-x-content:${version}": ':libs:x-content', "org.elasticsearch:elasticsearch-x-content:${version}": ':libs:x-content',
"org.elasticsearch:elasticsearch-secure-sm:${version}": ':libs:secure-sm', "org.elasticsearch:elasticsearch-secure-sm:${version}": ':libs:secure-sm',
"org.elasticsearch.client:elasticsearch-rest-client:${version}": ':client:rest', "org.elasticsearch.client:elasticsearch-rest-client:${version}": ':client:rest',
@ -543,7 +543,7 @@ subprojects { project ->
} }
} }
/* Remove assemble on all qa projects because we don't need to publish /* Remove assemble/dependenciesInfo on all qa projects because we don't need to publish
* artifacts for them. */ * artifacts for them. */
gradle.projectsEvaluated { gradle.projectsEvaluated {
subprojects { subprojects {
@ -553,6 +553,11 @@ gradle.projectsEvaluated {
project.tasks.remove(assemble) project.tasks.remove(assemble)
project.build.dependsOn.remove('assemble') project.build.dependsOn.remove('assemble')
} }
Task dependenciesInfo = project.tasks.findByName('dependenciesInfo')
if (dependenciesInfo) {
project.tasks.remove(dependenciesInfo)
project.precommit.dependsOn.remove('dependenciesInfo')
}
} }
} }
} }

View File

@ -762,6 +762,10 @@ class BuildPlugin implements Plugin<Project> {
private static configureDependenciesInfo(Project project) { private static configureDependenciesInfo(Project project) {
Task deps = project.tasks.create("dependenciesInfo", DependenciesInfoTask.class) Task deps = project.tasks.create("dependenciesInfo", DependenciesInfoTask.class)
deps.dependencies = project.configurations.compile.allDependencies deps.runtimeConfiguration = project.configurations.runtime
deps.compileOnlyConfiguration = project.configurations.compileOnly
project.afterEvaluate {
deps.mappings = project.dependencyLicenses.mappings
}
} }
} }

View File

@ -19,14 +19,19 @@
package org.elasticsearch.gradle package org.elasticsearch.gradle
import org.elasticsearch.gradle.precommit.DependencyLicensesTask
import org.gradle.api.DefaultTask import org.gradle.api.DefaultTask
import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.Dependency import org.gradle.api.artifacts.Dependency
import org.gradle.api.artifacts.DependencyResolutionListener
import org.gradle.api.artifacts.DependencySet import org.gradle.api.artifacts.DependencySet
import org.gradle.api.tasks.Input import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputDirectory import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.TaskAction
import java.util.regex.Matcher
import java.util.regex.Pattern
/** /**
* A task to gather information about the dependencies and export them into a csv file. * A task to gather information about the dependencies and export them into a csv file.
@ -44,7 +49,14 @@ public class DependenciesInfoTask extends DefaultTask {
/** Dependencies to gather information from. */ /** Dependencies to gather information from. */
@Input @Input
public DependencySet dependencies public Configuration runtimeConfiguration
/** We subtract compile-only dependencies. */
@Input
public Configuration compileOnlyConfiguration
@Input
public LinkedHashMap<String, String> mappings
/** Directory to read license files */ /** Directory to read license files */
@InputDirectory @InputDirectory
@ -59,15 +71,34 @@ public class DependenciesInfoTask extends DefaultTask {
@TaskAction @TaskAction
public void generateDependenciesInfo() { public void generateDependenciesInfo() {
final DependencySet runtimeDependencies = runtimeConfiguration.getAllDependencies()
// we have to resolve the transitive dependencies and create a group:artifactId:version map
final Set<String> compileOnlyArtifacts =
compileOnlyConfiguration
.getResolvedConfiguration()
.resolvedArtifacts
.collect { it -> "${it.moduleVersion.id.group}:${it.moduleVersion.id.name}:${it.moduleVersion.id.version}" }
final StringBuilder output = new StringBuilder() final StringBuilder output = new StringBuilder()
for (Dependency dependency : dependencies) { for (final Dependency dependency : runtimeDependencies) {
// Only external dependencies are checked // we do not need compile-only dependencies here
if (dependency.group != null && dependency.group.contains("elasticsearch") == false) { if (compileOnlyArtifacts.contains("${dependency.group}:${dependency.name}:${dependency.version}")) {
final String url = createURL(dependency.group, dependency.name, dependency.version) continue
final String licenseType = getLicenseType(dependency.group, dependency.name)
output.append("${dependency.group}:${dependency.name},${dependency.version},${url},${licenseType}\n")
} }
// only external dependencies are checked
if (dependency.group != null && dependency.group.contains("org.elasticsearch")) {
continue
}
final String url = createURL(dependency.group, dependency.name, dependency.version)
final String dependencyName = DependencyLicensesTask.getDependencyName(mappings, dependency.name)
logger.info("mapped dependency ${dependency.group}:${dependency.name} to ${dependencyName} for license info")
final String licenseType = getLicenseType(dependency.group, dependencyName)
output.append("${dependency.group}:${dependency.name},${dependency.version},${url},${licenseType}\n")
} }
outputFile.setText(output.toString(), 'UTF-8') outputFile.setText(output.toString(), 'UTF-8')
} }
@ -109,7 +140,8 @@ public class DependenciesInfoTask extends DefaultTask {
} }
if (license) { if (license) {
final String content = license.readLines("UTF-8").toString() // replace * because they are sometimes used at the beginning lines as if the license was a multi-line comment
final String content = new String(license.readBytes(), "UTF-8").replaceAll("\\s+", " ").replaceAll("\\*", " ")
final String spdx = checkSPDXLicense(content) final String spdx = checkSPDXLicense(content)
if (spdx == null) { if (spdx == null) {
// License has not be identified as SPDX. // License has not be identified as SPDX.
@ -133,15 +165,88 @@ public class DependenciesInfoTask extends DefaultTask {
private String checkSPDXLicense(final String licenseText) { private String checkSPDXLicense(final String licenseText) {
String spdx = null String spdx = null
final String APACHE_2_0 = "Apache.*License.*(v|V)ersion 2.0" final String APACHE_2_0 = "Apache.*License.*(v|V)ersion.*2\\.0"
final String BSD_2 = "BSD 2-clause.*License"
final String BSD_2 = """
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1\\. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer\\.
2\\. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution\\.
THIS SOFTWARE IS PROVIDED BY .+ (``|''|")AS IS(''|") AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED\\.
IN NO EVENT SHALL .+ BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES \\(INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION\\) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
\\(INCLUDING NEGLIGENCE OR OTHERWISE\\) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE\\.
""".replaceAll("\\s+", "\\\\s*")
final String BSD_3 = """
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
(1\\.)? Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer\\.
(2\\.)? Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution\\.
((3\\.)? The name of .+ may not be used to endorse or promote products
derived from this software without specific prior written permission\\.|
(3\\.)? Neither the name of .+ nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission\\.)
THIS SOFTWARE IS PROVIDED BY .+ (``|''|")AS IS(''|") AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED\\.
IN NO EVENT SHALL .+ BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES \\(INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION\\) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
\\(INCLUDING NEGLIGENCE OR OTHERWISE\\) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE\\.
""".replaceAll("\\s+", "\\\\s*")
final String CDDL_1_0 = "COMMON DEVELOPMENT AND DISTRIBUTION LICENSE.*Version 1.0" final String CDDL_1_0 = "COMMON DEVELOPMENT AND DISTRIBUTION LICENSE.*Version 1.0"
final String CDDL_1_1 = "COMMON DEVELOPMENT AND DISTRIBUTION LICENSE.*Version 1.1" final String CDDL_1_1 = "COMMON DEVELOPMENT AND DISTRIBUTION LICENSE.*Version 1.1"
final String ICU = "ICU License - ICU 1.8.1 and later" final String ICU = "ICU License - ICU 1.8.1 and later"
final String LGPL_3 = "GNU LESSER GENERAL PUBLIC LICENSE.*Version 3" final String LGPL_3 = "GNU LESSER GENERAL PUBLIC LICENSE.*Version 3"
final String MIT = "MIT License"
final String MIT = """
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files \\(the "Software"\\), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software\\.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\\. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE\\.
""".replaceAll("\\s+", "\\\\s*")
final String MOZILLA_1_1 = "Mozilla Public License.*Version 1.1" final String MOZILLA_1_1 = "Mozilla Public License.*Version 1.1"
final String MOZILLA_2_0 = "Mozilla\\s*Public\\s*License\\s*Version\\s*2\\.0"
switch (licenseText) { switch (licenseText) {
case ~/.*${APACHE_2_0}.*/: case ~/.*${APACHE_2_0}.*/:
spdx = 'Apache-2.0' spdx = 'Apache-2.0'
@ -152,6 +257,9 @@ public class DependenciesInfoTask extends DefaultTask {
case ~/.*${BSD_2}.*/: case ~/.*${BSD_2}.*/:
spdx = 'BSD-2-Clause' spdx = 'BSD-2-Clause'
break break
case ~/.*${BSD_3}.*/:
spdx = 'BSD-3-Clause'
break
case ~/.*${LGPL_3}.*/: case ~/.*${LGPL_3}.*/:
spdx = 'LGPL-3.0' spdx = 'LGPL-3.0'
break break
@ -167,6 +275,9 @@ public class DependenciesInfoTask extends DefaultTask {
case ~/.*${MOZILLA_1_1}.*/: case ~/.*${MOZILLA_1_1}.*/:
spdx = 'MPL-1.1' spdx = 'MPL-1.1'
break break
case ~/.*${MOZILLA_2_0}.*/:
spdx = 'MPL-2.0'
break
default: default:
break break
} }

View File

@ -109,6 +109,10 @@ public class DependencyLicensesTask extends DefaultTask {
mappings.put(from, to) mappings.put(from, to)
} }
public LinkedHashMap<String, String> getMappings() {
return new LinkedHashMap<>(mappings)
}
/** /**
* Add a rule which will skip SHA checking for the given dependency name. This should be used for * Add a rule which will skip SHA checking for the given dependency name. This should be used for
* locally build dependencies, which cause the sha to change constantly. * locally build dependencies, which cause the sha to change constantly.
@ -129,10 +133,6 @@ public class DependencyLicensesTask extends DefaultTask {
throw new GradleException("Licences dir ${licensesDir} does not exist, but there are dependencies") throw new GradleException("Licences dir ${licensesDir} does not exist, but there are dependencies")
} }
// order is the same for keys and values iteration since we use a linked hashmap
List<String> mapped = new ArrayList<>(mappings.values())
Pattern mappingsPattern = Pattern.compile('(' + mappings.keySet().join(')|(') + ')')
Map<String, Integer> licenses = new HashMap<>() Map<String, Integer> licenses = new HashMap<>()
Map<String, Integer> notices = new HashMap<>() Map<String, Integer> notices = new HashMap<>()
Set<File> shaFiles = new HashSet<File>() Set<File> shaFiles = new HashSet<File>()
@ -151,7 +151,7 @@ public class DependencyLicensesTask extends DefaultTask {
for (File dependency : dependencies) { for (File dependency : dependencies) {
String jarName = dependency.getName() String jarName = dependency.getName()
String depName = jarName - ~/\-\d+.*/ String depName = jarName - ~/\-v?\d+.*/
if (ignoreShas.contains(depName)) { if (ignoreShas.contains(depName)) {
// local deps should not have sha files! // local deps should not have sha files!
if (getShaFile(jarName).exists()) { if (getShaFile(jarName).exists()) {
@ -162,16 +162,10 @@ public class DependencyLicensesTask extends DefaultTask {
checkSha(dependency, jarName, shaFiles) checkSha(dependency, jarName, shaFiles)
} }
logger.info("Checking license/notice for " + depName) final String dependencyName = getDependencyName(mappings, depName)
Matcher match = mappingsPattern.matcher(depName) logger.info("mapped dependency name ${depName} to ${dependencyName} for license/notice check")
if (match.matches()) { checkFile(dependencyName, jarName, licenses, 'LICENSE')
int i = 0 checkFile(dependencyName, jarName, notices, 'NOTICE')
while (i < match.groupCount() && match.group(i + 1) == null) ++i;
logger.info("Mapped dependency name ${depName} to ${mapped.get(i)} for license check")
depName = mapped.get(i)
}
checkFile(depName, jarName, licenses, 'LICENSE')
checkFile(depName, jarName, notices, 'NOTICE')
} }
licenses.each { license, count -> licenses.each { license, count ->
@ -189,6 +183,19 @@ public class DependencyLicensesTask extends DefaultTask {
} }
} }
public static String getDependencyName(final LinkedHashMap<String, String> mappings, final String dependencyName) {
// order is the same for keys and values iteration since we use a linked hashmap
List<String> mapped = new ArrayList<>(mappings.values())
Pattern mappingsPattern = Pattern.compile('(' + mappings.keySet().join(')|(') + ')')
Matcher match = mappingsPattern.matcher(dependencyName)
if (match.matches()) {
int i = 0
while (i < match.groupCount() && match.group(i + 1) == null) ++i;
return mapped.get(i)
}
return dependencyName
}
private File getShaFile(String jarName) { private File getShaFile(String jarName) {
return new File(licensesDir, jarName + SHA_EXTENSION) return new File(licensesDir, jarName + SHA_EXTENSION)
} }

View File

@ -87,8 +87,9 @@ class ClusterConfiguration {
* A closure to call which returns the unicast host to connect to for cluster formation. * A closure to call which returns the unicast host to connect to for cluster formation.
* *
* This allows multi node clusters, or a new cluster to connect to an existing cluster. * This allows multi node clusters, or a new cluster to connect to an existing cluster.
* The closure takes two arguments, the NodeInfo for the first node in the cluster, and * The closure takes three arguments, the NodeInfo for the first node in the cluster,
* an AntBuilder which may be used to wait on conditions before returning. * the NodeInfo for the node current being configured, an AntBuilder which may be used
* to wait on conditions before returning.
*/ */
@Input @Input
Closure unicastTransportUri = { NodeInfo seedNode, NodeInfo node, AntBuilder ant -> Closure unicastTransportUri = { NodeInfo seedNode, NodeInfo node, AntBuilder ant ->

View File

@ -31,6 +31,9 @@ esplugin {
tasks.remove(assemble) tasks.remove(assemble)
build.dependsOn.remove('assemble') build.dependsOn.remove('assemble')
dependencyLicenses.enabled = false
dependenciesInfo.enabled = false
compileJava.options.compilerArgs << "-Xlint:-cast,-deprecation,-rawtypes,-try,-unchecked" compileJava.options.compilerArgs << "-Xlint:-cast,-deprecation,-rawtypes,-try,-unchecked"
// no unit tests // no unit tests

View File

@ -41,11 +41,28 @@ public final class ClusterClient {
} }
/** /**
* Updates cluster wide specific settings using the Cluster Update Settings API * Updates cluster wide specific settings using the Cluster Update Settings API.
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-update-settings.html"> Cluster Update Settings
* API on elastic.co</a>
* @param clusterUpdateSettingsRequest 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 ClusterUpdateSettingsResponse putSettings(ClusterUpdateSettingsRequest clusterUpdateSettingsRequest, RequestOptions options)
throws IOException {
return restHighLevelClient.performRequestAndParseEntity(clusterUpdateSettingsRequest, RequestConverters::clusterPutSettings,
options, ClusterUpdateSettingsResponse::fromXContent, emptySet());
}
/**
* Updates cluster wide specific settings using the Cluster Update Settings API.
* <p> * <p>
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-update-settings.html"> Cluster Update Settings * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-update-settings.html"> Cluster Update Settings
* API on elastic.co</a> * API on elastic.co</a>
* @deprecated Prefer {@link #putSettings(ClusterUpdateSettingsRequest, RequestOptions)}
*/ */
@Deprecated
public ClusterUpdateSettingsResponse putSettings(ClusterUpdateSettingsRequest clusterUpdateSettingsRequest, Header... headers) public ClusterUpdateSettingsResponse putSettings(ClusterUpdateSettingsRequest clusterUpdateSettingsRequest, Header... headers)
throws IOException { throws IOException {
return restHighLevelClient.performRequestAndParseEntity(clusterUpdateSettingsRequest, RequestConverters::clusterPutSettings, return restHighLevelClient.performRequestAndParseEntity(clusterUpdateSettingsRequest, RequestConverters::clusterPutSettings,
@ -53,11 +70,26 @@ public final class ClusterClient {
} }
/** /**
* Asynchronously updates cluster wide specific settings using the Cluster Update Settings API * Asynchronously updates cluster wide specific settings using the Cluster Update Settings API.
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-update-settings.html"> Cluster Update Settings
* API on elastic.co</a>
* @param clusterUpdateSettingsRequest 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 void putSettingsAsync(ClusterUpdateSettingsRequest clusterUpdateSettingsRequest, RequestOptions options,
ActionListener<ClusterUpdateSettingsResponse> listener) {
restHighLevelClient.performRequestAsyncAndParseEntity(clusterUpdateSettingsRequest, RequestConverters::clusterPutSettings,
options, ClusterUpdateSettingsResponse::fromXContent, listener, emptySet());
}
/**
* Asynchronously updates cluster wide specific settings using the Cluster Update Settings API.
* <p> * <p>
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-update-settings.html"> Cluster Update Settings * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-update-settings.html"> Cluster Update Settings
* API on elastic.co</a> * API on elastic.co</a>
* @deprecated Prefer {@link #putSettingsAsync(ClusterUpdateSettingsRequest, RequestOptions, ActionListener)}
*/ */
@Deprecated
public void putSettingsAsync(ClusterUpdateSettingsRequest clusterUpdateSettingsRequest, public void putSettingsAsync(ClusterUpdateSettingsRequest clusterUpdateSettingsRequest,
ActionListener<ClusterUpdateSettingsResponse> listener, Header... headers) { ActionListener<ClusterUpdateSettingsResponse> listener, Header... headers) {
restHighLevelClient.performRequestAsyncAndParseEntity(clusterUpdateSettingsRequest, RequestConverters::clusterPutSettings, restHighLevelClient.performRequestAsyncAndParseEntity(clusterUpdateSettingsRequest, RequestConverters::clusterPutSettings,

View File

@ -19,7 +19,6 @@
package org.elasticsearch.client; package org.elasticsearch.client;
import org.apache.http.Header;
import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.ingest.DeletePipelineRequest; import org.elasticsearch.action.ingest.DeletePipelineRequest;
import org.elasticsearch.action.ingest.GetPipelineRequest; import org.elasticsearch.action.ingest.GetPipelineRequest;
@ -45,70 +44,85 @@ public final class IngestClient {
} }
/** /**
* Add a pipeline or update an existing pipeline * Add a pipeline or update an existing pipeline.
* <p>
* See * See
* <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/put-pipeline-api.html"> Put Pipeline API on elastic.co</a> * <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/put-pipeline-api.html"> Put Pipeline API on elastic.co</a>
* @param request 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 WritePipelineResponse putPipeline(PutPipelineRequest request, Header... headers) throws IOException { public WritePipelineResponse putPipeline(PutPipelineRequest request, RequestOptions options) throws IOException {
return restHighLevelClient.performRequestAndParseEntity( request, RequestConverters::putPipeline, return restHighLevelClient.performRequestAndParseEntity( request, RequestConverters::putPipeline, options,
WritePipelineResponse::fromXContent, emptySet(), headers); WritePipelineResponse::fromXContent, emptySet());
} }
/** /**
* Asynchronously add a pipeline or update an existing pipeline * Asynchronously add a pipeline or update an existing pipeline.
* <p>
* See * See
* <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/put-pipeline-api.html"> Put Pipeline API on elastic.co</a> * <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/put-pipeline-api.html"> Put Pipeline API on elastic.co</a>
* @param request 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 void putPipelineAsync(PutPipelineRequest request, ActionListener<WritePipelineResponse> listener, Header... headers) { public void putPipelineAsync(PutPipelineRequest request, RequestOptions options, ActionListener<WritePipelineResponse> listener) {
restHighLevelClient.performRequestAsyncAndParseEntity( request, RequestConverters::putPipeline, restHighLevelClient.performRequestAsyncAndParseEntity( request, RequestConverters::putPipeline, options,
WritePipelineResponse::fromXContent, listener, emptySet(), headers); WritePipelineResponse::fromXContent, listener, emptySet());
} }
/** /**
* Get an existing pipeline * Get an existing pipeline.
* <p>
* See * See
* <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/get-pipeline-api.html"> Get Pipeline API on elastic.co</a> * <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/get-pipeline-api.html"> Get Pipeline API on elastic.co</a>
* @param request 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 GetPipelineResponse getPipeline(GetPipelineRequest request, Header... headers) throws IOException { public GetPipelineResponse getPipeline(GetPipelineRequest request, RequestOptions options) throws IOException {
return restHighLevelClient.performRequestAndParseEntity( request, RequestConverters::getPipeline, return restHighLevelClient.performRequestAndParseEntity( request, RequestConverters::getPipeline, options,
GetPipelineResponse::fromXContent, emptySet(), headers); GetPipelineResponse::fromXContent, emptySet());
} }
/** /**
* Asynchronously get an existing pipeline * Asynchronously get an existing pipeline.
* <p>
* See * See
* <a href="https://www.elastic.co/guide/en/elasticsearch/reference/master/get-pipeline-api.html"> Get Pipeline API on elastic.co</a> * <a href="https://www.elastic.co/guide/en/elasticsearch/reference/master/get-pipeline-api.html"> Get Pipeline API on elastic.co</a>
* @param request 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 void getPipelineAsync(GetPipelineRequest request, ActionListener<GetPipelineResponse> listener, Header... headers) { public void getPipelineAsync(GetPipelineRequest request, RequestOptions options, ActionListener<GetPipelineResponse> listener) {
restHighLevelClient.performRequestAsyncAndParseEntity( request, RequestConverters::getPipeline, restHighLevelClient.performRequestAsyncAndParseEntity( request, RequestConverters::getPipeline, options,
GetPipelineResponse::fromXContent, listener, emptySet(), headers); GetPipelineResponse::fromXContent, listener, emptySet());
} }
/** /**
* Delete an existing pipeline * Delete an existing pipeline.
* <p>
* See * See
* <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/delete-pipeline-api.html"> * <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/delete-pipeline-api.html">
* Delete Pipeline API on elastic.co</a> * Delete Pipeline API on elastic.co</a>
* @param request 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 WritePipelineResponse deletePipeline(DeletePipelineRequest request, Header... headers) throws IOException { public WritePipelineResponse deletePipeline(DeletePipelineRequest request, RequestOptions options) throws IOException {
return restHighLevelClient.performRequestAndParseEntity( request, RequestConverters::deletePipeline, return restHighLevelClient.performRequestAndParseEntity( request, RequestConverters::deletePipeline, options,
WritePipelineResponse::fromXContent, emptySet(), headers); WritePipelineResponse::fromXContent, emptySet());
} }
/** /**
* Asynchronously delete an existing pipeline * Asynchronously delete an existing pipeline.
* <p>
* See * See
* <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/delete-pipeline-api.html"> * <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/delete-pipeline-api.html">
* Delete Pipeline API on elastic.co</a> * Delete Pipeline API on elastic.co</a>
* @param request 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 void deletePipelineAsync(DeletePipelineRequest request, ActionListener<WritePipelineResponse> listener, Header... headers) { public void deletePipelineAsync(DeletePipelineRequest request, RequestOptions options, ActionListener<WritePipelineResponse> listener) {
restHighLevelClient.performRequestAsyncAndParseEntity( request, RequestConverters::deletePipeline, restHighLevelClient.performRequestAsyncAndParseEntity( request, RequestConverters::deletePipeline, options,
WritePipelineResponse::fromXContent, listener, emptySet(), headers); WritePipelineResponse::fromXContent, listener, emptySet());
} }
} }

View File

@ -29,6 +29,7 @@ import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.ContentType; import org.apache.http.entity.ContentType;
import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.BytesRef;
import org.elasticsearch.action.DocWriteRequest; import org.elasticsearch.action.DocWriteRequest;
import org.elasticsearch.action.admin.cluster.node.tasks.cancel.CancelTasksRequest;
import org.elasticsearch.action.admin.cluster.node.tasks.list.ListTasksRequest; import org.elasticsearch.action.admin.cluster.node.tasks.list.ListTasksRequest;
import org.elasticsearch.action.admin.cluster.repositories.delete.DeleteRepositoryRequest; import org.elasticsearch.action.admin.cluster.repositories.delete.DeleteRepositoryRequest;
import org.elasticsearch.action.admin.cluster.repositories.get.GetRepositoriesRequest; import org.elasticsearch.action.admin.cluster.repositories.get.GetRepositoriesRequest;
@ -108,6 +109,17 @@ final class RequestConverters {
// Contains only status utility methods // Contains only status utility methods
} }
static Request cancelTasks(CancelTasksRequest cancelTasksRequest) {
Request request = new Request(HttpPost.METHOD_NAME, "/_tasks/_cancel");
Params params = new Params(request);
params.withTimeout(cancelTasksRequest.getTimeout())
.withTaskId(cancelTasksRequest.getTaskId())
.withNodes(cancelTasksRequest.getNodes())
.withParentTaskId(cancelTasksRequest.getParentTaskId())
.withActions(cancelTasksRequest.getActions());
return request;
}
static Request delete(DeleteRequest deleteRequest) { static Request delete(DeleteRequest deleteRequest) {
String endpoint = endpoint(deleteRequest.index(), deleteRequest.type(), deleteRequest.id()); String endpoint = endpoint(deleteRequest.index(), deleteRequest.type(), deleteRequest.id());
Request request = new Request(HttpDelete.METHOD_NAME, endpoint); Request request = new Request(HttpDelete.METHOD_NAME, endpoint);
@ -710,7 +722,7 @@ final class RequestConverters {
return request; return request;
} }
static Request getSettings(GetSettingsRequest getSettingsRequest) throws IOException { static Request getSettings(GetSettingsRequest getSettingsRequest) {
String[] indices = getSettingsRequest.indices() == null ? Strings.EMPTY_ARRAY : getSettingsRequest.indices(); String[] indices = getSettingsRequest.indices() == null ? Strings.EMPTY_ARRAY : getSettingsRequest.indices();
String[] names = getSettingsRequest.names() == null ? Strings.EMPTY_ARRAY : getSettingsRequest.names(); String[] names = getSettingsRequest.names() == null ? Strings.EMPTY_ARRAY : getSettingsRequest.names();
@ -1070,6 +1082,13 @@ final class RequestConverters {
return this; return this;
} }
Params withTaskId(TaskId taskId) {
if (taskId != null && taskId.isSet()) {
return putParam("task_id", taskId.toString());
}
return this;
}
Params withParentTaskId(TaskId parentTaskId) { Params withParentTaskId(TaskId parentTaskId) {
if (parentTaskId != null && parentTaskId.isSet()) { if (parentTaskId != null && parentTaskId.isSet()) {
return putParam("parent_task_id", parentTaskId.toString()); return putParam("parent_task_id", parentTaskId.toString());

View File

@ -285,16 +285,19 @@ public class RestHighLevelClient implements Closeable {
} }
/** /**
* Executes a bulk request using the Bulk API * Executes a bulk request using the Bulk API.
*
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html">Bulk API on elastic.co</a> * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html">Bulk API on elastic.co</a>
* @param bulkRequest 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 BulkResponse bulk(BulkRequest bulkRequest, RequestOptions options) throws IOException { public final BulkResponse bulk(BulkRequest bulkRequest, RequestOptions options) throws IOException {
return performRequestAndParseEntity(bulkRequest, RequestConverters::bulk, options, BulkResponse::fromXContent, emptySet()); return performRequestAndParseEntity(bulkRequest, RequestConverters::bulk, options, BulkResponse::fromXContent, emptySet());
} }
/** /**
* Executes a bulk request using the Bulk API * Executes a bulk request using the Bulk API.
* *
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html">Bulk API on elastic.co</a> * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html">Bulk API on elastic.co</a>
* @deprecated Prefer {@link #bulk(BulkRequest, RequestOptions)} * @deprecated Prefer {@link #bulk(BulkRequest, RequestOptions)}
@ -305,16 +308,18 @@ public class RestHighLevelClient implements Closeable {
} }
/** /**
* Asynchronously executes a bulk request using the Bulk API * Asynchronously executes a bulk request using the Bulk API.
*
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html">Bulk API on elastic.co</a> * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html">Bulk API on elastic.co</a>
* @param bulkRequest 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 bulkAsync(BulkRequest bulkRequest, RequestOptions options, ActionListener<BulkResponse> listener) { public final void bulkAsync(BulkRequest bulkRequest, RequestOptions options, ActionListener<BulkResponse> listener) {
performRequestAsyncAndParseEntity(bulkRequest, RequestConverters::bulk, options, BulkResponse::fromXContent, listener, emptySet()); performRequestAsyncAndParseEntity(bulkRequest, RequestConverters::bulk, options, BulkResponse::fromXContent, listener, emptySet());
} }
/** /**
* Asynchronously executes a bulk request using the Bulk API * Asynchronously executes a bulk request using the Bulk API.
* *
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html">Bulk API on elastic.co</a> * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html">Bulk API on elastic.co</a>
* @deprecated Prefer {@link #bulkAsync(BulkRequest, RequestOptions, ActionListener)} * @deprecated Prefer {@link #bulkAsync(BulkRequest, RequestOptions, ActionListener)}
@ -326,194 +331,482 @@ public class RestHighLevelClient implements Closeable {
/** /**
* Pings the remote Elasticsearch cluster and returns true if the ping succeeded, false otherwise * 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
* @return <code>true</code> if the ping succeeded, false otherwise
* @throws IOException in case there is a problem sending the request
*/ */
public final boolean ping(RequestOptions options) throws IOException {
return performRequest(new MainRequest(), (request) -> RequestConverters.ping(), options, RestHighLevelClient::convertExistsResponse,
emptySet());
}
/**
* Pings the remote Elasticsearch cluster and returns true if the ping succeeded, false otherwise
* @deprecated Prefer {@link #ping(RequestOptions)}
*/
@Deprecated
public final boolean ping(Header... headers) throws IOException { public final boolean ping(Header... headers) throws IOException {
return performRequest(new MainRequest(), (request) -> RequestConverters.ping(), RestHighLevelClient::convertExistsResponse, return performRequest(new MainRequest(), (request) -> RequestConverters.ping(), RestHighLevelClient::convertExistsResponse,
emptySet(), headers); emptySet(), headers);
} }
/** /**
* Get the cluster info otherwise provided when sending an HTTP request to port 9200 * Get the cluster info otherwise provided when sending an HTTP request to '/'
* @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 MainResponse info(RequestOptions options) throws IOException {
return performRequestAndParseEntity(new MainRequest(), (request) -> RequestConverters.info(), options,
MainResponse::fromXContent, emptySet());
}
/**
* Get the cluster info otherwise provided when sending an HTTP request to port 9200
* @deprecated Prefer {@link #info(RequestOptions)}
*/
@Deprecated
public final MainResponse info(Header... headers) throws IOException { public final MainResponse info(Header... headers) throws IOException {
return performRequestAndParseEntity(new MainRequest(), (request) -> RequestConverters.info(), return performRequestAndParseEntity(new MainRequest(), (request) -> RequestConverters.info(),
MainResponse::fromXContent, emptySet(), headers); MainResponse::fromXContent, emptySet(), headers);
} }
/** /**
* Retrieves a document by id using the Get API * Retrieves a document by id using the Get API.
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html">Get API on elastic.co</a>
* @param getRequest 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 GetResponse get(GetRequest getRequest, RequestOptions options) throws IOException {
return performRequestAndParseEntity(getRequest, RequestConverters::get, options, GetResponse::fromXContent, singleton(404));
}
/**
* Retrieves a document by id using the Get API.
* *
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html">Get API on elastic.co</a> * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html">Get API on elastic.co</a>
* @deprecated Prefer {@link #get(GetRequest, RequestOptions)}
*/ */
@Deprecated
public final GetResponse get(GetRequest getRequest, Header... headers) throws IOException { public final GetResponse get(GetRequest getRequest, Header... headers) throws IOException {
return performRequestAndParseEntity(getRequest, RequestConverters::get, GetResponse::fromXContent, singleton(404), headers); return performRequestAndParseEntity(getRequest, RequestConverters::get, GetResponse::fromXContent, singleton(404), headers);
} }
/** /**
* Asynchronously retrieves a document by id using the Get API * Asynchronously retrieves a document by id using the Get API.
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html">Get API on elastic.co</a>
* @param getRequest 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 getAsync(GetRequest getRequest, RequestOptions options, ActionListener<GetResponse> listener) {
performRequestAsyncAndParseEntity(getRequest, RequestConverters::get, options, GetResponse::fromXContent, listener,
singleton(404));
}
/**
* Asynchronously retrieves a document by id using the Get API.
* *
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html">Get API on elastic.co</a> * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html">Get API on elastic.co</a>
* @deprecated Prefer {@link #getAsync(GetRequest, RequestOptions, ActionListener)}
*/ */
@Deprecated
public final void getAsync(GetRequest getRequest, ActionListener<GetResponse> listener, Header... headers) { public final void getAsync(GetRequest getRequest, ActionListener<GetResponse> listener, Header... headers) {
performRequestAsyncAndParseEntity(getRequest, RequestConverters::get, GetResponse::fromXContent, listener, performRequestAsyncAndParseEntity(getRequest, RequestConverters::get, GetResponse::fromXContent, listener,
singleton(404), headers); singleton(404), headers);
} }
/** /**
* Retrieves multiple documents by id using the Multi Get API * Retrieves multiple documents by id using the Multi Get API.
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-multi-get.html">Multi Get API on elastic.co</a>
* @param multiGetRequest 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 MultiGetResponse multiGet(MultiGetRequest multiGetRequest, RequestOptions options) throws IOException {
return performRequestAndParseEntity(multiGetRequest, RequestConverters::multiGet, options, MultiGetResponse::fromXContent,
singleton(404));
}
/**
* Retrieves multiple documents by id using the Multi Get API.
* *
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-multi-get.html">Multi Get API on elastic.co</a> * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-multi-get.html">Multi Get API on elastic.co</a>
* @deprecated Prefer {@link #multiGet(MultiGetRequest, RequestOptions)}
*/ */
@Deprecated
public final MultiGetResponse multiGet(MultiGetRequest multiGetRequest, Header... headers) throws IOException { public final MultiGetResponse multiGet(MultiGetRequest multiGetRequest, Header... headers) throws IOException {
return performRequestAndParseEntity(multiGetRequest, RequestConverters::multiGet, MultiGetResponse::fromXContent, return performRequestAndParseEntity(multiGetRequest, RequestConverters::multiGet, MultiGetResponse::fromXContent,
singleton(404), headers); singleton(404), headers);
} }
/** /**
* Asynchronously retrieves multiple documents by id using the Multi Get API * Asynchronously retrieves multiple documents by id using the Multi Get API.
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-multi-get.html">Multi Get API on elastic.co</a>
* @param multiGetRequest 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 multiGetAsync(MultiGetRequest multiGetRequest, RequestOptions options, ActionListener<MultiGetResponse> listener) {
performRequestAsyncAndParseEntity(multiGetRequest, RequestConverters::multiGet, options, MultiGetResponse::fromXContent, listener,
singleton(404));
}
/**
* Asynchronously retrieves multiple documents by id using the Multi Get API.
* *
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-multi-get.html">Multi Get API on elastic.co</a> * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-multi-get.html">Multi Get API on elastic.co</a>
* @deprecated Prefer {@link #multiGetAsync(MultiGetRequest, RequestOptions, ActionListener)}
*/ */
@Deprecated
public final void multiGetAsync(MultiGetRequest multiGetRequest, ActionListener<MultiGetResponse> listener, Header... headers) { public final void multiGetAsync(MultiGetRequest multiGetRequest, ActionListener<MultiGetResponse> listener, Header... headers) {
performRequestAsyncAndParseEntity(multiGetRequest, RequestConverters::multiGet, MultiGetResponse::fromXContent, listener, performRequestAsyncAndParseEntity(multiGetRequest, RequestConverters::multiGet, MultiGetResponse::fromXContent, listener,
singleton(404), headers); singleton(404), headers);
} }
/** /**
* Checks for the existence of a document. Returns true if it exists, false otherwise * Checks for the existence of a document. Returns true if it exists, false otherwise.
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html">Get API on elastic.co</a>
* @param getRequest the request
* @param options the request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized
* @return <code>true</code> if the document exists, <code>false</code> otherwise
* @throws IOException in case there is a problem sending the request
*/
public final boolean exists(GetRequest getRequest, RequestOptions options) throws IOException {
return performRequest(getRequest, RequestConverters::exists, options, RestHighLevelClient::convertExistsResponse, emptySet());
}
/**
* Checks for the existence of a document. Returns true if it exists, false otherwise.
* *
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html">Get API on elastic.co</a> * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html">Get API on elastic.co</a>
* @deprecated Prefer {@link #exists(GetRequest, RequestOptions)}
*/ */
@Deprecated
public final boolean exists(GetRequest getRequest, Header... headers) throws IOException { public final boolean exists(GetRequest getRequest, Header... headers) throws IOException {
return performRequest(getRequest, RequestConverters::exists, RestHighLevelClient::convertExistsResponse, emptySet(), headers); return performRequest(getRequest, RequestConverters::exists, RestHighLevelClient::convertExistsResponse, emptySet(), headers);
} }
/** /**
* Asynchronously checks for the existence of a document. Returns true if it exists, false otherwise * Asynchronously checks for the existence of a document. Returns true if it exists, false otherwise.
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html">Get API on elastic.co</a>
* @param getRequest 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 existsAsync(GetRequest getRequest, RequestOptions options, ActionListener<Boolean> listener) {
performRequestAsync(getRequest, RequestConverters::exists, options, RestHighLevelClient::convertExistsResponse, listener,
emptySet());
}
/**
* Asynchronously checks for the existence of a document. Returns true if it exists, false otherwise.
* *
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html">Get API on elastic.co</a> * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html">Get API on elastic.co</a>
* @deprecated Prefer {@link #existsAsync(GetRequest, RequestOptions, ActionListener)}
*/ */
@Deprecated
public final void existsAsync(GetRequest getRequest, ActionListener<Boolean> listener, Header... headers) { public final void existsAsync(GetRequest getRequest, ActionListener<Boolean> listener, Header... headers) {
performRequestAsync(getRequest, RequestConverters::exists, RestHighLevelClient::convertExistsResponse, listener, performRequestAsync(getRequest, RequestConverters::exists, RestHighLevelClient::convertExistsResponse, listener,
emptySet(), headers); emptySet(), headers);
} }
/** /**
* Index a document using the Index API * Index a document using the Index API.
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html">Index API on elastic.co</a>
* @param indexRequest 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 IndexResponse index(IndexRequest indexRequest, RequestOptions options) throws IOException {
return performRequestAndParseEntity(indexRequest, RequestConverters::index, options, IndexResponse::fromXContent, emptySet());
}
/**
* Index a document using the Index API.
* *
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html">Index API on elastic.co</a> * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html">Index API on elastic.co</a>
* @deprecated Prefer {@link #index(IndexRequest, RequestOptions)}
*/ */
@Deprecated
public final IndexResponse index(IndexRequest indexRequest, Header... headers) throws IOException { public final IndexResponse index(IndexRequest indexRequest, Header... headers) throws IOException {
return performRequestAndParseEntity(indexRequest, RequestConverters::index, IndexResponse::fromXContent, emptySet(), headers); return performRequestAndParseEntity(indexRequest, RequestConverters::index, IndexResponse::fromXContent, emptySet(), headers);
} }
/** /**
* Asynchronously index a document using the Index API * Asynchronously index a document using the Index API.
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html">Index API on elastic.co</a>
* @param indexRequest 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 indexAsync(IndexRequest indexRequest, RequestOptions options, ActionListener<IndexResponse> listener) {
performRequestAsyncAndParseEntity(indexRequest, RequestConverters::index, options, IndexResponse::fromXContent, listener,
emptySet());
}
/**
* Asynchronously index a document using the Index API.
* *
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html">Index API on elastic.co</a> * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html">Index API on elastic.co</a>
* @deprecated Prefer {@link #indexAsync(IndexRequest, RequestOptions, ActionListener)}
*/ */
@Deprecated
public final void indexAsync(IndexRequest indexRequest, ActionListener<IndexResponse> listener, Header... headers) { public final void indexAsync(IndexRequest indexRequest, ActionListener<IndexResponse> listener, Header... headers) {
performRequestAsyncAndParseEntity(indexRequest, RequestConverters::index, IndexResponse::fromXContent, listener, performRequestAsyncAndParseEntity(indexRequest, RequestConverters::index, IndexResponse::fromXContent, listener,
emptySet(), headers); emptySet(), headers);
} }
/** /**
* Updates a document using the Update API * Updates a document using the Update API.
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html">Update API on elastic.co</a>
* @param updateRequest 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 UpdateResponse update(UpdateRequest updateRequest, RequestOptions options) throws IOException {
return performRequestAndParseEntity(updateRequest, RequestConverters::update, options, UpdateResponse::fromXContent, emptySet());
}
/**
* Updates a document using the Update API.
* <p> * <p>
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html">Update API on elastic.co</a> * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html">Update API on elastic.co</a>
* @deprecated Prefer {@link #update(UpdateRequest, RequestOptions)}
*/ */
@Deprecated
public final UpdateResponse update(UpdateRequest updateRequest, Header... headers) throws IOException { public final UpdateResponse update(UpdateRequest updateRequest, Header... headers) throws IOException {
return performRequestAndParseEntity(updateRequest, RequestConverters::update, UpdateResponse::fromXContent, emptySet(), headers); return performRequestAndParseEntity(updateRequest, RequestConverters::update, UpdateResponse::fromXContent, emptySet(), headers);
} }
/** /**
* Asynchronously updates a document using the Update API * Asynchronously updates a document using the Update API.
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html">Update API on elastic.co</a>
* @param updateRequest 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 updateAsync(UpdateRequest updateRequest, RequestOptions options, ActionListener<UpdateResponse> listener) {
performRequestAsyncAndParseEntity(updateRequest, RequestConverters::update, options, UpdateResponse::fromXContent, listener,
emptySet());
}
/**
* Asynchronously updates a document using the Update API.
* <p> * <p>
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html">Update API on elastic.co</a> * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html">Update API on elastic.co</a>
* @deprecated Prefer {@link #updateAsync(UpdateRequest, RequestOptions, ActionListener)}
*/ */
@Deprecated
public final void updateAsync(UpdateRequest updateRequest, ActionListener<UpdateResponse> listener, Header... headers) { public final void updateAsync(UpdateRequest updateRequest, ActionListener<UpdateResponse> listener, Header... headers) {
performRequestAsyncAndParseEntity(updateRequest, RequestConverters::update, UpdateResponse::fromXContent, listener, performRequestAsyncAndParseEntity(updateRequest, RequestConverters::update, UpdateResponse::fromXContent, listener,
emptySet(), headers); emptySet(), headers);
} }
/** /**
* Deletes a document by id using the Delete API * Deletes a document by id using the Delete API.
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete.html">Delete API on elastic.co</a>
* @param deleteRequest the reuqest
* @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 DeleteResponse delete(DeleteRequest deleteRequest, RequestOptions options) throws IOException {
return performRequestAndParseEntity(deleteRequest, RequestConverters::delete, options, DeleteResponse::fromXContent,
singleton(404));
}
/**
* Deletes a document by id using the Delete API.
* *
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete.html">Delete API on elastic.co</a> * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete.html">Delete API on elastic.co</a>
* @deprecated Prefer {@link #delete(DeleteRequest, RequestOptions)}
*/ */
@Deprecated
public final DeleteResponse delete(DeleteRequest deleteRequest, Header... headers) throws IOException { public final DeleteResponse delete(DeleteRequest deleteRequest, Header... headers) throws IOException {
return performRequestAndParseEntity(deleteRequest, RequestConverters::delete, DeleteResponse::fromXContent, return performRequestAndParseEntity(deleteRequest, RequestConverters::delete, DeleteResponse::fromXContent,
singleton(404), headers); singleton(404), headers);
} }
/** /**
* Asynchronously deletes a document by id using the Delete API * Asynchronously deletes a document by id using the Delete API.
*
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete.html">Delete API on elastic.co</a> * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete.html">Delete API on elastic.co</a>
* @param deleteRequest 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 deleteAsync(DeleteRequest deleteRequest, ActionListener<DeleteResponse> listener, Header... headers) { public final void deleteAsync(DeleteRequest deleteRequest, RequestOptions options, ActionListener<DeleteResponse> listener) {
performRequestAsyncAndParseEntity(deleteRequest, RequestConverters::delete, DeleteResponse::fromXContent, listener, performRequestAsyncAndParseEntity(deleteRequest, RequestConverters::delete, options, DeleteResponse::fromXContent, listener,
Collections.singleton(404), headers); Collections.singleton(404));
} }
/** /**
* Executes a search using the Search API * Asynchronously deletes a document by id using the Delete API.
*
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete.html">Delete API on elastic.co</a>
* @deprecated Prefer {@link #deleteAsync(DeleteRequest, RequestOptions, ActionListener)}
*/
@Deprecated
public final void deleteAsync(DeleteRequest deleteRequest, ActionListener<DeleteResponse> listener, Header... headers) {
performRequestAsyncAndParseEntity(deleteRequest, RequestConverters::delete, DeleteResponse::fromXContent, listener,
Collections.singleton(404), headers);
}
/**
* Executes a search request using the Search API.
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html">Search API on elastic.co</a>
* @param searchRequest 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 SearchResponse search(SearchRequest searchRequest, RequestOptions options) throws IOException {
return performRequestAndParseEntity(searchRequest, RequestConverters::search, options, SearchResponse::fromXContent, emptySet());
}
/**
* Executes a search using the Search API.
* *
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html">Search API on elastic.co</a> * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html">Search API on elastic.co</a>
* @deprecated Prefer {@link #search(SearchRequest, RequestOptions)}
*/ */
@Deprecated
public final SearchResponse search(SearchRequest searchRequest, Header... headers) throws IOException { public final SearchResponse search(SearchRequest searchRequest, Header... headers) throws IOException {
return performRequestAndParseEntity(searchRequest, RequestConverters::search, SearchResponse::fromXContent, emptySet(), headers); return performRequestAndParseEntity(searchRequest, RequestConverters::search, SearchResponse::fromXContent, emptySet(), headers);
} }
/** /**
* Asynchronously executes a search using the Search API * Asynchronously executes a search using the Search API.
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html">Search API on elastic.co</a>
* @param searchRequest 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 searchAsync(SearchRequest searchRequest, RequestOptions options, ActionListener<SearchResponse> listener) {
performRequestAsyncAndParseEntity(searchRequest, RequestConverters::search, options, SearchResponse::fromXContent, listener,
emptySet());
}
/**
* Asynchronously executes a search using the Search API.
* *
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html">Search API on elastic.co</a> * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html">Search API on elastic.co</a>
* @deprecated Prefer {@link #searchAsync(SearchRequest, RequestOptions, ActionListener)}
*/ */
@Deprecated
public final void searchAsync(SearchRequest searchRequest, ActionListener<SearchResponse> listener, Header... headers) { public final void searchAsync(SearchRequest searchRequest, ActionListener<SearchResponse> listener, Header... headers) {
performRequestAsyncAndParseEntity(searchRequest, RequestConverters::search, SearchResponse::fromXContent, listener, performRequestAsyncAndParseEntity(searchRequest, RequestConverters::search, SearchResponse::fromXContent, listener,
emptySet(), headers); emptySet(), headers);
} }
/** /**
* Executes a multi search using the msearch API * Executes a multi search using the msearch API.
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-multi-search.html">Multi search API on
* elastic.co</a>
* @param multiSearchRequest 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 MultiSearchResponse multiSearch(MultiSearchRequest multiSearchRequest, RequestOptions options) throws IOException {
return performRequestAndParseEntity(multiSearchRequest, RequestConverters::multiSearch, options, MultiSearchResponse::fromXContext,
emptySet());
}
/**
* Executes a multi search using the msearch API.
* *
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-multi-search.html">Multi search API on * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-multi-search.html">Multi search API on
* elastic.co</a> * elastic.co</a>
* @deprecated Prefer {@link #multiSearch(MultiSearchRequest, RequestOptions)}
*/ */
@Deprecated
public final MultiSearchResponse multiSearch(MultiSearchRequest multiSearchRequest, Header... headers) throws IOException { public final MultiSearchResponse multiSearch(MultiSearchRequest multiSearchRequest, Header... headers) throws IOException {
return performRequestAndParseEntity(multiSearchRequest, RequestConverters::multiSearch, MultiSearchResponse::fromXContext, return performRequestAndParseEntity(multiSearchRequest, RequestConverters::multiSearch, MultiSearchResponse::fromXContext,
emptySet(), headers); emptySet(), headers);
} }
/** /**
* Asynchronously executes a multi search using the msearch API * Asynchronously executes a multi search using the msearch API.
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-multi-search.html">Multi search API on
* elastic.co</a>
* @param searchRequest 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 multiSearchAsync(MultiSearchRequest searchRequest, RequestOptions options,
ActionListener<MultiSearchResponse> listener) {
performRequestAsyncAndParseEntity(searchRequest, RequestConverters::multiSearch, options, MultiSearchResponse::fromXContext,
listener, emptySet());
}
/**
* Asynchronously executes a multi search using the msearch API.
* *
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-multi-search.html">Multi search API on * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-multi-search.html">Multi search API on
* elastic.co</a> * elastic.co</a>
* @deprecated Prefer {@link #multiSearchAsync(MultiSearchRequest, RequestOptions, ActionListener)}
*/ */
@Deprecated
public final void multiSearchAsync(MultiSearchRequest searchRequest, ActionListener<MultiSearchResponse> listener, Header... headers) { public final void multiSearchAsync(MultiSearchRequest searchRequest, ActionListener<MultiSearchResponse> listener, Header... headers) {
performRequestAsyncAndParseEntity(searchRequest, RequestConverters::multiSearch, MultiSearchResponse::fromXContext, listener, performRequestAsyncAndParseEntity(searchRequest, RequestConverters::multiSearch, MultiSearchResponse::fromXContext, listener,
emptySet(), headers); emptySet(), headers);
} }
/** /**
* Executes a search using the Search Scroll API * Executes a search using the Search Scroll API.
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html">Search Scroll
* API on elastic.co</a>
* @param searchScrollRequest 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 SearchResponse searchScroll(SearchScrollRequest searchScrollRequest, RequestOptions options) throws IOException {
return performRequestAndParseEntity(searchScrollRequest, RequestConverters::searchScroll, options, SearchResponse::fromXContent,
emptySet());
}
/**
* Executes a search using the Search Scroll API.
* *
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html">Search Scroll * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html">Search Scroll
* API on elastic.co</a> * API on elastic.co</a>
* @deprecated Prefer {@link #searchScroll(SearchScrollRequest, RequestOptions)}
*/ */
@Deprecated
public final SearchResponse searchScroll(SearchScrollRequest searchScrollRequest, Header... headers) throws IOException { public final SearchResponse searchScroll(SearchScrollRequest searchScrollRequest, Header... headers) throws IOException {
return performRequestAndParseEntity(searchScrollRequest, RequestConverters::searchScroll, SearchResponse::fromXContent, return performRequestAndParseEntity(searchScrollRequest, RequestConverters::searchScroll, SearchResponse::fromXContent,
emptySet(), headers); emptySet(), headers);
} }
/** /**
* Asynchronously executes a search using the Search Scroll API * Asynchronously executes a search using the Search Scroll API.
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html">Search Scroll
* API on elastic.co</a>
* @param searchScrollRequest 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 searchScrollAsync(SearchScrollRequest searchScrollRequest, RequestOptions options,
ActionListener<SearchResponse> listener) {
performRequestAsyncAndParseEntity(searchScrollRequest, RequestConverters::searchScroll, options, SearchResponse::fromXContent,
listener, emptySet());
}
/**
* Asynchronously executes a search using the Search Scroll API.
* *
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html">Search Scroll * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html">Search Scroll
* API on elastic.co</a> * API on elastic.co</a>
* @deprecated Prefer {@link #searchScrollAsync(SearchScrollRequest, RequestOptions, ActionListener)}
*/ */
@Deprecated
public final void searchScrollAsync(SearchScrollRequest searchScrollRequest, public final void searchScrollAsync(SearchScrollRequest searchScrollRequest,
ActionListener<SearchResponse> listener, Header... headers) { ActionListener<SearchResponse> listener, Header... headers) {
performRequestAsyncAndParseEntity(searchScrollRequest, RequestConverters::searchScroll, SearchResponse::fromXContent, performRequestAsyncAndParseEntity(searchScrollRequest, RequestConverters::searchScroll, SearchResponse::fromXContent,
@ -521,22 +814,54 @@ public class RestHighLevelClient implements Closeable {
} }
/** /**
* Clears one or more scroll ids using the Clear Scroll API * Clears one or more scroll ids using the Clear Scroll API.
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html#_clear_scroll_api">
* Clear Scroll API on elastic.co</a>
* @param clearScrollRequest 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 ClearScrollResponse clearScroll(ClearScrollRequest clearScrollRequest, RequestOptions options) throws IOException {
return performRequestAndParseEntity(clearScrollRequest, RequestConverters::clearScroll, options, ClearScrollResponse::fromXContent,
emptySet());
}
/**
* Clears one or more scroll ids using the Clear Scroll API.
* *
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html#_clear_scroll_api"> * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html#_clear_scroll_api">
* Clear Scroll API on elastic.co</a> * Clear Scroll API on elastic.co</a>
* @deprecated Prefer {@link #clearScroll(ClearScrollRequest, RequestOptions)}
*/ */
@Deprecated
public final ClearScrollResponse clearScroll(ClearScrollRequest clearScrollRequest, Header... headers) throws IOException { public final ClearScrollResponse clearScroll(ClearScrollRequest clearScrollRequest, Header... headers) throws IOException {
return performRequestAndParseEntity(clearScrollRequest, RequestConverters::clearScroll, ClearScrollResponse::fromXContent, return performRequestAndParseEntity(clearScrollRequest, RequestConverters::clearScroll, ClearScrollResponse::fromXContent,
emptySet(), headers); emptySet(), headers);
} }
/** /**
* Asynchronously clears one or more scroll ids using the Clear Scroll API * Asynchronously clears one or more scroll ids using the Clear Scroll API.
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html#_clear_scroll_api">
* Clear Scroll API on elastic.co</a>
* @param clearScrollRequest the reuqest
* @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 clearScrollAsync(ClearScrollRequest clearScrollRequest, RequestOptions options,
ActionListener<ClearScrollResponse> listener) {
performRequestAsyncAndParseEntity(clearScrollRequest, RequestConverters::clearScroll, options, ClearScrollResponse::fromXContent,
listener, emptySet());
}
/**
* Asynchronously clears one or more scroll ids using the Clear Scroll API.
* *
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html#_clear_scroll_api"> * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html#_clear_scroll_api">
* Clear Scroll API on elastic.co</a> * Clear Scroll API on elastic.co</a>
* @deprecated Prefer {@link #clearScrollAsync(ClearScrollRequest, RequestOptions, ActionListener)}
*/ */
@Deprecated
public final void clearScrollAsync(ClearScrollRequest clearScrollRequest, public final void clearScrollAsync(ClearScrollRequest clearScrollRequest,
ActionListener<ClearScrollResponse> listener, Header... headers) { ActionListener<ClearScrollResponse> listener, Header... headers) {
performRequestAsyncAndParseEntity(clearScrollRequest, RequestConverters::clearScroll, ClearScrollResponse::fromXContent, performRequestAsyncAndParseEntity(clearScrollRequest, RequestConverters::clearScroll, ClearScrollResponse::fromXContent,
@ -545,47 +870,79 @@ public class RestHighLevelClient implements Closeable {
/** /**
* Executes a request using the Search Template API. * Executes a request using the Search Template API.
*
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-template.html">Search Template API * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-template.html">Search Template API
* on elastic.co</a>. * on elastic.co</a>.
* @param searchTemplateRequest 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 SearchTemplateResponse searchTemplate(SearchTemplateRequest searchTemplateRequest, public final SearchTemplateResponse searchTemplate(SearchTemplateRequest searchTemplateRequest,
Header... headers) throws IOException { RequestOptions options) throws IOException {
return performRequestAndParseEntity(searchTemplateRequest, RequestConverters::searchTemplate, return performRequestAndParseEntity(searchTemplateRequest, RequestConverters::searchTemplate, options,
SearchTemplateResponse::fromXContent, emptySet(), headers); SearchTemplateResponse::fromXContent, emptySet());
} }
/** /**
* Asynchronously executes a request using the Search Template API * Asynchronously executes a request using the Search Template API.
* *
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-template.html">Search Template API * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-template.html">Search Template API
* on elastic.co</a>. * on elastic.co</a>.
*/ */
public final void searchTemplateAsync(SearchTemplateRequest searchTemplateRequest, public final void searchTemplateAsync(SearchTemplateRequest searchTemplateRequest, RequestOptions options,
ActionListener<SearchTemplateResponse> listener, ActionListener<SearchTemplateResponse> listener) {
Header... headers) { performRequestAsyncAndParseEntity(searchTemplateRequest, RequestConverters::searchTemplate, options,
performRequestAsyncAndParseEntity(searchTemplateRequest, RequestConverters::searchTemplate, SearchTemplateResponse::fromXContent, listener, emptySet());
SearchTemplateResponse::fromXContent, listener, emptySet(), headers);
} }
/**
* Executes a request using the Ranking Evaluation API.
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-rank-eval.html">Ranking Evaluation API
* on elastic.co</a>
* @param rankEvalRequest 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 RankEvalResponse rankEval(RankEvalRequest rankEvalRequest, RequestOptions options) throws IOException {
return performRequestAndParseEntity(rankEvalRequest, RequestConverters::rankEval, options, RankEvalResponse::fromXContent,
emptySet());
}
/** /**
* Executes a request using the Ranking Evaluation API. * Executes a request using the Ranking Evaluation API.
* *
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-rank-eval.html">Ranking Evaluation API * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-rank-eval.html">Ranking Evaluation API
* on elastic.co</a> * on elastic.co</a>
* @deprecated Prefer {@link #rankEval(RankEvalRequest, RequestOptions)}
*/ */
@Deprecated
public final RankEvalResponse rankEval(RankEvalRequest rankEvalRequest, Header... headers) throws IOException { public final RankEvalResponse rankEval(RankEvalRequest rankEvalRequest, Header... headers) throws IOException {
return performRequestAndParseEntity(rankEvalRequest, RequestConverters::rankEval, RankEvalResponse::fromXContent, return performRequestAndParseEntity(rankEvalRequest, RequestConverters::rankEval, RankEvalResponse::fromXContent,
emptySet(), headers); emptySet(), headers);
} }
/**
* Asynchronously executes a request using the Ranking Evaluation API.
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-rank-eval.html">Ranking Evaluation API
* on elastic.co</a>
* @param rankEvalRequest 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 rankEvalAsync(RankEvalRequest rankEvalRequest, RequestOptions options, ActionListener<RankEvalResponse> listener) {
performRequestAsyncAndParseEntity(rankEvalRequest, RequestConverters::rankEval, options, RankEvalResponse::fromXContent, listener,
emptySet());
}
/** /**
* Asynchronously executes a request using the Ranking Evaluation API. * Asynchronously executes a request using the Ranking Evaluation API.
* *
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-rank-eval.html">Ranking Evaluation API * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-rank-eval.html">Ranking Evaluation API
* on elastic.co</a> * on elastic.co</a>
* @deprecated Prefer {@link #rankEvalAsync(RankEvalRequest, RequestOptions, ActionListener)}
*/ */
@Deprecated
public final void rankEvalAsync(RankEvalRequest rankEvalRequest, ActionListener<RankEvalResponse> listener, Header... headers) { public final void rankEvalAsync(RankEvalRequest rankEvalRequest, ActionListener<RankEvalResponse> listener, Header... headers) {
performRequestAsyncAndParseEntity(rankEvalRequest, RequestConverters::rankEval, RankEvalResponse::fromXContent, listener, performRequestAsyncAndParseEntity(rankEvalRequest, RequestConverters::rankEval, RankEvalResponse::fromXContent, listener,
emptySet(), headers); emptySet(), headers);
@ -593,27 +950,31 @@ public class RestHighLevelClient implements Closeable {
/** /**
* Executes a request using the Field Capabilities API. * Executes a request using the Field Capabilities API.
*
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-field-caps.html">Field Capabilities API * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-field-caps.html">Field Capabilities API
* on elastic.co</a>. * on elastic.co</a>.
* @param fieldCapabilitiesRequest 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 FieldCapabilitiesResponse fieldCaps(FieldCapabilitiesRequest fieldCapabilitiesRequest, public final FieldCapabilitiesResponse fieldCaps(FieldCapabilitiesRequest fieldCapabilitiesRequest,
Header... headers) throws IOException { RequestOptions options) throws IOException {
return performRequestAndParseEntity(fieldCapabilitiesRequest, RequestConverters::fieldCaps, return performRequestAndParseEntity(fieldCapabilitiesRequest, RequestConverters::fieldCaps, options,
FieldCapabilitiesResponse::fromXContent, emptySet(), headers); FieldCapabilitiesResponse::fromXContent, emptySet());
} }
/** /**
* Asynchronously executes a request using the Field Capabilities API. * Asynchronously executes a request using the Field Capabilities API.
*
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-field-caps.html">Field Capabilities API * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-field-caps.html">Field Capabilities API
* on elastic.co</a>. * on elastic.co</a>.
* @param fieldCapabilitiesRequest 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 fieldCapsAsync(FieldCapabilitiesRequest fieldCapabilitiesRequest, public final void fieldCapsAsync(FieldCapabilitiesRequest fieldCapabilitiesRequest, RequestOptions options,
ActionListener<FieldCapabilitiesResponse> listener, ActionListener<FieldCapabilitiesResponse> listener) {
Header... headers) { performRequestAsyncAndParseEntity(fieldCapabilitiesRequest, RequestConverters::fieldCaps, options,
performRequestAsyncAndParseEntity(fieldCapabilitiesRequest, RequestConverters::fieldCaps, FieldCapabilitiesResponse::fromXContent, listener, emptySet());
FieldCapabilitiesResponse::fromXContent, listener, emptySet(), headers);
} }
@Deprecated @Deprecated

View File

@ -19,7 +19,6 @@
package org.elasticsearch.client; package org.elasticsearch.client;
import org.apache.http.Header;
import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.admin.cluster.repositories.delete.DeleteRepositoryRequest; import org.elasticsearch.action.admin.cluster.repositories.delete.DeleteRepositoryRequest;
import org.elasticsearch.action.admin.cluster.repositories.delete.DeleteRepositoryResponse; import org.elasticsearch.action.admin.cluster.repositories.delete.DeleteRepositoryResponse;
@ -49,97 +48,117 @@ public final class SnapshotClient {
/** /**
* Gets a list of snapshot repositories. If the list of repositories is empty or it contains a single element "_all", all * Gets a list of snapshot repositories. If the list of repositories is empty or it contains a single element "_all", all
* registered repositories are returned. * registered repositories are returned.
* <p>
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html"> Snapshot and Restore * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html"> Snapshot and Restore
* API on elastic.co</a> * API on elastic.co</a>
* @param getRepositoriesRequest 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 GetRepositoriesResponse getRepositories(GetRepositoriesRequest getRepositoriesRequest, Header... headers) public GetRepositoriesResponse getRepositories(GetRepositoriesRequest getRepositoriesRequest, RequestOptions options)
throws IOException { throws IOException {
return restHighLevelClient.performRequestAndParseEntity(getRepositoriesRequest, RequestConverters::getRepositories, return restHighLevelClient.performRequestAndParseEntity(getRepositoriesRequest, RequestConverters::getRepositories, options,
GetRepositoriesResponse::fromXContent, emptySet(), headers); GetRepositoriesResponse::fromXContent, emptySet());
} }
/** /**
* Asynchronously gets a list of snapshot repositories. If the list of repositories is empty or it contains a single element "_all", all * Asynchronously gets a list of snapshot repositories. If the list of repositories is empty or it contains a single element "_all", all
* registered repositories are returned. * registered repositories are returned.
* <p>
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html"> Snapshot and Restore * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html"> Snapshot and Restore
* API on elastic.co</a> * API on elastic.co</a>
* @param getRepositoriesRequest 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 void getRepositoriesAsync(GetRepositoriesRequest getRepositoriesRequest, public void getRepositoriesAsync(GetRepositoriesRequest getRepositoriesRequest, RequestOptions options,
ActionListener<GetRepositoriesResponse> listener, Header... headers) { ActionListener<GetRepositoriesResponse> listener) {
restHighLevelClient.performRequestAsyncAndParseEntity(getRepositoriesRequest, RequestConverters::getRepositories, restHighLevelClient.performRequestAsyncAndParseEntity(getRepositoriesRequest, RequestConverters::getRepositories, options,
GetRepositoriesResponse::fromXContent, listener, emptySet(), headers); GetRepositoriesResponse::fromXContent, listener, emptySet());
} }
/** /**
* Creates a snapshot repository. * Creates a snapshot repository.
* <p>
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html"> Snapshot and Restore * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html"> Snapshot and Restore
* API on elastic.co</a> * API on elastic.co</a>
* @param putRepositoryRequest 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 PutRepositoryResponse createRepository(PutRepositoryRequest putRepositoryRequest, Header... headers) throws IOException { public PutRepositoryResponse createRepository(PutRepositoryRequest putRepositoryRequest, RequestOptions options) throws IOException {
return restHighLevelClient.performRequestAndParseEntity(putRepositoryRequest, RequestConverters::createRepository, return restHighLevelClient.performRequestAndParseEntity(putRepositoryRequest, RequestConverters::createRepository, options,
PutRepositoryResponse::fromXContent, emptySet(), headers); PutRepositoryResponse::fromXContent, emptySet());
} }
/** /**
* Asynchronously creates a snapshot repository. * Asynchronously creates a snapshot repository.
* <p>
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html"> Snapshot and Restore * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html"> Snapshot and Restore
* API on elastic.co</a> * API on elastic.co</a>
* @param putRepositoryRequest 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 void createRepositoryAsync(PutRepositoryRequest putRepositoryRequest, public void createRepositoryAsync(PutRepositoryRequest putRepositoryRequest, RequestOptions options,
ActionListener<PutRepositoryResponse> listener, Header... headers) { ActionListener<PutRepositoryResponse> listener) {
restHighLevelClient.performRequestAsyncAndParseEntity(putRepositoryRequest, RequestConverters::createRepository, restHighLevelClient.performRequestAsyncAndParseEntity(putRepositoryRequest, RequestConverters::createRepository, options,
PutRepositoryResponse::fromXContent, listener, emptySet(), headers); PutRepositoryResponse::fromXContent, listener, emptySet());
} }
/** /**
* Deletes a snapshot repository. * Deletes a snapshot repository.
* <p>
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html"> Snapshot and Restore * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html"> Snapshot and Restore
* API on elastic.co</a> * API on elastic.co</a>
* @param deleteRepositoryRequest 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 DeleteRepositoryResponse deleteRepository(DeleteRepositoryRequest deleteRepositoryRequest, Header... headers) public DeleteRepositoryResponse deleteRepository(DeleteRepositoryRequest deleteRepositoryRequest, RequestOptions options)
throws IOException { throws IOException {
return restHighLevelClient.performRequestAndParseEntity(deleteRepositoryRequest, RequestConverters::deleteRepository, return restHighLevelClient.performRequestAndParseEntity(deleteRepositoryRequest, RequestConverters::deleteRepository, options,
DeleteRepositoryResponse::fromXContent, emptySet(), headers); DeleteRepositoryResponse::fromXContent, emptySet());
} }
/** /**
* Asynchronously deletes a snapshot repository. * Asynchronously deletes a snapshot repository.
* <p>
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html"> Snapshot and Restore * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html"> Snapshot and Restore
* API on elastic.co</a> * API on elastic.co</a>
* @param deleteRepositoryRequest 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 void deleteRepositoryAsync(DeleteRepositoryRequest deleteRepositoryRequest, public void deleteRepositoryAsync(DeleteRepositoryRequest deleteRepositoryRequest, RequestOptions options,
ActionListener<DeleteRepositoryResponse> listener, Header... headers) { ActionListener<DeleteRepositoryResponse> listener) {
restHighLevelClient.performRequestAsyncAndParseEntity(deleteRepositoryRequest, RequestConverters::deleteRepository, restHighLevelClient.performRequestAsyncAndParseEntity(deleteRepositoryRequest, RequestConverters::deleteRepository, options,
DeleteRepositoryResponse::fromXContent, listener, emptySet(), headers); DeleteRepositoryResponse::fromXContent, listener, emptySet());
} }
/** /**
* Verifies a snapshot repository. * Verifies a snapshot repository.
* <p>
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html"> Snapshot and Restore * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html"> Snapshot and Restore
* API on elastic.co</a> * API on elastic.co</a>
* @param verifyRepositoryRequest 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 VerifyRepositoryResponse verifyRepository(VerifyRepositoryRequest verifyRepositoryRequest, Header... headers) public VerifyRepositoryResponse verifyRepository(VerifyRepositoryRequest verifyRepositoryRequest, RequestOptions options)
throws IOException { throws IOException {
return restHighLevelClient.performRequestAndParseEntity(verifyRepositoryRequest, RequestConverters::verifyRepository, return restHighLevelClient.performRequestAndParseEntity(verifyRepositoryRequest, RequestConverters::verifyRepository, options,
VerifyRepositoryResponse::fromXContent, emptySet(), headers); VerifyRepositoryResponse::fromXContent, emptySet());
} }
/** /**
* Asynchronously verifies a snapshot repository. * Asynchronously verifies a snapshot repository.
* <p>
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html"> Snapshot and Restore * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html"> Snapshot and Restore
* API on elastic.co</a> * API on elastic.co</a>
* @param verifyRepositoryRequest 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 void verifyRepositoryAsync(VerifyRepositoryRequest verifyRepositoryRequest, public void verifyRepositoryAsync(VerifyRepositoryRequest verifyRepositoryRequest, RequestOptions options,
ActionListener<VerifyRepositoryResponse> listener, Header... headers) { ActionListener<VerifyRepositoryResponse> listener) {
restHighLevelClient.performRequestAsyncAndParseEntity(verifyRepositoryRequest, RequestConverters::verifyRepository, restHighLevelClient.performRequestAsyncAndParseEntity(verifyRepositoryRequest, RequestConverters::verifyRepository, options,
VerifyRepositoryResponse::fromXContent, listener, emptySet(), headers); VerifyRepositoryResponse::fromXContent, listener, emptySet());
} }
} }

View File

@ -19,8 +19,9 @@
package org.elasticsearch.client; package org.elasticsearch.client;
import org.apache.http.Header;
import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.admin.cluster.node.tasks.cancel.CancelTasksRequest;
import org.elasticsearch.action.admin.cluster.node.tasks.cancel.CancelTasksResponse;
import org.elasticsearch.action.admin.cluster.node.tasks.list.ListTasksRequest; import org.elasticsearch.action.admin.cluster.node.tasks.list.ListTasksRequest;
import org.elasticsearch.action.admin.cluster.node.tasks.list.ListTasksResponse; import org.elasticsearch.action.admin.cluster.node.tasks.list.ListTasksResponse;
@ -33,7 +34,7 @@ import static java.util.Collections.emptySet;
* <p> * <p>
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/tasks.html">Task Management API on elastic.co</a> * See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/tasks.html">Task Management API on elastic.co</a>
*/ */
public class TasksClient { public final class TasksClient {
private final RestHighLevelClient restHighLevelClient; private final RestHighLevelClient restHighLevelClient;
TasksClient(RestHighLevelClient restHighLevelClient) { TasksClient(RestHighLevelClient restHighLevelClient) {
@ -41,24 +42,70 @@ public class TasksClient {
} }
/** /**
* Get current tasks using the Task Management API * Get current tasks using the Task Management API.
* <p>
* See * See
* <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/tasks.html"> Task Management API on elastic.co</a> * <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/tasks.html"> Task Management API on elastic.co</a>
* @param request 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 ListTasksResponse list(ListTasksRequest request, Header... headers) throws IOException { public ListTasksResponse list(ListTasksRequest request, RequestOptions options) throws IOException {
return restHighLevelClient.performRequestAndParseEntity(request, RequestConverters::listTasks, ListTasksResponse::fromXContent, return restHighLevelClient.performRequestAndParseEntity(request, RequestConverters::listTasks, options,
emptySet(), headers); ListTasksResponse::fromXContent, emptySet());
} }
/** /**
* Asynchronously get current tasks using the Task Management API * Asynchronously get current tasks using the Task Management API.
* <p>
* See * See
* <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/tasks.html"> Task Management API on elastic.co</a> * <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/tasks.html"> Task Management API on elastic.co</a>
* @param request 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 void listAsync(ListTasksRequest request, ActionListener<ListTasksResponse> listener, Header... headers) { public void listAsync(ListTasksRequest request, RequestOptions options, ActionListener<ListTasksResponse> listener) {
restHighLevelClient.performRequestAsyncAndParseEntity(request, RequestConverters::listTasks, ListTasksResponse::fromXContent, restHighLevelClient.performRequestAsyncAndParseEntity(request, RequestConverters::listTasks, options,
listener, emptySet(), headers); ListTasksResponse::fromXContent, listener, emptySet());
}
/**
* Cancel one or more cluster tasks using the Task Management API.
*
* See
* <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/tasks.html"> Task Management API on elastic.co</a>
* @param cancelTasksRequest 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 CancelTasksResponse cancel(CancelTasksRequest cancelTasksRequest, RequestOptions options ) throws IOException {
return restHighLevelClient.performRequestAndParseEntity(
cancelTasksRequest,
RequestConverters::cancelTasks,
options,
parser -> CancelTasksResponse.fromXContent(parser),
emptySet()
);
}
/**
* Asynchronously cancel one or more cluster tasks using the Task Management API.
*
* See
* <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/tasks.html"> Task Management API on elastic.co</a>
* @param cancelTasksRequest 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 void cancelAsync(CancelTasksRequest cancelTasksRequest, RequestOptions options, ActionListener<CancelTasksResponse> listener) {
restHighLevelClient.performRequestAsyncAndParseEntity(
cancelTasksRequest,
RequestConverters::cancelTasks,
options,
parser -> CancelTasksResponse.fromXContent(parser),
listener,
emptySet()
);
} }
} }

View File

@ -20,8 +20,6 @@
package org.elasticsearch.client; package org.elasticsearch.client;
import com.carrotsearch.randomizedtesting.generators.RandomPicks; import com.carrotsearch.randomizedtesting.generators.RandomPicks;
import org.apache.http.entity.ContentType;
import org.apache.http.nio.entity.NStringEntity;
import org.elasticsearch.action.bulk.BulkItemResponse; import org.elasticsearch.action.bulk.BulkItemResponse;
import org.elasticsearch.action.bulk.BulkProcessor; import org.elasticsearch.action.bulk.BulkProcessor;
import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.action.bulk.BulkRequest;
@ -39,7 +37,6 @@ import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.common.xcontent.json.JsonXContent; import org.elasticsearch.common.xcontent.json.JsonXContent;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@ -81,7 +78,7 @@ public class BulkProcessorIT extends ESRestHighLevelClientTestCase {
assertThat(listener.afterCounts.get(), equalTo(1)); assertThat(listener.afterCounts.get(), equalTo(1));
assertThat(listener.bulkFailures.size(), equalTo(0)); assertThat(listener.bulkFailures.size(), equalTo(0));
assertResponseItems(listener.bulkItems, numDocs); assertResponseItems(listener.bulkItems, numDocs);
assertMultiGetResponse(highLevelClient().multiGet(multiGetRequest), numDocs); assertMultiGetResponse(highLevelClient().multiGet(multiGetRequest, RequestOptions.DEFAULT), numDocs);
} }
} }
@ -107,7 +104,7 @@ public class BulkProcessorIT extends ESRestHighLevelClientTestCase {
assertThat(listener.afterCounts.get(), equalTo(1)); assertThat(listener.afterCounts.get(), equalTo(1));
assertThat(listener.bulkFailures.size(), equalTo(0)); assertThat(listener.bulkFailures.size(), equalTo(0));
assertResponseItems(listener.bulkItems, numDocs); assertResponseItems(listener.bulkItems, numDocs);
assertMultiGetResponse(highLevelClient().multiGet(multiGetRequest), numDocs); assertMultiGetResponse(highLevelClient().multiGet(multiGetRequest, RequestOptions.DEFAULT), numDocs);
} }
} }
@ -159,7 +156,7 @@ public class BulkProcessorIT extends ESRestHighLevelClientTestCase {
assertThat(ids.add(bulkItemResponse.getId()), equalTo(true)); assertThat(ids.add(bulkItemResponse.getId()), equalTo(true));
} }
assertMultiGetResponse(highLevelClient().multiGet(multiGetRequest), numDocs); assertMultiGetResponse(highLevelClient().multiGet(multiGetRequest, RequestOptions.DEFAULT), numDocs);
} }
public void testBulkProcessorWaitOnClose() throws Exception { public void testBulkProcessorWaitOnClose() throws Exception {
@ -190,7 +187,7 @@ public class BulkProcessorIT extends ESRestHighLevelClientTestCase {
} }
assertThat(listener.bulkFailures.size(), equalTo(0)); assertThat(listener.bulkFailures.size(), equalTo(0));
assertResponseItems(listener.bulkItems, numDocs); assertResponseItems(listener.bulkItems, numDocs);
assertMultiGetResponse(highLevelClient().multiGet(multiGetRequest), numDocs); assertMultiGetResponse(highLevelClient().multiGet(multiGetRequest, RequestOptions.DEFAULT), numDocs);
} }
public void testBulkProcessorConcurrentRequestsReadOnlyIndex() throws Exception { public void testBulkProcessorConcurrentRequestsReadOnlyIndex() throws Exception {
@ -267,7 +264,7 @@ public class BulkProcessorIT extends ESRestHighLevelClientTestCase {
} }
} }
assertMultiGetResponse(highLevelClient().multiGet(multiGetRequest), testDocs); assertMultiGetResponse(highLevelClient().multiGet(multiGetRequest, RequestOptions.DEFAULT), testDocs);
} }
private static MultiGetRequest indexDocs(BulkProcessor processor, int numDocs) throws Exception { private static MultiGetRequest indexDocs(BulkProcessor processor, int numDocs) throws Exception {

View File

@ -127,8 +127,8 @@ public class BulkProcessorRetryIT extends ESRestHighLevelClientTestCase {
} }
} }
highLevelClient().indices().refresh(new RefreshRequest()); highLevelClient().indices().refresh(new RefreshRequest(), RequestOptions.DEFAULT);
int multiGetResponsesCount = highLevelClient().multiGet(multiGetRequest).getResponses().length; int multiGetResponsesCount = highLevelClient().multiGet(multiGetRequest, RequestOptions.DEFAULT).getResponses().length;
if (rejectedExecutionExpected) { if (rejectedExecutionExpected) {
assertThat(multiGetResponsesCount, lessThanOrEqualTo(numberOfAsyncOps)); assertThat(multiGetResponsesCount, lessThanOrEqualTo(numberOfAsyncOps));

View File

@ -57,6 +57,7 @@ public class ClusterClientIT extends ESRestHighLevelClientTestCase {
setRequest.persistentSettings(map); setRequest.persistentSettings(map);
ClusterUpdateSettingsResponse setResponse = execute(setRequest, highLevelClient().cluster()::putSettings, ClusterUpdateSettingsResponse setResponse = execute(setRequest, highLevelClient().cluster()::putSettings,
highLevelClient().cluster()::putSettingsAsync, highLevelClient().cluster()::putSettings,
highLevelClient().cluster()::putSettingsAsync); highLevelClient().cluster()::putSettingsAsync);
assertAcked(setResponse); assertAcked(setResponse);
@ -79,6 +80,7 @@ public class ClusterClientIT extends ESRestHighLevelClientTestCase {
resetRequest.persistentSettings("{\"" + persistentSettingKey + "\": null }", XContentType.JSON); resetRequest.persistentSettings("{\"" + persistentSettingKey + "\": null }", XContentType.JSON);
ClusterUpdateSettingsResponse resetResponse = execute(resetRequest, highLevelClient().cluster()::putSettings, ClusterUpdateSettingsResponse resetResponse = execute(resetRequest, highLevelClient().cluster()::putSettings,
highLevelClient().cluster()::putSettingsAsync, highLevelClient().cluster()::putSettings,
highLevelClient().cluster()::putSettingsAsync); highLevelClient().cluster()::putSettingsAsync);
assertThat(resetResponse.getTransientSettings().get(transientSettingKey), equalTo(null)); assertThat(resetResponse.getTransientSettings().get(transientSettingKey), equalTo(null));
@ -100,6 +102,7 @@ public class ClusterClientIT extends ESRestHighLevelClientTestCase {
clusterUpdateSettingsRequest.transientSettings(Settings.builder().put(setting, value).build()); clusterUpdateSettingsRequest.transientSettings(Settings.builder().put(setting, value).build());
ElasticsearchException exception = expectThrows(ElasticsearchException.class, () -> execute(clusterUpdateSettingsRequest, ElasticsearchException exception = expectThrows(ElasticsearchException.class, () -> execute(clusterUpdateSettingsRequest,
highLevelClient().cluster()::putSettings, highLevelClient().cluster()::putSettingsAsync,
highLevelClient().cluster()::putSettings, highLevelClient().cluster()::putSettingsAsync)); highLevelClient().cluster()::putSettings, highLevelClient().cluster()::putSettingsAsync));
assertThat(exception.status(), equalTo(RestStatus.BAD_REQUEST)); assertThat(exception.status(), equalTo(RestStatus.BAD_REQUEST));
assertThat(exception.getMessage(), equalTo( assertThat(exception.getMessage(), equalTo(

View File

@ -68,12 +68,14 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
{ {
// Testing deletion // Testing deletion
String docId = "id"; String docId = "id";
highLevelClient().index(new IndexRequest("index", "type", docId).source(Collections.singletonMap("foo", "bar"))); highLevelClient().index(
new IndexRequest("index", "type", docId).source(Collections.singletonMap("foo", "bar")), RequestOptions.DEFAULT);
DeleteRequest deleteRequest = new DeleteRequest("index", "type", docId); DeleteRequest deleteRequest = new DeleteRequest("index", "type", docId);
if (randomBoolean()) { if (randomBoolean()) {
deleteRequest.version(1L); deleteRequest.version(1L);
} }
DeleteResponse deleteResponse = execute(deleteRequest, highLevelClient()::delete, highLevelClient()::deleteAsync); DeleteResponse deleteResponse = execute(deleteRequest, highLevelClient()::delete, highLevelClient()::deleteAsync,
highLevelClient()::delete, highLevelClient()::deleteAsync);
assertEquals("index", deleteResponse.getIndex()); assertEquals("index", deleteResponse.getIndex());
assertEquals("type", deleteResponse.getType()); assertEquals("type", deleteResponse.getType());
assertEquals(docId, deleteResponse.getId()); assertEquals(docId, deleteResponse.getId());
@ -83,7 +85,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
// Testing non existing document // Testing non existing document
String docId = "does_not_exist"; String docId = "does_not_exist";
DeleteRequest deleteRequest = new DeleteRequest("index", "type", docId); DeleteRequest deleteRequest = new DeleteRequest("index", "type", docId);
DeleteResponse deleteResponse = execute(deleteRequest, highLevelClient()::delete, highLevelClient()::deleteAsync); DeleteResponse deleteResponse = execute(deleteRequest, highLevelClient()::delete, highLevelClient()::deleteAsync,
highLevelClient()::delete, highLevelClient()::deleteAsync);
assertEquals("index", deleteResponse.getIndex()); assertEquals("index", deleteResponse.getIndex());
assertEquals("type", deleteResponse.getType()); assertEquals("type", deleteResponse.getType());
assertEquals(docId, deleteResponse.getId()); assertEquals(docId, deleteResponse.getId());
@ -92,10 +95,12 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
{ {
// Testing version conflict // Testing version conflict
String docId = "version_conflict"; String docId = "version_conflict";
highLevelClient().index(new IndexRequest("index", "type", docId).source(Collections.singletonMap("foo", "bar"))); highLevelClient().index(
new IndexRequest("index", "type", docId).source(Collections.singletonMap("foo", "bar")), RequestOptions.DEFAULT);
DeleteRequest deleteRequest = new DeleteRequest("index", "type", docId).version(2); DeleteRequest deleteRequest = new DeleteRequest("index", "type", docId).version(2);
ElasticsearchException exception = expectThrows(ElasticsearchException.class, ElasticsearchException exception = expectThrows(ElasticsearchException.class,
() -> execute(deleteRequest, highLevelClient()::delete, highLevelClient()::deleteAsync)); () -> execute(deleteRequest, highLevelClient()::delete, highLevelClient()::deleteAsync,
highLevelClient()::delete, highLevelClient()::deleteAsync));
assertEquals(RestStatus.CONFLICT, exception.status()); assertEquals(RestStatus.CONFLICT, exception.status());
assertEquals("Elasticsearch exception [type=version_conflict_engine_exception, reason=[type][" + docId + "]: " + assertEquals("Elasticsearch exception [type=version_conflict_engine_exception, reason=[type][" + docId + "]: " +
"version conflict, current version [1] is different than the one provided [2]]", exception.getMessage()); "version conflict, current version [1] is different than the one provided [2]]", exception.getMessage());
@ -104,10 +109,12 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
{ {
// Testing version type // Testing version type
String docId = "version_type"; String docId = "version_type";
highLevelClient().index(new IndexRequest("index", "type", docId).source(Collections.singletonMap("foo", "bar")) highLevelClient().index(
.versionType(VersionType.EXTERNAL).version(12)); new IndexRequest("index", "type", docId).source(Collections.singletonMap("foo", "bar"))
.versionType(VersionType.EXTERNAL).version(12), RequestOptions.DEFAULT);
DeleteRequest deleteRequest = new DeleteRequest("index", "type", docId).versionType(VersionType.EXTERNAL).version(13); DeleteRequest deleteRequest = new DeleteRequest("index", "type", docId).versionType(VersionType.EXTERNAL).version(13);
DeleteResponse deleteResponse = execute(deleteRequest, highLevelClient()::delete, highLevelClient()::deleteAsync); DeleteResponse deleteResponse = execute(deleteRequest, highLevelClient()::delete, highLevelClient()::deleteAsync,
highLevelClient()::delete, highLevelClient()::deleteAsync);
assertEquals("index", deleteResponse.getIndex()); assertEquals("index", deleteResponse.getIndex());
assertEquals("type", deleteResponse.getType()); assertEquals("type", deleteResponse.getType());
assertEquals(docId, deleteResponse.getId()); assertEquals(docId, deleteResponse.getId());
@ -116,11 +123,13 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
{ {
// Testing version type with a wrong version // Testing version type with a wrong version
String docId = "wrong_version"; String docId = "wrong_version";
highLevelClient().index(new IndexRequest("index", "type", docId).source(Collections.singletonMap("foo", "bar")) highLevelClient().index(
.versionType(VersionType.EXTERNAL).version(12)); new IndexRequest("index", "type", docId).source(Collections.singletonMap("foo", "bar"))
.versionType(VersionType.EXTERNAL).version(12), RequestOptions.DEFAULT);
ElasticsearchStatusException exception = expectThrows(ElasticsearchStatusException.class, () -> { ElasticsearchStatusException exception = expectThrows(ElasticsearchStatusException.class, () -> {
DeleteRequest deleteRequest = new DeleteRequest("index", "type", docId).versionType(VersionType.EXTERNAL).version(10); DeleteRequest deleteRequest = new DeleteRequest("index", "type", docId).versionType(VersionType.EXTERNAL).version(10);
execute(deleteRequest, highLevelClient()::delete, highLevelClient()::deleteAsync); execute(deleteRequest, highLevelClient()::delete, highLevelClient()::deleteAsync,
highLevelClient()::delete, highLevelClient()::deleteAsync);
}); });
assertEquals(RestStatus.CONFLICT, exception.status()); assertEquals(RestStatus.CONFLICT, exception.status());
assertEquals("Elasticsearch exception [type=version_conflict_engine_exception, reason=[type][" + assertEquals("Elasticsearch exception [type=version_conflict_engine_exception, reason=[type][" +
@ -130,9 +139,11 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
{ {
// Testing routing // Testing routing
String docId = "routing"; String docId = "routing";
highLevelClient().index(new IndexRequest("index", "type", docId).source(Collections.singletonMap("foo", "bar")).routing("foo")); highLevelClient().index(new IndexRequest("index", "type", docId).source(Collections.singletonMap("foo", "bar")).routing("foo"),
RequestOptions.DEFAULT);
DeleteRequest deleteRequest = new DeleteRequest("index", "type", docId).routing("foo"); DeleteRequest deleteRequest = new DeleteRequest("index", "type", docId).routing("foo");
DeleteResponse deleteResponse = execute(deleteRequest, highLevelClient()::delete, highLevelClient()::deleteAsync); DeleteResponse deleteResponse = execute(deleteRequest, highLevelClient()::delete, highLevelClient()::deleteAsync,
highLevelClient()::delete, highLevelClient()::deleteAsync);
assertEquals("index", deleteResponse.getIndex()); assertEquals("index", deleteResponse.getIndex());
assertEquals("type", deleteResponse.getType()); assertEquals("type", deleteResponse.getType());
assertEquals(docId, deleteResponse.getId()); assertEquals(docId, deleteResponse.getId());
@ -143,23 +154,27 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
public void testExists() throws IOException { public void testExists() throws IOException {
{ {
GetRequest getRequest = new GetRequest("index", "type", "id"); GetRequest getRequest = new GetRequest("index", "type", "id");
assertFalse(execute(getRequest, highLevelClient()::exists, highLevelClient()::existsAsync)); assertFalse(execute(getRequest, highLevelClient()::exists, highLevelClient()::existsAsync,
highLevelClient()::exists, highLevelClient()::existsAsync));
} }
IndexRequest index = new IndexRequest("index", "type", "id"); IndexRequest index = new IndexRequest("index", "type", "id");
index.source("{\"field1\":\"value1\",\"field2\":\"value2\"}", XContentType.JSON); index.source("{\"field1\":\"value1\",\"field2\":\"value2\"}", XContentType.JSON);
index.setRefreshPolicy(RefreshPolicy.IMMEDIATE); index.setRefreshPolicy(RefreshPolicy.IMMEDIATE);
highLevelClient().index(index); highLevelClient().index(index, RequestOptions.DEFAULT);
{ {
GetRequest getRequest = new GetRequest("index", "type", "id"); GetRequest getRequest = new GetRequest("index", "type", "id");
assertTrue(execute(getRequest, highLevelClient()::exists, highLevelClient()::existsAsync)); assertTrue(execute(getRequest, highLevelClient()::exists, highLevelClient()::existsAsync,
highLevelClient()::exists, highLevelClient()::existsAsync));
} }
{ {
GetRequest getRequest = new GetRequest("index", "type", "does_not_exist"); GetRequest getRequest = new GetRequest("index", "type", "does_not_exist");
assertFalse(execute(getRequest, highLevelClient()::exists, highLevelClient()::existsAsync)); assertFalse(execute(getRequest, highLevelClient()::exists, highLevelClient()::existsAsync,
highLevelClient()::exists, highLevelClient()::existsAsync));
} }
{ {
GetRequest getRequest = new GetRequest("index", "type", "does_not_exist").version(1); GetRequest getRequest = new GetRequest("index", "type", "does_not_exist").version(1);
assertFalse(execute(getRequest, highLevelClient()::exists, highLevelClient()::existsAsync)); assertFalse(execute(getRequest, highLevelClient()::exists, highLevelClient()::existsAsync,
highLevelClient()::exists, highLevelClient()::existsAsync));
} }
} }
@ -167,7 +182,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
{ {
GetRequest getRequest = new GetRequest("index", "type", "id"); GetRequest getRequest = new GetRequest("index", "type", "id");
ElasticsearchException exception = expectThrows(ElasticsearchException.class, ElasticsearchException exception = expectThrows(ElasticsearchException.class,
() -> execute(getRequest, highLevelClient()::get, highLevelClient()::getAsync)); () -> execute(getRequest, highLevelClient()::get, highLevelClient()::getAsync,
highLevelClient()::get, highLevelClient()::getAsync));
assertEquals(RestStatus.NOT_FOUND, exception.status()); assertEquals(RestStatus.NOT_FOUND, exception.status());
assertEquals("Elasticsearch exception [type=index_not_found_exception, reason=no such index]", exception.getMessage()); assertEquals("Elasticsearch exception [type=index_not_found_exception, reason=no such index]", exception.getMessage());
assertEquals("index", exception.getMetadata("es.index").get(0)); assertEquals("index", exception.getMetadata("es.index").get(0));
@ -176,11 +192,12 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
String document = "{\"field1\":\"value1\",\"field2\":\"value2\"}"; String document = "{\"field1\":\"value1\",\"field2\":\"value2\"}";
index.source(document, XContentType.JSON); index.source(document, XContentType.JSON);
index.setRefreshPolicy(RefreshPolicy.IMMEDIATE); index.setRefreshPolicy(RefreshPolicy.IMMEDIATE);
highLevelClient().index(index); highLevelClient().index(index, RequestOptions.DEFAULT);
{ {
GetRequest getRequest = new GetRequest("index", "type", "id").version(2); GetRequest getRequest = new GetRequest("index", "type", "id").version(2);
ElasticsearchException exception = expectThrows(ElasticsearchException.class, ElasticsearchException exception = expectThrows(ElasticsearchException.class,
() -> execute(getRequest, highLevelClient()::get, highLevelClient()::getAsync)); () -> execute(getRequest, highLevelClient()::get, highLevelClient()::getAsync,
highLevelClient()::get, highLevelClient()::getAsync));
assertEquals(RestStatus.CONFLICT, exception.status()); assertEquals(RestStatus.CONFLICT, exception.status());
assertEquals("Elasticsearch exception [type=version_conflict_engine_exception, " + "reason=[type][id]: " + assertEquals("Elasticsearch exception [type=version_conflict_engine_exception, " + "reason=[type][id]: " +
"version conflict, current version [1] is different than the one provided [2]]", exception.getMessage()); "version conflict, current version [1] is different than the one provided [2]]", exception.getMessage());
@ -191,7 +208,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
if (randomBoolean()) { if (randomBoolean()) {
getRequest.version(1L); getRequest.version(1L);
} }
GetResponse getResponse = execute(getRequest, highLevelClient()::get, highLevelClient()::getAsync); GetResponse getResponse = execute(getRequest, highLevelClient()::get, highLevelClient()::getAsync,
highLevelClient()::get, highLevelClient()::getAsync);
assertEquals("index", getResponse.getIndex()); assertEquals("index", getResponse.getIndex());
assertEquals("type", getResponse.getType()); assertEquals("type", getResponse.getType());
assertEquals("id", getResponse.getId()); assertEquals("id", getResponse.getId());
@ -202,7 +220,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
} }
{ {
GetRequest getRequest = new GetRequest("index", "type", "does_not_exist"); GetRequest getRequest = new GetRequest("index", "type", "does_not_exist");
GetResponse getResponse = execute(getRequest, highLevelClient()::get, highLevelClient()::getAsync); GetResponse getResponse = execute(getRequest, highLevelClient()::get, highLevelClient()::getAsync,
highLevelClient()::get, highLevelClient()::getAsync);
assertEquals("index", getResponse.getIndex()); assertEquals("index", getResponse.getIndex());
assertEquals("type", getResponse.getType()); assertEquals("type", getResponse.getType());
assertEquals("does_not_exist", getResponse.getId()); assertEquals("does_not_exist", getResponse.getId());
@ -214,7 +233,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
{ {
GetRequest getRequest = new GetRequest("index", "type", "id"); GetRequest getRequest = new GetRequest("index", "type", "id");
getRequest.fetchSourceContext(new FetchSourceContext(false, Strings.EMPTY_ARRAY, Strings.EMPTY_ARRAY)); getRequest.fetchSourceContext(new FetchSourceContext(false, Strings.EMPTY_ARRAY, Strings.EMPTY_ARRAY));
GetResponse getResponse = execute(getRequest, highLevelClient()::get, highLevelClient()::getAsync); GetResponse getResponse = execute(getRequest, highLevelClient()::get, highLevelClient()::getAsync,
highLevelClient()::get, highLevelClient()::getAsync);
assertEquals("index", getResponse.getIndex()); assertEquals("index", getResponse.getIndex());
assertEquals("type", getResponse.getType()); assertEquals("type", getResponse.getType());
assertEquals("id", getResponse.getId()); assertEquals("id", getResponse.getId());
@ -230,7 +250,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
} else { } else {
getRequest.fetchSourceContext(new FetchSourceContext(true, Strings.EMPTY_ARRAY, new String[]{"field2"})); getRequest.fetchSourceContext(new FetchSourceContext(true, Strings.EMPTY_ARRAY, new String[]{"field2"}));
} }
GetResponse getResponse = execute(getRequest, highLevelClient()::get, highLevelClient()::getAsync); GetResponse getResponse = execute(getRequest, highLevelClient()::get, highLevelClient()::getAsync,
highLevelClient()::get, highLevelClient()::getAsync);
assertEquals("index", getResponse.getIndex()); assertEquals("index", getResponse.getIndex());
assertEquals("type", getResponse.getType()); assertEquals("type", getResponse.getType());
assertEquals("id", getResponse.getId()); assertEquals("id", getResponse.getId());
@ -248,7 +269,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
MultiGetRequest multiGetRequest = new MultiGetRequest(); MultiGetRequest multiGetRequest = new MultiGetRequest();
multiGetRequest.add("index", "type", "id1"); multiGetRequest.add("index", "type", "id1");
multiGetRequest.add("index", "type", "id2"); multiGetRequest.add("index", "type", "id2");
MultiGetResponse response = execute(multiGetRequest, highLevelClient()::multiGet, highLevelClient()::multiGetAsync); MultiGetResponse response = execute(multiGetRequest, highLevelClient()::multiGet, highLevelClient()::multiGetAsync,
highLevelClient()::multiGet, highLevelClient()::multiGetAsync);
assertEquals(2, response.getResponses().length); assertEquals(2, response.getResponses().length);
assertTrue(response.getResponses()[0].isFailed()); assertTrue(response.getResponses()[0].isFailed());
@ -275,12 +297,13 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
index = new IndexRequest("index", "type", "id2"); index = new IndexRequest("index", "type", "id2");
index.source("{\"field\":\"value2\"}", XContentType.JSON); index.source("{\"field\":\"value2\"}", XContentType.JSON);
bulk.add(index); bulk.add(index);
highLevelClient().bulk(bulk); highLevelClient().bulk(bulk, RequestOptions.DEFAULT);
{ {
MultiGetRequest multiGetRequest = new MultiGetRequest(); MultiGetRequest multiGetRequest = new MultiGetRequest();
multiGetRequest.add("index", "type", "id1"); multiGetRequest.add("index", "type", "id1");
multiGetRequest.add("index", "type", "id2"); multiGetRequest.add("index", "type", "id2");
MultiGetResponse response = execute(multiGetRequest, highLevelClient()::multiGet, highLevelClient()::multiGetAsync); MultiGetResponse response = execute(multiGetRequest, highLevelClient()::multiGet, highLevelClient()::multiGetAsync,
highLevelClient()::multiGet, highLevelClient()::multiGetAsync);
assertEquals(2, response.getResponses().length); assertEquals(2, response.getResponses().length);
assertFalse(response.getResponses()[0].isFailed()); assertFalse(response.getResponses()[0].isFailed());
@ -305,7 +328,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
IndexRequest indexRequest = new IndexRequest("index", "type"); IndexRequest indexRequest = new IndexRequest("index", "type");
indexRequest.source(XContentBuilder.builder(xContentType.xContent()).startObject().field("test", "test").endObject()); indexRequest.source(XContentBuilder.builder(xContentType.xContent()).startObject().field("test", "test").endObject());
IndexResponse indexResponse = execute(indexRequest, highLevelClient()::index, highLevelClient()::indexAsync); IndexResponse indexResponse = execute(indexRequest, highLevelClient()::index, highLevelClient()::indexAsync,
highLevelClient()::index, highLevelClient()::indexAsync);
assertEquals(RestStatus.CREATED, indexResponse.status()); assertEquals(RestStatus.CREATED, indexResponse.status());
assertEquals(DocWriteResponse.Result.CREATED, indexResponse.getResult()); assertEquals(DocWriteResponse.Result.CREATED, indexResponse.getResult());
assertEquals("index", indexResponse.getIndex()); assertEquals("index", indexResponse.getIndex());
@ -326,7 +350,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
IndexRequest indexRequest = new IndexRequest("index", "type", "id"); IndexRequest indexRequest = new IndexRequest("index", "type", "id");
indexRequest.source(XContentBuilder.builder(xContentType.xContent()).startObject().field("version", 1).endObject()); indexRequest.source(XContentBuilder.builder(xContentType.xContent()).startObject().field("version", 1).endObject());
IndexResponse indexResponse = execute(indexRequest, highLevelClient()::index, highLevelClient()::indexAsync); IndexResponse indexResponse = execute(indexRequest, highLevelClient()::index, highLevelClient()::indexAsync,
highLevelClient()::index, highLevelClient()::indexAsync);
assertEquals(RestStatus.CREATED, indexResponse.status()); assertEquals(RestStatus.CREATED, indexResponse.status());
assertEquals("index", indexResponse.getIndex()); assertEquals("index", indexResponse.getIndex());
assertEquals("type", indexResponse.getType()); assertEquals("type", indexResponse.getType());
@ -336,7 +361,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
indexRequest = new IndexRequest("index", "type", "id"); indexRequest = new IndexRequest("index", "type", "id");
indexRequest.source(XContentBuilder.builder(xContentType.xContent()).startObject().field("version", 2).endObject()); indexRequest.source(XContentBuilder.builder(xContentType.xContent()).startObject().field("version", 2).endObject());
indexResponse = execute(indexRequest, highLevelClient()::index, highLevelClient()::indexAsync); indexResponse = execute(indexRequest, highLevelClient()::index, highLevelClient()::indexAsync,
highLevelClient()::index, highLevelClient()::indexAsync);
assertEquals(RestStatus.OK, indexResponse.status()); assertEquals(RestStatus.OK, indexResponse.status());
assertEquals("index", indexResponse.getIndex()); assertEquals("index", indexResponse.getIndex());
assertEquals("type", indexResponse.getType()); assertEquals("type", indexResponse.getType());
@ -348,7 +374,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
wrongRequest.source(XContentBuilder.builder(xContentType.xContent()).startObject().field("field", "test").endObject()); wrongRequest.source(XContentBuilder.builder(xContentType.xContent()).startObject().field("field", "test").endObject());
wrongRequest.version(5L); wrongRequest.version(5L);
execute(wrongRequest, highLevelClient()::index, highLevelClient()::indexAsync); execute(wrongRequest, highLevelClient()::index, highLevelClient()::indexAsync,
highLevelClient()::index, highLevelClient()::indexAsync);
}); });
assertEquals(RestStatus.CONFLICT, exception.status()); assertEquals(RestStatus.CONFLICT, exception.status());
assertEquals("Elasticsearch exception [type=version_conflict_engine_exception, reason=[type][id]: " + assertEquals("Elasticsearch exception [type=version_conflict_engine_exception, reason=[type][id]: " +
@ -361,7 +388,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
indexRequest.source(XContentBuilder.builder(xContentType.xContent()).startObject().field("field", "test").endObject()); indexRequest.source(XContentBuilder.builder(xContentType.xContent()).startObject().field("field", "test").endObject());
indexRequest.setPipeline("missing"); indexRequest.setPipeline("missing");
execute(indexRequest, highLevelClient()::index, highLevelClient()::indexAsync); execute(indexRequest, highLevelClient()::index, highLevelClient()::indexAsync,
highLevelClient()::index, highLevelClient()::indexAsync);
}); });
assertEquals(RestStatus.BAD_REQUEST, exception.status()); assertEquals(RestStatus.BAD_REQUEST, exception.status());
@ -374,7 +402,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
indexRequest.version(12L); indexRequest.version(12L);
indexRequest.versionType(VersionType.EXTERNAL); indexRequest.versionType(VersionType.EXTERNAL);
IndexResponse indexResponse = execute(indexRequest, highLevelClient()::index, highLevelClient()::indexAsync); IndexResponse indexResponse = execute(indexRequest, highLevelClient()::index, highLevelClient()::indexAsync,
highLevelClient()::index, highLevelClient()::indexAsync);
assertEquals(RestStatus.CREATED, indexResponse.status()); assertEquals(RestStatus.CREATED, indexResponse.status());
assertEquals("index", indexResponse.getIndex()); assertEquals("index", indexResponse.getIndex());
assertEquals("type", indexResponse.getType()); assertEquals("type", indexResponse.getType());
@ -386,14 +415,16 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
indexRequest.source(XContentBuilder.builder(xContentType.xContent()).startObject().field("field", "test").endObject()); indexRequest.source(XContentBuilder.builder(xContentType.xContent()).startObject().field("field", "test").endObject());
indexRequest.opType(DocWriteRequest.OpType.CREATE); indexRequest.opType(DocWriteRequest.OpType.CREATE);
IndexResponse indexResponse = execute(indexRequest, highLevelClient()::index, highLevelClient()::indexAsync); IndexResponse indexResponse = execute(indexRequest, highLevelClient()::index, highLevelClient()::indexAsync,
highLevelClient()::index, highLevelClient()::indexAsync);
assertEquals(RestStatus.CREATED, indexResponse.status()); assertEquals(RestStatus.CREATED, indexResponse.status());
assertEquals("index", indexResponse.getIndex()); assertEquals("index", indexResponse.getIndex());
assertEquals("type", indexResponse.getType()); assertEquals("type", indexResponse.getType());
assertEquals("with_create_op_type", indexResponse.getId()); assertEquals("with_create_op_type", indexResponse.getId());
ElasticsearchStatusException exception = expectThrows(ElasticsearchStatusException.class, () -> { ElasticsearchStatusException exception = expectThrows(ElasticsearchStatusException.class, () -> {
execute(indexRequest, highLevelClient()::index, highLevelClient()::indexAsync); execute(indexRequest, highLevelClient()::index, highLevelClient()::indexAsync,
highLevelClient()::index, highLevelClient()::indexAsync);
}); });
assertEquals(RestStatus.CONFLICT, exception.status()); assertEquals(RestStatus.CONFLICT, exception.status());
@ -408,7 +439,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
updateRequest.doc(singletonMap("field", "value"), randomFrom(XContentType.values())); updateRequest.doc(singletonMap("field", "value"), randomFrom(XContentType.values()));
ElasticsearchStatusException exception = expectThrows(ElasticsearchStatusException.class, () -> ElasticsearchStatusException exception = expectThrows(ElasticsearchStatusException.class, () ->
execute(updateRequest, highLevelClient()::update, highLevelClient()::updateAsync)); execute(updateRequest, highLevelClient()::update, highLevelClient()::updateAsync,
highLevelClient()::update, highLevelClient()::updateAsync));
assertEquals(RestStatus.NOT_FOUND, exception.status()); assertEquals(RestStatus.NOT_FOUND, exception.status());
assertEquals("Elasticsearch exception [type=document_missing_exception, reason=[type][does_not_exist]: document missing]", assertEquals("Elasticsearch exception [type=document_missing_exception, reason=[type][does_not_exist]: document missing]",
exception.getMessage()); exception.getMessage());
@ -416,7 +448,7 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
{ {
IndexRequest indexRequest = new IndexRequest("index", "type", "id"); IndexRequest indexRequest = new IndexRequest("index", "type", "id");
indexRequest.source(singletonMap("field", "value")); indexRequest.source(singletonMap("field", "value"));
IndexResponse indexResponse = highLevelClient().index(indexRequest); IndexResponse indexResponse = highLevelClient().index(indexRequest, RequestOptions.DEFAULT);
assertEquals(RestStatus.CREATED, indexResponse.status()); assertEquals(RestStatus.CREATED, indexResponse.status());
UpdateRequest updateRequest = new UpdateRequest("index", "type", "id"); UpdateRequest updateRequest = new UpdateRequest("index", "type", "id");
@ -431,7 +463,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
updateRequestConflict.version(indexResponse.getVersion()); updateRequestConflict.version(indexResponse.getVersion());
ElasticsearchStatusException exception = expectThrows(ElasticsearchStatusException.class, () -> ElasticsearchStatusException exception = expectThrows(ElasticsearchStatusException.class, () ->
execute(updateRequestConflict, highLevelClient()::update, highLevelClient()::updateAsync)); execute(updateRequestConflict, highLevelClient()::update, highLevelClient()::updateAsync,
highLevelClient()::update, highLevelClient()::updateAsync));
assertEquals(RestStatus.CONFLICT, exception.status()); assertEquals(RestStatus.CONFLICT, exception.status());
assertEquals("Elasticsearch exception [type=version_conflict_engine_exception, reason=[type][id]: version conflict, " + assertEquals("Elasticsearch exception [type=version_conflict_engine_exception, reason=[type][id]: version conflict, " +
"current version [2] is different than the one provided [1]]", exception.getMessage()); "current version [2] is different than the one provided [1]]", exception.getMessage());
@ -439,7 +472,7 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
{ {
IndexRequest indexRequest = new IndexRequest("index", "type", "with_script"); IndexRequest indexRequest = new IndexRequest("index", "type", "with_script");
indexRequest.source(singletonMap("counter", 12)); indexRequest.source(singletonMap("counter", 12));
IndexResponse indexResponse = highLevelClient().index(indexRequest); IndexResponse indexResponse = highLevelClient().index(indexRequest, RequestOptions.DEFAULT);
assertEquals(RestStatus.CREATED, indexResponse.status()); assertEquals(RestStatus.CREATED, indexResponse.status());
UpdateRequest updateRequest = new UpdateRequest("index", "type", "with_script"); UpdateRequest updateRequest = new UpdateRequest("index", "type", "with_script");
@ -447,7 +480,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
updateRequest.script(script); updateRequest.script(script);
updateRequest.fetchSource(true); updateRequest.fetchSource(true);
UpdateResponse updateResponse = execute(updateRequest, highLevelClient()::update, highLevelClient()::updateAsync); UpdateResponse updateResponse = execute(updateRequest, highLevelClient()::update, highLevelClient()::updateAsync,
highLevelClient()::update, highLevelClient()::updateAsync);
assertEquals(RestStatus.OK, updateResponse.status()); assertEquals(RestStatus.OK, updateResponse.status());
assertEquals(DocWriteResponse.Result.UPDATED, updateResponse.getResult()); assertEquals(DocWriteResponse.Result.UPDATED, updateResponse.getResult());
assertEquals(2L, updateResponse.getVersion()); assertEquals(2L, updateResponse.getVersion());
@ -459,7 +493,7 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
indexRequest.source("field_1", "one", "field_3", "three"); indexRequest.source("field_1", "one", "field_3", "three");
indexRequest.version(12L); indexRequest.version(12L);
indexRequest.versionType(VersionType.EXTERNAL); indexRequest.versionType(VersionType.EXTERNAL);
IndexResponse indexResponse = highLevelClient().index(indexRequest); IndexResponse indexResponse = highLevelClient().index(indexRequest, RequestOptions.DEFAULT);
assertEquals(RestStatus.CREATED, indexResponse.status()); assertEquals(RestStatus.CREATED, indexResponse.status());
assertEquals(12L, indexResponse.getVersion()); assertEquals(12L, indexResponse.getVersion());
@ -467,7 +501,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
updateRequest.doc(singletonMap("field_2", "two"), randomFrom(XContentType.values())); updateRequest.doc(singletonMap("field_2", "two"), randomFrom(XContentType.values()));
updateRequest.fetchSource("field_*", "field_3"); updateRequest.fetchSource("field_*", "field_3");
UpdateResponse updateResponse = execute(updateRequest, highLevelClient()::update, highLevelClient()::updateAsync); UpdateResponse updateResponse = execute(updateRequest, highLevelClient()::update, highLevelClient()::updateAsync,
highLevelClient()::update, highLevelClient()::updateAsync);
assertEquals(RestStatus.OK, updateResponse.status()); assertEquals(RestStatus.OK, updateResponse.status());
assertEquals(DocWriteResponse.Result.UPDATED, updateResponse.getResult()); assertEquals(DocWriteResponse.Result.UPDATED, updateResponse.getResult());
assertEquals(13L, updateResponse.getVersion()); assertEquals(13L, updateResponse.getVersion());
@ -481,14 +516,15 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
{ {
IndexRequest indexRequest = new IndexRequest("index", "type", "noop"); IndexRequest indexRequest = new IndexRequest("index", "type", "noop");
indexRequest.source("field", "value"); indexRequest.source("field", "value");
IndexResponse indexResponse = highLevelClient().index(indexRequest); IndexResponse indexResponse = highLevelClient().index(indexRequest, RequestOptions.DEFAULT);
assertEquals(RestStatus.CREATED, indexResponse.status()); assertEquals(RestStatus.CREATED, indexResponse.status());
assertEquals(1L, indexResponse.getVersion()); assertEquals(1L, indexResponse.getVersion());
UpdateRequest updateRequest = new UpdateRequest("index", "type", "noop"); UpdateRequest updateRequest = new UpdateRequest("index", "type", "noop");
updateRequest.doc(singletonMap("field", "value"), randomFrom(XContentType.values())); updateRequest.doc(singletonMap("field", "value"), randomFrom(XContentType.values()));
UpdateResponse updateResponse = execute(updateRequest, highLevelClient()::update, highLevelClient()::updateAsync); UpdateResponse updateResponse = execute(updateRequest, highLevelClient()::update, highLevelClient()::updateAsync,
highLevelClient()::update, highLevelClient()::updateAsync);
assertEquals(RestStatus.OK, updateResponse.status()); assertEquals(RestStatus.OK, updateResponse.status());
assertEquals(DocWriteResponse.Result.NOOP, updateResponse.getResult()); assertEquals(DocWriteResponse.Result.NOOP, updateResponse.getResult());
assertEquals(1L, updateResponse.getVersion()); assertEquals(1L, updateResponse.getVersion());
@ -506,7 +542,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
updateRequest.doc(singletonMap("doc_status", "updated")); updateRequest.doc(singletonMap("doc_status", "updated"));
updateRequest.fetchSource(true); updateRequest.fetchSource(true);
UpdateResponse updateResponse = execute(updateRequest, highLevelClient()::update, highLevelClient()::updateAsync); UpdateResponse updateResponse = execute(updateRequest, highLevelClient()::update, highLevelClient()::updateAsync,
highLevelClient()::update, highLevelClient()::updateAsync);
assertEquals(RestStatus.CREATED, updateResponse.status()); assertEquals(RestStatus.CREATED, updateResponse.status());
assertEquals("index", updateResponse.getIndex()); assertEquals("index", updateResponse.getIndex());
assertEquals("type", updateResponse.getType()); assertEquals("type", updateResponse.getType());
@ -521,7 +558,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
updateRequest.fetchSource(true); updateRequest.fetchSource(true);
updateRequest.docAsUpsert(true); updateRequest.docAsUpsert(true);
UpdateResponse updateResponse = execute(updateRequest, highLevelClient()::update, highLevelClient()::updateAsync); UpdateResponse updateResponse = execute(updateRequest, highLevelClient()::update, highLevelClient()::updateAsync,
highLevelClient()::update, highLevelClient()::updateAsync);
assertEquals(RestStatus.CREATED, updateResponse.status()); assertEquals(RestStatus.CREATED, updateResponse.status());
assertEquals("index", updateResponse.getIndex()); assertEquals("index", updateResponse.getIndex());
assertEquals("type", updateResponse.getType()); assertEquals("type", updateResponse.getType());
@ -537,7 +575,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
updateRequest.scriptedUpsert(true); updateRequest.scriptedUpsert(true);
updateRequest.upsert(singletonMap("level", "A")); updateRequest.upsert(singletonMap("level", "A"));
UpdateResponse updateResponse = execute(updateRequest, highLevelClient()::update, highLevelClient()::updateAsync); UpdateResponse updateResponse = execute(updateRequest, highLevelClient()::update, highLevelClient()::updateAsync,
highLevelClient()::update, highLevelClient()::updateAsync);
assertEquals(RestStatus.CREATED, updateResponse.status()); assertEquals(RestStatus.CREATED, updateResponse.status());
assertEquals("index", updateResponse.getIndex()); assertEquals("index", updateResponse.getIndex());
assertEquals("type", updateResponse.getType()); assertEquals("type", updateResponse.getType());
@ -552,7 +591,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
UpdateRequest updateRequest = new UpdateRequest("index", "type", "id"); UpdateRequest updateRequest = new UpdateRequest("index", "type", "id");
updateRequest.doc(new IndexRequest().source(Collections.singletonMap("field", "doc"), XContentType.JSON)); updateRequest.doc(new IndexRequest().source(Collections.singletonMap("field", "doc"), XContentType.JSON));
updateRequest.upsert(new IndexRequest().source(Collections.singletonMap("field", "upsert"), XContentType.YAML)); updateRequest.upsert(new IndexRequest().source(Collections.singletonMap("field", "upsert"), XContentType.YAML));
execute(updateRequest, highLevelClient()::update, highLevelClient()::updateAsync); execute(updateRequest, highLevelClient()::update, highLevelClient()::updateAsync,
highLevelClient()::update, highLevelClient()::updateAsync);
}); });
assertEquals("Update request cannot have different content types for doc [JSON] and upsert [YAML] documents", assertEquals("Update request cannot have different content types for doc [JSON] and upsert [YAML] documents",
exception.getMessage()); exception.getMessage());
@ -575,7 +615,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
if (opType == DocWriteRequest.OpType.DELETE) { if (opType == DocWriteRequest.OpType.DELETE) {
if (erroneous == false) { if (erroneous == false) {
assertEquals(RestStatus.CREATED, assertEquals(RestStatus.CREATED,
highLevelClient().index(new IndexRequest("index", "test", id).source("field", -1)).status()); highLevelClient().index(
new IndexRequest("index", "test", id).source("field", -1), RequestOptions.DEFAULT).status());
} }
DeleteRequest deleteRequest = new DeleteRequest("index", "test", id); DeleteRequest deleteRequest = new DeleteRequest("index", "test", id);
bulkRequest.add(deleteRequest); bulkRequest.add(deleteRequest);
@ -593,7 +634,7 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
} else if (opType == DocWriteRequest.OpType.CREATE) { } else if (opType == DocWriteRequest.OpType.CREATE) {
IndexRequest createRequest = new IndexRequest("index", "test", id).source(source, xContentType).create(true); IndexRequest createRequest = new IndexRequest("index", "test", id).source(source, xContentType).create(true);
if (erroneous) { if (erroneous) {
assertEquals(RestStatus.CREATED, highLevelClient().index(createRequest).status()); assertEquals(RestStatus.CREATED, highLevelClient().index(createRequest, RequestOptions.DEFAULT).status());
} }
bulkRequest.add(createRequest); bulkRequest.add(createRequest);
@ -602,14 +643,16 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
.doc(new IndexRequest().source(source, xContentType)); .doc(new IndexRequest().source(source, xContentType));
if (erroneous == false) { if (erroneous == false) {
assertEquals(RestStatus.CREATED, assertEquals(RestStatus.CREATED,
highLevelClient().index(new IndexRequest("index", "test", id).source("field", -1)).status()); highLevelClient().index(
new IndexRequest("index", "test", id).source("field", -1), RequestOptions.DEFAULT).status());
} }
bulkRequest.add(updateRequest); bulkRequest.add(updateRequest);
} }
} }
} }
BulkResponse bulkResponse = execute(bulkRequest, highLevelClient()::bulk, highLevelClient()::bulkAsync); BulkResponse bulkResponse = execute(bulkRequest, highLevelClient()::bulk, highLevelClient()::bulkAsync,
highLevelClient()::bulk, highLevelClient()::bulkAsync);
assertEquals(RestStatus.OK, bulkResponse.status()); assertEquals(RestStatus.OK, bulkResponse.status());
assertTrue(bulkResponse.getTook().getMillis() > 0); assertTrue(bulkResponse.getTook().getMillis() > 0);
assertEquals(nbItems, bulkResponse.getItems().length); assertEquals(nbItems, bulkResponse.getItems().length);
@ -662,7 +705,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
if (opType == DocWriteRequest.OpType.DELETE) { if (opType == DocWriteRequest.OpType.DELETE) {
if (erroneous == false) { if (erroneous == false) {
assertEquals(RestStatus.CREATED, assertEquals(RestStatus.CREATED,
highLevelClient().index(new IndexRequest("index", "test", id).source("field", -1)).status()); highLevelClient().index(
new IndexRequest("index", "test", id).source("field", -1), RequestOptions.DEFAULT).status());
} }
DeleteRequest deleteRequest = new DeleteRequest("index", "test", id); DeleteRequest deleteRequest = new DeleteRequest("index", "test", id);
processor.add(deleteRequest); processor.add(deleteRequest);
@ -678,7 +722,7 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
} else if (opType == DocWriteRequest.OpType.CREATE) { } else if (opType == DocWriteRequest.OpType.CREATE) {
IndexRequest createRequest = new IndexRequest("index", "test", id).source(xContentType, "id", i).create(true); IndexRequest createRequest = new IndexRequest("index", "test", id).source(xContentType, "id", i).create(true);
if (erroneous) { if (erroneous) {
assertEquals(RestStatus.CREATED, highLevelClient().index(createRequest).status()); assertEquals(RestStatus.CREATED, highLevelClient().index(createRequest, RequestOptions.DEFAULT).status());
} }
processor.add(createRequest); processor.add(createRequest);
@ -687,7 +731,8 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
.doc(new IndexRequest().source(xContentType, "id", i)); .doc(new IndexRequest().source(xContentType, "id", i));
if (erroneous == false) { if (erroneous == false) {
assertEquals(RestStatus.CREATED, assertEquals(RestStatus.CREATED,
highLevelClient().index(new IndexRequest("index", "test", id).source("field", -1)).status()); highLevelClient().index(
new IndexRequest("index", "test", id).source("field", -1), RequestOptions.DEFAULT).status());
} }
processor.add(updateRequest); processor.add(updateRequest);
} }
@ -739,14 +784,14 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
{ {
IndexRequest indexRequest = new IndexRequest(indexPattern, "type", "id#1"); IndexRequest indexRequest = new IndexRequest(indexPattern, "type", "id#1");
indexRequest.source("field", "value"); indexRequest.source("field", "value");
IndexResponse indexResponse = highLevelClient().index(indexRequest); IndexResponse indexResponse = highLevelClient().index(indexRequest, RequestOptions.DEFAULT);
assertEquals(expectedIndex, indexResponse.getIndex()); assertEquals(expectedIndex, indexResponse.getIndex());
assertEquals("type", indexResponse.getType()); assertEquals("type", indexResponse.getType());
assertEquals("id#1", indexResponse.getId()); assertEquals("id#1", indexResponse.getId());
} }
{ {
GetRequest getRequest = new GetRequest(indexPattern, "type", "id#1"); GetRequest getRequest = new GetRequest(indexPattern, "type", "id#1");
GetResponse getResponse = highLevelClient().get(getRequest); GetResponse getResponse = highLevelClient().get(getRequest, RequestOptions.DEFAULT);
assertTrue(getResponse.isExists()); assertTrue(getResponse.isExists());
assertEquals(expectedIndex, getResponse.getIndex()); assertEquals(expectedIndex, getResponse.getIndex());
assertEquals("type", getResponse.getType()); assertEquals("type", getResponse.getType());
@ -757,21 +802,21 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
{ {
IndexRequest indexRequest = new IndexRequest("index", "type", docId); IndexRequest indexRequest = new IndexRequest("index", "type", docId);
indexRequest.source("field", "value"); indexRequest.source("field", "value");
IndexResponse indexResponse = highLevelClient().index(indexRequest); IndexResponse indexResponse = highLevelClient().index(indexRequest, RequestOptions.DEFAULT);
assertEquals("index", indexResponse.getIndex()); assertEquals("index", indexResponse.getIndex());
assertEquals("type", indexResponse.getType()); assertEquals("type", indexResponse.getType());
assertEquals(docId, indexResponse.getId()); assertEquals(docId, indexResponse.getId());
} }
{ {
GetRequest getRequest = new GetRequest("index", "type", docId); GetRequest getRequest = new GetRequest("index", "type", docId);
GetResponse getResponse = highLevelClient().get(getRequest); GetResponse getResponse = highLevelClient().get(getRequest, RequestOptions.DEFAULT);
assertTrue(getResponse.isExists()); assertTrue(getResponse.isExists());
assertEquals("index", getResponse.getIndex()); assertEquals("index", getResponse.getIndex());
assertEquals("type", getResponse.getType()); assertEquals("type", getResponse.getType());
assertEquals(docId, getResponse.getId()); assertEquals(docId, getResponse.getId());
} }
assertTrue(highLevelClient().indices().exists(new GetIndexRequest().indices(indexPattern, "index"))); assertTrue(highLevelClient().indices().exists(new GetIndexRequest().indices(indexPattern, "index"), RequestOptions.DEFAULT));
} }
public void testParamsEncode() throws IOException { public void testParamsEncode() throws IOException {
@ -781,14 +826,14 @@ public class CrudIT extends ESRestHighLevelClientTestCase {
IndexRequest indexRequest = new IndexRequest("index", "type", "id"); IndexRequest indexRequest = new IndexRequest("index", "type", "id");
indexRequest.source("field", "value"); indexRequest.source("field", "value");
indexRequest.routing(routing); indexRequest.routing(routing);
IndexResponse indexResponse = highLevelClient().index(indexRequest); IndexResponse indexResponse = highLevelClient().index(indexRequest, RequestOptions.DEFAULT);
assertEquals("index", indexResponse.getIndex()); assertEquals("index", indexResponse.getIndex());
assertEquals("type", indexResponse.getType()); assertEquals("type", indexResponse.getType());
assertEquals("id", indexResponse.getId()); assertEquals("id", indexResponse.getId());
} }
{ {
GetRequest getRequest = new GetRequest("index", "type", "id").routing(routing); GetRequest getRequest = new GetRequest("index", "type", "id").routing(routing);
GetResponse getResponse = highLevelClient().get(getRequest); GetResponse getResponse = highLevelClient().get(getRequest, RequestOptions.DEFAULT);
assertTrue(getResponse.isExists()); assertTrue(getResponse.isExists());
assertEquals("index", getResponse.getIndex()); assertEquals("index", getResponse.getIndex());
assertEquals("type", getResponse.getType()); assertEquals("type", getResponse.getType());

View File

@ -60,23 +60,60 @@ public abstract class ESRestHighLevelClientTestCase extends ESRestTestCase {
* Executes the provided request using either the sync method or its async variant, both provided as functions * Executes the provided request using either the sync method or its async variant, both provided as functions
*/ */
protected static <Req, Resp> Resp execute(Req request, SyncMethod<Req, Resp> syncMethod, protected static <Req, Resp> Resp execute(Req request, SyncMethod<Req, Resp> syncMethod,
AsyncMethod<Req, Resp> asyncMethod, Header... headers) throws IOException { AsyncMethod<Req, Resp> asyncMethod) throws IOException {
if (randomBoolean()) { if (randomBoolean()) {
return syncMethod.execute(request, headers); return syncMethod.execute(request, RequestOptions.DEFAULT);
} else { } else {
PlainActionFuture<Resp> future = PlainActionFuture.newFuture(); PlainActionFuture<Resp> future = PlainActionFuture.newFuture();
asyncMethod.execute(request, future, headers); asyncMethod.execute(request, RequestOptions.DEFAULT, future);
return future.actionGet(); return future.actionGet();
} }
} }
@FunctionalInterface @FunctionalInterface
protected interface SyncMethod<Request, Response> { protected interface SyncMethod<Request, Response> {
Response execute(Request request, Header... headers) throws IOException; Response execute(Request request, RequestOptions options) throws IOException;
} }
@FunctionalInterface @FunctionalInterface
protected interface AsyncMethod<Request, Response> { protected interface AsyncMethod<Request, Response> {
void execute(Request request, RequestOptions options, ActionListener<Response> listener);
}
/**
* Executes the provided request using either the sync method or its async variant, both provided as functions
*/
@Deprecated
protected static <Req, Resp> Resp execute(Req request, SyncMethod<Req, Resp> syncMethod, AsyncMethod<Req, Resp> asyncMethod,
SyncMethodWithHeaders<Req, Resp> syncMethodWithHeaders,
AsyncMethodWithHeaders<Req, Resp> asyncMethodWithHeaders) throws IOException {
switch(randomIntBetween(0, 3)) {
case 0:
return syncMethod.execute(request, RequestOptions.DEFAULT);
case 1:
PlainActionFuture<Resp> future = PlainActionFuture.newFuture();
asyncMethod.execute(request, RequestOptions.DEFAULT, future);
return future.actionGet();
case 2:
return syncMethodWithHeaders.execute(request);
case 3:
PlainActionFuture<Resp> futureWithHeaders = PlainActionFuture.newFuture();
asyncMethodWithHeaders.execute(request, futureWithHeaders);
return futureWithHeaders.actionGet();
default:
throw new UnsupportedOperationException();
}
}
@Deprecated
@FunctionalInterface
protected interface SyncMethodWithHeaders<Request, Response> {
Response execute(Request request, Header... headers) throws IOException;
}
@Deprecated
@FunctionalInterface
protected interface AsyncMethodWithHeaders<Request, Response> {
void execute(Request request, ActionListener<Response> listener, Header... headers); void execute(Request request, ActionListener<Response> listener, Header... headers);
} }

View File

@ -110,6 +110,8 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
boolean response = execute( boolean response = execute(
request, request,
highLevelClient().indices()::exists, highLevelClient().indices()::exists,
highLevelClient().indices()::existsAsync,
highLevelClient().indices()::exists,
highLevelClient().indices()::existsAsync highLevelClient().indices()::existsAsync
); );
assertTrue(response); assertTrue(response);
@ -125,6 +127,8 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
boolean response = execute( boolean response = execute(
request, request,
highLevelClient().indices()::exists, highLevelClient().indices()::exists,
highLevelClient().indices()::existsAsync,
highLevelClient().indices()::exists,
highLevelClient().indices()::existsAsync highLevelClient().indices()::existsAsync
); );
assertFalse(response); assertFalse(response);
@ -143,6 +147,8 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
boolean response = execute( boolean response = execute(
request, request,
highLevelClient().indices()::exists, highLevelClient().indices()::exists,
highLevelClient().indices()::existsAsync,
highLevelClient().indices()::exists,
highLevelClient().indices()::existsAsync highLevelClient().indices()::existsAsync
); );
assertFalse(response); assertFalse(response);
@ -160,7 +166,8 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName); CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName);
CreateIndexResponse createIndexResponse = CreateIndexResponse createIndexResponse =
execute(createIndexRequest, highLevelClient().indices()::create, highLevelClient().indices()::createAsync); execute(createIndexRequest, highLevelClient().indices()::create, highLevelClient().indices()::createAsync,
highLevelClient().indices()::create, highLevelClient().indices()::createAsync);
assertTrue(createIndexResponse.isAcknowledged()); assertTrue(createIndexResponse.isAcknowledged());
assertTrue(indexExists(indexName)); assertTrue(indexExists(indexName));
@ -188,7 +195,8 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
createIndexRequest.mapping("type_name", mappingBuilder); createIndexRequest.mapping("type_name", mappingBuilder);
CreateIndexResponse createIndexResponse = CreateIndexResponse createIndexResponse =
execute(createIndexRequest, highLevelClient().indices()::create, highLevelClient().indices()::createAsync); execute(createIndexRequest, highLevelClient().indices()::create, highLevelClient().indices()::createAsync,
highLevelClient().indices()::create, highLevelClient().indices()::createAsync);
assertTrue(createIndexResponse.isAcknowledged()); assertTrue(createIndexResponse.isAcknowledged());
Map<String, Object> getIndexResponse = getAsMap(indexName); Map<String, Object> getIndexResponse = getAsMap(indexName);
@ -323,7 +331,8 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
putMappingRequest.source(mappingBuilder); putMappingRequest.source(mappingBuilder);
PutMappingResponse putMappingResponse = PutMappingResponse putMappingResponse =
execute(putMappingRequest, highLevelClient().indices()::putMapping, highLevelClient().indices()::putMappingAsync); execute(putMappingRequest, highLevelClient().indices()::putMapping, highLevelClient().indices()::putMappingAsync,
highLevelClient().indices()::putMapping, highLevelClient().indices()::putMappingAsync);
assertTrue(putMappingResponse.isAcknowledged()); assertTrue(putMappingResponse.isAcknowledged());
Map<String, Object> getIndexResponse = getAsMap(indexName); Map<String, Object> getIndexResponse = getAsMap(indexName);
@ -375,7 +384,8 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(indexName); DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(indexName);
DeleteIndexResponse deleteIndexResponse = DeleteIndexResponse deleteIndexResponse =
execute(deleteIndexRequest, highLevelClient().indices()::delete, highLevelClient().indices()::deleteAsync); execute(deleteIndexRequest, highLevelClient().indices()::delete, highLevelClient().indices()::deleteAsync,
highLevelClient().indices()::delete, highLevelClient().indices()::deleteAsync);
assertTrue(deleteIndexResponse.isAcknowledged()); assertTrue(deleteIndexResponse.isAcknowledged());
assertFalse(indexExists(indexName)); assertFalse(indexExists(indexName));
@ -388,7 +398,8 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(nonExistentIndex); DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(nonExistentIndex);
ElasticsearchException exception = expectThrows(ElasticsearchException.class, ElasticsearchException exception = expectThrows(ElasticsearchException.class,
() -> execute(deleteIndexRequest, highLevelClient().indices()::delete, highLevelClient().indices()::deleteAsync)); () -> execute(deleteIndexRequest, highLevelClient().indices()::delete, highLevelClient().indices()::deleteAsync,
highLevelClient().indices()::delete, highLevelClient().indices()::deleteAsync));
assertEquals(RestStatus.NOT_FOUND, exception.status()); assertEquals(RestStatus.NOT_FOUND, exception.status());
} }
} }
@ -407,6 +418,7 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
addAction.routing("routing").searchRouting("search_routing").filter("{\"term\":{\"year\":2016}}"); addAction.routing("routing").searchRouting("search_routing").filter("{\"term\":{\"year\":2016}}");
aliasesAddRequest.addAliasAction(addAction); aliasesAddRequest.addAliasAction(addAction);
IndicesAliasesResponse aliasesAddResponse = execute(aliasesAddRequest, highLevelClient().indices()::updateAliases, IndicesAliasesResponse aliasesAddResponse = execute(aliasesAddRequest, highLevelClient().indices()::updateAliases,
highLevelClient().indices()::updateAliasesAsync, highLevelClient().indices()::updateAliases,
highLevelClient().indices()::updateAliasesAsync); highLevelClient().indices()::updateAliasesAsync);
assertTrue(aliasesAddResponse.isAcknowledged()); assertTrue(aliasesAddResponse.isAcknowledged());
assertThat(aliasExists(alias), equalTo(true)); assertThat(aliasExists(alias), equalTo(true));
@ -425,6 +437,7 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
AliasActions removeAction = new AliasActions(AliasActions.Type.REMOVE).index(index).alias(alias); AliasActions removeAction = new AliasActions(AliasActions.Type.REMOVE).index(index).alias(alias);
aliasesAddRemoveRequest.addAliasAction(removeAction); aliasesAddRemoveRequest.addAliasAction(removeAction);
IndicesAliasesResponse aliasesAddRemoveResponse = execute(aliasesAddRemoveRequest, highLevelClient().indices()::updateAliases, IndicesAliasesResponse aliasesAddRemoveResponse = execute(aliasesAddRemoveRequest, highLevelClient().indices()::updateAliases,
highLevelClient().indices()::updateAliasesAsync, highLevelClient().indices()::updateAliases,
highLevelClient().indices()::updateAliasesAsync); highLevelClient().indices()::updateAliasesAsync);
assertTrue(aliasesAddRemoveResponse.isAcknowledged()); assertTrue(aliasesAddRemoveResponse.isAcknowledged());
assertThat(aliasExists(alias), equalTo(false)); assertThat(aliasExists(alias), equalTo(false));
@ -436,6 +449,7 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
AliasActions removeIndexAction = new AliasActions(AliasActions.Type.REMOVE_INDEX).index(index); AliasActions removeIndexAction = new AliasActions(AliasActions.Type.REMOVE_INDEX).index(index);
aliasesRemoveIndexRequest.addAliasAction(removeIndexAction); aliasesRemoveIndexRequest.addAliasAction(removeIndexAction);
IndicesAliasesResponse aliasesRemoveIndexResponse = execute(aliasesRemoveIndexRequest, highLevelClient().indices()::updateAliases, IndicesAliasesResponse aliasesRemoveIndexResponse = execute(aliasesRemoveIndexRequest, highLevelClient().indices()::updateAliases,
highLevelClient().indices()::updateAliasesAsync, highLevelClient().indices()::updateAliases,
highLevelClient().indices()::updateAliasesAsync); highLevelClient().indices()::updateAliasesAsync);
assertTrue(aliasesRemoveIndexResponse.isAcknowledged()); assertTrue(aliasesRemoveIndexResponse.isAcknowledged());
assertThat(aliasExists(alias), equalTo(false)); assertThat(aliasExists(alias), equalTo(false));
@ -453,7 +467,9 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
IndicesAliasesRequest nonExistentIndexRequest = new IndicesAliasesRequest(); IndicesAliasesRequest nonExistentIndexRequest = new IndicesAliasesRequest();
nonExistentIndexRequest.addAliasAction(new AliasActions(AliasActions.Type.ADD).index(nonExistentIndex).alias(alias)); nonExistentIndexRequest.addAliasAction(new AliasActions(AliasActions.Type.ADD).index(nonExistentIndex).alias(alias));
ElasticsearchException exception = expectThrows(ElasticsearchException.class, () -> execute(nonExistentIndexRequest, ElasticsearchException exception = expectThrows(ElasticsearchException.class, () -> execute(nonExistentIndexRequest,
highLevelClient().indices()::updateAliases, highLevelClient().indices()::updateAliasesAsync)); highLevelClient().indices()::updateAliases, highLevelClient().indices()::updateAliasesAsync,
highLevelClient().indices()::updateAliases,
highLevelClient().indices()::updateAliasesAsync));
assertThat(exception.status(), equalTo(RestStatus.NOT_FOUND)); assertThat(exception.status(), equalTo(RestStatus.NOT_FOUND));
assertThat(exception.getMessage(), equalTo("Elasticsearch exception [type=index_not_found_exception, reason=no such index]")); assertThat(exception.getMessage(), equalTo("Elasticsearch exception [type=index_not_found_exception, reason=no such index]"));
assertThat(exception.getMetadata("es.index"), hasItem(nonExistentIndex)); assertThat(exception.getMetadata("es.index"), hasItem(nonExistentIndex));
@ -463,7 +479,8 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
mixedRequest.addAliasAction(new AliasActions(AliasActions.Type.ADD).indices(index).aliases(alias)); mixedRequest.addAliasAction(new AliasActions(AliasActions.Type.ADD).indices(index).aliases(alias));
mixedRequest.addAliasAction(new AliasActions(AliasActions.Type.REMOVE).indices(nonExistentIndex).alias(alias)); mixedRequest.addAliasAction(new AliasActions(AliasActions.Type.REMOVE).indices(nonExistentIndex).alias(alias));
exception = expectThrows(ElasticsearchStatusException.class, exception = expectThrows(ElasticsearchStatusException.class,
() -> execute(mixedRequest, highLevelClient().indices()::updateAliases, highLevelClient().indices()::updateAliasesAsync)); () -> execute(mixedRequest, highLevelClient().indices()::updateAliases, highLevelClient().indices()::updateAliasesAsync,
highLevelClient().indices()::updateAliases, highLevelClient().indices()::updateAliasesAsync));
assertThat(exception.status(), equalTo(RestStatus.NOT_FOUND)); assertThat(exception.status(), equalTo(RestStatus.NOT_FOUND));
assertThat(exception.getMessage(), equalTo("Elasticsearch exception [type=index_not_found_exception, reason=no such index]")); assertThat(exception.getMessage(), equalTo("Elasticsearch exception [type=index_not_found_exception, reason=no such index]"));
assertThat(exception.getMetadata("es.index"), hasItem(nonExistentIndex)); assertThat(exception.getMetadata("es.index"), hasItem(nonExistentIndex));
@ -475,6 +492,7 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
removeIndexRequest.addAliasAction(new AliasActions(AliasActions.Type.ADD).index(nonExistentIndex).alias(alias)); removeIndexRequest.addAliasAction(new AliasActions(AliasActions.Type.ADD).index(nonExistentIndex).alias(alias));
removeIndexRequest.addAliasAction(new AliasActions(AliasActions.Type.REMOVE_INDEX).indices(nonExistentIndex)); removeIndexRequest.addAliasAction(new AliasActions(AliasActions.Type.REMOVE_INDEX).indices(nonExistentIndex));
exception = expectThrows(ElasticsearchException.class, () -> execute(removeIndexRequest, highLevelClient().indices()::updateAliases, exception = expectThrows(ElasticsearchException.class, () -> execute(removeIndexRequest, highLevelClient().indices()::updateAliases,
highLevelClient().indices()::updateAliasesAsync, highLevelClient().indices()::updateAliases,
highLevelClient().indices()::updateAliasesAsync)); highLevelClient().indices()::updateAliasesAsync));
assertThat(exception.status(), equalTo(RestStatus.NOT_FOUND)); assertThat(exception.status(), equalTo(RestStatus.NOT_FOUND));
assertThat(exception.getMessage(), equalTo("Elasticsearch exception [type=index_not_found_exception, reason=no such index]")); assertThat(exception.getMessage(), equalTo("Elasticsearch exception [type=index_not_found_exception, reason=no such index]"));
@ -495,6 +513,7 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
OpenIndexRequest openIndexRequest = new OpenIndexRequest(index); OpenIndexRequest openIndexRequest = new OpenIndexRequest(index);
OpenIndexResponse openIndexResponse = execute(openIndexRequest, highLevelClient().indices()::open, OpenIndexResponse openIndexResponse = execute(openIndexRequest, highLevelClient().indices()::open,
highLevelClient().indices()::openAsync, highLevelClient().indices()::open,
highLevelClient().indices()::openAsync); highLevelClient().indices()::openAsync);
assertTrue(openIndexResponse.isAcknowledged()); assertTrue(openIndexResponse.isAcknowledged());
@ -508,19 +527,22 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
OpenIndexRequest openIndexRequest = new OpenIndexRequest(nonExistentIndex); OpenIndexRequest openIndexRequest = new OpenIndexRequest(nonExistentIndex);
ElasticsearchException exception = expectThrows(ElasticsearchException.class, ElasticsearchException exception = expectThrows(ElasticsearchException.class,
() -> execute(openIndexRequest, highLevelClient().indices()::open, highLevelClient().indices()::openAsync)); () -> execute(openIndexRequest, highLevelClient().indices()::open, highLevelClient().indices()::openAsync,
highLevelClient().indices()::open, highLevelClient().indices()::openAsync));
assertEquals(RestStatus.NOT_FOUND, exception.status()); assertEquals(RestStatus.NOT_FOUND, exception.status());
OpenIndexRequest lenientOpenIndexRequest = new OpenIndexRequest(nonExistentIndex); OpenIndexRequest lenientOpenIndexRequest = new OpenIndexRequest(nonExistentIndex);
lenientOpenIndexRequest.indicesOptions(IndicesOptions.lenientExpandOpen()); lenientOpenIndexRequest.indicesOptions(IndicesOptions.lenientExpandOpen());
OpenIndexResponse lenientOpenIndexResponse = execute(lenientOpenIndexRequest, highLevelClient().indices()::open, OpenIndexResponse lenientOpenIndexResponse = execute(lenientOpenIndexRequest, highLevelClient().indices()::open,
highLevelClient().indices()::openAsync, highLevelClient().indices()::open,
highLevelClient().indices()::openAsync); highLevelClient().indices()::openAsync);
assertThat(lenientOpenIndexResponse.isAcknowledged(), equalTo(true)); assertThat(lenientOpenIndexResponse.isAcknowledged(), equalTo(true));
OpenIndexRequest strictOpenIndexRequest = new OpenIndexRequest(nonExistentIndex); OpenIndexRequest strictOpenIndexRequest = new OpenIndexRequest(nonExistentIndex);
strictOpenIndexRequest.indicesOptions(IndicesOptions.strictExpandOpen()); strictOpenIndexRequest.indicesOptions(IndicesOptions.strictExpandOpen());
ElasticsearchException strictException = expectThrows(ElasticsearchException.class, ElasticsearchException strictException = expectThrows(ElasticsearchException.class,
() -> execute(openIndexRequest, highLevelClient().indices()::open, highLevelClient().indices()::openAsync)); () -> execute(openIndexRequest, highLevelClient().indices()::open, highLevelClient().indices()::openAsync,
highLevelClient().indices()::open, highLevelClient().indices()::openAsync));
assertEquals(RestStatus.NOT_FOUND, strictException.status()); assertEquals(RestStatus.NOT_FOUND, strictException.status());
} }
@ -532,6 +554,7 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
CloseIndexRequest closeIndexRequest = new CloseIndexRequest(index); CloseIndexRequest closeIndexRequest = new CloseIndexRequest(index);
CloseIndexResponse closeIndexResponse = execute(closeIndexRequest, highLevelClient().indices()::close, CloseIndexResponse closeIndexResponse = execute(closeIndexRequest, highLevelClient().indices()::close,
highLevelClient().indices()::closeAsync, highLevelClient().indices()::close,
highLevelClient().indices()::closeAsync); highLevelClient().indices()::closeAsync);
assertTrue(closeIndexResponse.isAcknowledged()); assertTrue(closeIndexResponse.isAcknowledged());
@ -547,7 +570,8 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
CloseIndexRequest closeIndexRequest = new CloseIndexRequest(nonExistentIndex); CloseIndexRequest closeIndexRequest = new CloseIndexRequest(nonExistentIndex);
ElasticsearchException exception = expectThrows(ElasticsearchException.class, ElasticsearchException exception = expectThrows(ElasticsearchException.class,
() -> execute(closeIndexRequest, highLevelClient().indices()::close, highLevelClient().indices()::closeAsync)); () -> execute(closeIndexRequest, highLevelClient().indices()::close, highLevelClient().indices()::closeAsync,
highLevelClient().indices()::close, highLevelClient().indices()::closeAsync));
assertEquals(RestStatus.NOT_FOUND, exception.status()); assertEquals(RestStatus.NOT_FOUND, exception.status());
} }
@ -561,7 +585,8 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
createIndex(index, settings); createIndex(index, settings);
RefreshRequest refreshRequest = new RefreshRequest(index); RefreshRequest refreshRequest = new RefreshRequest(index);
RefreshResponse refreshResponse = RefreshResponse refreshResponse =
execute(refreshRequest, highLevelClient().indices()::refresh, highLevelClient().indices()::refreshAsync); execute(refreshRequest, highLevelClient().indices()::refresh, highLevelClient().indices()::refreshAsync,
highLevelClient().indices()::refresh, highLevelClient().indices()::refreshAsync);
assertThat(refreshResponse.getTotalShards(), equalTo(1)); assertThat(refreshResponse.getTotalShards(), equalTo(1));
assertThat(refreshResponse.getSuccessfulShards(), equalTo(1)); assertThat(refreshResponse.getSuccessfulShards(), equalTo(1));
assertThat(refreshResponse.getFailedShards(), equalTo(0)); assertThat(refreshResponse.getFailedShards(), equalTo(0));
@ -572,7 +597,8 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
assertFalse(indexExists(nonExistentIndex)); assertFalse(indexExists(nonExistentIndex));
RefreshRequest refreshRequest = new RefreshRequest(nonExistentIndex); RefreshRequest refreshRequest = new RefreshRequest(nonExistentIndex);
ElasticsearchException exception = expectThrows(ElasticsearchException.class, ElasticsearchException exception = expectThrows(ElasticsearchException.class,
() -> execute(refreshRequest, highLevelClient().indices()::refresh, highLevelClient().indices()::refreshAsync)); () -> execute(refreshRequest, highLevelClient().indices()::refresh, highLevelClient().indices()::refreshAsync,
highLevelClient().indices()::refresh, highLevelClient().indices()::refreshAsync));
assertEquals(RestStatus.NOT_FOUND, exception.status()); assertEquals(RestStatus.NOT_FOUND, exception.status());
} }
} }
@ -587,7 +613,8 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
createIndex(index, settings); createIndex(index, settings);
FlushRequest flushRequest = new FlushRequest(index); FlushRequest flushRequest = new FlushRequest(index);
FlushResponse flushResponse = FlushResponse flushResponse =
execute(flushRequest, highLevelClient().indices()::flush, highLevelClient().indices()::flushAsync); execute(flushRequest, highLevelClient().indices()::flush, highLevelClient().indices()::flushAsync,
highLevelClient().indices()::flush, highLevelClient().indices()::flushAsync);
assertThat(flushResponse.getTotalShards(), equalTo(1)); assertThat(flushResponse.getTotalShards(), equalTo(1));
assertThat(flushResponse.getSuccessfulShards(), equalTo(1)); assertThat(flushResponse.getSuccessfulShards(), equalTo(1));
assertThat(flushResponse.getFailedShards(), equalTo(0)); assertThat(flushResponse.getFailedShards(), equalTo(0));
@ -598,7 +625,8 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
assertFalse(indexExists(nonExistentIndex)); assertFalse(indexExists(nonExistentIndex));
FlushRequest flushRequest = new FlushRequest(nonExistentIndex); FlushRequest flushRequest = new FlushRequest(nonExistentIndex);
ElasticsearchException exception = expectThrows(ElasticsearchException.class, ElasticsearchException exception = expectThrows(ElasticsearchException.class,
() -> execute(flushRequest, highLevelClient().indices()::flush, highLevelClient().indices()::flushAsync)); () -> execute(flushRequest, highLevelClient().indices()::flush, highLevelClient().indices()::flushAsync,
highLevelClient().indices()::flush, highLevelClient().indices()::flushAsync));
assertEquals(RestStatus.NOT_FOUND, exception.status()); assertEquals(RestStatus.NOT_FOUND, exception.status());
} }
} }
@ -646,7 +674,8 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
createIndex(index, settings); createIndex(index, settings);
ClearIndicesCacheRequest clearCacheRequest = new ClearIndicesCacheRequest(index); ClearIndicesCacheRequest clearCacheRequest = new ClearIndicesCacheRequest(index);
ClearIndicesCacheResponse clearCacheResponse = ClearIndicesCacheResponse clearCacheResponse =
execute(clearCacheRequest, highLevelClient().indices()::clearCache, highLevelClient().indices()::clearCacheAsync); execute(clearCacheRequest, highLevelClient().indices()::clearCache, highLevelClient().indices()::clearCacheAsync,
highLevelClient().indices()::clearCache, highLevelClient().indices()::clearCacheAsync);
assertThat(clearCacheResponse.getTotalShards(), equalTo(1)); assertThat(clearCacheResponse.getTotalShards(), equalTo(1));
assertThat(clearCacheResponse.getSuccessfulShards(), equalTo(1)); assertThat(clearCacheResponse.getSuccessfulShards(), equalTo(1));
assertThat(clearCacheResponse.getFailedShards(), equalTo(0)); assertThat(clearCacheResponse.getFailedShards(), equalTo(0));
@ -657,8 +686,8 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
assertFalse(indexExists(nonExistentIndex)); assertFalse(indexExists(nonExistentIndex));
ClearIndicesCacheRequest clearCacheRequest = new ClearIndicesCacheRequest(nonExistentIndex); ClearIndicesCacheRequest clearCacheRequest = new ClearIndicesCacheRequest(nonExistentIndex);
ElasticsearchException exception = expectThrows(ElasticsearchException.class, ElasticsearchException exception = expectThrows(ElasticsearchException.class,
() -> execute(clearCacheRequest, highLevelClient().indices()::clearCache, () -> execute(clearCacheRequest, highLevelClient().indices()::clearCache, highLevelClient().indices()::clearCacheAsync,
highLevelClient().indices()::clearCacheAsync)); highLevelClient().indices()::clearCache, highLevelClient().indices()::clearCacheAsync));
assertEquals(RestStatus.NOT_FOUND, exception.status()); assertEquals(RestStatus.NOT_FOUND, exception.status());
} }
} }
@ -673,7 +702,8 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
createIndex(index, settings); createIndex(index, settings);
ForceMergeRequest forceMergeRequest = new ForceMergeRequest(index); ForceMergeRequest forceMergeRequest = new ForceMergeRequest(index);
ForceMergeResponse forceMergeResponse = ForceMergeResponse forceMergeResponse =
execute(forceMergeRequest, highLevelClient().indices()::forceMerge, highLevelClient().indices()::forceMergeAsync); execute(forceMergeRequest, highLevelClient().indices()::forceMerge, highLevelClient().indices()::forceMergeAsync,
highLevelClient().indices()::forceMerge, highLevelClient().indices()::forceMergeAsync);
assertThat(forceMergeResponse.getTotalShards(), equalTo(1)); assertThat(forceMergeResponse.getTotalShards(), equalTo(1));
assertThat(forceMergeResponse.getSuccessfulShards(), equalTo(1)); assertThat(forceMergeResponse.getSuccessfulShards(), equalTo(1));
assertThat(forceMergeResponse.getFailedShards(), equalTo(0)); assertThat(forceMergeResponse.getFailedShards(), equalTo(0));
@ -684,25 +714,30 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
assertFalse(indexExists(nonExistentIndex)); assertFalse(indexExists(nonExistentIndex));
ForceMergeRequest forceMergeRequest = new ForceMergeRequest(nonExistentIndex); ForceMergeRequest forceMergeRequest = new ForceMergeRequest(nonExistentIndex);
ElasticsearchException exception = expectThrows(ElasticsearchException.class, ElasticsearchException exception = expectThrows(ElasticsearchException.class,
() -> execute(forceMergeRequest, highLevelClient().indices()::forceMerge, highLevelClient().indices()::forceMergeAsync)); () -> execute(forceMergeRequest, highLevelClient().indices()::forceMerge, highLevelClient().indices()::forceMergeAsync,
highLevelClient().indices()::forceMerge, highLevelClient().indices()::forceMergeAsync));
assertEquals(RestStatus.NOT_FOUND, exception.status()); assertEquals(RestStatus.NOT_FOUND, exception.status());
} }
} }
public void testExistsAlias() throws IOException { public void testExistsAlias() throws IOException {
GetAliasesRequest getAliasesRequest = new GetAliasesRequest("alias"); GetAliasesRequest getAliasesRequest = new GetAliasesRequest("alias");
assertFalse(execute(getAliasesRequest, highLevelClient().indices()::existsAlias, highLevelClient().indices()::existsAliasAsync)); assertFalse(execute(getAliasesRequest, highLevelClient().indices()::existsAlias, highLevelClient().indices()::existsAliasAsync,
highLevelClient().indices()::existsAlias, highLevelClient().indices()::existsAliasAsync));
createIndex("index", Settings.EMPTY); createIndex("index", Settings.EMPTY);
client().performRequest(HttpPut.METHOD_NAME, "/index/_alias/alias"); client().performRequest(HttpPut.METHOD_NAME, "/index/_alias/alias");
assertTrue(execute(getAliasesRequest, highLevelClient().indices()::existsAlias, highLevelClient().indices()::existsAliasAsync)); assertTrue(execute(getAliasesRequest, highLevelClient().indices()::existsAlias, highLevelClient().indices()::existsAliasAsync,
highLevelClient().indices()::existsAlias, highLevelClient().indices()::existsAliasAsync));
GetAliasesRequest getAliasesRequest2 = new GetAliasesRequest(); GetAliasesRequest getAliasesRequest2 = new GetAliasesRequest();
getAliasesRequest2.aliases("alias"); getAliasesRequest2.aliases("alias");
getAliasesRequest2.indices("index"); getAliasesRequest2.indices("index");
assertTrue(execute(getAliasesRequest2, highLevelClient().indices()::existsAlias, highLevelClient().indices()::existsAliasAsync)); assertTrue(execute(getAliasesRequest2, highLevelClient().indices()::existsAlias, highLevelClient().indices()::existsAliasAsync,
highLevelClient().indices()::existsAlias, highLevelClient().indices()::existsAliasAsync));
getAliasesRequest2.indices("does_not_exist"); getAliasesRequest2.indices("does_not_exist");
assertFalse(execute(getAliasesRequest2, highLevelClient().indices()::existsAlias, highLevelClient().indices()::existsAliasAsync)); assertFalse(execute(getAliasesRequest2, highLevelClient().indices()::existsAlias, highLevelClient().indices()::existsAliasAsync,
highLevelClient().indices()::existsAlias, highLevelClient().indices()::existsAliasAsync));
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@ -722,7 +757,8 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
.putNull("index.routing.allocation.require._name") .putNull("index.routing.allocation.require._name")
.build(); .build();
resizeRequest.setTargetIndex(new CreateIndexRequest("target").settings(targetSettings).alias(new Alias("alias"))); resizeRequest.setTargetIndex(new CreateIndexRequest("target").settings(targetSettings).alias(new Alias("alias")));
ResizeResponse resizeResponse = highLevelClient().indices().shrink(resizeRequest); ResizeResponse resizeResponse = execute(resizeRequest, highLevelClient().indices()::shrink,
highLevelClient().indices()::shrinkAsync, highLevelClient().indices()::shrink, highLevelClient().indices()::shrinkAsync);
assertTrue(resizeResponse.isAcknowledged()); assertTrue(resizeResponse.isAcknowledged());
assertTrue(resizeResponse.isShardsAcknowledged()); assertTrue(resizeResponse.isShardsAcknowledged());
Map<String, Object> getIndexResponse = getAsMap("target"); Map<String, Object> getIndexResponse = getAsMap("target");
@ -744,7 +780,8 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
resizeRequest.setResizeType(ResizeType.SPLIT); resizeRequest.setResizeType(ResizeType.SPLIT);
Settings targetSettings = Settings.builder().put("index.number_of_shards", 4).put("index.number_of_replicas", 0).build(); Settings targetSettings = Settings.builder().put("index.number_of_shards", 4).put("index.number_of_replicas", 0).build();
resizeRequest.setTargetIndex(new CreateIndexRequest("target").settings(targetSettings).alias(new Alias("alias"))); resizeRequest.setTargetIndex(new CreateIndexRequest("target").settings(targetSettings).alias(new Alias("alias")));
ResizeResponse resizeResponse = highLevelClient().indices().split(resizeRequest); ResizeResponse resizeResponse = execute(resizeRequest, highLevelClient().indices()::split, highLevelClient().indices()::splitAsync,
highLevelClient().indices()::split, highLevelClient().indices()::splitAsync);
assertTrue(resizeResponse.isAcknowledged()); assertTrue(resizeResponse.isAcknowledged());
assertTrue(resizeResponse.isShardsAcknowledged()); assertTrue(resizeResponse.isShardsAcknowledged());
Map<String, Object> getIndexResponse = getAsMap("target"); Map<String, Object> getIndexResponse = getAsMap("target");
@ -757,12 +794,13 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
} }
public void testRollover() throws IOException { public void testRollover() throws IOException {
highLevelClient().indices().create(new CreateIndexRequest("test").alias(new Alias("alias"))); highLevelClient().indices().create(new CreateIndexRequest("test").alias(new Alias("alias")), RequestOptions.DEFAULT);
RolloverRequest rolloverRequest = new RolloverRequest("alias", "test_new"); RolloverRequest rolloverRequest = new RolloverRequest("alias", "test_new");
rolloverRequest.addMaxIndexDocsCondition(1); rolloverRequest.addMaxIndexDocsCondition(1);
{ {
RolloverResponse rolloverResponse = execute(rolloverRequest, highLevelClient().indices()::rollover, RolloverResponse rolloverResponse = execute(rolloverRequest, highLevelClient().indices()::rollover,
highLevelClient().indices()::rolloverAsync, highLevelClient().indices()::rollover,
highLevelClient().indices()::rolloverAsync); highLevelClient().indices()::rolloverAsync);
assertFalse(rolloverResponse.isRolledOver()); assertFalse(rolloverResponse.isRolledOver());
assertFalse(rolloverResponse.isDryRun()); assertFalse(rolloverResponse.isDryRun());
@ -773,15 +811,16 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
assertEquals("test_new", rolloverResponse.getNewIndex()); assertEquals("test_new", rolloverResponse.getNewIndex());
} }
highLevelClient().index(new IndexRequest("test", "type", "1").source("field", "value")); highLevelClient().index(new IndexRequest("test", "type", "1").source("field", "value"), RequestOptions.DEFAULT);
highLevelClient().index(new IndexRequest("test", "type", "2").source("field", "value") highLevelClient().index(new IndexRequest("test", "type", "2").source("field", "value")
.setRefreshPolicy(WriteRequest.RefreshPolicy.WAIT_UNTIL)); .setRefreshPolicy(WriteRequest.RefreshPolicy.WAIT_UNTIL), RequestOptions.DEFAULT);
//without the refresh the rollover may not happen as the number of docs seen may be off //without the refresh the rollover may not happen as the number of docs seen may be off
{ {
rolloverRequest.addMaxIndexAgeCondition(new TimeValue(1)); rolloverRequest.addMaxIndexAgeCondition(new TimeValue(1));
rolloverRequest.dryRun(true); rolloverRequest.dryRun(true);
RolloverResponse rolloverResponse = execute(rolloverRequest, highLevelClient().indices()::rollover, RolloverResponse rolloverResponse = execute(rolloverRequest, highLevelClient().indices()::rollover,
highLevelClient().indices()::rolloverAsync, highLevelClient().indices()::rollover,
highLevelClient().indices()::rolloverAsync); highLevelClient().indices()::rolloverAsync);
assertFalse(rolloverResponse.isRolledOver()); assertFalse(rolloverResponse.isRolledOver());
assertTrue(rolloverResponse.isDryRun()); assertTrue(rolloverResponse.isDryRun());
@ -796,6 +835,7 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
rolloverRequest.dryRun(false); rolloverRequest.dryRun(false);
rolloverRequest.addMaxIndexSizeCondition(new ByteSizeValue(1, ByteSizeUnit.MB)); rolloverRequest.addMaxIndexSizeCondition(new ByteSizeValue(1, ByteSizeUnit.MB));
RolloverResponse rolloverResponse = execute(rolloverRequest, highLevelClient().indices()::rollover, RolloverResponse rolloverResponse = execute(rolloverRequest, highLevelClient().indices()::rollover,
highLevelClient().indices()::rolloverAsync, highLevelClient().indices()::rollover,
highLevelClient().indices()::rolloverAsync); highLevelClient().indices()::rolloverAsync);
assertTrue(rolloverResponse.isRolledOver()); assertTrue(rolloverResponse.isRolledOver());
assertFalse(rolloverResponse.isDryRun()); assertFalse(rolloverResponse.isDryRun());
@ -830,6 +870,7 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
UpdateSettingsRequest dynamicSettingRequest = new UpdateSettingsRequest(); UpdateSettingsRequest dynamicSettingRequest = new UpdateSettingsRequest();
dynamicSettingRequest.settings(Settings.builder().put(dynamicSettingKey, dynamicSettingValue).build()); dynamicSettingRequest.settings(Settings.builder().put(dynamicSettingKey, dynamicSettingValue).build());
UpdateSettingsResponse response = execute(dynamicSettingRequest, highLevelClient().indices()::putSettings, UpdateSettingsResponse response = execute(dynamicSettingRequest, highLevelClient().indices()::putSettings,
highLevelClient().indices()::putSettingsAsync, highLevelClient().indices()::putSettings,
highLevelClient().indices()::putSettingsAsync); highLevelClient().indices()::putSettingsAsync);
assertTrue(response.isAcknowledged()); assertTrue(response.isAcknowledged());
@ -840,6 +881,7 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
UpdateSettingsRequest staticSettingRequest = new UpdateSettingsRequest(); UpdateSettingsRequest staticSettingRequest = new UpdateSettingsRequest();
staticSettingRequest.settings(Settings.builder().put(staticSettingKey, staticSettingValue).build()); staticSettingRequest.settings(Settings.builder().put(staticSettingKey, staticSettingValue).build());
ElasticsearchException exception = expectThrows(ElasticsearchException.class, () -> execute(staticSettingRequest, ElasticsearchException exception = expectThrows(ElasticsearchException.class, () -> execute(staticSettingRequest,
highLevelClient().indices()::putSettings, highLevelClient().indices()::putSettingsAsync,
highLevelClient().indices()::putSettings, highLevelClient().indices()::putSettingsAsync)); highLevelClient().indices()::putSettings, highLevelClient().indices()::putSettingsAsync));
assertThat(exception.getMessage(), assertThat(exception.getMessage(),
startsWith("Elasticsearch exception [type=illegal_argument_exception, " startsWith("Elasticsearch exception [type=illegal_argument_exception, "
@ -850,6 +892,7 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
closeIndex(index); closeIndex(index);
response = execute(staticSettingRequest, highLevelClient().indices()::putSettings, response = execute(staticSettingRequest, highLevelClient().indices()::putSettings,
highLevelClient().indices()::putSettingsAsync, highLevelClient().indices()::putSettings,
highLevelClient().indices()::putSettingsAsync); highLevelClient().indices()::putSettingsAsync);
assertTrue(response.isAcknowledged()); assertTrue(response.isAcknowledged());
openIndex(index); openIndex(index);
@ -860,6 +903,7 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
UpdateSettingsRequest unmodifiableSettingRequest = new UpdateSettingsRequest(); UpdateSettingsRequest unmodifiableSettingRequest = new UpdateSettingsRequest();
unmodifiableSettingRequest.settings(Settings.builder().put(unmodifiableSettingKey, unmodifiableSettingValue).build()); unmodifiableSettingRequest.settings(Settings.builder().put(unmodifiableSettingKey, unmodifiableSettingValue).build());
exception = expectThrows(ElasticsearchException.class, () -> execute(unmodifiableSettingRequest, exception = expectThrows(ElasticsearchException.class, () -> execute(unmodifiableSettingRequest,
highLevelClient().indices()::putSettings, highLevelClient().indices()::putSettingsAsync,
highLevelClient().indices()::putSettings, highLevelClient().indices()::putSettingsAsync)); highLevelClient().indices()::putSettings, highLevelClient().indices()::putSettingsAsync));
assertThat(exception.getMessage(), startsWith( assertThat(exception.getMessage(), startsWith(
"Elasticsearch exception [type=illegal_argument_exception, " "Elasticsearch exception [type=illegal_argument_exception, "
@ -887,12 +931,14 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
indexUpdateSettingsRequest.settings(Settings.builder().put(setting, value).build()); indexUpdateSettingsRequest.settings(Settings.builder().put(setting, value).build());
ElasticsearchException exception = expectThrows(ElasticsearchException.class, () -> execute(indexUpdateSettingsRequest, ElasticsearchException exception = expectThrows(ElasticsearchException.class, () -> execute(indexUpdateSettingsRequest,
highLevelClient().indices()::putSettings, highLevelClient().indices()::putSettingsAsync,
highLevelClient().indices()::putSettings, highLevelClient().indices()::putSettingsAsync)); highLevelClient().indices()::putSettings, highLevelClient().indices()::putSettingsAsync));
assertEquals(RestStatus.NOT_FOUND, exception.status()); assertEquals(RestStatus.NOT_FOUND, exception.status());
assertThat(exception.getMessage(), equalTo("Elasticsearch exception [type=index_not_found_exception, reason=no such index]")); assertThat(exception.getMessage(), equalTo("Elasticsearch exception [type=index_not_found_exception, reason=no such index]"));
createIndex(index, Settings.EMPTY); createIndex(index, Settings.EMPTY);
exception = expectThrows(ElasticsearchException.class, () -> execute(indexUpdateSettingsRequest, exception = expectThrows(ElasticsearchException.class, () -> execute(indexUpdateSettingsRequest,
highLevelClient().indices()::putSettings, highLevelClient().indices()::putSettingsAsync,
highLevelClient().indices()::putSettings, highLevelClient().indices()::putSettingsAsync)); highLevelClient().indices()::putSettings, highLevelClient().indices()::putSettingsAsync));
assertThat(exception.status(), equalTo(RestStatus.BAD_REQUEST)); assertThat(exception.status(), equalTo(RestStatus.BAD_REQUEST));
assertThat(exception.getMessage(), equalTo( assertThat(exception.getMessage(), equalTo(

View File

@ -28,12 +28,12 @@ import java.util.Map;
public class PingAndInfoIT extends ESRestHighLevelClientTestCase { public class PingAndInfoIT extends ESRestHighLevelClientTestCase {
public void testPing() throws IOException { public void testPing() throws IOException {
assertTrue(highLevelClient().ping()); assertTrue(highLevelClient().ping(RequestOptions.DEFAULT));
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void testInfo() throws IOException { public void testInfo() throws IOException {
MainResponse info = highLevelClient().info(); MainResponse info = highLevelClient().info(RequestOptions.DEFAULT);
// compare with what the low level client outputs // compare with what the low level client outputs
Map<String, Object> infoAsMap = entityAsMap(adminClient().performRequest(HttpGet.METHOD_NAME, "/")); Map<String, Object> infoAsMap = entityAsMap(adminClient().performRequest(HttpGet.METHOD_NAME, "/"));
assertEquals(infoAsMap.get("cluster_name"), info.getClusterName().value()); assertEquals(infoAsMap.get("cluster_name"), info.getClusterName().value());

View File

@ -82,8 +82,8 @@ public class RankEvalIT extends ESRestHighLevelClientTestCase {
RankEvalSpec spec = new RankEvalSpec(specifications, metric); RankEvalSpec spec = new RankEvalSpec(specifications, metric);
RankEvalRequest rankEvalRequest = new RankEvalRequest(spec, new String[] { "index", "index2" }); RankEvalRequest rankEvalRequest = new RankEvalRequest(spec, new String[] { "index", "index2" });
RankEvalResponse response = execute(rankEvalRequest, highLevelClient()::rankEval, RankEvalResponse response = execute(rankEvalRequest, highLevelClient()::rankEval, highLevelClient()::rankEvalAsync,
highLevelClient()::rankEvalAsync); highLevelClient()::rankEval, highLevelClient()::rankEvalAsync);
// the expected Prec@ for the first query is 5/7 and the expected Prec@ for the second is 1/7, divided by 2 to get the average // the expected Prec@ for the first query is 5/7 and the expected Prec@ for the second is 1/7, divided by 2 to get the average
double expectedPrecision = (1.0 / 7.0 + 5.0 / 7.0) / 2.0; double expectedPrecision = (1.0 / 7.0 + 5.0 / 7.0) / 2.0;
assertEquals(expectedPrecision, response.getEvaluationResult(), Double.MIN_VALUE); assertEquals(expectedPrecision, response.getEvaluationResult(), Double.MIN_VALUE);
@ -117,7 +117,8 @@ public class RankEvalIT extends ESRestHighLevelClientTestCase {
// now try this when test2 is closed // now try this when test2 is closed
client().performRequest("POST", "index2/_close", Collections.emptyMap()); client().performRequest("POST", "index2/_close", Collections.emptyMap());
rankEvalRequest.indicesOptions(IndicesOptions.fromParameters(null, "true", null, SearchRequest.DEFAULT_INDICES_OPTIONS)); rankEvalRequest.indicesOptions(IndicesOptions.fromParameters(null, "true", null, SearchRequest.DEFAULT_INDICES_OPTIONS));
response = execute(rankEvalRequest, highLevelClient()::rankEval, highLevelClient()::rankEvalAsync); response = execute(rankEvalRequest, highLevelClient()::rankEval, highLevelClient()::rankEvalAsync,
highLevelClient()::rankEval, highLevelClient()::rankEvalAsync);
} }
private static List<RatedDocument> createRelevant(String indexName, String... docs) { private static List<RatedDocument> createRelevant(String indexName, String... docs) {

View File

@ -29,6 +29,8 @@ import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.util.EntityUtils; import org.apache.http.util.EntityUtils;
import org.elasticsearch.action.ActionRequestValidationException; import org.elasticsearch.action.ActionRequestValidationException;
import org.elasticsearch.action.DocWriteRequest; import org.elasticsearch.action.DocWriteRequest;
import org.elasticsearch.action.admin.cluster.node.tasks.cancel.CancelTasksRequest;
import org.elasticsearch.action.admin.cluster.node.tasks.cancel.CancelTasksResponse;
import org.elasticsearch.action.admin.cluster.node.tasks.list.ListTasksRequest; import org.elasticsearch.action.admin.cluster.node.tasks.list.ListTasksRequest;
import org.elasticsearch.action.admin.cluster.repositories.delete.DeleteRepositoryRequest; import org.elasticsearch.action.admin.cluster.repositories.delete.DeleteRepositoryRequest;
import org.elasticsearch.action.admin.cluster.repositories.get.GetRepositoriesRequest; import org.elasticsearch.action.admin.cluster.repositories.get.GetRepositoriesRequest;
@ -1587,6 +1589,23 @@ public class RequestConvertersTests extends ESTestCase {
assertEquals(expectedParams, request.getParameters()); assertEquals(expectedParams, request.getParameters());
} }
public void testCancelTasks() {
CancelTasksRequest request = new CancelTasksRequest();
Map<String, String> expectedParams = new HashMap<>();
TaskId taskId = new TaskId(randomAlphaOfLength(5), randomNonNegativeLong());
TaskId parentTaskId = new TaskId(randomAlphaOfLength(5), randomNonNegativeLong());
request.setTaskId(taskId);
request.setParentTaskId(parentTaskId);
expectedParams.put("task_id", taskId.toString());
expectedParams.put("parent_task_id", parentTaskId.toString());
Request httpRequest = RequestConverters.cancelTasks(request);
assertThat(httpRequest, notNullValue());
assertThat(httpRequest.getMethod(), equalTo(HttpPost.METHOD_NAME));
assertThat(httpRequest.getEntity(), nullValue());
assertThat(httpRequest.getEndpoint(), equalTo("/_tasks/_cancel"));
assertThat(httpRequest.getParameters(), equalTo(expectedParams));
}
public void testListTasks() { public void testListTasks() {
{ {
ListTasksRequest request = new ListTasksRequest(); ListTasksRequest request = new ListTasksRequest();

View File

@ -20,7 +20,6 @@
package org.elasticsearch.client; package org.elasticsearch.client;
import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonParseException;
import org.apache.http.Header; import org.apache.http.Header;
import org.apache.http.HttpEntity; import org.apache.http.HttpEntity;
import org.apache.http.HttpHost; import org.apache.http.HttpHost;
@ -28,10 +27,7 @@ import org.apache.http.HttpResponse;
import org.apache.http.ProtocolVersion; import org.apache.http.ProtocolVersion;
import org.apache.http.RequestLine; import org.apache.http.RequestLine;
import org.apache.http.StatusLine; import org.apache.http.StatusLine;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpHead;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ByteArrayEntity; import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.ContentType; import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity; import org.apache.http.entity.StringEntity;
@ -77,9 +73,6 @@ import org.elasticsearch.search.suggest.Suggest;
import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.test.InternalAggregationTestCase; import org.elasticsearch.test.InternalAggregationTestCase;
import org.junit.Before; import org.junit.Before;
import org.mockito.ArgumentMatcher;
import org.mockito.internal.matchers.ArrayEquals;
import org.mockito.internal.matchers.VarargMatcher;
import java.io.IOException; import java.io.IOException;
import java.net.SocketTimeoutException; import java.net.SocketTimeoutException;
@ -124,25 +117,22 @@ public class RestHighLevelClientTests extends ESTestCase {
} }
public void testPingSuccessful() throws IOException { public void testPingSuccessful() throws IOException {
Header[] headers = randomHeaders(random(), "Header");
Response response = mock(Response.class); Response response = mock(Response.class);
when(response.getStatusLine()).thenReturn(newStatusLine(RestStatus.OK)); when(response.getStatusLine()).thenReturn(newStatusLine(RestStatus.OK));
when(restClient.performRequest(any(Request.class))).thenReturn(response); when(restClient.performRequest(any(Request.class))).thenReturn(response);
assertTrue(restHighLevelClient.ping(headers)); assertTrue(restHighLevelClient.ping(RequestOptions.DEFAULT));
} }
public void testPing404NotFound() throws IOException { public void testPing404NotFound() throws IOException {
Header[] headers = randomHeaders(random(), "Header");
Response response = mock(Response.class); Response response = mock(Response.class);
when(response.getStatusLine()).thenReturn(newStatusLine(RestStatus.NOT_FOUND)); when(response.getStatusLine()).thenReturn(newStatusLine(RestStatus.NOT_FOUND));
when(restClient.performRequest(any(Request.class))).thenReturn(response); when(restClient.performRequest(any(Request.class))).thenReturn(response);
assertFalse(restHighLevelClient.ping(headers)); assertFalse(restHighLevelClient.ping(RequestOptions.DEFAULT));
} }
public void testPingSocketTimeout() throws IOException { public void testPingSocketTimeout() throws IOException {
Header[] headers = randomHeaders(random(), "Header");
when(restClient.performRequest(any(Request.class))).thenThrow(new SocketTimeoutException()); when(restClient.performRequest(any(Request.class))).thenThrow(new SocketTimeoutException());
expectThrows(SocketTimeoutException.class, () -> restHighLevelClient.ping(headers)); expectThrows(SocketTimeoutException.class, () -> restHighLevelClient.ping(RequestOptions.DEFAULT));
} }
public void testInfo() throws IOException { public void testInfo() throws IOException {
@ -150,18 +140,17 @@ public class RestHighLevelClientTests extends ESTestCase {
MainResponse testInfo = new MainResponse("nodeName", Version.CURRENT, new ClusterName("clusterName"), "clusterUuid", MainResponse testInfo = new MainResponse("nodeName", Version.CURRENT, new ClusterName("clusterName"), "clusterUuid",
Build.CURRENT); Build.CURRENT);
mockResponse(testInfo); mockResponse(testInfo);
MainResponse receivedInfo = restHighLevelClient.info(headers); MainResponse receivedInfo = restHighLevelClient.info(RequestOptions.DEFAULT);
assertEquals(testInfo, receivedInfo); assertEquals(testInfo, receivedInfo);
} }
public void testSearchScroll() throws IOException { public void testSearchScroll() throws IOException {
Header[] headers = randomHeaders(random(), "Header");
SearchResponse mockSearchResponse = new SearchResponse(new SearchResponseSections(SearchHits.empty(), InternalAggregations.EMPTY, SearchResponse mockSearchResponse = new SearchResponse(new SearchResponseSections(SearchHits.empty(), InternalAggregations.EMPTY,
null, false, false, null, 1), randomAlphaOfLengthBetween(5, 10), 5, 5, 0, 100, ShardSearchFailure.EMPTY_ARRAY, null, false, false, null, 1), randomAlphaOfLengthBetween(5, 10), 5, 5, 0, 100, ShardSearchFailure.EMPTY_ARRAY,
SearchResponse.Clusters.EMPTY); SearchResponse.Clusters.EMPTY);
mockResponse(mockSearchResponse); mockResponse(mockSearchResponse);
SearchResponse searchResponse = restHighLevelClient.searchScroll(new SearchScrollRequest(randomAlphaOfLengthBetween(5, 10)), SearchResponse searchResponse = restHighLevelClient.searchScroll(
headers); new SearchScrollRequest(randomAlphaOfLengthBetween(5, 10)), RequestOptions.DEFAULT);
assertEquals(mockSearchResponse.getScrollId(), searchResponse.getScrollId()); assertEquals(mockSearchResponse.getScrollId(), searchResponse.getScrollId());
assertEquals(0, searchResponse.getHits().totalHits); assertEquals(0, searchResponse.getHits().totalHits);
assertEquals(5, searchResponse.getTotalShards()); assertEquals(5, searchResponse.getTotalShards());
@ -170,12 +159,11 @@ public class RestHighLevelClientTests extends ESTestCase {
} }
public void testClearScroll() throws IOException { public void testClearScroll() throws IOException {
Header[] headers = randomHeaders(random(), "Header");
ClearScrollResponse mockClearScrollResponse = new ClearScrollResponse(randomBoolean(), randomIntBetween(0, Integer.MAX_VALUE)); ClearScrollResponse mockClearScrollResponse = new ClearScrollResponse(randomBoolean(), randomIntBetween(0, Integer.MAX_VALUE));
mockResponse(mockClearScrollResponse); mockResponse(mockClearScrollResponse);
ClearScrollRequest clearScrollRequest = new ClearScrollRequest(); ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
clearScrollRequest.addScrollId(randomAlphaOfLengthBetween(5, 10)); clearScrollRequest.addScrollId(randomAlphaOfLengthBetween(5, 10));
ClearScrollResponse clearScrollResponse = restHighLevelClient.clearScroll(clearScrollRequest, headers); ClearScrollResponse clearScrollResponse = restHighLevelClient.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
assertEquals(mockClearScrollResponse.isSucceeded(), clearScrollResponse.isSucceeded()); assertEquals(mockClearScrollResponse.isSucceeded(), clearScrollResponse.isSucceeded());
assertEquals(mockClearScrollResponse.getNumFreed(), clearScrollResponse.getNumFreed()); assertEquals(mockClearScrollResponse.getNumFreed(), clearScrollResponse.getNumFreed());
} }

View File

@ -164,7 +164,8 @@ public class SearchIT extends ESRestHighLevelClientTestCase {
public void testSearchMatchQuery() throws IOException { public void testSearchMatchQuery() throws IOException {
SearchRequest searchRequest = new SearchRequest("index"); SearchRequest searchRequest = new SearchRequest("index");
searchRequest.source(new SearchSourceBuilder().query(new MatchQueryBuilder("num", 10))); searchRequest.source(new SearchSourceBuilder().query(new MatchQueryBuilder("num", 10)));
SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync); SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync,
highLevelClient()::search, highLevelClient()::searchAsync);
assertSearchHeader(searchResponse); assertSearchHeader(searchResponse);
assertNull(searchResponse.getAggregations()); assertNull(searchResponse.getAggregations());
assertNull(searchResponse.getSuggest()); assertNull(searchResponse.getSuggest());
@ -190,7 +191,8 @@ public class SearchIT extends ESRestHighLevelClientTestCase {
searchSourceBuilder.aggregation(new TermsAggregationBuilder("agg1", ValueType.STRING).field("type.keyword")); searchSourceBuilder.aggregation(new TermsAggregationBuilder("agg1", ValueType.STRING).field("type.keyword"));
searchSourceBuilder.size(0); searchSourceBuilder.size(0);
searchRequest.source(searchSourceBuilder); searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync); SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync,
highLevelClient()::search, highLevelClient()::searchAsync);
assertSearchHeader(searchResponse); assertSearchHeader(searchResponse);
assertNull(searchResponse.getSuggest()); assertNull(searchResponse.getSuggest());
assertEquals(Collections.emptyMap(), searchResponse.getProfileResults()); assertEquals(Collections.emptyMap(), searchResponse.getProfileResults());
@ -216,7 +218,8 @@ public class SearchIT extends ESRestHighLevelClientTestCase {
searchRequest.source(searchSourceBuilder); searchRequest.source(searchSourceBuilder);
ElasticsearchStatusException exception = expectThrows(ElasticsearchStatusException.class, ElasticsearchStatusException exception = expectThrows(ElasticsearchStatusException.class,
() -> execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync)); () -> execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync,
highLevelClient()::search, highLevelClient()::searchAsync));
assertEquals(RestStatus.BAD_REQUEST, exception.status()); assertEquals(RestStatus.BAD_REQUEST, exception.status());
} }
@ -226,7 +229,8 @@ public class SearchIT extends ESRestHighLevelClientTestCase {
.addRange("first", 0, 30).addRange("second", 31, 200)); .addRange("first", 0, 30).addRange("second", 31, 200));
searchSourceBuilder.size(0); searchSourceBuilder.size(0);
searchRequest.source(searchSourceBuilder); searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync); SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync,
highLevelClient()::search, highLevelClient()::searchAsync);
assertSearchHeader(searchResponse); assertSearchHeader(searchResponse);
assertNull(searchResponse.getSuggest()); assertNull(searchResponse.getSuggest());
assertEquals(Collections.emptyMap(), searchResponse.getProfileResults()); assertEquals(Collections.emptyMap(), searchResponse.getProfileResults());
@ -257,7 +261,8 @@ public class SearchIT extends ESRestHighLevelClientTestCase {
searchSourceBuilder.aggregation(agg); searchSourceBuilder.aggregation(agg);
searchSourceBuilder.size(0); searchSourceBuilder.size(0);
searchRequest.source(searchSourceBuilder); searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync); SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync,
highLevelClient()::search, highLevelClient()::searchAsync);
assertSearchHeader(searchResponse); assertSearchHeader(searchResponse);
assertNull(searchResponse.getSuggest()); assertNull(searchResponse.getSuggest());
assertEquals(Collections.emptyMap(), searchResponse.getProfileResults()); assertEquals(Collections.emptyMap(), searchResponse.getProfileResults());
@ -308,7 +313,8 @@ public class SearchIT extends ESRestHighLevelClientTestCase {
searchSourceBuilder.aggregation(new MatrixStatsAggregationBuilder("agg1").fields(Arrays.asList("num", "num2"))); searchSourceBuilder.aggregation(new MatrixStatsAggregationBuilder("agg1").fields(Arrays.asList("num", "num2")));
searchSourceBuilder.size(0); searchSourceBuilder.size(0);
searchRequest.source(searchSourceBuilder); searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync); SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync,
highLevelClient()::search, highLevelClient()::searchAsync);
assertSearchHeader(searchResponse); assertSearchHeader(searchResponse);
assertNull(searchResponse.getSuggest()); assertNull(searchResponse.getSuggest());
assertEquals(Collections.emptyMap(), searchResponse.getProfileResults()); assertEquals(Collections.emptyMap(), searchResponse.getProfileResults());
@ -397,7 +403,8 @@ public class SearchIT extends ESRestHighLevelClientTestCase {
SearchRequest searchRequest = new SearchRequest(indexName); SearchRequest searchRequest = new SearchRequest(indexName);
searchRequest.source(searchSourceBuilder); searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync); SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync,
highLevelClient()::search, highLevelClient()::searchAsync);
assertSearchHeader(searchResponse); assertSearchHeader(searchResponse);
assertNull(searchResponse.getSuggest()); assertNull(searchResponse.getSuggest());
assertEquals(Collections.emptyMap(), searchResponse.getProfileResults()); assertEquals(Collections.emptyMap(), searchResponse.getProfileResults());
@ -437,7 +444,8 @@ public class SearchIT extends ESRestHighLevelClientTestCase {
searchSourceBuilder.size(0); searchSourceBuilder.size(0);
searchRequest.source(searchSourceBuilder); searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync); SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync,
highLevelClient()::search, highLevelClient()::searchAsync);
assertSearchHeader(searchResponse); assertSearchHeader(searchResponse);
assertNull(searchResponse.getAggregations()); assertNull(searchResponse.getAggregations());
assertEquals(Collections.emptyMap(), searchResponse.getProfileResults()); assertEquals(Collections.emptyMap(), searchResponse.getProfileResults());
@ -469,7 +477,8 @@ public class SearchIT extends ESRestHighLevelClientTestCase {
{ {
SearchRequest searchRequest = new SearchRequest("test").source(SearchSourceBuilder.searchSource() SearchRequest searchRequest = new SearchRequest("test").source(SearchSourceBuilder.searchSource()
.scriptField("result", new Script("null"))); .scriptField("result", new Script("null")));
SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync); SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync,
highLevelClient()::search, highLevelClient()::searchAsync);
SearchHit searchHit = searchResponse.getHits().getAt(0); SearchHit searchHit = searchResponse.getHits().getAt(0);
List<Object> values = searchHit.getFields().get("result").getValues(); List<Object> values = searchHit.getFields().get("result").getValues();
assertNotNull(values); assertNotNull(values);
@ -479,7 +488,8 @@ public class SearchIT extends ESRestHighLevelClientTestCase {
{ {
SearchRequest searchRequest = new SearchRequest("test").source(SearchSourceBuilder.searchSource() SearchRequest searchRequest = new SearchRequest("test").source(SearchSourceBuilder.searchSource()
.scriptField("result", new Script("new HashMap()"))); .scriptField("result", new Script("new HashMap()")));
SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync); SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync,
highLevelClient()::search, highLevelClient()::searchAsync);
SearchHit searchHit = searchResponse.getHits().getAt(0); SearchHit searchHit = searchResponse.getHits().getAt(0);
List<Object> values = searchHit.getFields().get("result").getValues(); List<Object> values = searchHit.getFields().get("result").getValues();
assertNotNull(values); assertNotNull(values);
@ -491,7 +501,8 @@ public class SearchIT extends ESRestHighLevelClientTestCase {
{ {
SearchRequest searchRequest = new SearchRequest("test").source(SearchSourceBuilder.searchSource() SearchRequest searchRequest = new SearchRequest("test").source(SearchSourceBuilder.searchSource()
.scriptField("result", new Script("new String[]{}"))); .scriptField("result", new Script("new String[]{}")));
SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync); SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync,
highLevelClient()::search, highLevelClient()::searchAsync);
SearchHit searchHit = searchResponse.getHits().getAt(0); SearchHit searchHit = searchResponse.getHits().getAt(0);
List<Object> values = searchHit.getFields().get("result").getValues(); List<Object> values = searchHit.getFields().get("result").getValues();
assertNotNull(values); assertNotNull(values);
@ -513,7 +524,8 @@ public class SearchIT extends ESRestHighLevelClientTestCase {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().size(35).sort("field", SortOrder.ASC); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().size(35).sort("field", SortOrder.ASC);
SearchRequest searchRequest = new SearchRequest("test").scroll(TimeValue.timeValueMinutes(2)).source(searchSourceBuilder); SearchRequest searchRequest = new SearchRequest("test").scroll(TimeValue.timeValueMinutes(2)).source(searchSourceBuilder);
SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync); SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync,
highLevelClient()::search, highLevelClient()::searchAsync);
try { try {
long counter = 0; long counter = 0;
@ -525,6 +537,7 @@ public class SearchIT extends ESRestHighLevelClientTestCase {
} }
searchResponse = execute(new SearchScrollRequest(searchResponse.getScrollId()).scroll(TimeValue.timeValueMinutes(2)), searchResponse = execute(new SearchScrollRequest(searchResponse.getScrollId()).scroll(TimeValue.timeValueMinutes(2)),
highLevelClient()::searchScroll, highLevelClient()::searchScrollAsync,
highLevelClient()::searchScroll, highLevelClient()::searchScrollAsync); highLevelClient()::searchScroll, highLevelClient()::searchScrollAsync);
assertThat(searchResponse.getHits().getTotalHits(), equalTo(100L)); assertThat(searchResponse.getHits().getTotalHits(), equalTo(100L));
@ -534,6 +547,7 @@ public class SearchIT extends ESRestHighLevelClientTestCase {
} }
searchResponse = execute(new SearchScrollRequest(searchResponse.getScrollId()).scroll(TimeValue.timeValueMinutes(2)), searchResponse = execute(new SearchScrollRequest(searchResponse.getScrollId()).scroll(TimeValue.timeValueMinutes(2)),
highLevelClient()::searchScroll, highLevelClient()::searchScrollAsync,
highLevelClient()::searchScroll, highLevelClient()::searchScrollAsync); highLevelClient()::searchScroll, highLevelClient()::searchScrollAsync);
assertThat(searchResponse.getHits().getTotalHits(), equalTo(100L)); assertThat(searchResponse.getHits().getTotalHits(), equalTo(100L));
@ -545,14 +559,14 @@ public class SearchIT extends ESRestHighLevelClientTestCase {
ClearScrollRequest clearScrollRequest = new ClearScrollRequest(); ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
clearScrollRequest.addScrollId(searchResponse.getScrollId()); clearScrollRequest.addScrollId(searchResponse.getScrollId());
ClearScrollResponse clearScrollResponse = execute(clearScrollRequest, ClearScrollResponse clearScrollResponse = execute(clearScrollRequest,
// Not using a method reference to work around https://bugs.eclipse.org/bugs/show_bug.cgi?id=517951 highLevelClient()::clearScroll, highLevelClient()::clearScrollAsync,
(request, headers) -> highLevelClient().clearScroll(request, headers), highLevelClient()::clearScroll, highLevelClient()::clearScrollAsync);
(request, listener, headers) -> highLevelClient().clearScrollAsync(request, listener, headers));
assertThat(clearScrollResponse.getNumFreed(), greaterThan(0)); assertThat(clearScrollResponse.getNumFreed(), greaterThan(0));
assertTrue(clearScrollResponse.isSucceeded()); assertTrue(clearScrollResponse.isSucceeded());
SearchScrollRequest scrollRequest = new SearchScrollRequest(searchResponse.getScrollId()).scroll(TimeValue.timeValueMinutes(2)); SearchScrollRequest scrollRequest = new SearchScrollRequest(searchResponse.getScrollId()).scroll(TimeValue.timeValueMinutes(2));
ElasticsearchStatusException exception = expectThrows(ElasticsearchStatusException.class, () -> execute(scrollRequest, ElasticsearchStatusException exception = expectThrows(ElasticsearchStatusException.class, () -> execute(scrollRequest,
highLevelClient()::searchScroll, highLevelClient()::searchScrollAsync,
highLevelClient()::searchScroll, highLevelClient()::searchScrollAsync)); highLevelClient()::searchScroll, highLevelClient()::searchScrollAsync));
assertEquals(RestStatus.NOT_FOUND, exception.status()); assertEquals(RestStatus.NOT_FOUND, exception.status());
assertThat(exception.getRootCause(), instanceOf(ElasticsearchException.class)); assertThat(exception.getRootCause(), instanceOf(ElasticsearchException.class));
@ -574,7 +588,8 @@ public class SearchIT extends ESRestHighLevelClientTestCase {
multiSearchRequest.add(searchRequest3); multiSearchRequest.add(searchRequest3);
MultiSearchResponse multiSearchResponse = MultiSearchResponse multiSearchResponse =
execute(multiSearchRequest, highLevelClient()::multiSearch, highLevelClient()::multiSearchAsync); execute(multiSearchRequest, highLevelClient()::multiSearch, highLevelClient()::multiSearchAsync,
highLevelClient()::multiSearch, highLevelClient()::multiSearchAsync);
assertThat(multiSearchResponse.getTook().millis(), Matchers.greaterThanOrEqualTo(0L)); assertThat(multiSearchResponse.getTook().millis(), Matchers.greaterThanOrEqualTo(0L));
assertThat(multiSearchResponse.getResponses().length, Matchers.equalTo(3)); assertThat(multiSearchResponse.getResponses().length, Matchers.equalTo(3));
@ -616,7 +631,8 @@ public class SearchIT extends ESRestHighLevelClientTestCase {
multiSearchRequest.add(searchRequest3); multiSearchRequest.add(searchRequest3);
MultiSearchResponse multiSearchResponse = MultiSearchResponse multiSearchResponse =
execute(multiSearchRequest, highLevelClient()::multiSearch, highLevelClient()::multiSearchAsync); execute(multiSearchRequest, highLevelClient()::multiSearch, highLevelClient()::multiSearchAsync,
highLevelClient()::multiSearch, highLevelClient()::multiSearchAsync);
assertThat(multiSearchResponse.getTook().millis(), Matchers.greaterThanOrEqualTo(0L)); assertThat(multiSearchResponse.getTook().millis(), Matchers.greaterThanOrEqualTo(0L));
assertThat(multiSearchResponse.getResponses().length, Matchers.equalTo(3)); assertThat(multiSearchResponse.getResponses().length, Matchers.equalTo(3));
@ -664,7 +680,8 @@ public class SearchIT extends ESRestHighLevelClientTestCase {
multiSearchRequest.add(searchRequest3); multiSearchRequest.add(searchRequest3);
MultiSearchResponse multiSearchResponse = MultiSearchResponse multiSearchResponse =
execute(multiSearchRequest, highLevelClient()::multiSearch, highLevelClient()::multiSearchAsync); execute(multiSearchRequest, highLevelClient()::multiSearch, highLevelClient()::multiSearchAsync,
highLevelClient()::multiSearch, highLevelClient()::multiSearchAsync);
assertThat(multiSearchResponse.getTook().millis(), Matchers.greaterThanOrEqualTo(0L)); assertThat(multiSearchResponse.getTook().millis(), Matchers.greaterThanOrEqualTo(0L));
assertThat(multiSearchResponse.getResponses().length, Matchers.equalTo(3)); assertThat(multiSearchResponse.getResponses().length, Matchers.equalTo(3));
@ -727,7 +744,8 @@ public class SearchIT extends ESRestHighLevelClientTestCase {
multiSearchRequest.add(searchRequest2); multiSearchRequest.add(searchRequest2);
MultiSearchResponse multiSearchResponse = MultiSearchResponse multiSearchResponse =
execute(multiSearchRequest, highLevelClient()::multiSearch, highLevelClient()::multiSearchAsync); execute(multiSearchRequest, highLevelClient()::multiSearch, highLevelClient()::multiSearchAsync,
highLevelClient()::multiSearch, highLevelClient()::multiSearchAsync);
assertThat(multiSearchResponse.getTook().millis(), Matchers.greaterThanOrEqualTo(0L)); assertThat(multiSearchResponse.getTook().millis(), Matchers.greaterThanOrEqualTo(0L));
assertThat(multiSearchResponse.getResponses().length, Matchers.equalTo(2)); assertThat(multiSearchResponse.getResponses().length, Matchers.equalTo(2));

View File

@ -19,9 +19,12 @@
package org.elasticsearch.client; package org.elasticsearch.client;
import org.elasticsearch.action.admin.cluster.node.tasks.cancel.CancelTasksRequest;
import org.elasticsearch.action.admin.cluster.node.tasks.cancel.CancelTasksResponse;
import org.elasticsearch.action.admin.cluster.node.tasks.list.ListTasksRequest; import org.elasticsearch.action.admin.cluster.node.tasks.list.ListTasksRequest;
import org.elasticsearch.action.admin.cluster.node.tasks.list.ListTasksResponse; import org.elasticsearch.action.admin.cluster.node.tasks.list.ListTasksResponse;
import org.elasticsearch.action.admin.cluster.node.tasks.list.TaskGroup; import org.elasticsearch.action.admin.cluster.node.tasks.list.TaskGroup;
import org.elasticsearch.tasks.TaskId;
import org.elasticsearch.tasks.TaskInfo; import org.elasticsearch.tasks.TaskInfo;
import java.io.IOException; import java.io.IOException;
@ -58,4 +61,26 @@ public class TasksIT extends ESRestHighLevelClientTestCase {
assertTrue("List tasks were not found", listTasksFound); assertTrue("List tasks were not found", listTasksFound);
} }
public void testCancelTasks() throws IOException {
ListTasksRequest listRequest = new ListTasksRequest();
ListTasksResponse listResponse = execute(
listRequest,
highLevelClient().tasks()::list,
highLevelClient().tasks()::listAsync
);
// in this case, probably no task will actually be cancelled.
// this is ok, that case is covered in TasksIT.testTasksCancellation
TaskInfo firstTask = listResponse.getTasks().get(0);
String node = listResponse.getPerNodeTasks().keySet().iterator().next();
CancelTasksRequest cancelTasksRequest = new CancelTasksRequest();
cancelTasksRequest.setTaskId(new TaskId(node, firstTask.getId()));
cancelTasksRequest.setReason("testreason");
CancelTasksResponse response = execute(cancelTasksRequest,
highLevelClient().tasks()::cancel,
highLevelClient().tasks()::cancelAsync);
// Since the task may or may not have been cancelled, assert that we received a response only
// The actual testing of task cancellation is covered by TasksIT.testTasksCancellation
assertThat(response, notNullValue());
}
} }

View File

@ -48,6 +48,7 @@ import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse; import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.ESRestHighLevelClientTestCase; import org.elasticsearch.client.ESRestHighLevelClientTestCase;
import org.elasticsearch.client.Request; import org.elasticsearch.client.Request;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.Response; import org.elasticsearch.client.Response;
import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.Strings; import org.elasticsearch.common.Strings;
@ -72,13 +73,12 @@ import java.util.Map;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import static java.util.Collections.singletonMap;
import static org.hamcrest.Matchers.arrayWithSize; import static org.hamcrest.Matchers.arrayWithSize;
import static org.hamcrest.Matchers.hasEntry;
import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.hasEntry;
import static org.hamcrest.Matchers.hasKey; import static org.hamcrest.Matchers.hasKey;
import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.not;
import static java.util.Collections.emptyMap;
import static java.util.Collections.singletonMap;
/** /**
* This class is used to generate the Java CRUD API documentation. * This class is used to generate the Java CRUD API documentation.
@ -112,7 +112,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
IndexRequest indexRequest = new IndexRequest("posts", "doc", "1") IndexRequest indexRequest = new IndexRequest("posts", "doc", "1")
.source(jsonMap); // <1> .source(jsonMap); // <1>
//end::index-request-map //end::index-request-map
IndexResponse indexResponse = client.index(indexRequest); IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
assertEquals(indexResponse.getResult(), DocWriteResponse.Result.CREATED); assertEquals(indexResponse.getResult(), DocWriteResponse.Result.CREATED);
} }
{ {
@ -128,7 +128,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
IndexRequest indexRequest = new IndexRequest("posts", "doc", "1") IndexRequest indexRequest = new IndexRequest("posts", "doc", "1")
.source(builder); // <1> .source(builder); // <1>
//end::index-request-xcontent //end::index-request-xcontent
IndexResponse indexResponse = client.index(indexRequest); IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
assertEquals(indexResponse.getResult(), DocWriteResponse.Result.UPDATED); assertEquals(indexResponse.getResult(), DocWriteResponse.Result.UPDATED);
} }
{ {
@ -138,7 +138,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
"postDate", new Date(), "postDate", new Date(),
"message", "trying out Elasticsearch"); // <1> "message", "trying out Elasticsearch"); // <1>
//end::index-request-shortcut //end::index-request-shortcut
IndexResponse indexResponse = client.index(indexRequest); IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
assertEquals(indexResponse.getResult(), DocWriteResponse.Result.UPDATED); assertEquals(indexResponse.getResult(), DocWriteResponse.Result.UPDATED);
} }
{ {
@ -156,7 +156,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
//end::index-request-string //end::index-request-string
// tag::index-execute // tag::index-execute
IndexResponse indexResponse = client.index(request); IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
// end::index-execute // end::index-execute
assertEquals(indexResponse.getResult(), DocWriteResponse.Result.UPDATED); assertEquals(indexResponse.getResult(), DocWriteResponse.Result.UPDATED);
@ -214,7 +214,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
.source("field", "value") .source("field", "value")
.version(1); .version(1);
try { try {
IndexResponse response = client.index(request); IndexResponse response = client.index(request, RequestOptions.DEFAULT);
} catch(ElasticsearchException e) { } catch(ElasticsearchException e) {
if (e.status() == RestStatus.CONFLICT) { if (e.status() == RestStatus.CONFLICT) {
// <1> // <1>
@ -228,7 +228,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
.source("field", "value") .source("field", "value")
.opType(DocWriteRequest.OpType.CREATE); .opType(DocWriteRequest.OpType.CREATE);
try { try {
IndexResponse response = client.index(request); IndexResponse response = client.index(request, RequestOptions.DEFAULT);
} catch(ElasticsearchException e) { } catch(ElasticsearchException e) {
if (e.status() == RestStatus.CONFLICT) { if (e.status() == RestStatus.CONFLICT) {
// <1> // <1>
@ -257,7 +257,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::index-execute-async // tag::index-execute-async
client.indexAsync(request, listener); // <1> client.indexAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::index-execute-async // end::index-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -268,7 +268,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
RestHighLevelClient client = highLevelClient(); RestHighLevelClient client = highLevelClient();
{ {
IndexRequest indexRequest = new IndexRequest("posts", "doc", "1").source("field", 0); IndexRequest indexRequest = new IndexRequest("posts", "doc", "1").source("field", 0);
IndexResponse indexResponse = client.index(indexRequest); IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
assertSame(indexResponse.status(), RestStatus.CREATED); assertSame(indexResponse.status(), RestStatus.CREATED);
Request request = new Request("POST", "/_scripts/increment-field"); Request request = new Request("POST", "/_scripts/increment-field");
@ -297,7 +297,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
"ctx._source.field += params.count", parameters); // <2> "ctx._source.field += params.count", parameters); // <2>
request.script(inline); // <3> request.script(inline); // <3>
//end::update-request-with-inline-script //end::update-request-with-inline-script
UpdateResponse updateResponse = client.update(request); UpdateResponse updateResponse = client.update(request, RequestOptions.DEFAULT);
assertEquals(updateResponse.getResult(), DocWriteResponse.Result.UPDATED); assertEquals(updateResponse.getResult(), DocWriteResponse.Result.UPDATED);
assertEquals(4, updateResponse.getGetResult().getSource().get("field")); assertEquals(4, updateResponse.getGetResult().getSource().get("field"));
@ -307,7 +307,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
new Script(ScriptType.STORED, null, "increment-field", parameters); // <1> new Script(ScriptType.STORED, null, "increment-field", parameters); // <1>
request.script(stored); // <2> request.script(stored); // <2>
//end::update-request-with-stored-script //end::update-request-with-stored-script
updateResponse = client.update(request); updateResponse = client.update(request, RequestOptions.DEFAULT);
assertEquals(updateResponse.getResult(), DocWriteResponse.Result.UPDATED); assertEquals(updateResponse.getResult(), DocWriteResponse.Result.UPDATED);
assertEquals(8, updateResponse.getGetResult().getSource().get("field")); assertEquals(8, updateResponse.getGetResult().getSource().get("field"));
} }
@ -319,7 +319,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
UpdateRequest request = new UpdateRequest("posts", "doc", "1") UpdateRequest request = new UpdateRequest("posts", "doc", "1")
.doc(jsonMap); // <1> .doc(jsonMap); // <1>
//end::update-request-with-doc-as-map //end::update-request-with-doc-as-map
UpdateResponse updateResponse = client.update(request); UpdateResponse updateResponse = client.update(request, RequestOptions.DEFAULT);
assertEquals(updateResponse.getResult(), DocWriteResponse.Result.UPDATED); assertEquals(updateResponse.getResult(), DocWriteResponse.Result.UPDATED);
} }
{ {
@ -334,7 +334,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
UpdateRequest request = new UpdateRequest("posts", "doc", "1") UpdateRequest request = new UpdateRequest("posts", "doc", "1")
.doc(builder); // <1> .doc(builder); // <1>
//end::update-request-with-doc-as-xcontent //end::update-request-with-doc-as-xcontent
UpdateResponse updateResponse = client.update(request); UpdateResponse updateResponse = client.update(request, RequestOptions.DEFAULT);
assertEquals(updateResponse.getResult(), DocWriteResponse.Result.UPDATED); assertEquals(updateResponse.getResult(), DocWriteResponse.Result.UPDATED);
} }
{ {
@ -343,7 +343,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
.doc("updated", new Date(), .doc("updated", new Date(),
"reason", "daily update"); // <1> "reason", "daily update"); // <1>
//end::update-request-shortcut //end::update-request-shortcut
UpdateResponse updateResponse = client.update(request); UpdateResponse updateResponse = client.update(request, RequestOptions.DEFAULT);
assertEquals(updateResponse.getResult(), DocWriteResponse.Result.UPDATED); assertEquals(updateResponse.getResult(), DocWriteResponse.Result.UPDATED);
} }
{ {
@ -357,7 +357,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
//end::update-request-with-doc-as-string //end::update-request-with-doc-as-string
request.fetchSource(true); request.fetchSource(true);
// tag::update-execute // tag::update-execute
UpdateResponse updateResponse = client.update(request); UpdateResponse updateResponse = client.update(request, RequestOptions.DEFAULT);
// end::update-execute // end::update-execute
assertEquals(updateResponse.getResult(), DocWriteResponse.Result.UPDATED); assertEquals(updateResponse.getResult(), DocWriteResponse.Result.UPDATED);
@ -406,7 +406,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
UpdateRequest request = new UpdateRequest("posts", "type", "does_not_exist") UpdateRequest request = new UpdateRequest("posts", "type", "does_not_exist")
.doc("field", "value"); .doc("field", "value");
try { try {
UpdateResponse updateResponse = client.update(request); UpdateResponse updateResponse = client.update(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException e) { } catch (ElasticsearchException e) {
if (e.status() == RestStatus.NOT_FOUND) { if (e.status() == RestStatus.NOT_FOUND) {
// <1> // <1>
@ -420,7 +420,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
.doc("field", "value") .doc("field", "value")
.version(1); .version(1);
try { try {
UpdateResponse updateResponse = client.update(request); UpdateResponse updateResponse = client.update(request, RequestOptions.DEFAULT);
} catch(ElasticsearchException e) { } catch(ElasticsearchException e) {
if (e.status() == RestStatus.CONFLICT) { if (e.status() == RestStatus.CONFLICT) {
// <1> // <1>
@ -433,7 +433,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
//tag::update-request-no-source //tag::update-request-no-source
request.fetchSource(true); // <1> request.fetchSource(true); // <1>
//end::update-request-no-source //end::update-request-no-source
UpdateResponse updateResponse = client.update(request); UpdateResponse updateResponse = client.update(request, RequestOptions.DEFAULT);
assertEquals(updateResponse.getResult(), DocWriteResponse.Result.UPDATED); assertEquals(updateResponse.getResult(), DocWriteResponse.Result.UPDATED);
assertNotNull(updateResponse.getGetResult()); assertNotNull(updateResponse.getGetResult());
assertEquals(3, updateResponse.getGetResult().sourceAsMap().size()); assertEquals(3, updateResponse.getGetResult().sourceAsMap().size());
@ -445,7 +445,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
String[] excludes = Strings.EMPTY_ARRAY; String[] excludes = Strings.EMPTY_ARRAY;
request.fetchSource(new FetchSourceContext(true, includes, excludes)); // <1> request.fetchSource(new FetchSourceContext(true, includes, excludes)); // <1>
//end::update-request-source-include //end::update-request-source-include
UpdateResponse updateResponse = client.update(request); UpdateResponse updateResponse = client.update(request, RequestOptions.DEFAULT);
assertEquals(updateResponse.getResult(), DocWriteResponse.Result.UPDATED); assertEquals(updateResponse.getResult(), DocWriteResponse.Result.UPDATED);
Map<String, Object> sourceAsMap = updateResponse.getGetResult().sourceAsMap(); Map<String, Object> sourceAsMap = updateResponse.getGetResult().sourceAsMap();
assertEquals(2, sourceAsMap.size()); assertEquals(2, sourceAsMap.size());
@ -459,7 +459,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
String[] excludes = new String[]{"updated"}; String[] excludes = new String[]{"updated"};
request.fetchSource(new FetchSourceContext(true, includes, excludes)); // <1> request.fetchSource(new FetchSourceContext(true, includes, excludes)); // <1>
//end::update-request-source-exclude //end::update-request-source-exclude
UpdateResponse updateResponse = client.update(request); UpdateResponse updateResponse = client.update(request, RequestOptions.DEFAULT);
assertEquals(updateResponse.getResult(), DocWriteResponse.Result.UPDATED); assertEquals(updateResponse.getResult(), DocWriteResponse.Result.UPDATED);
Map<String, Object> sourceAsMap = updateResponse.getGetResult().sourceAsMap(); Map<String, Object> sourceAsMap = updateResponse.getGetResult().sourceAsMap();
assertEquals(2, sourceAsMap.size()); assertEquals(2, sourceAsMap.size());
@ -525,7 +525,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::update-execute-async // tag::update-execute-async
client.updateAsync(request, listener); // <1> client.updateAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::update-execute-async // end::update-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -537,7 +537,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
{ {
IndexRequest indexRequest = new IndexRequest("posts", "doc", "1").source("field", "value"); IndexRequest indexRequest = new IndexRequest("posts", "doc", "1").source("field", "value");
IndexResponse indexResponse = client.index(indexRequest); IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
assertSame(indexResponse.status(), RestStatus.CREATED); assertSame(indexResponse.status(), RestStatus.CREATED);
} }
@ -550,7 +550,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
// end::delete-request // end::delete-request
// tag::delete-execute // tag::delete-execute
DeleteResponse deleteResponse = client.delete(request); DeleteResponse deleteResponse = client.delete(request, RequestOptions.DEFAULT);
// end::delete-execute // end::delete-execute
assertSame(deleteResponse.getResult(), DocWriteResponse.Result.DELETED); assertSame(deleteResponse.getResult(), DocWriteResponse.Result.DELETED);
@ -595,7 +595,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
{ {
// tag::delete-notfound // tag::delete-notfound
DeleteRequest request = new DeleteRequest("posts", "doc", "does_not_exist"); DeleteRequest request = new DeleteRequest("posts", "doc", "does_not_exist");
DeleteResponse deleteResponse = client.delete(request); DeleteResponse deleteResponse = client.delete(request, RequestOptions.DEFAULT);
if (deleteResponse.getResult() == DocWriteResponse.Result.NOT_FOUND) { if (deleteResponse.getResult() == DocWriteResponse.Result.NOT_FOUND) {
// <1> // <1>
} }
@ -603,13 +603,14 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
} }
{ {
IndexResponse indexResponse = client.index(new IndexRequest("posts", "doc", "1").source("field", "value")); IndexResponse indexResponse = client.index(new IndexRequest("posts", "doc", "1").source("field", "value")
, RequestOptions.DEFAULT);
assertSame(indexResponse.status(), RestStatus.CREATED); assertSame(indexResponse.status(), RestStatus.CREATED);
// tag::delete-conflict // tag::delete-conflict
try { try {
DeleteRequest request = new DeleteRequest("posts", "doc", "1").version(2); DeleteRequest request = new DeleteRequest("posts", "doc", "1").version(2);
DeleteResponse deleteResponse = client.delete(request); DeleteResponse deleteResponse = client.delete(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException exception) { } catch (ElasticsearchException exception) {
if (exception.status() == RestStatus.CONFLICT) { if (exception.status() == RestStatus.CONFLICT) {
// <1> // <1>
@ -618,7 +619,8 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
// end::delete-conflict // end::delete-conflict
} }
{ {
IndexResponse indexResponse = client.index(new IndexRequest("posts", "doc", "async").source("field", "value")); IndexResponse indexResponse = client.index(new IndexRequest("posts", "doc", "async").source("field", "value"),
RequestOptions.DEFAULT);
assertSame(indexResponse.status(), RestStatus.CREATED); assertSame(indexResponse.status(), RestStatus.CREATED);
DeleteRequest request = new DeleteRequest("posts", "doc", "async"); DeleteRequest request = new DeleteRequest("posts", "doc", "async");
@ -642,7 +644,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::delete-execute-async // tag::delete-execute-async
client.deleteAsync(request, listener); // <1> client.deleteAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::delete-execute-async // end::delete-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -662,7 +664,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
.source(XContentType.JSON,"field", "baz")); .source(XContentType.JSON,"field", "baz"));
// end::bulk-request // end::bulk-request
// tag::bulk-execute // tag::bulk-execute
BulkResponse bulkResponse = client.bulk(request); BulkResponse bulkResponse = client.bulk(request, RequestOptions.DEFAULT);
// end::bulk-execute // end::bulk-execute
assertSame(bulkResponse.status(), RestStatus.OK); assertSame(bulkResponse.status(), RestStatus.OK);
assertFalse(bulkResponse.hasFailures()); assertFalse(bulkResponse.hasFailures());
@ -676,7 +678,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
request.add(new IndexRequest("posts", "doc", "4") // <3> request.add(new IndexRequest("posts", "doc", "4") // <3>
.source(XContentType.JSON,"field", "baz")); .source(XContentType.JSON,"field", "baz"));
// end::bulk-request-with-mixed-operations // end::bulk-request-with-mixed-operations
BulkResponse bulkResponse = client.bulk(request); BulkResponse bulkResponse = client.bulk(request, RequestOptions.DEFAULT);
assertSame(bulkResponse.status(), RestStatus.OK); assertSame(bulkResponse.status(), RestStatus.OK);
assertFalse(bulkResponse.hasFailures()); assertFalse(bulkResponse.hasFailures());
@ -775,7 +777,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
.source("user", "kimchy", .source("user", "kimchy",
"postDate", new Date(), "postDate", new Date(),
"message", "trying out Elasticsearch"); "message", "trying out Elasticsearch");
IndexResponse indexResponse = client.index(indexRequest); IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
assertEquals(indexResponse.getResult(), DocWriteResponse.Result.CREATED); assertEquals(indexResponse.getResult(), DocWriteResponse.Result.CREATED);
} }
{ {
@ -787,7 +789,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
//end::get-request //end::get-request
//tag::get-execute //tag::get-execute
GetResponse getResponse = client.get(getRequest); GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
//end::get-execute //end::get-execute
assertTrue(getResponse.isExists()); assertTrue(getResponse.isExists());
assertEquals(3, getResponse.getSourceAsMap().size()); assertEquals(3, getResponse.getSourceAsMap().size());
@ -810,7 +812,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
//tag::get-request-no-source //tag::get-request-no-source
request.fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE); // <1> request.fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE); // <1>
//end::get-request-no-source //end::get-request-no-source
GetResponse getResponse = client.get(request); GetResponse getResponse = client.get(request, RequestOptions.DEFAULT);
assertNull(getResponse.getSourceInternal()); assertNull(getResponse.getSourceInternal());
} }
{ {
@ -822,7 +824,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
new FetchSourceContext(true, includes, excludes); new FetchSourceContext(true, includes, excludes);
request.fetchSourceContext(fetchSourceContext); // <1> request.fetchSourceContext(fetchSourceContext); // <1>
//end::get-request-source-include //end::get-request-source-include
GetResponse getResponse = client.get(request); GetResponse getResponse = client.get(request, RequestOptions.DEFAULT);
Map<String, Object> sourceAsMap = getResponse.getSourceAsMap(); Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
assertEquals(2, sourceAsMap.size()); assertEquals(2, sourceAsMap.size());
assertEquals("trying out Elasticsearch", sourceAsMap.get("message")); assertEquals("trying out Elasticsearch", sourceAsMap.get("message"));
@ -837,7 +839,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
new FetchSourceContext(true, includes, excludes); new FetchSourceContext(true, includes, excludes);
request.fetchSourceContext(fetchSourceContext); // <1> request.fetchSourceContext(fetchSourceContext); // <1>
//end::get-request-source-exclude //end::get-request-source-exclude
GetResponse getResponse = client.get(request); GetResponse getResponse = client.get(request, RequestOptions.DEFAULT);
Map<String, Object> sourceAsMap = getResponse.getSourceAsMap(); Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
assertEquals(2, sourceAsMap.size()); assertEquals(2, sourceAsMap.size());
assertEquals("kimchy", sourceAsMap.get("user")); assertEquals("kimchy", sourceAsMap.get("user"));
@ -847,7 +849,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
GetRequest request = new GetRequest("posts", "doc", "1"); GetRequest request = new GetRequest("posts", "doc", "1");
//tag::get-request-stored //tag::get-request-stored
request.storedFields("message"); // <1> request.storedFields("message"); // <1>
GetResponse getResponse = client.get(request); GetResponse getResponse = client.get(request, RequestOptions.DEFAULT);
String message = getResponse.getField("message").getValue(); // <2> String message = getResponse.getField("message").getValue(); // <2>
//end::get-request-stored //end::get-request-stored
assertEquals("trying out Elasticsearch", message); assertEquals("trying out Elasticsearch", message);
@ -897,7 +899,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
//tag::get-execute-async //tag::get-execute-async
client.getAsync(request, listener); // <1> client.getAsync(request, RequestOptions.DEFAULT, listener); // <1>
//end::get-execute-async //end::get-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -906,7 +908,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
//tag::get-indexnotfound //tag::get-indexnotfound
GetRequest request = new GetRequest("does_not_exist", "doc", "1"); GetRequest request = new GetRequest("does_not_exist", "doc", "1");
try { try {
GetResponse getResponse = client.get(request); GetResponse getResponse = client.get(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException e) { } catch (ElasticsearchException e) {
if (e.status() == RestStatus.NOT_FOUND) { if (e.status() == RestStatus.NOT_FOUND) {
// <1> // <1>
@ -918,7 +920,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
// tag::get-conflict // tag::get-conflict
try { try {
GetRequest request = new GetRequest("posts", "doc", "1").version(2); GetRequest request = new GetRequest("posts", "doc", "1").version(2);
GetResponse getResponse = client.get(request); GetResponse getResponse = client.get(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException exception) { } catch (ElasticsearchException exception) {
if (exception.status() == RestStatus.CONFLICT) { if (exception.status() == RestStatus.CONFLICT) {
// <1> // <1>
@ -940,7 +942,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
// end::exists-request // end::exists-request
{ {
// tag::exists-execute // tag::exists-execute
boolean exists = client.exists(getRequest); boolean exists = client.exists(getRequest, RequestOptions.DEFAULT);
// end::exists-execute // end::exists-execute
assertFalse(exists); assertFalse(exists);
} }
@ -964,7 +966,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::exists-execute-async // tag::exists-execute-async
client.existsAsync(getRequest, listener); // <1> client.existsAsync(getRequest, RequestOptions.DEFAULT, listener); // <1>
// end::exists-execute-async // end::exists-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -1091,7 +1093,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
source.put("baz", "val3"); source.put("baz", "val3");
client.index(new IndexRequest("index", "type", "example_id") client.index(new IndexRequest("index", "type", "example_id")
.source(source) .source(source)
.setRefreshPolicy(RefreshPolicy.IMMEDIATE)); .setRefreshPolicy(RefreshPolicy.IMMEDIATE), RequestOptions.DEFAULT);
{ {
// tag::multi-get-request // tag::multi-get-request
@ -1120,7 +1122,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
// end::multi-get-request-top-level-extras // end::multi-get-request-top-level-extras
// tag::multi-get-execute // tag::multi-get-execute
MultiGetResponse response = client.multiGet(request); MultiGetResponse response = client.multiGet(request, RequestOptions.DEFAULT);
// end::multi-get-execute // end::multi-get-execute
// tag::multi-get-response // tag::multi-get-response
@ -1184,7 +1186,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
request.add(new MultiGetRequest.Item("index", "type", "example_id") request.add(new MultiGetRequest.Item("index", "type", "example_id")
.fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE)); // <1> .fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE)); // <1>
// end::multi-get-request-no-source // end::multi-get-request-no-source
MultiGetItemResponse item = unwrapAndAssertExample(client.multiGet(request)); MultiGetItemResponse item = unwrapAndAssertExample(client.multiGet(request, RequestOptions.DEFAULT));
assertNull(item.getResponse().getSource()); assertNull(item.getResponse().getSource());
} }
{ {
@ -1197,7 +1199,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
request.add(new MultiGetRequest.Item("index", "type", "example_id") request.add(new MultiGetRequest.Item("index", "type", "example_id")
.fetchSourceContext(fetchSourceContext)); // <1> .fetchSourceContext(fetchSourceContext)); // <1>
// end::multi-get-request-source-include // end::multi-get-request-source-include
MultiGetItemResponse item = unwrapAndAssertExample(client.multiGet(request)); MultiGetItemResponse item = unwrapAndAssertExample(client.multiGet(request, RequestOptions.DEFAULT));
assertThat(item.getResponse().getSource(), hasEntry("foo", "val1")); assertThat(item.getResponse().getSource(), hasEntry("foo", "val1"));
assertThat(item.getResponse().getSource(), hasEntry("bar", "val2")); assertThat(item.getResponse().getSource(), hasEntry("bar", "val2"));
assertThat(item.getResponse().getSource(), not(hasKey("baz"))); assertThat(item.getResponse().getSource(), not(hasKey("baz")));
@ -1212,7 +1214,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
request.add(new MultiGetRequest.Item("index", "type", "example_id") request.add(new MultiGetRequest.Item("index", "type", "example_id")
.fetchSourceContext(fetchSourceContext)); // <1> .fetchSourceContext(fetchSourceContext)); // <1>
// end::multi-get-request-source-exclude // end::multi-get-request-source-exclude
MultiGetItemResponse item = unwrapAndAssertExample(client.multiGet(request)); MultiGetItemResponse item = unwrapAndAssertExample(client.multiGet(request, RequestOptions.DEFAULT));
assertThat(item.getResponse().getSource(), not(hasKey("foo"))); assertThat(item.getResponse().getSource(), not(hasKey("foo")));
assertThat(item.getResponse().getSource(), not(hasKey("bar"))); assertThat(item.getResponse().getSource(), not(hasKey("bar")));
assertThat(item.getResponse().getSource(), hasEntry("baz", "val3")); assertThat(item.getResponse().getSource(), hasEntry("baz", "val3"));
@ -1222,7 +1224,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
// tag::multi-get-request-stored // tag::multi-get-request-stored
request.add(new MultiGetRequest.Item("index", "type", "example_id") request.add(new MultiGetRequest.Item("index", "type", "example_id")
.storedFields("foo")); // <1> .storedFields("foo")); // <1>
MultiGetResponse response = client.multiGet(request); MultiGetResponse response = client.multiGet(request, RequestOptions.DEFAULT);
MultiGetItemResponse item = response.getResponses()[0]; MultiGetItemResponse item = response.getResponses()[0];
String value = item.getResponse().getField("foo").getValue(); // <2> String value = item.getResponse().getField("foo").getValue(); // <2>
// end::multi-get-request-stored // end::multi-get-request-stored
@ -1234,7 +1236,7 @@ public class CRUDDocumentationIT extends ESRestHighLevelClientTestCase {
MultiGetRequest request = new MultiGetRequest(); MultiGetRequest request = new MultiGetRequest();
request.add(new MultiGetRequest.Item("index", "type", "example_id") request.add(new MultiGetRequest.Item("index", "type", "example_id")
.version(1000L)); .version(1000L));
MultiGetResponse response = client.multiGet(request); MultiGetResponse response = client.multiGet(request, RequestOptions.DEFAULT);
MultiGetItemResponse item = response.getResponses()[0]; MultiGetItemResponse item = response.getResponses()[0];
assertNull(item.getResponse()); // <1> assertNull(item.getResponse()); // <1>
Exception e = item.getFailure().getFailure(); // <2> Exception e = item.getFailure().getFailure(); // <2>

View File

@ -23,27 +23,19 @@ import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.LatchedActionListener; import org.elasticsearch.action.LatchedActionListener;
import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsRequest; import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsRequest;
import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsResponse; import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsResponse;
import org.elasticsearch.action.ingest.GetPipelineRequest;
import org.elasticsearch.action.ingest.GetPipelineResponse;
import org.elasticsearch.action.ingest.PutPipelineRequest;
import org.elasticsearch.action.ingest.DeletePipelineRequest;
import org.elasticsearch.action.ingest.WritePipelineResponse;
import org.elasticsearch.client.ESRestHighLevelClientTestCase; import org.elasticsearch.client.ESRestHighLevelClientTestCase;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.cluster.routing.allocation.decider.EnableAllocationDecider; import org.elasticsearch.cluster.routing.allocation.decider.EnableAllocationDecider;
import org.elasticsearch.common.bytes.BytesArray;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.ByteSizeUnit; import org.elasticsearch.common.unit.ByteSizeUnit;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.indices.recovery.RecoverySettings; import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.ingest.PipelineConfiguration;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.List;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -134,7 +126,7 @@ public class ClusterClientDocumentationIT extends ESRestHighLevelClientTestCase
// end::put-settings-request-masterTimeout // end::put-settings-request-masterTimeout
// tag::put-settings-execute // tag::put-settings-execute
ClusterUpdateSettingsResponse response = client.cluster().putSettings(request); ClusterUpdateSettingsResponse response = client.cluster().putSettings(request, RequestOptions.DEFAULT);
// end::put-settings-execute // end::put-settings-execute
// tag::put-settings-response // tag::put-settings-response
@ -150,7 +142,7 @@ public class ClusterClientDocumentationIT extends ESRestHighLevelClientTestCase
request.transientSettings(Settings.builder().putNull(transientSettingKey).build()); // <1> request.transientSettings(Settings.builder().putNull(transientSettingKey).build()); // <1>
// tag::put-settings-request-reset-transient // tag::put-settings-request-reset-transient
request.persistentSettings(Settings.builder().putNull(persistentSettingKey)); request.persistentSettings(Settings.builder().putNull(persistentSettingKey));
ClusterUpdateSettingsResponse resetResponse = client.cluster().putSettings(request); ClusterUpdateSettingsResponse resetResponse = client.cluster().putSettings(request, RequestOptions.DEFAULT);
assertTrue(resetResponse.isAcknowledged()); assertTrue(resetResponse.isAcknowledged());
} }
@ -180,10 +172,11 @@ public class ClusterClientDocumentationIT extends ESRestHighLevelClientTestCase
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::put-settings-execute-async // tag::put-settings-execute-async
client.cluster().putSettingsAsync(request, listener); // <1> client.cluster().putSettingsAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::put-settings-execute-async // end::put-settings-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
} }
} }
} }

View File

@ -64,6 +64,7 @@ import org.elasticsearch.action.support.ActiveShardCount;
import org.elasticsearch.action.support.DefaultShardOperationFailedException; import org.elasticsearch.action.support.DefaultShardOperationFailedException;
import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.action.support.IndicesOptions;
import org.elasticsearch.client.ESRestHighLevelClientTestCase; import org.elasticsearch.client.ESRestHighLevelClientTestCase;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.SyncedFlushResponse; import org.elasticsearch.client.SyncedFlushResponse;
import org.elasticsearch.cluster.metadata.MappingMetaData; import org.elasticsearch.cluster.metadata.MappingMetaData;
@ -111,7 +112,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
RestHighLevelClient client = highLevelClient(); RestHighLevelClient client = highLevelClient();
{ {
CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("twitter")); CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("twitter"), RequestOptions.DEFAULT);
assertTrue(createIndexResponse.isAcknowledged()); assertTrue(createIndexResponse.isAcknowledged());
} }
@ -130,7 +131,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// end::indices-exists-request-optionals // end::indices-exists-request-optionals
// tag::indices-exists-response // tag::indices-exists-response
boolean exists = client.indices().exists(request); boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
// end::indices-exists-response // end::indices-exists-response
assertTrue(exists); assertTrue(exists);
} }
@ -140,7 +141,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
RestHighLevelClient client = highLevelClient(); RestHighLevelClient client = highLevelClient();
{ {
CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("twitter")); CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("twitter"), RequestOptions.DEFAULT);
assertTrue(createIndexResponse.isAcknowledged()); assertTrue(createIndexResponse.isAcknowledged());
} }
@ -167,7 +168,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::indices-exists-async // tag::indices-exists-async
client.indices().existsAsync(request, listener); // <1> client.indices().existsAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::indices-exists-async // end::indices-exists-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -177,7 +178,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
RestHighLevelClient client = highLevelClient(); RestHighLevelClient client = highLevelClient();
{ {
CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("posts")); CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("posts"), RequestOptions.DEFAULT);
assertTrue(createIndexResponse.isAcknowledged()); assertTrue(createIndexResponse.isAcknowledged());
} }
@ -199,7 +200,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// end::delete-index-request-indicesOptions // end::delete-index-request-indicesOptions
// tag::delete-index-execute // tag::delete-index-execute
DeleteIndexResponse deleteIndexResponse = client.indices().delete(request); DeleteIndexResponse deleteIndexResponse = client.indices().delete(request, RequestOptions.DEFAULT);
// end::delete-index-execute // end::delete-index-execute
// tag::delete-index-response // tag::delete-index-response
@ -212,7 +213,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// tag::delete-index-notfound // tag::delete-index-notfound
try { try {
DeleteIndexRequest request = new DeleteIndexRequest("does_not_exist"); DeleteIndexRequest request = new DeleteIndexRequest("does_not_exist");
client.indices().delete(request); client.indices().delete(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException exception) { } catch (ElasticsearchException exception) {
if (exception.status() == RestStatus.NOT_FOUND) { if (exception.status() == RestStatus.NOT_FOUND) {
// <1> // <1>
@ -226,7 +227,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
final RestHighLevelClient client = highLevelClient(); final RestHighLevelClient client = highLevelClient();
{ {
CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("posts")); CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("posts"), RequestOptions.DEFAULT);
assertTrue(createIndexResponse.isAcknowledged()); assertTrue(createIndexResponse.isAcknowledged());
} }
@ -253,7 +254,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::delete-index-execute-async // tag::delete-index-execute-async
client.indices().deleteAsync(request, listener); // <1> client.indices().deleteAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::delete-index-execute-async // end::delete-index-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -289,7 +290,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
"}", // <2> "}", // <2>
XContentType.JSON); XContentType.JSON);
// end::create-index-request-mappings // end::create-index-request-mappings
CreateIndexResponse createIndexResponse = client.indices().create(request); CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
assertTrue(createIndexResponse.isAcknowledged()); assertTrue(createIndexResponse.isAcknowledged());
} }
@ -306,7 +307,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
jsonMap.put("tweet", tweet); jsonMap.put("tweet", tweet);
request.mapping("tweet", jsonMap); // <1> request.mapping("tweet", jsonMap); // <1>
//end::create-index-mappings-map //end::create-index-mappings-map
CreateIndexResponse createIndexResponse = client.indices().create(request); CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
assertTrue(createIndexResponse.isAcknowledged()); assertTrue(createIndexResponse.isAcknowledged());
} }
{ {
@ -332,7 +333,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
builder.endObject(); builder.endObject();
request.mapping("tweet", builder); // <1> request.mapping("tweet", builder); // <1>
//end::create-index-mappings-xcontent //end::create-index-mappings-xcontent
CreateIndexResponse createIndexResponse = client.indices().create(request); CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
assertTrue(createIndexResponse.isAcknowledged()); assertTrue(createIndexResponse.isAcknowledged());
} }
{ {
@ -340,7 +341,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
//tag::create-index-mappings-shortcut //tag::create-index-mappings-shortcut
request.mapping("tweet", "message", "type=text"); // <1> request.mapping("tweet", "message", "type=text"); // <1>
//end::create-index-mappings-shortcut //end::create-index-mappings-shortcut
CreateIndexResponse createIndexResponse = client.indices().create(request); CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
assertTrue(createIndexResponse.isAcknowledged()); assertTrue(createIndexResponse.isAcknowledged());
} }
@ -362,7 +363,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
request.waitForActiveShards(ActiveShardCount.DEFAULT); // <2> request.waitForActiveShards(ActiveShardCount.DEFAULT); // <2>
// end::create-index-request-waitForActiveShards // end::create-index-request-waitForActiveShards
{ {
CreateIndexResponse createIndexResponse = client.indices().create(request); CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
assertTrue(createIndexResponse.isAcknowledged()); assertTrue(createIndexResponse.isAcknowledged());
} }
@ -387,7 +388,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// end::create-index-whole-source // end::create-index-whole-source
// tag::create-index-execute // tag::create-index-execute
CreateIndexResponse createIndexResponse = client.indices().create(request); CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
// end::create-index-execute // end::create-index-execute
// tag::create-index-response // tag::create-index-response
@ -426,7 +427,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::create-index-execute-async // tag::create-index-execute-async
client.indices().createAsync(request, listener); // <1> client.indices().createAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::create-index-execute-async // end::create-index-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -437,7 +438,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
RestHighLevelClient client = highLevelClient(); RestHighLevelClient client = highLevelClient();
{ {
CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("twitter")); CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("twitter"), RequestOptions.DEFAULT);
assertTrue(createIndexResponse.isAcknowledged()); assertTrue(createIndexResponse.isAcknowledged());
} }
@ -459,7 +460,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
"}", // <1> "}", // <1>
XContentType.JSON); XContentType.JSON);
// end::put-mapping-request-source // end::put-mapping-request-source
PutMappingResponse putMappingResponse = client.indices().putMapping(request); PutMappingResponse putMappingResponse = client.indices().putMapping(request, RequestOptions.DEFAULT);
assertTrue(putMappingResponse.isAcknowledged()); assertTrue(putMappingResponse.isAcknowledged());
} }
@ -473,7 +474,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
jsonMap.put("properties", properties); jsonMap.put("properties", properties);
request.source(jsonMap); // <1> request.source(jsonMap); // <1>
//end::put-mapping-map //end::put-mapping-map
PutMappingResponse putMappingResponse = client.indices().putMapping(request); PutMappingResponse putMappingResponse = client.indices().putMapping(request, RequestOptions.DEFAULT);
assertTrue(putMappingResponse.isAcknowledged()); assertTrue(putMappingResponse.isAcknowledged());
} }
{ {
@ -494,14 +495,14 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
builder.endObject(); builder.endObject();
request.source(builder); // <1> request.source(builder); // <1>
//end::put-mapping-xcontent //end::put-mapping-xcontent
PutMappingResponse putMappingResponse = client.indices().putMapping(request); PutMappingResponse putMappingResponse = client.indices().putMapping(request, RequestOptions.DEFAULT);
assertTrue(putMappingResponse.isAcknowledged()); assertTrue(putMappingResponse.isAcknowledged());
} }
{ {
//tag::put-mapping-shortcut //tag::put-mapping-shortcut
request.source("message", "type=text"); // <1> request.source("message", "type=text"); // <1>
//end::put-mapping-shortcut //end::put-mapping-shortcut
PutMappingResponse putMappingResponse = client.indices().putMapping(request); PutMappingResponse putMappingResponse = client.indices().putMapping(request, RequestOptions.DEFAULT);
assertTrue(putMappingResponse.isAcknowledged()); assertTrue(putMappingResponse.isAcknowledged());
} }
@ -515,7 +516,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// end::put-mapping-request-masterTimeout // end::put-mapping-request-masterTimeout
// tag::put-mapping-execute // tag::put-mapping-execute
PutMappingResponse putMappingResponse = client.indices().putMapping(request); PutMappingResponse putMappingResponse = client.indices().putMapping(request, RequestOptions.DEFAULT);
// end::put-mapping-execute // end::put-mapping-execute
// tag::put-mapping-response // tag::put-mapping-response
@ -529,7 +530,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
final RestHighLevelClient client = highLevelClient(); final RestHighLevelClient client = highLevelClient();
{ {
CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("twitter")); CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("twitter"), RequestOptions.DEFAULT);
assertTrue(createIndexResponse.isAcknowledged()); assertTrue(createIndexResponse.isAcknowledged());
} }
@ -556,7 +557,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::put-mapping-execute-async // tag::put-mapping-execute-async
client.indices().putMappingAsync(request, listener); // <1> client.indices().putMappingAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::put-mapping-execute-async // end::put-mapping-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -601,7 +602,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// end::get-mapping-request-indicesOptions // end::get-mapping-request-indicesOptions
// tag::get-mapping-execute // tag::get-mapping-execute
GetMappingsResponse getMappingResponse = client.indices().getMappings(request); GetMappingsResponse getMappingResponse = client.indices().getMappings(request, RequestOptions.DEFAULT);
// end::get-mapping-execute // end::get-mapping-execute
// tag::get-mapping-response // tag::get-mapping-response
@ -683,7 +684,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
}); });
// tag::get-mapping-execute-async // tag::get-mapping-execute-async
client.indices().getMappingsAsync(request, listener); // <1> client.indices().getMappingsAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::get-mapping-execute-async // end::get-mapping-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -694,7 +695,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
RestHighLevelClient client = highLevelClient(); RestHighLevelClient client = highLevelClient();
{ {
CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("index")); CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("index"), RequestOptions.DEFAULT);
assertTrue(createIndexResponse.isAcknowledged()); assertTrue(createIndexResponse.isAcknowledged());
} }
@ -721,7 +722,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// end::open-index-request-indicesOptions // end::open-index-request-indicesOptions
// tag::open-index-execute // tag::open-index-execute
OpenIndexResponse openIndexResponse = client.indices().open(request); OpenIndexResponse openIndexResponse = client.indices().open(request, RequestOptions.DEFAULT);
// end::open-index-execute // end::open-index-execute
// tag::open-index-response // tag::open-index-response
@ -751,7 +752,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::open-index-execute-async // tag::open-index-execute-async
client.indices().openAsync(request, listener); // <1> client.indices().openAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::open-index-execute-async // end::open-index-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -761,7 +762,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// tag::open-index-notfound // tag::open-index-notfound
try { try {
OpenIndexRequest request = new OpenIndexRequest("does_not_exist"); OpenIndexRequest request = new OpenIndexRequest("does_not_exist");
client.indices().open(request); client.indices().open(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException exception) { } catch (ElasticsearchException exception) {
if (exception.status() == RestStatus.BAD_REQUEST) { if (exception.status() == RestStatus.BAD_REQUEST) {
// <1> // <1>
@ -790,7 +791,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// end::refresh-request-indicesOptions // end::refresh-request-indicesOptions
// tag::refresh-execute // tag::refresh-execute
RefreshResponse refreshResponse = client.indices().refresh(request); RefreshResponse refreshResponse = client.indices().refresh(request, RequestOptions.DEFAULT);
// end::refresh-execute // end::refresh-execute
// tag::refresh-response // tag::refresh-response
@ -819,7 +820,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::refresh-execute-async // tag::refresh-execute-async
client.indices().refreshAsync(request, listener); // <1> client.indices().refreshAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::refresh-execute-async // end::refresh-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -829,7 +830,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// tag::refresh-notfound // tag::refresh-notfound
try { try {
RefreshRequest request = new RefreshRequest("does_not_exist"); RefreshRequest request = new RefreshRequest("does_not_exist");
client.indices().refresh(request); client.indices().refresh(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException exception) { } catch (ElasticsearchException exception) {
if (exception.status() == RestStatus.NOT_FOUND) { if (exception.status() == RestStatus.NOT_FOUND) {
// <1> // <1>
@ -866,7 +867,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// end::flush-request-force // end::flush-request-force
// tag::flush-execute // tag::flush-execute
FlushResponse flushResponse = client.indices().flush(request); FlushResponse flushResponse = client.indices().flush(request, RequestOptions.DEFAULT);
// end::flush-execute // end::flush-execute
// tag::flush-response // tag::flush-response
@ -895,7 +896,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::flush-execute-async // tag::flush-execute-async
client.indices().flushAsync(request, listener); // <1> client.indices().flushAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::flush-execute-async // end::flush-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -905,7 +906,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// tag::flush-notfound // tag::flush-notfound
try { try {
FlushRequest request = new FlushRequest("does_not_exist"); FlushRequest request = new FlushRequest("does_not_exist");
client.indices().flush(request); client.indices().flush(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException exception) { } catch (ElasticsearchException exception) {
if (exception.status() == RestStatus.NOT_FOUND) { if (exception.status() == RestStatus.NOT_FOUND) {
// <1> // <1>
@ -934,7 +935,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// end::flush-synced-request-indicesOptions // end::flush-synced-request-indicesOptions
// tag::flush-synced-execute // tag::flush-synced-execute
SyncedFlushResponse flushSyncedResponse = client.indices().flushSynced(request); SyncedFlushResponse flushSyncedResponse = client.indices().flushSynced(request, RequestOptions.DEFAULT);
// end::flush-synced-execute // end::flush-synced-execute
// tag::flush-synced-response // tag::flush-synced-response
@ -978,7 +979,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::flush-synced-execute-async // tag::flush-synced-execute-async
client.indices().flushSyncedAsync(request, listener); // <1> client.indices().flushSyncedAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::flush-synced-execute-async // end::flush-synced-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -988,7 +989,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// tag::flush-synced-notfound // tag::flush-synced-notfound
try { try {
SyncedFlushRequest request = new SyncedFlushRequest("does_not_exist"); SyncedFlushRequest request = new SyncedFlushRequest("does_not_exist");
client.indices().flushSynced(request); client.indices().flushSynced(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException exception) { } catch (ElasticsearchException exception) {
if (exception.status() == RestStatus.NOT_FOUND) { if (exception.status() == RestStatus.NOT_FOUND) {
// <1> // <1>
@ -1003,7 +1004,8 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
{ {
Settings settings = Settings.builder().put("number_of_shards", 3).build(); Settings settings = Settings.builder().put("number_of_shards", 3).build();
CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("index", settings)); CreateIndexResponse createIndexResponse = client.indices().create(
new CreateIndexRequest("index", settings), RequestOptions.DEFAULT);
assertTrue(createIndexResponse.isAcknowledged()); assertTrue(createIndexResponse.isAcknowledged());
} }
@ -1020,7 +1022,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// end::get-settings-request-indicesOptions // end::get-settings-request-indicesOptions
// tag::get-settings-execute // tag::get-settings-execute
GetSettingsResponse getSettingsResponse = client.indices().getSettings(request); GetSettingsResponse getSettingsResponse = client.indices().getSettings(request, RequestOptions.DEFAULT);
// end::get-settings-execute // end::get-settings-execute
// tag::get-settings-response // tag::get-settings-response
@ -1055,7 +1057,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::get-settings-execute-async // tag::get-settings-execute-async
client.indices().getSettingsAsync(request, listener); // <1> client.indices().getSettingsAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::get-settings-execute-async // end::get-settings-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -1066,7 +1068,8 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
{ {
Settings settings = Settings.builder().put("number_of_shards", 3).build(); Settings settings = Settings.builder().put("number_of_shards", 3).build();
CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("index", settings)); CreateIndexResponse createIndexResponse = client.indices().create(
new CreateIndexRequest("index", settings), RequestOptions.DEFAULT);
assertTrue(createIndexResponse.isAcknowledged()); assertTrue(createIndexResponse.isAcknowledged());
} }
@ -1077,7 +1080,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
request.includeDefaults(true); // <1> request.includeDefaults(true); // <1>
// end::get-settings-request-include-defaults // end::get-settings-request-include-defaults
GetSettingsResponse getSettingsResponse = client.indices().getSettings(request); GetSettingsResponse getSettingsResponse = client.indices().getSettings(request, RequestOptions.DEFAULT);
String numberOfShardsString = getSettingsResponse.getSetting("index", "index.number_of_shards"); String numberOfShardsString = getSettingsResponse.getSetting("index", "index.number_of_shards");
Settings indexSettings = getSettingsResponse.getIndexToSettings().get("index"); Settings indexSettings = getSettingsResponse.getIndexToSettings().get("index");
Integer numberOfShards = indexSettings.getAsInt("index.number_of_shards", null); Integer numberOfShards = indexSettings.getAsInt("index.number_of_shards", null);
@ -1107,7 +1110,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
final CountDownLatch latch = new CountDownLatch(1); final CountDownLatch latch = new CountDownLatch(1);
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
client.indices().getSettingsAsync(request, listener); client.indices().getSettingsAsync(request, RequestOptions.DEFAULT, listener);
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
} }
@ -1142,7 +1145,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// end::force-merge-request-flush // end::force-merge-request-flush
// tag::force-merge-execute // tag::force-merge-execute
ForceMergeResponse forceMergeResponse = client.indices().forceMerge(request); ForceMergeResponse forceMergeResponse = client.indices().forceMerge(request, RequestOptions.DEFAULT);
// end::force-merge-execute // end::force-merge-execute
// tag::force-merge-response // tag::force-merge-response
@ -1167,14 +1170,14 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// end::force-merge-execute-listener // end::force-merge-execute-listener
// tag::force-merge-execute-async // tag::force-merge-execute-async
client.indices().forceMergeAsync(request, listener); // <1> client.indices().forceMergeAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::force-merge-execute-async // end::force-merge-execute-async
} }
{ {
// tag::force-merge-notfound // tag::force-merge-notfound
try { try {
ForceMergeRequest request = new ForceMergeRequest("does_not_exist"); ForceMergeRequest request = new ForceMergeRequest("does_not_exist");
client.indices().forceMerge(request); client.indices().forceMerge(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException exception) { } catch (ElasticsearchException exception) {
if (exception.status() == RestStatus.NOT_FOUND) { if (exception.status() == RestStatus.NOT_FOUND) {
// <1> // <1>
@ -1219,7 +1222,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// end::clear-cache-request-fields // end::clear-cache-request-fields
// tag::clear-cache-execute // tag::clear-cache-execute
ClearIndicesCacheResponse clearCacheResponse = client.indices().clearCache(request); ClearIndicesCacheResponse clearCacheResponse = client.indices().clearCache(request, RequestOptions.DEFAULT);
// end::clear-cache-execute // end::clear-cache-execute
// tag::clear-cache-response // tag::clear-cache-response
@ -1248,7 +1251,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::clear-cache-execute-async // tag::clear-cache-execute-async
client.indices().clearCacheAsync(request, listener); // <1> client.indices().clearCacheAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::clear-cache-execute-async // end::clear-cache-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -1258,7 +1261,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// tag::clear-cache-notfound // tag::clear-cache-notfound
try { try {
ClearIndicesCacheRequest request = new ClearIndicesCacheRequest("does_not_exist"); ClearIndicesCacheRequest request = new ClearIndicesCacheRequest("does_not_exist");
client.indices().clearCache(request); client.indices().clearCache(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException exception) { } catch (ElasticsearchException exception) {
if (exception.status() == RestStatus.NOT_FOUND) { if (exception.status() == RestStatus.NOT_FOUND) {
// <1> // <1>
@ -1272,7 +1275,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
RestHighLevelClient client = highLevelClient(); RestHighLevelClient client = highLevelClient();
{ {
CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("index")); CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("index"), RequestOptions.DEFAULT);
assertTrue(createIndexResponse.isAcknowledged()); assertTrue(createIndexResponse.isAcknowledged());
} }
@ -1295,7 +1298,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// end::close-index-request-indicesOptions // end::close-index-request-indicesOptions
// tag::close-index-execute // tag::close-index-execute
CloseIndexResponse closeIndexResponse = client.indices().close(request); CloseIndexResponse closeIndexResponse = client.indices().close(request, RequestOptions.DEFAULT);
// end::close-index-execute // end::close-index-execute
// tag::close-index-response // tag::close-index-response
@ -1323,7 +1326,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::close-index-execute-async // tag::close-index-execute-async
client.indices().closeAsync(request, listener); // <1> client.indices().closeAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::close-index-execute-async // end::close-index-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -1335,7 +1338,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
{ {
CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("index") CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("index")
.alias(new Alias("alias"))); .alias(new Alias("alias")), RequestOptions.DEFAULT);
assertTrue(createIndexResponse.isAcknowledged()); assertTrue(createIndexResponse.isAcknowledged());
} }
@ -1363,7 +1366,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// end::exists-alias-request-local // end::exists-alias-request-local
// tag::exists-alias-execute // tag::exists-alias-execute
boolean exists = client.indices().existsAlias(request); boolean exists = client.indices().existsAlias(request, RequestOptions.DEFAULT);
// end::exists-alias-execute // end::exists-alias-execute
assertTrue(exists); assertTrue(exists);
@ -1386,7 +1389,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::exists-alias-execute-async // tag::exists-alias-execute-async
client.indices().existsAliasAsync(request, listener); // <1> client.indices().existsAliasAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::exists-alias-execute-async // end::exists-alias-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -1397,13 +1400,13 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
RestHighLevelClient client = highLevelClient(); RestHighLevelClient client = highLevelClient();
{ {
CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("index1")); CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("index1"), RequestOptions.DEFAULT);
assertTrue(createIndexResponse.isAcknowledged()); assertTrue(createIndexResponse.isAcknowledged());
createIndexResponse = client.indices().create(new CreateIndexRequest("index2")); createIndexResponse = client.indices().create(new CreateIndexRequest("index2"), RequestOptions.DEFAULT);
assertTrue(createIndexResponse.isAcknowledged()); assertTrue(createIndexResponse.isAcknowledged());
createIndexResponse = client.indices().create(new CreateIndexRequest("index3")); createIndexResponse = client.indices().create(new CreateIndexRequest("index3"), RequestOptions.DEFAULT);
assertTrue(createIndexResponse.isAcknowledged()); assertTrue(createIndexResponse.isAcknowledged());
createIndexResponse = client.indices().create(new CreateIndexRequest("index4")); createIndexResponse = client.indices().create(new CreateIndexRequest("index4"), RequestOptions.DEFAULT);
assertTrue(createIndexResponse.isAcknowledged()); assertTrue(createIndexResponse.isAcknowledged());
} }
@ -1448,7 +1451,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// tag::update-aliases-execute // tag::update-aliases-execute
IndicesAliasesResponse indicesAliasesResponse = IndicesAliasesResponse indicesAliasesResponse =
client.indices().updateAliases(request); client.indices().updateAliases(request, RequestOptions.DEFAULT);
// end::update-aliases-execute // end::update-aliases-execute
// tag::update-aliases-response // tag::update-aliases-response
@ -1482,7 +1485,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::update-aliases-execute-async // tag::update-aliases-execute-async
client.indices().updateAliasesAsync(request, listener); // <1> client.indices().updateAliasesAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::update-aliases-execute-async // end::update-aliases-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -1527,7 +1530,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// end::shrink-index-request-aliases // end::shrink-index-request-aliases
// tag::shrink-index-execute // tag::shrink-index-execute
ResizeResponse resizeResponse = client.indices().shrink(request); ResizeResponse resizeResponse = client.indices().shrink(request, RequestOptions.DEFAULT);
// end::shrink-index-execute // end::shrink-index-execute
// tag::shrink-index-response // tag::shrink-index-response
@ -1556,7 +1559,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::shrink-index-execute-async // tag::shrink-index-execute-async
client.indices().shrinkAsync(request, listener); // <1> client.indices().shrinkAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::shrink-index-execute-async // end::shrink-index-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -1597,7 +1600,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// end::split-index-request-aliases // end::split-index-request-aliases
// tag::split-index-execute // tag::split-index-execute
ResizeResponse resizeResponse = client.indices().split(request); ResizeResponse resizeResponse = client.indices().split(request, RequestOptions.DEFAULT);
// end::split-index-execute // end::split-index-execute
// tag::split-index-response // tag::split-index-response
@ -1626,7 +1629,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::split-index-execute-async // tag::split-index-execute-async
client.indices().splitAsync(request,listener); // <1> client.indices().splitAsync(request, RequestOptions.DEFAULT,listener); // <1>
// end::split-index-execute-async // end::split-index-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -1636,7 +1639,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
RestHighLevelClient client = highLevelClient(); RestHighLevelClient client = highLevelClient();
{ {
client.indices().create(new CreateIndexRequest("index-1").alias(new Alias("alias"))); client.indices().create(new CreateIndexRequest("index-1").alias(new Alias("alias")), RequestOptions.DEFAULT);
} }
// tag::rollover-request // tag::rollover-request
@ -1673,7 +1676,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// end::rollover-request-alias // end::rollover-request-alias
// tag::rollover-execute // tag::rollover-execute
RolloverResponse rolloverResponse = client.indices().rollover(request); RolloverResponse rolloverResponse = client.indices().rollover(request, RequestOptions.DEFAULT);
// end::rollover-execute // end::rollover-execute
// tag::rollover-response // tag::rollover-response
@ -1712,7 +1715,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::rollover-execute-async // tag::rollover-execute-async
client.indices().rolloverAsync(request,listener); // <1> client.indices().rolloverAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::rollover-execute-async // end::rollover-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -1722,7 +1725,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
RestHighLevelClient client = highLevelClient(); RestHighLevelClient client = highLevelClient();
{ {
CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("index")); CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("index"), RequestOptions.DEFAULT);
assertTrue(createIndexResponse.isAcknowledged()); assertTrue(createIndexResponse.isAcknowledged());
} }
@ -1785,7 +1788,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
// tag::put-settings-execute // tag::put-settings-execute
UpdateSettingsResponse updateSettingsResponse = UpdateSettingsResponse updateSettingsResponse =
client.indices().putSettings(request); client.indices().putSettings(request, RequestOptions.DEFAULT);
// end::put-settings-execute // end::put-settings-execute
// tag::put-settings-response // tag::put-settings-response
@ -1814,7 +1817,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::put-settings-execute-async // tag::put-settings-execute-async
client.indices().putSettingsAsync(request,listener); // <1> client.indices().putSettingsAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::put-settings-execute-async // end::put-settings-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -1849,7 +1852,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
"}", // <2> "}", // <2>
XContentType.JSON); XContentType.JSON);
// end::put-template-request-mappings-json // end::put-template-request-mappings-json
assertTrue(client.indices().putTemplate(request).isAcknowledged()); assertTrue(client.indices().putTemplate(request, RequestOptions.DEFAULT).isAcknowledged());
} }
{ {
//tag::put-template-request-mappings-map //tag::put-template-request-mappings-map
@ -1863,7 +1866,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
jsonMap.put("tweet", tweet); jsonMap.put("tweet", tweet);
request.mapping("tweet", jsonMap); // <1> request.mapping("tweet", jsonMap); // <1>
//end::put-template-request-mappings-map //end::put-template-request-mappings-map
assertTrue(client.indices().putTemplate(request).isAcknowledged()); assertTrue(client.indices().putTemplate(request, RequestOptions.DEFAULT).isAcknowledged());
} }
{ {
//tag::put-template-request-mappings-xcontent //tag::put-template-request-mappings-xcontent
@ -1887,13 +1890,13 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
builder.endObject(); builder.endObject();
request.mapping("tweet", builder); // <1> request.mapping("tweet", builder); // <1>
//end::put-template-request-mappings-xcontent //end::put-template-request-mappings-xcontent
assertTrue(client.indices().putTemplate(request).isAcknowledged()); assertTrue(client.indices().putTemplate(request, RequestOptions.DEFAULT).isAcknowledged());
} }
{ {
//tag::put-template-request-mappings-shortcut //tag::put-template-request-mappings-shortcut
request.mapping("tweet", "message", "type=text"); // <1> request.mapping("tweet", "message", "type=text"); // <1>
//end::put-template-request-mappings-shortcut //end::put-template-request-mappings-shortcut
assertTrue(client.indices().putTemplate(request).isAcknowledged()); assertTrue(client.indices().putTemplate(request, RequestOptions.DEFAULT).isAcknowledged());
} }
// tag::put-template-request-aliases // tag::put-template-request-aliases
@ -1947,7 +1950,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
request.create(false); // make test happy request.create(false); // make test happy
// tag::put-template-execute // tag::put-template-execute
PutIndexTemplateResponse putTemplateResponse = client.indices().putTemplate(request); PutIndexTemplateResponse putTemplateResponse = client.indices().putTemplate(request, RequestOptions.DEFAULT);
// end::put-template-execute // end::put-template-execute
// tag::put-template-response // tag::put-template-response
@ -1975,7 +1978,7 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::put-template-execute-async // tag::put-template-execute-async
client.indices().putTemplateAsync(request, listener); // <1> client.indices().putTemplateAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::put-template-execute-async // end::put-template-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));

View File

@ -27,6 +27,7 @@ import org.elasticsearch.action.ingest.GetPipelineResponse;
import org.elasticsearch.action.ingest.PutPipelineRequest; import org.elasticsearch.action.ingest.PutPipelineRequest;
import org.elasticsearch.action.ingest.WritePipelineResponse; import org.elasticsearch.action.ingest.WritePipelineResponse;
import org.elasticsearch.client.ESRestHighLevelClientTestCase; import org.elasticsearch.client.ESRestHighLevelClientTestCase;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.bytes.BytesArray;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
@ -86,7 +87,7 @@ public class IngestClientDocumentationIT extends ESRestHighLevelClientTestCase {
// end::put-pipeline-request-masterTimeout // end::put-pipeline-request-masterTimeout
// tag::put-pipeline-execute // tag::put-pipeline-execute
WritePipelineResponse response = client.ingest().putPipeline(request); // <1> WritePipelineResponse response = client.ingest().putPipeline(request, RequestOptions.DEFAULT); // <1>
// end::put-pipeline-execute // end::put-pipeline-execute
// tag::put-pipeline-response // tag::put-pipeline-response
@ -129,7 +130,7 @@ public class IngestClientDocumentationIT extends ESRestHighLevelClientTestCase {
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::put-pipeline-execute-async // tag::put-pipeline-execute-async
client.ingest().putPipelineAsync(request, listener); // <1> client.ingest().putPipelineAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::put-pipeline-execute-async // end::put-pipeline-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -154,7 +155,7 @@ public class IngestClientDocumentationIT extends ESRestHighLevelClientTestCase {
// end::get-pipeline-request-masterTimeout // end::get-pipeline-request-masterTimeout
// tag::get-pipeline-execute // tag::get-pipeline-execute
GetPipelineResponse response = client.ingest().getPipeline(request); // <1> GetPipelineResponse response = client.ingest().getPipeline(request, RequestOptions.DEFAULT); // <1>
// end::get-pipeline-execute // end::get-pipeline-execute
// tag::get-pipeline-response // tag::get-pipeline-response
@ -199,7 +200,7 @@ public class IngestClientDocumentationIT extends ESRestHighLevelClientTestCase {
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::get-pipeline-execute-async // tag::get-pipeline-execute-async
client.ingest().getPipelineAsync(request, listener); // <1> client.ingest().getPipelineAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::get-pipeline-execute-async // end::get-pipeline-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -229,7 +230,7 @@ public class IngestClientDocumentationIT extends ESRestHighLevelClientTestCase {
// end::delete-pipeline-request-masterTimeout // end::delete-pipeline-request-masterTimeout
// tag::delete-pipeline-execute // tag::delete-pipeline-execute
WritePipelineResponse response = client.ingest().deletePipeline(request); // <1> WritePipelineResponse response = client.ingest().deletePipeline(request, RequestOptions.DEFAULT); // <1>
// end::delete-pipeline-execute // end::delete-pipeline-execute
// tag::delete-pipeline-response // tag::delete-pipeline-response
@ -269,7 +270,7 @@ public class IngestClientDocumentationIT extends ESRestHighLevelClientTestCase {
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::delete-pipeline-execute-async // tag::delete-pipeline-execute-async
client.ingest().deletePipelineAsync(request, listener); // <1> client.ingest().deletePipelineAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::delete-pipeline-execute-async // end::delete-pipeline-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));

View File

@ -19,10 +19,6 @@
package org.elasticsearch.client.documentation; package org.elasticsearch.client.documentation;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.entity.ContentType;
import org.apache.http.nio.entity.NStringEntity;
import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.delete.DeleteRequest; import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse; import org.elasticsearch.action.delete.DeleteResponse;
@ -31,12 +27,10 @@ import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.ESRestHighLevelClientTestCase; import org.elasticsearch.client.ESRestHighLevelClientTestCase;
import org.elasticsearch.client.Request; import org.elasticsearch.client.Request;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.Response; import org.elasticsearch.client.Response;
import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.cluster.health.ClusterHealthStatus; import org.elasticsearch.cluster.health.ClusterHealthStatus;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.common.xcontent.XContentHelper;
import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.rest.RestStatus; import org.elasticsearch.rest.RestStatus;
@ -45,11 +39,6 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.Map; import java.util.Map;
import static java.util.Collections.emptyMap;
import static java.util.Collections.singletonMap;
import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_REPLICAS;
import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_SHARDS;
/** /**
* This class is used to generate the documentation for the * This class is used to generate the documentation for the
* docs/java-rest/high-level/migration.asciidoc page. * docs/java-rest/high-level/migration.asciidoc page.
@ -98,14 +87,14 @@ public class MigrationDocumentationIT extends ESRestHighLevelClientTestCase {
//end::migration-request-ctor //end::migration-request-ctor
//tag::migration-request-ctor-execution //tag::migration-request-ctor-execution
IndexResponse response = client.index(request); IndexResponse response = client.index(request, RequestOptions.DEFAULT);
//end::migration-request-ctor-execution //end::migration-request-ctor-execution
assertEquals(RestStatus.CREATED, response.status()); assertEquals(RestStatus.CREATED, response.status());
} }
{ {
//tag::migration-request-async-execution //tag::migration-request-async-execution
DeleteRequest request = new DeleteRequest("index", "doc", "id"); // <1> DeleteRequest request = new DeleteRequest("index", "doc", "id"); // <1>
client.deleteAsync(request, new ActionListener<DeleteResponse>() { // <2> client.deleteAsync(request, RequestOptions.DEFAULT, new ActionListener<DeleteResponse>() { // <2>
@Override @Override
public void onResponse(DeleteResponse deleteResponse) { public void onResponse(DeleteResponse deleteResponse) {
// <3> // <3>
@ -117,12 +106,12 @@ public class MigrationDocumentationIT extends ESRestHighLevelClientTestCase {
} }
}); });
//end::migration-request-async-execution //end::migration-request-async-execution
assertBusy(() -> assertFalse(client.exists(new GetRequest("index", "doc", "id")))); assertBusy(() -> assertFalse(client.exists(new GetRequest("index", "doc", "id"), RequestOptions.DEFAULT)));
} }
{ {
//tag::migration-request-sync-execution //tag::migration-request-sync-execution
DeleteRequest request = new DeleteRequest("index", "doc", "id"); DeleteRequest request = new DeleteRequest("index", "doc", "id");
DeleteResponse response = client.delete(request); // <1> DeleteResponse response = client.delete(request, RequestOptions.DEFAULT); // <1>
//end::migration-request-sync-execution //end::migration-request-sync-execution
assertEquals(RestStatus.NOT_FOUND, response.status()); assertEquals(RestStatus.NOT_FOUND, response.status());
} }

View File

@ -24,6 +24,7 @@ import org.elasticsearch.Build;
import org.elasticsearch.Version; import org.elasticsearch.Version;
import org.elasticsearch.action.main.MainResponse; import org.elasticsearch.action.main.MainResponse;
import org.elasticsearch.client.ESRestHighLevelClientTestCase; import org.elasticsearch.client.ESRestHighLevelClientTestCase;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.cluster.ClusterName; import org.elasticsearch.cluster.ClusterName;
@ -40,7 +41,7 @@ public class MiscellaneousDocumentationIT extends ESRestHighLevelClientTestCase
RestHighLevelClient client = highLevelClient(); RestHighLevelClient client = highLevelClient();
{ {
//tag::main-execute //tag::main-execute
MainResponse response = client.info(); MainResponse response = client.info(RequestOptions.DEFAULT);
//end::main-execute //end::main-execute
//tag::main-response //tag::main-response
ClusterName clusterName = response.getClusterName(); // <1> ClusterName clusterName = response.getClusterName(); // <1>
@ -60,7 +61,7 @@ public class MiscellaneousDocumentationIT extends ESRestHighLevelClientTestCase
public void testPing() throws IOException { public void testPing() throws IOException {
RestHighLevelClient client = highLevelClient(); RestHighLevelClient client = highLevelClient();
//tag::ping-execute //tag::ping-execute
boolean response = client.ping(); boolean response = client.ping(RequestOptions.DEFAULT);
//end::ping-execute //end::ping-execute
assertTrue(response); assertTrue(response);
} }

View File

@ -42,6 +42,7 @@ import org.elasticsearch.action.support.IndicesOptions;
import org.elasticsearch.action.support.WriteRequest; import org.elasticsearch.action.support.WriteRequest;
import org.elasticsearch.client.ESRestHighLevelClientTestCase; import org.elasticsearch.client.ESRestHighLevelClientTestCase;
import org.elasticsearch.client.Request; import org.elasticsearch.client.Request;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.Response; import org.elasticsearch.client.Response;
import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.RestHighLevelClient;
@ -143,7 +144,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
// tag::search-request-preference // tag::search-request-preference
searchRequest.preference("_local"); // <1> searchRequest.preference("_local"); // <1>
// end::search-request-preference // end::search-request-preference
assertNotNull(client.search(searchRequest)); assertNotNull(client.search(searchRequest, RequestOptions.DEFAULT));
} }
{ {
// tag::search-source-basics // tag::search-source-basics
@ -176,7 +177,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
// end::search-source-setter // end::search-source-setter
// tag::search-execute // tag::search-execute
SearchResponse searchResponse = client.search(searchRequest); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
// end::search-execute // end::search-execute
// tag::search-execute-listener // tag::search-execute-listener
@ -198,7 +199,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::search-execute-async // tag::search-execute-async
client.searchAsync(searchRequest, listener); // <1> client.searchAsync(searchRequest, RequestOptions.DEFAULT, listener); // <1>
// end::search-execute-async // end::search-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -296,7 +297,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
request.add(new IndexRequest("posts", "doc", "3") request.add(new IndexRequest("posts", "doc", "3")
.source(XContentType.JSON, "company", "Elastic", "age", 40)); .source(XContentType.JSON, "company", "Elastic", "age", 40));
request.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE); request.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
BulkResponse bulkResponse = client.bulk(request); BulkResponse bulkResponse = client.bulk(request, RequestOptions.DEFAULT);
assertSame(RestStatus.OK, bulkResponse.status()); assertSame(RestStatus.OK, bulkResponse.status());
assertFalse(bulkResponse.hasFailures()); assertFalse(bulkResponse.hasFailures());
} }
@ -312,7 +313,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
// end::search-request-aggregations // end::search-request-aggregations
searchSourceBuilder.query(QueryBuilders.matchAllQuery()); searchSourceBuilder.query(QueryBuilders.matchAllQuery());
searchRequest.source(searchSourceBuilder); searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
{ {
// tag::search-request-aggregations-get // tag::search-request-aggregations-get
Aggregations aggregations = searchResponse.getAggregations(); Aggregations aggregations = searchResponse.getAggregations();
@ -369,7 +370,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
request.add(new IndexRequest("posts", "doc", "3").source(XContentType.JSON, "user", "tlrx")); request.add(new IndexRequest("posts", "doc", "3").source(XContentType.JSON, "user", "tlrx"));
request.add(new IndexRequest("posts", "doc", "4").source(XContentType.JSON, "user", "cbuescher")); request.add(new IndexRequest("posts", "doc", "4").source(XContentType.JSON, "user", "cbuescher"));
request.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE); request.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
BulkResponse bulkResponse = client.bulk(request); BulkResponse bulkResponse = client.bulk(request, RequestOptions.DEFAULT);
assertSame(RestStatus.OK, bulkResponse.status()); assertSame(RestStatus.OK, bulkResponse.status());
assertFalse(bulkResponse.hasFailures()); assertFalse(bulkResponse.hasFailures());
} }
@ -384,7 +385,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
searchSourceBuilder.suggest(suggestBuilder); searchSourceBuilder.suggest(suggestBuilder);
// end::search-request-suggestion // end::search-request-suggestion
searchRequest.source(searchSourceBuilder); searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
{ {
// tag::search-request-suggestion-get // tag::search-request-suggestion-get
Suggest suggest = searchResponse.getSuggest(); // <1> Suggest suggest = searchResponse.getSuggest(); // <1>
@ -416,7 +417,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
.source(XContentType.JSON, "title", "The Future of Federated Search in Elasticsearch", "user", .source(XContentType.JSON, "title", "The Future of Federated Search in Elasticsearch", "user",
Arrays.asList("kimchy", "tanguy"), "innerObject", Collections.singletonMap("key", "value"))); Arrays.asList("kimchy", "tanguy"), "innerObject", Collections.singletonMap("key", "value")));
request.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE); request.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
BulkResponse bulkResponse = client.bulk(request); BulkResponse bulkResponse = client.bulk(request, RequestOptions.DEFAULT);
assertSame(RestStatus.OK, bulkResponse.status()); assertSame(RestStatus.OK, bulkResponse.status());
assertFalse(bulkResponse.hasFailures()); assertFalse(bulkResponse.hasFailures());
} }
@ -437,7 +438,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
.should(matchQuery("title", "Elasticsearch")) .should(matchQuery("title", "Elasticsearch"))
.should(matchQuery("user", "kimchy"))); .should(matchQuery("user", "kimchy")));
searchRequest.source(searchSourceBuilder); searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
{ {
// tag::search-request-highlighting-get // tag::search-request-highlighting-get
SearchHits hits = searchResponse.getHits(); SearchHits hits = searchResponse.getHits();
@ -472,7 +473,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
IndexRequest request = new IndexRequest("posts", "doc", "1") IndexRequest request = new IndexRequest("posts", "doc", "1")
.source(XContentType.JSON, "tags", "elasticsearch", "comments", 123); .source(XContentType.JSON, "tags", "elasticsearch", "comments", 123);
request.setRefreshPolicy(WriteRequest.RefreshPolicy.WAIT_UNTIL); request.setRefreshPolicy(WriteRequest.RefreshPolicy.WAIT_UNTIL);
IndexResponse indexResponse = client.index(request); IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
assertSame(RestStatus.CREATED, indexResponse.status()); assertSame(RestStatus.CREATED, indexResponse.status());
} }
{ {
@ -485,7 +486,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
searchSourceBuilder.aggregation(AggregationBuilders.histogram("by_comments").field("comments").interval(100)); searchSourceBuilder.aggregation(AggregationBuilders.histogram("by_comments").field("comments").interval(100));
searchRequest.source(searchSourceBuilder); searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
// tag::search-request-profiling-get // tag::search-request-profiling-get
Map<String, ProfileShardResult> profilingResults = Map<String, ProfileShardResult> profilingResults =
searchResponse.getProfileResults(); // <1> searchResponse.getProfileResults(); // <1>
@ -548,7 +549,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
request.add(new IndexRequest("posts", "doc", "3") request.add(new IndexRequest("posts", "doc", "3")
.source(XContentType.JSON, "title", "The Future of Federated Search in Elasticsearch")); .source(XContentType.JSON, "title", "The Future of Federated Search in Elasticsearch"));
request.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE); request.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
BulkResponse bulkResponse = client.bulk(request); BulkResponse bulkResponse = client.bulk(request, RequestOptions.DEFAULT);
assertSame(RestStatus.OK, bulkResponse.status()); assertSame(RestStatus.OK, bulkResponse.status());
assertFalse(bulkResponse.hasFailures()); assertFalse(bulkResponse.hasFailures());
} }
@ -561,7 +562,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
searchSourceBuilder.size(size); // <1> searchSourceBuilder.size(size); // <1>
searchRequest.source(searchSourceBuilder); searchRequest.source(searchSourceBuilder);
searchRequest.scroll(TimeValue.timeValueMinutes(1L)); // <2> searchRequest.scroll(TimeValue.timeValueMinutes(1L)); // <2>
SearchResponse searchResponse = client.search(searchRequest); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
String scrollId = searchResponse.getScrollId(); // <3> String scrollId = searchResponse.getScrollId(); // <3>
SearchHits hits = searchResponse.getHits(); // <4> SearchHits hits = searchResponse.getHits(); // <4>
// end::search-scroll-init // end::search-scroll-init
@ -572,7 +573,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
// tag::search-scroll2 // tag::search-scroll2
SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId); // <1> SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId); // <1>
scrollRequest.scroll(TimeValue.timeValueSeconds(30)); scrollRequest.scroll(TimeValue.timeValueSeconds(30));
SearchResponse searchScrollResponse = client.searchScroll(scrollRequest); SearchResponse searchScrollResponse = client.searchScroll(scrollRequest, RequestOptions.DEFAULT);
scrollId = searchScrollResponse.getScrollId(); // <2> scrollId = searchScrollResponse.getScrollId(); // <2>
hits = searchScrollResponse.getHits(); // <3> hits = searchScrollResponse.getHits(); // <3>
assertEquals(3, hits.getTotalHits()); assertEquals(3, hits.getTotalHits());
@ -582,14 +583,14 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
ClearScrollRequest clearScrollRequest = new ClearScrollRequest(); ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
clearScrollRequest.addScrollId(scrollId); clearScrollRequest.addScrollId(scrollId);
ClearScrollResponse clearScrollResponse = client.clearScroll(clearScrollRequest); ClearScrollResponse clearScrollResponse = client.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
assertTrue(clearScrollResponse.isSucceeded()); assertTrue(clearScrollResponse.isSucceeded());
} }
{ {
SearchRequest searchRequest = new SearchRequest(); SearchRequest searchRequest = new SearchRequest();
searchRequest.scroll("60s"); searchRequest.scroll("60s");
SearchResponse initialSearchResponse = client.search(searchRequest); SearchResponse initialSearchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
String scrollId = initialSearchResponse.getScrollId(); String scrollId = initialSearchResponse.getScrollId();
SearchScrollRequest scrollRequest = new SearchScrollRequest(); SearchScrollRequest scrollRequest = new SearchScrollRequest();
@ -601,7 +602,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
// end::scroll-request-arguments // end::scroll-request-arguments
// tag::search-scroll-execute-sync // tag::search-scroll-execute-sync
SearchResponse searchResponse = client.searchScroll(scrollRequest); SearchResponse searchResponse = client.searchScroll(scrollRequest, RequestOptions.DEFAULT);
// end::search-scroll-execute-sync // end::search-scroll-execute-sync
assertEquals(0, searchResponse.getFailedShards()); assertEquals(0, searchResponse.getFailedShards());
@ -648,7 +649,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
// end::clear-scroll-add-scroll-ids // end::clear-scroll-add-scroll-ids
// tag::clear-scroll-execute // tag::clear-scroll-execute
ClearScrollResponse response = client.clearScroll(request); ClearScrollResponse response = client.clearScroll(request, RequestOptions.DEFAULT);
// end::clear-scroll-execute // end::clear-scroll-execute
// tag::clear-scroll-response // tag::clear-scroll-response
@ -678,7 +679,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
listener = new LatchedActionListener<>(listener, clearScrollLatch); listener = new LatchedActionListener<>(listener, clearScrollLatch);
// tag::clear-scroll-execute-async // tag::clear-scroll-execute-async
client.clearScrollAsync(request, listener); // <1> client.clearScrollAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::clear-scroll-execute-async // end::clear-scroll-execute-async
assertTrue(clearScrollLatch.await(30L, TimeUnit.SECONDS)); assertTrue(clearScrollLatch.await(30L, TimeUnit.SECONDS));
@ -692,14 +693,14 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
searchSourceBuilder.query(matchQuery("title", "Elasticsearch")); searchSourceBuilder.query(matchQuery("title", "Elasticsearch"));
searchRequest.source(searchSourceBuilder); searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest); // <1> SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); // <1>
String scrollId = searchResponse.getScrollId(); String scrollId = searchResponse.getScrollId();
SearchHit[] searchHits = searchResponse.getHits().getHits(); SearchHit[] searchHits = searchResponse.getHits().getHits();
while (searchHits != null && searchHits.length > 0) { // <2> while (searchHits != null && searchHits.length > 0) { // <2>
SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId); // <3> SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId); // <3>
scrollRequest.scroll(scroll); scrollRequest.scroll(scroll);
searchResponse = client.searchScroll(scrollRequest); searchResponse = client.searchScroll(scrollRequest, RequestOptions.DEFAULT);
scrollId = searchResponse.getScrollId(); scrollId = searchResponse.getScrollId();
searchHits = searchResponse.getHits().getHits(); searchHits = searchResponse.getHits().getHits();
// <4> // <4>
@ -707,7 +708,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
ClearScrollRequest clearScrollRequest = new ClearScrollRequest(); // <5> ClearScrollRequest clearScrollRequest = new ClearScrollRequest(); // <5>
clearScrollRequest.addScrollId(scrollId); clearScrollRequest.addScrollId(scrollId);
ClearScrollResponse clearScrollResponse = client.clearScroll(clearScrollRequest); ClearScrollResponse clearScrollResponse = client.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
boolean succeeded = clearScrollResponse.isSucceeded(); boolean succeeded = clearScrollResponse.isSucceeded();
// end::search-scroll-example // end::search-scroll-example
assertTrue(succeeded); assertTrue(succeeded);
@ -737,7 +738,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
// end::search-template-request-inline // end::search-template-request-inline
// tag::search-template-response // tag::search-template-response
SearchTemplateResponse response = client.searchTemplate(request); SearchTemplateResponse response = client.searchTemplate(request, RequestOptions.DEFAULT);
SearchResponse searchResponse = response.getResponse(); SearchResponse searchResponse = response.getResponse();
// end::search-template-response // end::search-template-response
@ -749,7 +750,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
// end::render-search-template-request // end::render-search-template-request
// tag::render-search-template-response // tag::render-search-template-response
SearchTemplateResponse renderResponse = client.searchTemplate(request); SearchTemplateResponse renderResponse = client.searchTemplate(request, RequestOptions.DEFAULT);
BytesReference source = renderResponse.getSource(); // <1> BytesReference source = renderResponse.getSource(); // <1>
// end::render-search-template-response // end::render-search-template-response
@ -802,7 +803,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
// end::search-template-request-options // end::search-template-request-options
// tag::search-template-execute // tag::search-template-execute
SearchTemplateResponse response = client.searchTemplate(request); SearchTemplateResponse response = client.searchTemplate(request, RequestOptions.DEFAULT);
// end::search-template-execute // end::search-template-execute
SearchResponse searchResponse = response.getResponse(); SearchResponse searchResponse = response.getResponse();
@ -828,7 +829,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::search-template-execute-async // tag::search-template-execute-async
client.searchTemplateAsync(request, listener); // <1> client.searchTemplateAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::search-template-execute-async // end::search-template-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -849,7 +850,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
// end::field-caps-request-indicesOptions // end::field-caps-request-indicesOptions
// tag::field-caps-execute // tag::field-caps-execute
FieldCapabilitiesResponse response = client.fieldCaps(request); FieldCapabilitiesResponse response = client.fieldCaps(request, RequestOptions.DEFAULT);
// end::field-caps-execute // end::field-caps-execute
// tag::field-caps-response // tag::field-caps-response
@ -892,7 +893,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::field-caps-execute-async // tag::field-caps-execute-async
client.fieldCapsAsync(request, listener); // <1> client.fieldCapsAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::field-caps-execute-async // end::field-caps-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -918,7 +919,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
// end::rank-eval-request-basic // end::rank-eval-request-basic
// tag::rank-eval-execute // tag::rank-eval-execute
RankEvalResponse response = client.rankEval(request); RankEvalResponse response = client.rankEval(request, RequestOptions.DEFAULT);
// end::rank-eval-execute // end::rank-eval-execute
// tag::rank-eval-response // tag::rank-eval-response
@ -962,7 +963,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::rank-eval-execute-async // tag::rank-eval-execute-async
client.rankEvalAsync(request, listener); // <1> client.rankEvalAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::rank-eval-execute-async // end::rank-eval-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -987,7 +988,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
request.add(secondSearchRequest); request.add(secondSearchRequest);
// end::multi-search-request-basic // end::multi-search-request-basic
// tag::multi-search-execute // tag::multi-search-execute
MultiSearchResponse response = client.multiSearch(request); MultiSearchResponse response = client.multiSearch(request, RequestOptions.DEFAULT);
// end::multi-search-execute // end::multi-search-execute
// tag::multi-search-response // tag::multi-search-response
MultiSearchResponse.Item firstResponse = response.getResponses()[0]; // <1> MultiSearchResponse.Item firstResponse = response.getResponses()[0]; // <1>
@ -1019,7 +1020,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::multi-search-execute-async // tag::multi-search-execute-async
client.multiSearchAsync(request, listener); // <1> client.multiSearchAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::multi-search-execute-async // end::multi-search-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -1030,7 +1031,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
request.add(new SearchRequest("posts") // <1> request.add(new SearchRequest("posts") // <1>
.types("doc")); // <2> .types("doc")); // <2>
// end::multi-search-request-index // end::multi-search-request-index
MultiSearchResponse response = client.multiSearch(request); MultiSearchResponse response = client.multiSearch(request, RequestOptions.DEFAULT);
MultiSearchResponse.Item firstResponse = response.getResponses()[0]; MultiSearchResponse.Item firstResponse = response.getResponses()[0];
assertNull(firstResponse.getFailure()); assertNull(firstResponse.getFailure());
SearchResponse searchResponse = firstResponse.getResponse(); SearchResponse searchResponse = firstResponse.getResponse();
@ -1041,12 +1042,12 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
private void indexSearchTestData() throws IOException { private void indexSearchTestData() throws IOException {
CreateIndexRequest authorsRequest = new CreateIndexRequest("authors") CreateIndexRequest authorsRequest = new CreateIndexRequest("authors")
.mapping("doc", "user", "type=keyword,doc_values=false"); .mapping("doc", "user", "type=keyword,doc_values=false");
CreateIndexResponse authorsResponse = highLevelClient().indices().create(authorsRequest); CreateIndexResponse authorsResponse = highLevelClient().indices().create(authorsRequest, RequestOptions.DEFAULT);
assertTrue(authorsResponse.isAcknowledged()); assertTrue(authorsResponse.isAcknowledged());
CreateIndexRequest reviewersRequest = new CreateIndexRequest("contributors") CreateIndexRequest reviewersRequest = new CreateIndexRequest("contributors")
.mapping("doc", "user", "type=keyword"); .mapping("doc", "user", "type=keyword");
CreateIndexResponse reviewersResponse = highLevelClient().indices().create(reviewersRequest); CreateIndexResponse reviewersResponse = highLevelClient().indices().create(reviewersRequest, RequestOptions.DEFAULT);
assertTrue(reviewersResponse.isAcknowledged()); assertTrue(reviewersResponse.isAcknowledged());
BulkRequest bulkRequest = new BulkRequest(); BulkRequest bulkRequest = new BulkRequest();
@ -1067,7 +1068,7 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
bulkRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE); bulkRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
BulkResponse bulkResponse = highLevelClient().bulk(bulkRequest); BulkResponse bulkResponse = highLevelClient().bulk(bulkRequest, RequestOptions.DEFAULT);
assertSame(RestStatus.OK, bulkResponse.status()); assertSame(RestStatus.OK, bulkResponse.status());
assertFalse(bulkResponse.hasFailures()); assertFalse(bulkResponse.hasFailures());
} }

View File

@ -30,6 +30,7 @@ import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryResp
import org.elasticsearch.action.admin.cluster.repositories.verify.VerifyRepositoryRequest; import org.elasticsearch.action.admin.cluster.repositories.verify.VerifyRepositoryRequest;
import org.elasticsearch.action.admin.cluster.repositories.verify.VerifyRepositoryResponse; import org.elasticsearch.action.admin.cluster.repositories.verify.VerifyRepositoryResponse;
import org.elasticsearch.client.ESRestHighLevelClientTestCase; import org.elasticsearch.client.ESRestHighLevelClientTestCase;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.cluster.metadata.RepositoryMetaData; import org.elasticsearch.cluster.metadata.RepositoryMetaData;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
@ -134,7 +135,7 @@ public class SnapshotClientDocumentationIT extends ESRestHighLevelClientTestCase
// end::create-repository-request-verify // end::create-repository-request-verify
// tag::create-repository-execute // tag::create-repository-execute
PutRepositoryResponse response = client.snapshot().createRepository(request); PutRepositoryResponse response = client.snapshot().createRepository(request, RequestOptions.DEFAULT);
// end::create-repository-execute // end::create-repository-execute
// tag::create-repository-response // tag::create-repository-response
@ -168,7 +169,7 @@ public class SnapshotClientDocumentationIT extends ESRestHighLevelClientTestCase
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::create-repository-execute-async // tag::create-repository-execute-async
client.snapshot().createRepositoryAsync(request, listener); // <1> client.snapshot().createRepositoryAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::create-repository-execute-async // end::create-repository-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -197,7 +198,7 @@ public class SnapshotClientDocumentationIT extends ESRestHighLevelClientTestCase
// end::get-repository-request-masterTimeout // end::get-repository-request-masterTimeout
// tag::get-repository-execute // tag::get-repository-execute
GetRepositoriesResponse response = client.snapshot().getRepositories(request); GetRepositoriesResponse response = client.snapshot().getRepositories(request, RequestOptions.DEFAULT);
// end::get-repository-execute // end::get-repository-execute
// tag::get-repository-response // tag::get-repository-response
@ -232,7 +233,7 @@ public class SnapshotClientDocumentationIT extends ESRestHighLevelClientTestCase
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::get-repository-execute-async // tag::get-repository-execute-async
client.snapshot().getRepositoriesAsync(request, listener); // <1> client.snapshot().getRepositoriesAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::get-repository-execute-async // end::get-repository-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -258,7 +259,7 @@ public class SnapshotClientDocumentationIT extends ESRestHighLevelClientTestCase
// end::delete-repository-request-timeout // end::delete-repository-request-timeout
// tag::delete-repository-execute // tag::delete-repository-execute
DeleteRepositoryResponse response = client.snapshot().deleteRepository(request); DeleteRepositoryResponse response = client.snapshot().deleteRepository(request, RequestOptions.DEFAULT);
// end::delete-repository-execute // end::delete-repository-execute
// tag::delete-repository-response // tag::delete-repository-response
@ -292,7 +293,7 @@ public class SnapshotClientDocumentationIT extends ESRestHighLevelClientTestCase
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::delete-repository-execute-async // tag::delete-repository-execute-async
client.snapshot().deleteRepositoryAsync(request, listener); // <1> client.snapshot().deleteRepositoryAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::delete-repository-execute-async // end::delete-repository-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -317,7 +318,7 @@ public class SnapshotClientDocumentationIT extends ESRestHighLevelClientTestCase
// end::verify-repository-request-timeout // end::verify-repository-request-timeout
// tag::verify-repository-execute // tag::verify-repository-execute
VerifyRepositoryResponse response = client.snapshot().verifyRepository(request); VerifyRepositoryResponse response = client.snapshot().verifyRepository(request, RequestOptions.DEFAULT);
// end::verify-repository-execute // end::verify-repository-execute
// tag::verify-repository-response // tag::verify-repository-response
@ -352,7 +353,7 @@ public class SnapshotClientDocumentationIT extends ESRestHighLevelClientTestCase
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::verify-repository-execute-async // tag::verify-repository-execute-async
client.snapshot().verifyRepositoryAsync(request, listener); // <1> client.snapshot().verifyRepositoryAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::verify-repository-execute-async // end::verify-repository-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
@ -363,6 +364,6 @@ public class SnapshotClientDocumentationIT extends ESRestHighLevelClientTestCase
PutRepositoryRequest request = new PutRepositoryRequest(repositoryName); PutRepositoryRequest request = new PutRepositoryRequest(repositoryName);
request.type(FsRepository.TYPE); request.type(FsRepository.TYPE);
request.settings("{\"location\": \".\"}", XContentType.JSON); request.settings("{\"location\": \".\"}", XContentType.JSON);
assertTrue(highLevelClient().snapshot().createRepository(request).isAcknowledged()); assertTrue(highLevelClient().snapshot().createRepository(request, RequestOptions.DEFAULT).isAcknowledged());
} }
} }

View File

@ -23,10 +23,13 @@ import org.elasticsearch.ElasticsearchException;
import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.LatchedActionListener; import org.elasticsearch.action.LatchedActionListener;
import org.elasticsearch.action.TaskOperationFailure; import org.elasticsearch.action.TaskOperationFailure;
import org.elasticsearch.action.admin.cluster.node.tasks.cancel.CancelTasksRequest;
import org.elasticsearch.action.admin.cluster.node.tasks.cancel.CancelTasksResponse;
import org.elasticsearch.action.admin.cluster.node.tasks.list.ListTasksRequest; import org.elasticsearch.action.admin.cluster.node.tasks.list.ListTasksRequest;
import org.elasticsearch.action.admin.cluster.node.tasks.list.ListTasksResponse; import org.elasticsearch.action.admin.cluster.node.tasks.list.ListTasksResponse;
import org.elasticsearch.action.admin.cluster.node.tasks.list.TaskGroup; import org.elasticsearch.action.admin.cluster.node.tasks.list.TaskGroup;
import org.elasticsearch.client.ESRestHighLevelClientTestCase; import org.elasticsearch.client.ESRestHighLevelClientTestCase;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.tasks.TaskId; import org.elasticsearch.tasks.TaskId;
@ -90,7 +93,7 @@ public class TasksClientDocumentationIT extends ESRestHighLevelClientTestCase {
ListTasksRequest request = new ListTasksRequest(); ListTasksRequest request = new ListTasksRequest();
// tag::list-tasks-execute // tag::list-tasks-execute
ListTasksResponse response = client.tasks().list(request); ListTasksResponse response = client.tasks().list(request, RequestOptions.DEFAULT);
// end::list-tasks-execute // end::list-tasks-execute
assertThat(response, notNullValue()); assertThat(response, notNullValue());
@ -139,10 +142,80 @@ public class TasksClientDocumentationIT extends ESRestHighLevelClientTestCase {
listener = new LatchedActionListener<>(listener, latch); listener = new LatchedActionListener<>(listener, latch);
// tag::list-tasks-execute-async // tag::list-tasks-execute-async
client.tasks().listAsync(request, listener); // <1> client.tasks().listAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::list-tasks-execute-async // end::list-tasks-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS)); assertTrue(latch.await(30L, TimeUnit.SECONDS));
} }
} }
public void testCancelTasks() throws IOException {
RestHighLevelClient client = highLevelClient();
{
// tag::cancel-tasks-request
CancelTasksRequest request = new CancelTasksRequest();
// end::cancel-tasks-request
// tag::cancel-tasks-request-filter
request.setTaskId(new TaskId("nodeId1", 42)); //<1>
request.setActions("cluster:*"); // <2>
request.setNodes("nodeId1", "nodeId2"); // <3>
// end::cancel-tasks-request-filter
}
CancelTasksRequest request = new CancelTasksRequest();
request.setTaskId(TaskId.EMPTY_TASK_ID);
// tag::cancel-tasks-execute
CancelTasksResponse response = client.tasks().cancel(request, RequestOptions.DEFAULT);
// end::cancel-tasks-execute
assertThat(response, notNullValue());
// tag::cancel-tasks-response-tasks
List<TaskInfo> tasks = response.getTasks(); // <1>
// end::cancel-tasks-response-tasks
// tag::cancel-tasks-response-failures
List<ElasticsearchException> nodeFailures = response.getNodeFailures(); // <1>
List<TaskOperationFailure> taskFailures = response.getTaskFailures(); // <2>
// end::-tasks-response-failures
assertThat(response.getNodeFailures(), equalTo(emptyList()));
assertThat(response.getTaskFailures(), equalTo(emptyList()));
}
public void testAsyncCancelTasks() throws InterruptedException {
RestHighLevelClient client = highLevelClient();
{
CancelTasksRequest request = new CancelTasksRequest();
// tag::cancel-tasks-execute-listener
ActionListener<CancelTasksResponse> listener =
new ActionListener<CancelTasksResponse>() {
@Override
public void onResponse(CancelTasksResponse response) {
// <1>
}
@Override
public void onFailure(Exception e) {
// <2>
}
};
// end::cancel-tasks-execute-listener
// Replace the empty listener by a blocking listener in test
final CountDownLatch latch = new CountDownLatch(1);
listener = new LatchedActionListener<>(listener, latch);
// tag::cancel-tasks-execute-async
client.tasks().cancelAsync(request, RequestOptions.DEFAULT, listener); // <1>
// end::cancel-tasks-execute-async
assertTrue(latch.await(30L, TimeUnit.SECONDS));
}
}
} }

View File

@ -69,7 +69,7 @@ forbiddenApisTest {
} }
// JarHell is part of es server, which we don't want to pull in // JarHell is part of es server, which we don't want to pull in
// TODO: Not anymore. Now in elasticsearch-core // TODO: Not anymore. Now in :libs:core
jarHell.enabled=false jarHell.enabled=false
namingConventions { namingConventions {

View File

@ -72,7 +72,7 @@ dependencyLicenses {
} }
// JarHell is part of es server, which we don't want to pull in // JarHell is part of es server, which we don't want to pull in
// TODO: Not anymore. Now in elasticsearch-core // TODO: Not anymore. Now in :libs:core
jarHell.enabled=false jarHell.enabled=false
namingConventions { namingConventions {

View File

@ -30,7 +30,6 @@ import com.sun.net.httpserver.HttpServer;
import org.apache.http.Consts; import org.apache.http.Consts;
import org.apache.http.HttpHost; import org.apache.http.HttpHost;
import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpGet;
import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement;
import org.elasticsearch.client.Response; import org.elasticsearch.client.Response;
import org.elasticsearch.client.ResponseException; import org.elasticsearch.client.ResponseException;
import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClient;
@ -148,8 +147,6 @@ public class ElasticsearchHostsSnifferTests extends RestClientTestCase {
return httpServer; return httpServer;
} }
//animal-sniffer doesn't like our usage of com.sun.net.httpserver.* classes
@IgnoreJRERequirement
private static class ResponseHandler implements HttpHandler { private static class ResponseHandler implements HttpHandler {
private final int sniffTimeoutMillis; private final int sniffTimeoutMillis;
private final SniffResponse sniffResponse; private final SniffResponse sniffResponse;

View File

@ -21,7 +21,6 @@ import org.elasticsearch.gradle.precommit.PrecommitTasks
import org.gradle.api.JavaVersion import org.gradle.api.JavaVersion
apply plugin: 'elasticsearch.build' apply plugin: 'elasticsearch.build'
apply plugin: 'ru.vyarus.animalsniffer'
targetCompatibility = JavaVersion.VERSION_1_7 targetCompatibility = JavaVersion.VERSION_1_7
sourceCompatibility = JavaVersion.VERSION_1_7 sourceCompatibility = JavaVersion.VERSION_1_7
@ -31,8 +30,6 @@ dependencies {
compile "com.carrotsearch.randomizedtesting:randomizedtesting-runner:${versions.randomizedrunner}" compile "com.carrotsearch.randomizedtesting:randomizedtesting-runner:${versions.randomizedrunner}"
compile "junit:junit:${versions.junit}" compile "junit:junit:${versions.junit}"
compile "org.hamcrest:hamcrest-all:${versions.hamcrest}" compile "org.hamcrest:hamcrest-all:${versions.hamcrest}"
compile "org.codehaus.mojo:animal-sniffer-annotations:1.15"
signature "org.codehaus.mojo.signature:java17:1.0@signature"
} }
forbiddenApisMain { forbiddenApisMain {
@ -49,7 +46,7 @@ forbiddenApisTest {
} }
// JarHell is part of es server, which we don't want to pull in // JarHell is part of es server, which we don't want to pull in
// TODO: Not anymore. Now in elasticsearch-core // TODO: Not anymore. Now in :libs:core
jarHell.enabled=false jarHell.enabled=false
// TODO: should we have licenses for our test deps? // TODO: should we have licenses for our test deps?

View File

@ -34,7 +34,7 @@ Collection distributions = project('archives').subprojects + project('packages')
task generateDependenciesReport(type: ConcatFilesTask) { task generateDependenciesReport(type: ConcatFilesTask) {
files = fileTree(dir: project.rootDir, include: '**/dependencies.csv' ) files = fileTree(dir: project.rootDir, include: '**/dependencies.csv' )
headerLine = "name,version,url,license" headerLine = "name,version,url,license"
target = new File(System.getProperty('csv')?: "${project.buildDir}/dependencies/es-dependencies.csv") target = new File(System.getProperty('csv')?: "${project.buildDir}/reports/dependencies/es-dependencies.csv")
} }
/***************************************************************************** /*****************************************************************************
@ -231,6 +231,7 @@ configure(subprojects.findAll { ['archives', 'packages'].contains(it.name) }) {
from { project(':server').jar } from { project(':server').jar }
from { project(':server').configurations.runtime } from { project(':server').configurations.runtime }
from { project(':libs:plugin-classloader').jar } from { project(':libs:plugin-classloader').jar }
from { project(':distribution:tools:java-version-checker').jar }
from { project(':distribution:tools:launchers').jar } from { project(':distribution:tools:launchers').jar }
into('tools/plugin-cli') { into('tools/plugin-cli') {
from { project(':distribution:tools:plugin-cli').jar } from { project(':distribution:tools:plugin-cli').jar }

View File

@ -24,5 +24,5 @@ exec \
-Des.distribution.flavor="$ES_DISTRIBUTION_FLAVOR" \ -Des.distribution.flavor="$ES_DISTRIBUTION_FLAVOR" \
-Des.distribution.type="$ES_DISTRIBUTION_TYPE" \ -Des.distribution.type="$ES_DISTRIBUTION_TYPE" \
-cp "$ES_CLASSPATH" \ -cp "$ES_CLASSPATH" \
$1 \ "$ES_MAIN_CLASS" \
"${@:2}" "$@"

View File

@ -6,11 +6,6 @@ if defined ES_ADDITIONAL_SOURCES (
) )
) )
for /f "tokens=1*" %%a in ("%*") do (
set main_class=%%a
set arguments=%%b
)
if defined ES_ADDITIONAL_CLASSPATH_DIRECTORIES ( if defined ES_ADDITIONAL_CLASSPATH_DIRECTORIES (
for %%a in ("%ES_ADDITIONAL_CLASSPATH_DIRECTORIES:;=","%") do ( for %%a in ("%ES_ADDITIONAL_CLASSPATH_DIRECTORIES:;=","%") do (
set ES_CLASSPATH=!ES_CLASSPATH!;!ES_HOME!/%%a/* set ES_CLASSPATH=!ES_CLASSPATH!;!ES_HOME!/%%a/*
@ -24,5 +19,5 @@ if defined ES_ADDITIONAL_CLASSPATH_DIRECTORIES (
-Des.distribution.flavor="%ES_DISTRIBUTION_FLAVOR%" ^ -Des.distribution.flavor="%ES_DISTRIBUTION_FLAVOR%" ^
-Des.distribution.type="%ES_DISTRIBUTION_TYPE%" ^ -Des.distribution.type="%ES_DISTRIBUTION_TYPE%" ^
-cp "%ES_CLASSPATH%" ^ -cp "%ES_CLASSPATH%" ^
%main_class% ^ "%ES_MAIN_CLASS%" ^
%arguments% %*

View File

@ -63,7 +63,7 @@ if [ ! -z "$JAVA_OPTS" ]; then
fi fi
# check the Java version # check the Java version
"$JAVA" -cp "$ES_CLASSPATH" org.elasticsearch.tools.launchers.JavaVersionChecker "$JAVA" -cp "$ES_CLASSPATH" org.elasticsearch.tools.java_version_checker.JavaVersionChecker
export HOSTNAME=$HOSTNAME export HOSTNAME=$HOSTNAME

View File

@ -42,7 +42,7 @@ if defined JAVA_OPTS (
) )
rem check the Java version rem check the Java version
%JAVA% -cp "%ES_CLASSPATH%" "org.elasticsearch.tools.launchers.JavaVersionChecker" || exit /b 1 %JAVA% -cp "%ES_CLASSPATH%" "org.elasticsearch.tools.java_version_checker.JavaVersionChecker" || exit /b 1
set HOSTNAME=%COMPUTERNAME% set HOSTNAME=%COMPUTERNAME%

View File

@ -1,5 +1,5 @@
#!/bin/bash #!/bin/bash
"`dirname "$0"`"/elasticsearch-cli \ ES_MAIN_CLASS=org.elasticsearch.common.settings.KeyStoreCli \
org.elasticsearch.common.settings.KeyStoreCli \ "`dirname "$0"`"/elasticsearch-cli \
"$@" "$@"

View File

@ -3,8 +3,8 @@
setlocal enabledelayedexpansion setlocal enabledelayedexpansion
setlocal enableextensions setlocal enableextensions
set ES_MAIN_CLASS=org.elasticsearch.common.settings.KeyStoreCli
call "%~dp0elasticsearch-cli.bat" ^ call "%~dp0elasticsearch-cli.bat" ^
org.elasticsearch.common.settings.KeyStoreCli ^
%%* ^ %%* ^
|| exit /b 1 || exit /b 1

View File

@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
ES_ADDITIONAL_CLASSPATH_DIRECTORIES=lib/tools/plugin-cli \ ES_MAIN_CLASS=org.elasticsearch.plugins.PluginCli \
ES_ADDITIONAL_CLASSPATH_DIRECTORIES=lib/tools/plugin-cli \
"`dirname "$0"`"/elasticsearch-cli \ "`dirname "$0"`"/elasticsearch-cli \
org.elasticsearch.plugins.PluginCli \
"$@" "$@"

View File

@ -3,9 +3,9 @@
setlocal enabledelayedexpansion setlocal enabledelayedexpansion
setlocal enableextensions setlocal enableextensions
set ES_MAIN_CLASS=org.elasticsearch.plugins.PluginCli
set ES_ADDITIONAL_CLASSPATH_DIRECTORIES=lib/tools/plugin-cli set ES_ADDITIONAL_CLASSPATH_DIRECTORIES=lib/tools/plugin-cli
call "%~dp0elasticsearch-cli.bat" ^ call "%~dp0elasticsearch-cli.bat" ^
org.elasticsearch.plugins.PluginCli ^
%%* ^ %%* ^
|| exit /b 1 || exit /b 1

View File

@ -1,5 +1,5 @@
#!/bin/bash #!/bin/bash
"`dirname "$0"`"/elasticsearch-cli \ ES_MAIN_CLASS=org.elasticsearch.index.translog.TranslogToolCli \
org.elasticsearch.index.translog.TranslogToolCli \ "`dirname "$0"`"/elasticsearch-cli \
"$@" "$@"

View File

@ -3,8 +3,8 @@
setlocal enabledelayedexpansion setlocal enabledelayedexpansion
setlocal enableextensions setlocal enableextensions
set ES_MAIN_CLASS=org.elasticsearch.index.translog.TranslogToolCli
call "%~dp0elasticsearch-cli.bat" ^ call "%~dp0elasticsearch-cli.bat" ^
org.elasticsearch.index.translog.TranslogToolCli ^
%%* ^ %%* ^
|| exit /b 1 || exit /b 1

View File

@ -0,0 +1,14 @@
import org.elasticsearch.gradle.precommit.PrecommitTasks
apply plugin: 'elasticsearch.build'
targetCompatibility = JavaVersion.VERSION_1_7
// java_version_checker do not depend on core so only JDK signatures should be checked
forbiddenApisMain.signaturesURLs = [PrecommitTasks.getResource('/forbidden/jdk-signatures.txt')]
test.enabled = false
namingConventions.enabled = false
javadoc.enabled = false
loggerUsageCheck.enabled = false
jarHell.enabled = false

View File

@ -17,7 +17,7 @@
* under the License. * under the License.
*/ */
package org.elasticsearch.tools.launchers; package org.elasticsearch.tools.java_version_checker;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -25,8 +25,8 @@ import java.util.Objects;
public class JavaVersion { public class JavaVersion {
static final List<Integer> CURRENT = parse(System.getProperty("java.specification.version")); public static final List<Integer> CURRENT = parse(System.getProperty("java.specification.version"));
static final List<Integer> JAVA_8 = parse("1.8"); public static final List<Integer> JAVA_8 = parse("1.8");
static List<Integer> parse(final String value) { static List<Integer> parse(final String value) {
if (!value.matches("^0*[0-9]+(\\.[0-9]+)*$")) { if (!value.matches("^0*[0-9]+(\\.[0-9]+)*$")) {
@ -41,7 +41,7 @@ public class JavaVersion {
return version; return version;
} }
static int majorVersion(final List<Integer> javaVersion) { public static int majorVersion(final List<Integer> javaVersion) {
Objects.requireNonNull(javaVersion); Objects.requireNonNull(javaVersion);
if (javaVersion.get(0) > 1) { if (javaVersion.get(0) > 1) {
return javaVersion.get(0); return javaVersion.get(0);

View File

@ -17,7 +17,7 @@
* under the License. * under the License.
*/ */
package org.elasticsearch.tools.launchers; package org.elasticsearch.tools.java_version_checker;
import java.util.Arrays; import java.util.Arrays;
import java.util.Locale; import java.util.Locale;
@ -45,10 +45,30 @@ final class JavaVersionChecker {
Locale.ROOT, Locale.ROOT,
"the minimum required Java version is 8; your Java version from [%s] does not meet this requirement", "the minimum required Java version is 8; your Java version from [%s] does not meet this requirement",
System.getProperty("java.home")); System.getProperty("java.home"));
Launchers.errPrintln(message); errPrintln(message);
Launchers.exit(1); exit(1);
} }
Launchers.exit(0); exit(0);
}
/**
* Prints a string and terminates the line on standard error.
*
* @param message the message to print
*/
@SuppressForbidden(reason = "System#err")
static void errPrintln(final String message) {
System.err.println(message);
}
/**
* Exit the VM with the specified status.
*
* @param status the status
*/
@SuppressForbidden(reason = "System#exit")
static void exit(final int status) {
System.exit(status);
} }
} }

View File

@ -17,17 +17,18 @@
* under the License. * under the License.
*/ */
package org.elasticsearch.tools.launchers; package org.elasticsearch.tools.java_version_checker;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import java.lang.annotation.Target;
/** /**
* Annotation to suppress forbidden-apis errors inside a whole class, a method, or a field. * Annotation to suppress forbidden-apis errors inside a whole class, a method, or a field.
*/ */
@Retention(RetentionPolicy.CLASS) @Retention(RetentionPolicy.CLASS)
@Target({ ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.TYPE }) @Target({ ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.TYPE })
@interface SuppressForbidden { public @interface SuppressForbidden {
String reason(); String reason();
} }

View File

@ -21,14 +21,9 @@ import org.elasticsearch.gradle.precommit.PrecommitTasks
import org.gradle.api.JavaVersion import org.gradle.api.JavaVersion
apply plugin: 'elasticsearch.build' apply plugin: 'elasticsearch.build'
apply plugin: 'ru.vyarus.animalsniffer'
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
dependencies { dependencies {
signature "org.codehaus.mojo.signature:java17:1.0@signature" compile parent.project('java-version-checker')
testCompile "com.carrotsearch.randomizedtesting:randomizedtesting-runner:${versions.randomizedrunner}" testCompile "com.carrotsearch.randomizedtesting:randomizedtesting-runner:${versions.randomizedrunner}"
testCompile "junit:junit:${versions.junit}" testCompile "junit:junit:${versions.junit}"
testCompile "org.hamcrest:hamcrest-all:${versions.hamcrest}" testCompile "org.hamcrest:hamcrest-all:${versions.hamcrest}"
@ -36,13 +31,10 @@ dependencies {
archivesBaseName = 'elasticsearch-launchers' archivesBaseName = 'elasticsearch-launchers'
// launchers do not depend on core so only JDK signatures should be checked // java_version_checker do not depend on core so only JDK signatures should be checked
forbiddenApisMain { List jdkSignatures = [PrecommitTasks.getResource('/forbidden/jdk-signatures.txt')]
signaturesURLs = [PrecommitTasks.getResource('/forbidden/jdk-signatures.txt')] forbiddenApisMain.signaturesURLs = jdkSignatures
} forbiddenApisTest.signaturesURLs = jdkSignatures
forbiddenApisTest {
signaturesURLs = [PrecommitTasks.getResource('/forbidden/jdk-signatures.txt')]
}
namingConventions { namingConventions {
testClass = 'org.elasticsearch.tools.launchers.LaunchersTestCase' testClass = 'org.elasticsearch.tools.launchers.LaunchersTestCase'
@ -51,4 +43,4 @@ namingConventions {
javadoc.enabled = false javadoc.enabled = false
loggerUsageCheck.enabled = false loggerUsageCheck.enabled = false
jarHell.enabled=false jarHell.enabled = false

View File

@ -38,6 +38,8 @@ import java.util.TreeMap;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import org.elasticsearch.tools.java_version_checker.JavaVersion;
/** /**
* Parses JVM options from a file and prints a single line with all JVM options to standard output. * Parses JVM options from a file and prints a single line with all JVM options to standard output.
*/ */

View File

@ -19,6 +19,8 @@
package org.elasticsearch.tools.launchers; package org.elasticsearch.tools.launchers;
import org.elasticsearch.tools.java_version_checker.SuppressForbidden;
/** /**
* Utility methods for launchers. * Utility methods for launchers.
*/ */

View File

@ -140,5 +140,7 @@ include::snapshot/verify_repository.asciidoc[]
The Java High Level REST Client supports the following Tasks APIs: The Java High Level REST Client supports the following Tasks APIs:
* <<java-rest-high-tasks-list>> * <<java-rest-high-tasks-list>>
* <<java-rest-high-cluster-cancel-tasks>>
include::tasks/list_tasks.asciidoc[] include::tasks/list_tasks.asciidoc[]
include::tasks/cancel_tasks.asciidoc[]

View File

@ -0,0 +1,82 @@
[[java-rest-high-cluster-cancel-tasks]]
=== Cancel Tasks API
The Cancel Tasks API allows cancellation of a currently running task.
==== Cancel Tasks Request
A `CancelTasksRequest`:
["source","java",subs="attributes,callouts,macros"]
--------------------------------------------------
include-tagged::{doc-tests}/TasksClientDocumentationIT.java[cancel-tasks-request]
--------------------------------------------------
There are no required parameters. The task cancellation command supports the same
task selection parameters as the list tasks command.
==== Parameters
["source","java",subs="attributes,callouts,macros"]
--------------------------------------------------
include-tagged::{doc-tests}/TasksClientDocumentationIT.java[list-tasks-request-filter]
--------------------------------------------------
<1> Cancel a task
<2> Cancel only cluster-related tasks
<3> Cancel all tasks running on nodes nodeId1 and nodeId2
==== Synchronous Execution
["source","java",subs="attributes,callouts,macros"]
--------------------------------------------------
include-tagged::{doc-tests}/TasksClientDocumentationIT.java[list-tasks-execute]
--------------------------------------------------
==== Asynchronous Execution
The asynchronous execution requires `CancelTasksRequest` instance and an
`ActionListener` instance to be passed to the asynchronous method:
["source","java",subs="attributes,callouts,macros"]
--------------------------------------------------
include-tagged::{doc-tests}/TasksClientDocumentationIT.java[cancel-tasks-execute-async]
--------------------------------------------------
<1> The `CancelTasksRequest` 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 `CancelTasksResponse` looks like:
["source","java",subs="attributes,callouts,macros"]
--------------------------------------------------
include-tagged::{doc-tests}/TasksClientDocumentationIT.java[cancel-tasks-execute-listener]
--------------------------------------------------
<1> Called when the execution is successfully completed. The response is
provided as an argument
<2> Called in case of a failure. The raised exception is provided as an argument
==== Cancel Tasks Response
["source","java",subs="attributes,callouts,macros"]
--------------------------------------------------
include-tagged::{doc-tests}/TasksClientDocumentationIT.java[list-tasks-response-tasks]
--------------------------------------------------
<1> List of cancelled tasks
["source","java",subs="attributes,callouts,macros"]
--------------------------------------------------
include-tagged::{doc-tests}/TasksClientDocumentationIT.java[list-tasks-response-calc]
--------------------------------------------------
<1> List of cancelled tasks grouped by a node
<2> List of cancelled tasks grouped by a parent task
["source","java",subs="attributes,callouts,macros"]
--------------------------------------------------
include-tagged::{doc-tests}/TasksClientDocumentationIT.java[list-tasks-response-failures]
--------------------------------------------------
<1> List of node failures
<2> List of task cancellation failures

View File

@ -4,8 +4,11 @@
A cast converts the value of an original type to the equivalent value of a A cast converts the value of an original type to the equivalent value of a
target type. An implicit cast infers the target type and automatically occurs target type. An implicit cast infers the target type and automatically occurs
during certain <<painless-operators, operations>>. An explicit cast specifies during certain <<painless-operators, operations>>. An explicit cast specifies
the target type and forcefully occurs as its own operation. Use the *cast the target type and forcefully occurs as its own operation. Use the `cast
operator* to specify an explicit cast. operator '()'` to specify an explicit cast.
Refer to the <<allowed-casts, cast table>> for a quick reference on all
allowed casts.
*Errors* *Errors*
@ -13,6 +16,7 @@ operator* to specify an explicit cast.
* If an implicit cast is given, but an explicit cast is required. * If an implicit cast is given, but an explicit cast is required.
*Grammar* *Grammar*
[source,ANTLR4] [source,ANTLR4]
---- ----
cast: '(' TYPE ')' expression cast: '(' TYPE ')' expression
@ -31,15 +35,15 @@ cast: '(' TYPE ')' expression
+ +
<1> declare `int i`; <1> declare `int i`;
explicit cast `long 5` to `int 5` -> `int 5`; explicit cast `long 5` to `int 5` -> `int 5`;
assign `int 5` to `i` store `int 5` to `i`
<2> declare `Map m`; <2> declare `Map m`;
allocate `HashMap` instance -> `HashMap reference`; allocate `HashMap` instance -> `HashMap reference`;
implicit cast `HashMap reference` to `Map reference` -> `Map reference`; implicit cast `HashMap reference` to `Map reference` -> `Map reference`;
assign `Map reference` to `m` store `Map reference` to `m`
<3> declare `HashMap hm`; <3> declare `HashMap hm`;
access `m` -> `Map reference`; load from `m` -> `Map reference`;
explicit cast `Map reference` to `HashMap reference` -> `HashMap reference`; explicit cast `Map reference` to `HashMap reference` -> `HashMap reference`;
assign `HashMap reference` to `hm` store `HashMap reference` to `hm`
[[numeric-type-casting]] [[numeric-type-casting]]
==== Numeric Type Casting ==== Numeric Type Casting
@ -78,19 +82,19 @@ following table:
---- ----
+ +
<1> declare `int a`; <1> declare `int a`;
assign `int 1` to `a` store `int 1` to `a`
<2> declare `long b`; <2> declare `long b`;
access `a` -> `int 1`; load from `a` -> `int 1`;
implicit cast `int 1` to `long 1` -> `long 1`; implicit cast `int 1` to `long 1` -> `long 1`;
assign `long 1` to `b` store `long 1` to `b`
<3> declare `short c`; <3> declare `short c`;
access `b` -> `long 1`; load from `b` -> `long 1`;
explicit cast `long 1` to `short 1` -> `short 1`; explicit cast `long 1` to `short 1` -> `short 1`;
assign `short 1` value to `c` store `short 1` value to `c`
<4> declare `double e`; <4> declare `double e`;
access `a` -> `int 1`; load from `a` -> `int 1`;
explicit cast `int 1` to `double 1.0`; explicit cast `int 1` to `double 1.0`;
assign `double 1.0` to `e`; store `double 1.0` to `e`;
(note the explicit cast is extraneous since an implicit cast is valid) (note the explicit cast is extraneous since an implicit cast is valid)
+ +
* Invalid numeric type casts resulting in errors. * Invalid numeric type casts resulting in errors.
@ -106,9 +110,9 @@ following table:
*error* -> cannot implicit cast `double 1.0` to `int 1`; *error* -> cannot implicit cast `double 1.0` to `int 1`;
(note an explicit cast is valid) (note an explicit cast is valid)
<2> declare `int b`; <2> declare `int b`;
assign `int 2` to `b` store `int 2` to `b`
<3> declare byte `c`; <3> declare byte `c`;
access `b` -> `int 2`; load from `b` -> `int 2`;
*error* -> cannot implicit cast `int 2` to `byte 2`; *error* -> cannot implicit cast `int 2` to `byte 2`;
(note an explicit cast is valid) (note an explicit cast is valid)
@ -136,21 +140,21 @@ or the target type is a descendant of the original type.
---- ----
+ +
<1> declare `List x`; <1> declare `List x`;
assign default value `null` to `x` store default value `null` to `x`
<2> declare `ArrayList y`; <2> declare `ArrayList y`;
allocate `ArrayList` instance -> `ArrayList reference`; allocate `ArrayList` instance -> `ArrayList reference`;
assign `ArrayList reference` to `y`; store `ArrayList reference` to `y`;
<3> access `y` -> `ArrayList reference`; <3> load from `y` -> `ArrayList reference`;
implicit cast `ArrayList reference` to `List reference` -> `List reference`; implicit cast `ArrayList reference` to `List reference` -> `List reference`;
assign `List reference` to `x`; store `List reference` to `x`;
(note `ArrayList` is a descendant of `List`) (note `ArrayList` is a descendant of `List`)
<4> access `x` -> `List reference`; <4> load from `x` -> `List reference`;
explicit cast `List reference` to `ArrayList reference` explicit cast `List reference` to `ArrayList reference`
-> `ArrayList reference`; -> `ArrayList reference`;
assign `ArrayList reference` to `y`; store `ArrayList reference` to `y`;
<5> access `y` -> `ArrayList reference`; <5> load from `y` -> `ArrayList reference`;
explicit cast `ArrayList reference` to `List reference` -> `List reference`; explicit cast `ArrayList reference` to `List reference` -> `List reference`;
assign `List reference` to `x`; store `List reference` to `x`;
(note the explicit cast is extraneous, and an implicit cast is valid) (note the explicit cast is extraneous, and an implicit cast is valid)
+ +
* Invalid reference type casts resulting in errors. * Invalid reference type casts resulting in errors.
@ -165,16 +169,16 @@ or the target type is a descendant of the original type.
<1> declare `List x`; <1> declare `List x`;
allocate `ArrayList` instance -> `ArrayList reference`; allocate `ArrayList` instance -> `ArrayList reference`;
implicit cast `ArrayList reference` to `List reference` -> `List reference`; implicit cast `ArrayList reference` to `List reference` -> `List reference`;
assign `List reference` to `x` store `List reference` to `x`
<2> declare `ArrayList y`; <2> declare `ArrayList y`;
access `x` -> `List reference`; load from `x` -> `List reference`;
*error* -> cannot implicit cast `List reference` to `ArrayList reference`; *error* -> cannot implicit cast `List reference` to `ArrayList reference`;
(note an explicit cast is valid since `ArrayList` is a descendant of `List`) (note an explicit cast is valid since `ArrayList` is a descendant of `List`)
<3> declare `ArrayList y`; <3> declare `ArrayList y`;
access `x` -> `List reference`; load from `x` -> `List reference`;
*error* -> cannot explicit cast `List reference` to `Map reference`; *error* -> cannot explicit cast `List reference` to `Map reference`;
(note no cast would be valid since neither `List` nor `Map` is a descendant (note no cast is valid since neither `List` nor `Map` is a descendant of the
of the other) other)
[[dynamic-type-casting]] [[dynamic-type-casting]]
==== Dynamic Type Casting ==== Dynamic Type Casting
@ -206,24 +210,24 @@ based on the current type value the `def` type value represents.
+ +
<1> declare `def d0`; <1> declare `def d0`;
implicit cast `int 3` to `def`; implicit cast `int 3` to `def`;
assign `int 3` to `d0` store `int 3` to `d0`
<2> allocate `ArrayList` instance -> `ArrayList reference`; <2> allocate `ArrayList` instance -> `ArrayList reference`;
implicit cast `ArrayList reference` to `def` -> `def`; implicit cast `ArrayList reference` to `def` -> `def`;
assign `def` to `d0` store `def` to `d0`
<3> declare `Object o`; <3> declare `Object o`;
allocate `HashMap` instance -> `HashMap reference`; allocate `HashMap` instance -> `HashMap reference`;
implicit cast `HashMap reference` to `Object reference` implicit cast `HashMap reference` to `Object reference`
-> `Object reference`; -> `Object reference`;
assign `Object reference` to `o` store `Object reference` to `o`
<4> declare `def d1`; <4> declare `def d1`;
access `o` -> `Object reference`; load from `o` -> `Object reference`;
implicit cast `Object reference` to `def` -> `def`; implicit cast `Object reference` to `def` -> `def`;
assign `def` to `d1` store `def` to `d1`
<5> declare `int i`; <5> declare `int i`;
access `d1` -> `def`; load from `d1` -> `def`;
implicit cast `def` to `HashMap reference` -> HashMap reference`; implicit cast `def` to `HashMap reference` -> HashMap reference`;
call `size` on `HashMap reference` -> `int 0`; call `size` on `HashMap reference` -> `int 0`;
assign `int 0` to `i`; store `int 0` to `i`;
(note `def` was implicit cast to `HashMap reference` since `HashMap` is the (note `def` was implicit cast to `HashMap reference` since `HashMap` is the
child-most descendant type value that the `def` type value child-most descendant type value that the `def` type value
represents) represents)
@ -242,29 +246,29 @@ based on the current type value the `def` type value represents.
+ +
<1> declare `def d`; <1> declare `def d`;
implicit cast `double 1.0` to `def` -> `def`; implicit cast `double 1.0` to `def` -> `def`;
assign `def` to `d` store `def` to `d`
<2> declare `int i`; <2> declare `int i`;
access `d` -> `def`; load from `d` -> `def`;
implicit cast `def` to `double 1.0` -> `double 1.0`; implicit cast `def` to `double 1.0` -> `double 1.0`;
explicit cast `double 1.0` to `int 1` -> `int 1`; explicit cast `double 1.0` to `int 1` -> `int 1`;
assign `int 1` to `i`; store `int 1` to `i`;
(note the explicit cast is necessary since a `double` value cannot be (note the explicit cast is necessary since a `double` type value is not
converted to an `int` value implicitly) converted to an `int` type value implicitly)
<3> assign `int 1` to `d`; <3> store `int 1` to `d`;
(note the switch in the type `d` represents from `double` to `int`) (note the switch in the type `d` represents from `double` to `int`)
<4> declare `float i`; <4> declare `float i`;
access `d` -> `def`; load from `d` -> `def`;
implicit cast `def` to `int 1` -> `int 1`; implicit cast `def` to `int 1` -> `int 1`;
implicit cast `int 1` to `float 1.0` -> `float 1.0`; implicit cast `int 1` to `float 1.0` -> `float 1.0`;
assign `float 1.0` to `f` store `float 1.0` to `f`
<5> allocate `ArrayList` instance -> `ArrayList reference`; <5> allocate `ArrayList` instance -> `ArrayList reference`;
assign `ArrayList reference` to `d`; store `ArrayList reference` to `d`;
(note the switch in the type `d` represents from `int` to `ArrayList`) (note the switch in the type `d` represents from `int` to `ArrayList`)
<6> declare `List l`; <6> declare `List l`;
access `d` -> `def`; load from `d` -> `def`;
implicit cast `def` to `ArrayList reference` -> `ArrayList reference`; implicit cast `def` to `ArrayList reference` -> `ArrayList reference`;
implicit cast `ArrayList reference` to `List reference` -> `List reference`; implicit cast `ArrayList reference` to `List reference` -> `List reference`;
assign `List reference` to `l` store `List reference` to `l`
+ +
* Invalid dynamic type casts resulting in errors. * Invalid dynamic type casts resulting in errors.
+ +
@ -277,26 +281,26 @@ based on the current type value the `def` type value represents.
---- ----
<1> declare `def d`; <1> declare `def d`;
implicit cast `int 1` to `def` -> `def`; implicit cast `int 1` to `def` -> `def`;
assign `def` to `d` store `def` to `d`
<2> declare `short s`; <2> declare `short s`;
access `d` -> `def`; load from `d` -> `def`;
implicit cast `def` to `int 1` -> `int 1`; implicit cast `def` to `int 1` -> `int 1`;
*error* -> cannot implicit cast `int 1` to `short 1`; *error* -> cannot implicit cast `int 1` to `short 1`;
(note an explicit cast is valid) (note an explicit cast is valid)
<3> allocate `HashMap` instance -> `HashMap reference`; <3> allocate `HashMap` instance -> `HashMap reference`;
implicit cast `HashMap reference` to `def` -> `def`; implicit cast `HashMap reference` to `def` -> `def`;
assign `def` to `d` store `def` to `d`
<4> declare `List l`; <4> declare `List l`;
access `d` -> `def`; load from `d` -> `def`;
implicit cast `def` to `HashMap reference`; implicit cast `def` to `HashMap reference`;
*error* -> cannot implicit cast `HashMap reference` to `List reference`; *error* -> cannot implicit cast `HashMap reference` to `List reference`;
(note no cast would be valid since neither `HashMap` nor `List` is a (note no cast is valid since neither `HashMap` nor `List` is a descendant of
descendant of the other) the other)
[[string-character-casting]] [[string-character-casting]]
==== String to Character Casting ==== String to Character Casting
Use the *cast operator* to convert a <<string-type, `String` type>> value into a Use the cast operator to convert a <<string-type, `String` type>> value into a
<<primitive-types, `char` type>> value. <<primitive-types, `char` type>> value.
*Errors* *Errors*
@ -310,17 +314,17 @@ Use the *cast operator* to convert a <<string-type, `String` type>> value into a
+ +
[source,Painless] [source,Painless]
---- ----
<1> char c = (char)"C" <1> char c = (char)"C";
<2> c = (char)'c' <2> c = (char)'c';
---- ----
+ +
<1> declare `char c`; <1> declare `char c`;
explicit cast `String "C"` to `char C` -> `char C`; explicit cast `String "C"` to `char C` -> `char C`;
assign `char C` to `c` store `char C` to `c`
<2> explicit cast `String 'c'` to `char c` -> `char c`; <2> explicit cast `String 'c'` to `char c` -> `char c`;
assign `char c` to `c` store `char c` to `c`
+ +
* Casting a `String` reference into a `char` value. * Casting a `String` reference into a `char` type value.
+ +
[source,Painless] [source,Painless]
---- ----
@ -328,11 +332,11 @@ Use the *cast operator* to convert a <<string-type, `String` type>> value into a
<2> char c = (char)s; <2> char c = (char)s;
---- ----
<1> declare `String s`; <1> declare `String s`;
assign `String "s"` to `s`; store `String "s"` to `s`;
<2> declare `char c` <2> declare `char c`
access `s` -> `String "s"`; load from `s` -> `String "s"`;
explicit cast `String "s"` to `char s` -> `char s`; explicit cast `String "s"` to `char s` -> `char s`;
assign `char s` to `c` store `char s` to `c`
[[boxing-unboxing]] [[boxing-unboxing]]
==== Boxing and Unboxing ==== Boxing and Unboxing
@ -343,12 +347,12 @@ reference type to its corresponding primitive type.
Implicit boxing/unboxing occurs during the following operations: Implicit boxing/unboxing occurs during the following operations:
* Conversions between a `def` type and a primitive type will be implicitly * Conversions between a `def` type and a primitive type are implicitly
boxed/unboxed as necessary, though this is referred to as an implicit cast boxed/unboxed as necessary, though this is referred to as an implicit cast
throughout the documentation. throughout the documentation.
* Method/function call arguments will be implicitly boxed/unboxed as necessary. * Method/function call arguments are implicitly boxed/unboxed as necessary.
* A primitive type value will be implicitly boxed when a reference type method * A primitive type value is implicitly boxed when a reference type method
call is invoked on it. is called on it.
Explicit boxing/unboxing is not allowed. Use the reference type API to Explicit boxing/unboxing is not allowed. Use the reference type API to
explicitly convert a primitive type value to its respective reference type explicitly convert a primitive type value to its respective reference type
@ -372,22 +376,22 @@ value and vice versa.
+ +
<1> declare `List l`; <1> declare `List l`;
allocate `ArrayList` instance -> `ArrayList reference`; allocate `ArrayList` instance -> `ArrayList reference`;
assign `ArrayList reference` to `l`; store `ArrayList reference` to `l`;
<2> access `l` -> `List reference`; <2> load from `l` -> `List reference`;
implicit cast `int 1` to `def` -> `def`; implicit cast `int 1` to `def` -> `def`;
call `add` on `List reference` with arguments (`def`); call `add` on `List reference` with arguments (`def`);
(note internally `int 1` is boxed to `Integer 1` to store as a `def` type (note internally `int 1` is boxed to `Integer 1` to store as a `def` type
value) value)
<3> declare `Integer I`; <3> declare `Integer I`;
call `valueOf` on `Integer` with arguments of (`int 0`) -> `Integer 0`; call `valueOf` on `Integer` with arguments of (`int 0`) -> `Integer 0`;
assign `Integer 0` to `I`; store `Integer 0` to `I`;
<4> declare `int i`; <4> declare `int i`;
access `I` -> `Integer 0`; load from `I` -> `Integer 0`;
unbox `Integer 0` -> `int 0`; unbox `Integer 0` -> `int 0`;
access `l` -> `List reference`; load from `l` -> `List reference`;
call `get` on `List reference` with arguments (`int 0`) -> `def`; call `get` on `List reference` with arguments (`int 0`) -> `def`;
implicit cast `def` to `int 1` -> `int 1`; implicit cast `def` to `int 1` -> `int 1`;
assign `int 1` to `i`; store `int 1` to `i`;
(note internally `int 1` is unboxed from `Integer 1` when loaded from a (note internally `int 1` is unboxed from `Integer 1` when loaded from a
`def` type value) `def` type value)
+ +
@ -419,8 +423,8 @@ Promotion is when a single value is implicitly cast to a certain type or
multiple values are implicitly cast to the same type as required for evaluation multiple values are implicitly cast to the same type as required for evaluation
by certain operations. Each operation that requires promotion has a promotion by certain operations. Each operation that requires promotion has a promotion
table that shows all required implicit casts based on the type(s) of value(s). A table that shows all required implicit casts based on the type(s) of value(s). A
value can be promoted to a `def` type at compile-time; however, the promoted value promoted to a `def` type at compile-time is promoted again at run-time
type value is derived from what the `def` type value represents at run-time. based on the type the `def` value represents.
*Errors* *Errors*
@ -438,19 +442,83 @@ type value is derived from what the `def` type value represents at run-time.
<3> float f = x + 2.0F; <3> float f = x + 2.0F;
---- ----
<1> declare `double d`; <1> declare `double d`;
promote `int 2` and `double 2.0 @0` -> `double 2.0 @0`; promote `int 2` and `double 2.0 @0`: result `double`;
implicit cast `int 2` to `double 2.0 @1` -> `double 2.0 @1`; implicit cast `int 2` to `double 2.0 @1` -> `double 2.0 @1`;
add `double 2.0 @1` and `double 2.0 @0` -> `double 4.0`; add `double 2.0 @1` and `double 2.0 @0` -> `double 4.0`;
assign `double 4.0` to `d` store `double 4.0` to `d`
<2> declare `def x`; <2> declare `def x`;
implicit cast `int 1` to `def` -> `def`; implicit cast `int 1` to `def` -> `def`;
assign `def` to `x`; store `def` to `x`;
<3> declare `float f`; <3> declare `float f`;
access `x` -> `def`; load from `x` -> `def`;
implicit cast `def` to `int 1` -> `int 1`; implicit cast `def` to `int 1` -> `int 1`;
promote `int 1` and `float 2.0` -> `float 2.0`; promote `int 1` and `float 2.0`: result `float`;
implicit cast `int 1` to `float 1.0` -> `float `1.0`; implicit cast `int 1` to `float 1.0` -> `float `1.0`;
add `float 1.0` and `float 2.0` -> `float 3.0`; add `float 1.0` and `float 2.0` -> `float 3.0`;
assign `float 3.0` to `f`; store `float 3.0` to `f`;
(note this example illustrates promotion done at run-time as promotion (note this example illustrates promotion done at run-time as promotion
done at compile-time would have resolved to a `def` type value) done at compile-time would have resolved to a `def` type value)
[[allowed-casts]]
==== Allowed Casts
The following tables show all allowed casts. Read the tables row by row, where
the original type is shown in the first column, and each subsequent column
indicates whether a cast to the specified target type is implicit (I), explicit
(E), or is not allowed (-).
*Primitive/Reference Types*
[cols="<3,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1"]
|====
| | o | b | s | c | i | j | f | d | O | B | S | C | I | L | F | D | T | R | def
| boolean ( o ) | | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | I
| byte ( b ) | - | | I | I | I | I | I | I | - | - | - | - | - | - | - | - | - | - | I
| short ( s ) | - | E | | E | I | I | I | I | - | - | - | - | - | - | - | - | - | - | I
| char ( c ) | - | E | E | | I | I | I | I | - | - | - | - | - | - | - | - | E | - | I
| int ( i ) | - | E | E | E | | I | I | I | - | - | - | - | - | - | - | - | - | - | I
| long ( j ) | - | E | E | E | E | | I | I | - | - | - | - | - | - | - | - | - | - | I
| float ( f ) | - | E | E | E | E | E | | I | - | - | - | - | - | - | - | - | - | - | I
| double ( d ) | - | E | E | E | E | E | E | | - | - | - | - | - | - | - | - | - | - | I
| Boolean ( O ) | - | - | - | - | - | - | - | - | - | - | - | | - | - | - | - | - | - | I
| Byte ( B ) | - | - | - | - | - | - | - | - | - | | - | - | - | - | - | - | - | - | I
| Short ( S ) | - | - | - | - | - | - | - | - | - | - | | - | - | - | - | - | - | - | I
| Character ( C ) | - | - | - | - | - | - | - | - | - | - | - | | - | - | - | - | - | - | I
| Integer ( I ) | - | - | - | - | - | - | - | - | - | - | - | - | | - | - | - | - | - | I
| Long ( L ) | - | - | - | - | - | - | - | - | - | - | - | - | - | | - | - | - | - | I
| Float ( F ) | - | - | - | - | - | - | - | - | - | - | - | - | - | - | | - | - | - | I
| Double ( D ) | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | | - | - | I
| String ( T ) | - | - | - | E | - | - | - | - | - | - | - | - | - | - | - | - | | - | I
| Reference ( R ) | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | @ | I
|====
@ See <<reference-type-casting, reference type casting>> for allowed reference
type casts.
*`def` Type*
[cols="<3,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1"]
|====
| | o | b | s | c | i | j | f | d | O | B | S | C | I | L | F | D | T | R | def
| def as boolean | I | - | - | - | - | - | - | - | I | - | - | - | - | - | - | - | - | - |
| def as byte | - | I | I | I | I | I | I | I | - | I | I | I | I | I | I | I | - | - |
| def as short | - | E | I | E | I | I | I | I | - | E | I | E | I | I | I | I | - | - |
| def as char | - | E | E | I | I | I | I | I | - | E | E | I | I | I | I | I | E | - |
| def as int | - | E | E | E | I | I | I | I | - | E | E | E | I | I | I | I | - | - |
| def as long | - | E | E | E | E | I | I | I | - | E | E | E | E | I | I | I | - | - |
| def as float | - | E | E | E | E | E | I | I | - | E | E | E | E | E | I | I | - | - |
| def as double | - | E | E | E | E | E | E | I | - | E | E | E | E | E | E | I | - | - |
| def as Boolean | I | - | - | - | - | - | - | - | I | - | - | - | | - | - | - | - | - |
| def as Byte | - | I | I | I | I | I | I | I | - | I | I | I | I | I | I | I | - | - |
| def as Short | - | E | I | E | I | I | I | I | - | E | I | E | I | I | I | I | - | - |
| def as Character | - | E | E | I | I | I | I | I | - | E | E | I | I | I | I | I | - | - |
| def as Integer | - | E | E | E | I | I | I | I | - | E | E | E | I | I | I | I | - | - |
| def as Long | - | E | E | E | E | I | I | I | - | E | E | E | E | I | I | I | - | - |
| def as Float | - | E | E | E | E | E | I | I | - | E | E | E | E | E | I | I | - | - |
| def as Double | - | E | E | E | E | E | E | I | - | E | E | E | E | E | E | I | - | - |
| def as String | - | - | - | E | - | - | - | - | - | - | - | - | - | - | - | - | I | - |
| def as Reference | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | @ |
|====
@ See <<reference-type-casting, reference type casting>> for allowed reference
type casts.

View File

@ -6,9 +6,10 @@ anywhere on a line to specify a single-line comment. All characters from the
`//` token to the end of the line are ignored. Use an opening `/*` token and a `//` token to the end of the line are ignored. Use an opening `/*` token and a
closing `*/` token to specify a multi-line comment. Multi-line comments can closing `*/` token to specify a multi-line comment. Multi-line comments can
start anywhere on a line, and all characters in between the `/*` token and `*/` start anywhere on a line, and all characters in between the `/*` token and `*/`
token are ignored. Comments can be included anywhere within a script. token are ignored. A comment is included anywhere within a script.
*Grammar* *Grammar*
[source,ANTLR4] [source,ANTLR4]
---- ----
SINGLE_LINE_COMMENT: '//' .*? [\n\r]; SINGLE_LINE_COMMENT: '//' .*? [\n\r];

View File

@ -0,0 +1,24 @@
[[painless-functions]]
=== Functions
A function is a named piece of code comprised of one-to-many statements to
perform a specific task. A function is called multiple times in a single script
to repeat its specific task. A parameter is a named type value available as a
<<painless-variables, variable>> within the statement(s) of a function. A
function specifies zero-to-many parameters, and when a function is called a
value is specified per parameter. An argument is a value passed into a function
at the point of call. A function specifies a return type value, though if the
type is <<void-type, void>> then no value is returned. Any non-void type return
value is available for use within an <<painless-operators, operation>> or is
discarded otherwise.
You can declare functions at the beginning of a Painless script, for example:
[source,painless]
---------------------------------------------------------
boolean isNegative(def x) { x < 0 }
...
if (isNegative(someVar)) {
...
}
---------------------------------------------------------

View File

@ -1,81 +0,0 @@
[[painless-general-syntax]]
=== General Syntax
[[control-flow]]
==== Control flow
Painless supports all of Java's https://docs.oracle.com/javase/tutorial/java/nutsandbolts/flow.html[
control flow statements] except the `switch` statement.
Painless also supports the `for in` syntax from Groovy:
[source,painless]
---------------------------------------------------------
for (item : list) {
...
}
---------------------------------------------------------
[[functions]]
==== Functions
You can declare functions at the beginning of a Painless script, for example:
[source,painless]
---------------------------------------------------------
boolean isNegative(def x) { x < 0 }
...
if (isNegative(someVar)) {
...
}
---------------------------------------------------------
[[lambda-expressions]]
==== Lambda expressions
Lambda expressions and method references work the same as in https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html[Java].
[source,painless]
---------------------------------------------------------
list.removeIf(item -> item == 2);
list.removeIf((int item) -> item == 2);
list.removeIf((int item) -> { item == 2 });
list.sort((x, y) -> x - y);
list.sort(Integer::compare);
---------------------------------------------------------
You can make method references to functions within the script with `this`,
for example `list.sort(this::mycompare)`.
[[patterns]]
==== Patterns
Regular expression constants are directly supported. To ensure fast performance,
this is the only mechanism for creating patterns. Regular expressions
are always constants and compiled efficiently a single time.
[source,painless]
---------------------------------------------------------
Pattern p = /[aeiou]/
---------------------------------------------------------
[[pattern-flags]]
===== Pattern flags
You can define flags on patterns in Painless by adding characters after the
trailing `/` like `/foo/i` or `/foo \w #comment/iUx`. Painless exposes all of
the flags from Java's
https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html[
Pattern class] using these characters:
[cols="<,<,<",options="header",]
|=======================================================================
| Character | Java Constant | Example
|`c` | CANON_EQ | `'å' ==~ /å/c` (open in hex editor to see)
|`i` | CASE_INSENSITIVE | `'A' ==~ /a/i`
|`l` | LITERAL | `'[a]' ==~ /[a]/l`
|`m` | MULTILINE | `'a\nb\nc' =~ /^b$/m`
|`s` | DOTALL (aka single line) | `'a\nb\nc' =~ /.b./s`
|`U` | UNICODE_CHARACTER_CLASS | `'Ɛ' ==~ /\\w/U`
|`u` | UNICODE_CASE | `'Ɛ' ==~ /ɛ/iu`
|`x` | COMMENTS (aka extended) | `'a' ==~ /a #comment/x`
|=======================================================================

View File

@ -3,8 +3,12 @@
Use an identifier as a named token to specify a Use an identifier as a named token to specify a
<<painless-variables, variable>>, <<painless-types, type>>, <<painless-variables, variable>>, <<painless-types, type>>,
<<dot-operator, field>>, <<dot-operator, method>>, or function. <<field-access-operator, field>>, <<method-call-operator, method>>, or
<<painless-keywords, Keywords>> cannot be used as identifiers. <<painless-functions, function>>.
*Errors*
If a <<painless-keywords, keyword>> is used as an identifier.
*Grammar* *Grammar*
[source,ANTLR4] [source,ANTLR4]

View File

@ -1,9 +1,13 @@
[[painless-keywords]] [[painless-keywords]]
=== Keywords === Keywords
Keywords are reserved tokens for built-in language features and cannot be used Keywords are reserved tokens for built-in language features.
as <<painless-identifiers, identifiers>> within a script. The following are
keywords: *Errors*
If a keyword is used as an <<painless-identifiers, identifier>>.
*Keywords*
[cols="^1,^1,^1,^1,^1"] [cols="^1,^1,^1,^1,^1"]
|==== |====

View File

@ -0,0 +1,15 @@
[[painless-lambdas]]
=== Lambdas
Lambda expressions and method references work the same as in https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html[Java].
[source,painless]
---------------------------------------------------------
list.removeIf(item -> item == 2);
list.removeIf((int item) -> item == 2);
list.removeIf((int item) -> { item == 2 });
list.sort((x, y) -> x - y);
list.sort(Integer::compare);
---------------------------------------------------------
You can make method references to functions within the script with `this`,
for example `list.sort(this::mycompare)`.

View File

@ -33,4 +33,22 @@ include::painless-casting.asciidoc[]
include::painless-operators.asciidoc[] include::painless-operators.asciidoc[]
include::painless-general-syntax.asciidoc[] include::painless-operators-general.asciidoc[]
include::painless-operators-numeric.asciidoc[]
include::painless-operators-boolean.asciidoc[]
include::painless-operators-reference.asciidoc[]
include::painless-operators-array.asciidoc[]
include::painless-statements.asciidoc[]
include::painless-scripts.asciidoc[]
include::painless-functions.asciidoc[]
include::painless-lambdas.asciidoc[]
include::painless-regexes.asciidoc[]

View File

@ -4,7 +4,7 @@
Use a literal to specify a value directly in an Use a literal to specify a value directly in an
<<painless-operators, operation>>. <<painless-operators, operation>>.
[[integers]] [[integer-literals]]
==== Integers ==== Integers
Use an integer literal to specify an integer type value in decimal, octal, or Use an integer literal to specify an integer type value in decimal, octal, or
@ -16,6 +16,7 @@ to specify an integer literal as octal, and use `0x` or `0X` as a prefix to
specify an integer literal as hex. specify an integer literal as hex.
*Grammar* *Grammar*
[source,ANTLR4] [source,ANTLR4]
---- ----
INTEGER: '-'? ( '0' | [1-9] [0-9]* ) [lLfFdD]?; INTEGER: '-'? ( '0' | [1-9] [0-9]* ) [lLfFdD]?;
@ -44,7 +45,7 @@ HEX: '-'? '0' [xX] [0-9a-fA-F]+ [lL]?;
<5> `int -18` in octal <5> `int -18` in octal
<6> `int 3882` in hex <6> `int 3882` in hex
[[floats]] [[float-literals]]
==== Floats ==== Floats
Use a floating point literal to specify a floating point type value of a Use a floating point literal to specify a floating point type value of a
@ -53,6 +54,7 @@ single letter designations to specify the primitive type: `f` or `F` for `float`
and `d` or `D` for `double`. If not specified, the type defaults to `double`. and `d` or `D` for `double`. If not specified, the type defaults to `double`.
*Grammar* *Grammar*
[source,ANTLR4] [source,ANTLR4]
---- ----
DECIMAL: '-'? ( '0' | [1-9] [0-9]* ) (DOT [0-9]+)? EXPONENT? [fFdD]?; DECIMAL: '-'? ( '0' | [1-9] [0-9]* ) (DOT [0-9]+)? EXPONENT? [fFdD]?;
@ -78,7 +80,7 @@ EXPONENT: ( [eE] [+\-]? [0-9]+ );
<4> `double -126.34` <4> `double -126.34`
<5> `float 89.9` <5> `float 89.9`
[[strings]] [[string-literals]]
==== Strings ==== Strings
Use a string literal to specify a <<string-type, `String` type>> value with Use a string literal to specify a <<string-type, `String` type>> value with
@ -88,6 +90,7 @@ include a single-quote as part of a single-quoted string literal. Use a `\\`
token to include a backslash as part of any string literal. token to include a backslash as part of any string literal.
*Grammar* *Grammar*
[source,ANTLR4] [source,ANTLR4]
---- ----
STRING: ( '"' ( '\\"' | '\\\\' | ~[\\"] )*? '"' ) STRING: ( '"' ( '\\"' | '\\\\' | ~[\\"] )*? '"' )
@ -114,9 +117,9 @@ STRING: ( '"' ( '\\"' | '\\\\' | ~[\\"] )*? '"' )
"double-quoted with non-escaped 'single-quotes'" "double-quoted with non-escaped 'single-quotes'"
---- ----
[[characters]] [[character-literals]]
==== Characters ==== Characters
A character literal cannot be specified directly. Instead, use the Character literals are not specified directly. Instead, use the
<<string-character-casting, cast operator>> to convert a `String` type value <<string-character-casting, cast operator>> to convert a `String` type value
into a `char` type value. into a `char` type value.

View File

@ -0,0 +1,294 @@
[[painless-operators-array]]
=== Operators: Array
[[array-initialization-operator]]
==== Array Initialization
Use the `array initialization operator '[] {}'` to allocate a single-dimensional
<<array-type, array type>> instance to the heap with a set of pre-defined
elements. Each value used to initialize an element in the array type instance is
cast to the specified element type value upon insertion. The order of specified
values is maintained.
*Errors*
* If a value is not castable to the specified type value.
*Grammar*
[source,ANTLR4]
----
array_initialization: 'new' TYPE '[' ']' '{' expression_list '}'
| 'new' TYPE '[' ']' '{' '}';
expression_list: expression (',' expression);
----
*Example:*
* Array initialization with static values.
+
[source,Painless]
----
<1> int[] x = new int[] {1, 2, 3};
----
+
<1> declare `int[] x`;
allocate `1-d int array` instance with `length [3]`
-> `1-d int array reference`;
store `int 1` to `index [0]` of `1-d int array reference`;
store `int 2` to `index [1]` of `1-d int array reference`;
store `int 3` to `index [2]` of `1-d int array reference`;
store `1-d int array reference` to `x`;
+
* Array initialization with non-static values.
+
[source,Painless]
----
<1> int i = 1;
<2> long l = 2L;
<3> float f = 3.0F;
<4> double d = 4.0;
<5> String s = "5";
<6> def array = new def[] {i, l, f*d, s};
----
+
<1> declare `int i`;
store `int 1` to `i`
<2> declare `long l`;
store `long 2` to `l`
<3> declare `float f`;
store `float 3.0` to `f`
<4> declare `double d`;
store `double 4.0` to `d`
<5> declare `String s`;
store `String "5"` to `s`
<6> declare `def array`;
allocate `1-d def array` instance with `length [4]`
-> `1-d def array reference`;
load from `i` -> `int 1`;
implicit cast `int 1` to `def` -> `def`;
store `def` to `index [0]` of `1-d def array reference`;
load from `l` -> `long 2`;
implicit cast `long 2` to `def` -> `def`;
store `def` to `index [1]` of `1-d def array reference`;
load from `f` -> `float 3.0`;
load from `d` -> `double 4.0`;
promote `float 3.0` and `double 4.0`: result `double`;
implicit cast `float 3.0` to `double 3.0` -> `double 3.0`;
multiply `double 3.0` and `double 4.0` -> `double 12.0`;
implicit cast `double 12.0` to `def` -> `def`;
store `def` to `index [2]` of `1-d def array reference`;
load from `s` -> `String "5"`;
implicit cast `String "5"` to `def` -> `def`;
store `def` to `index [3]` of `1-d def array reference`;
implicit cast `1-d int array reference` to `def` -> `def`;
store `def` to `array`
[[array-access-operator]]
==== Array Access
Use the `array access operator '[]'` to store a value to or load a value from
an <<array-type, array type>> value. Each element of an array type value is
accessed with an `int` type value to specify the index to store/load. The range
of elements within an array that are accessible is `[0, size)` where size is the
number of elements specified at the time of allocation. Use a negative `int`
type value as an index to access an element in reverse from the end of an array
type value within a range of `[-size, -1]`.
*Errors*
* If a value other than an `int` type value or a value that is castable to an
`int` type value is provided as an index.
* If an element is accessed outside of the valid ranges.
*Grammar*
[source,ANTLR4]
----
brace_access: '[' expression ']'
----
*Examples*
* Array access with a single-dimensional array.
+
[source,Painless]
----
<1> int[] x = new int[2];
<2> x[0] = 2;
<3> x[1] = 5;
<4> int y = x[0] + x[1];
<5> int z = 1;
<6> int i = x[z];
----
+
<1> declare `int[] x`;
allocate `1-d int array` instance with `length [2]`
-> `1-d int array reference`;
store `1-d int array reference` to `x`
<2> load from `x` -> `1-d int array reference`;
store `int 2` to `index [0]` of `1-d int array reference`;
<3> load from `x` -> `1-d int array reference`;
store `int 5` to `index [1]` of `1-d int array reference`;
<4> declare `int y`;
load from `x` -> `1-d int array reference`;
load from `index [0]` of `1-d int array reference` -> `int 2`;
load from `x` -> `1-d int array reference`;
load from `index [1]` of `1-d int array reference` -> `int 5`;
add `int 2` and `int 5` -> `int 7`;
store `int 7` to `y`
<5> declare `int z`;
store `int 1` to `z`;
<6> declare `int i`;
load from `x` -> `1-d int array reference`;
load from `z` -> `int 1`;
load from `index [1]` of `1-d int array reference` -> `int 5`;
store `int 5` to `i`;
+
* Array access with the `def` type.
+
[source,Painless]
----
<1> def d = new int[2];
<2> d[0] = 2;
<3> d[1] = 5;
<4> def x = d[0] + d[1];
<5> def y = 1;
<6> def z = d[y];
----
+
<1> declare `def d`;
allocate `1-d int array` instance with `length [2]`
-> `1-d int array reference`;
implicit cast `1-d int array reference` to `def` -> `def`;
store `def` to `d`
<2> load from `d` -> `def`
implicit cast `def` to `1-d int array reference`
-> `1-d int array reference`;
store `int 2` to `index [0]` of `1-d int array reference`;
<3> load from `d` -> `def`
implicit cast `def` to `1-d int array reference`
-> `1-d int array reference`;
store `int 5` to `index [1]` of `1-d int array reference`;
<4> declare `int x`;
load from `d` -> `def`
implicit cast `def` to `1-d int array reference`
-> `1-d int array reference`;
load from `index [0]` of `1-d int array reference` -> `int 2`;
load from `d` -> `def`
implicit cast `def` to `1-d int array reference`
-> `1-d int array reference`;
load from `index [1]` of `1-d int array reference` -> `int 5`;
add `int 2` and `int 5` -> `int 7`;
implicit cast `int 7` to `def` -> `def`;
store `def` to `x`
<5> declare `def y`;
implicit cast `int 1` to `def` -> `def`;
store `def ` to `y`;
<6> declare `int i`;
load from `d` -> `def`
implicit cast `def` to `1-d int array reference`
-> `1-d int array reference`;
load from `y` -> `def`;
implicit cast `def` to `int 1` -> `int 1`;
load from `index [1]` of `1-d int array reference` -> `int 5`;
implicit cast `int 5` to `def`;
store `def` to `z`;
+
* Array access with a multi-dimensional array.
+
[source,Painless]
----
<1> int[][][] ia3 = new int[2][3][4];
<2> ia3[1][2][3] = 99;
<3> int i = ia3[1][2][3];
----
+
<1> declare `int[][][] ia`;
allocate `3-d int array` instance with length `[2, 3, 4]`
-> `3-d int array reference`;
store `3-d int array reference` to `ia3`
<2> load from `ia3` -> `3-d int array reference`;
store `int 99` to `index [1, 2, 3]` of `3-d int array reference`
<3> declare `int i`;
load from `ia3` -> `3-d int array reference`;
load from `index [1, 2, 3]` of `3-d int array reference` -> `int 99`;
store `int 99` to `i`
[[array-length-operator]]
==== Array Length
An array type value contains a read-only member field named `length`. The
`length` field stores the size of the array as an `int` type value where size is
the number of elements specified at the time of allocation. Use the
<<field-access-operator, field access operator>> to load the field `length`
from an array type value.
*Examples*
* Access the `length` field.
+
[source,Painless]
----
<1> int[] x = new int[10];
<2> int l = x.length;
----
<1> declare `int[] x`;
allocate `1-d int array` instance with `length [2]`
-> `1-d int array reference`;
store `1-d int array reference` to `x`
<2> declare `int l`;
load `x` -> `1-d int array reference`;
load `length` from `1-d int array reference` -> `int 10`;
store `int 10` to `l`;
[[new-array-operator]]
==== New Array
Use the `new array operator 'new []'` to allocate an array type instance to
the heap. Specify the element type following the `new` token. Specify each
dimension with the `[` and `]` tokens following the element type name. The size
of each dimension is specified by an `int` type value in between each set of `[`
and `]` tokens.
*Errors*
* If a value other than an `int` type value or a value that is castable to an
`int` type value is specified for for a dimension's size.
*Grammar*
[source,ANTLR4]
----
new_array: 'new' TYPE ('[' expression ']')+;
----
*Examples*
* Allocation of different array types.
+
[source,Painless]
----
<1> int[] x = new int[5];
<2> x = new int[10];
<3> int y = 2;
<4> def z = new def[y][y*2];
----
+
<1> declare `int[] x`;
allocate `1-d int array` instance with `length [5]`
-> `1-d int array reference`;
store `1-d int array reference` to `x`
<2> allocate `1-d int array` instance with `length [10]`
-> `1-d int array reference`;
store `1-d int array reference` to `x`
<3> declare `int y`;
store `int 2` to `y`;
<4> declare `def z`;
load from `y` -> `int 2 @0`;
load from `y` -> `int 2 @1`;
multiply `int 2 @1` by `int 2 @2` -> `int 4`;
allocate `2-d int array` instance with length `[2, 4]`
-> `2-d int array reference`;
implicit cast `2-d int array reference` to `def` -> `def`;
store `def` to `z`;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,432 @@
[[painless-operators-general]]
=== Operators: General
[[precedence-operator]]
==== Precedence
Use the `precedence operator '()'` to guarantee the order of evaluation for an
expression. An expression encapsulated by the precedence operator (enclosed in
parentheses) overrides existing precedence relationships between operators and
is evaluated prior to other expressions in inward-to-outward order.
*Grammar*
[source,ANTLR4]
----
precedence: '(' expression ')';
----
*Examples*
* Precedence with numeric operators.
+
[source,Painless]
----
<1> int x = (5+4)*6;
<2> int y = 12/(x-50);
----
+
<1> declare `int x`;
add `int 5` and `int 4` -> `int 9`;
multiply `int 9` and `int 6` -> `int 54`;
store `int 54` to `x`;
(note the add is evaluated before the multiply due to the precedence
operator)
<2> declare `int y`;
load from `x` -> `int 54`;
subtract `int 50` from `int 54` -> `int 4`;
divide `int 12` by `int 4` -> `int 3`;
store `int 3` to `y`;
(note the subtract is evaluated before the divide due to the precedence
operator)
[[function-call-operator]]
==== Function Call
Use the `function call operator ()` to call an existing function. A
<<painless-functions, function call>> is defined within a script.
*Grammar*
[source,ANTLR4]
----
function_call: ID '(' ( expression (',' expression)* )? ')'';
----
*Examples*
* A function call.
+
[source,Painless]
----
<1> int add(int x, int y) {
return x + y;
}
<2> int z = add(1, 2);
----
+
<1> define function `add` that returns `int` and has parameters (`int x`,
`int y`)
<2> declare `int z`;
call `add` with arguments (`int 1`, `int 2`) -> `int 3`;
store `int 3` to `z`
[[cast-operator]]
==== Cast
An explicit cast converts the value of an original type to the equivalent value
of a target type forcefully as an operation. Use the `cast operator '()'` to
specify an explicit cast. Refer to <<painless-casting, casting>> for more
information.
[[conditional-operator]]
==== Conditional
A conditional consists of three expressions. The first expression is evaluated
with an expected boolean result type. If the first expression evaluates to true
then the second expression will be evaluated. If the first expression evaluates
to false then the third expression will be evaluated. The second and third
expressions will be <<promotion, promoted>> if the evaluated values are not the
same type. Use the `conditional operator '? :'` as a shortcut to avoid the need
for a full if/else branch in certain expressions.
*Errors*
* If the first expression does not evaluate to a boolean type value.
* If the values for the second and third expressions cannot be promoted.
*Grammar*
[source,ANTLR4]
----
conditional: expression '?' expression ':' expression;
----
*Promotion*
[cols="<1,^1,^1,^1,^1,^1,^1,^1,^1,^1"]
|====
| | byte | short | char | int | long | float | double | Reference | def
| byte | int | int | int | int | long | float | double | - | def
| short | int | int | int | int | long | float | double | - | def
| char | int | int | int | int | long | float | double | - | def
| int | int | int | int | int | long | float | double | - | def
| long | long | long | long | long | long | float | double | - | def
| float | float | float | float | float | float | float | double | - | def
| double | double | double | double | double | double | double | double | - | def
| Reference | - | - | - | - | - | - | - | Object @ | def
| def | def | def | def | def | def | def | def | def | def
|====
@ If the two reference type values are the same then this promotion will not
occur.
*Examples*
* Evaluation of conditionals.
+
[source,Painless]
----
<1> boolean b = true;
<2> int x = b ? 1 : 2;
<3> List y = x > 1 ? new ArrayList() : null;
<4> def z = x < 2 ? x : 2.0;
----
+
<1> declare `boolean b`;
store `boolean true` to `b`
<2> declare `int x`;
load from `b` -> `boolean true`
evaluate 1st expression: `int 1` -> `int 1`;
store `int 1` to `x`
<3> declare `List y`;
load from `x` -> `int 1`;
`int 1` greater than `int 1` -> `boolean false`;
evaluate 2nd expression: `null` -> `null`;
store `null` to `y`;
<4> declare `def z`;
load from `x` -> `int 1`;
`int 1` less than `int 2` -> `boolean true`;
evaluate 1st expression: load from `x` -> `int 1`;
promote `int 1` and `double 2.0`: result `double`;
implicit cast `int 1` to `double 1.0` -> `double 1.0`;
implicit cast `double 1.0` to `def` -> `def`;
store `def` to `z`;
[[assignment-operator]]
==== Assignment
Use the `assignment operator '='` to store a value in a variable or reference
type member field for use in subsequent operations. Any operation that produces
a value can be assigned to any variable/field as long as the
<<painless-types, types>> are the same or the resultant type can be
<<painless-casting, implicitly cast>> to the variable/field type.
See <<variable-assignment, variable assignment>> for examples using variables.
*Errors*
* If the type of value is unable to match the type of variable or field.
*Grammar*
[source,ANTLR4]
----
assignment: field '=' expression
----
*Examples*
The examples use the following reference type definition:
[source,Painless]
----
name:
Example
non-static member fields:
* int x
* def y
* List z
----
* Field assignments of different type values.
+
[source,Painless]
----
<1> Example example = new Example();
<2> example.x = 1;
<3> example.y = 2.0;
<4> example.z = new ArrayList();
----
+
<1> declare `Example example`;
allocate `Example` instance -> `Example reference`;
store `Example reference` to `example`
<2> load from `example` -> `Example reference`;
store `int 1` to `x` of `Example reference`
<3> load from `example` -> `Example reference`;
implicit cast `double 2.0` to `def` -> `def`;
store `def` to `y` of `Example reference`
<4> load from `example` -> `Example reference`;
allocate `ArrayList` instance -> `ArrayList reference`;
implicit cast `ArrayList reference` to `List reference` -> `List reference`;
store `List reference` to `z` of `Example reference`
+
* A field assignment from a field access.
+
[source,Painless]
----
<1> Example example = new Example();
<2> example.x = 1;
<3> example.y = example.x;
----
+
<1> declare `Example example`;
allocate `Example` instance -> `Example reference`;
store `Example reference` to `example`
<2> load from `example` -> `Example reference`;
store `int 1` to `x` of `Example reference`
<3> load from `example` -> `Example reference @0`;
load from `example` -> `Example reference @1`;
load from `x` of `Example reference @1` -> `int 1`;
implicit cast `int 1` to `def` -> `def`;
store `def` to `y` of `Example reference @0`;
(note `Example reference @0` and `Example reference @1` are the same)
[[compound-assignment-operator]]
==== Compound Assignment
Use the `compound assignment operator '$='` as a shortcut for an assignment
where a binary operation would occur between the variable/field as the
left-hand side expression and a separate right-hand side expression.
A compound assignment is equivalent to the expression below where V is the
variable/field and T is the type of variable/member.
[source,Painless]
----
V = (T)(V op expression);
----
*Operators*
The table below shows the available operators for use in a compound assignment.
Each operator follows the casting/promotion rules according to their regular
definition. For numeric operations there is an extra implicit cast when
necessary to return the promoted numeric type value to the original numeric type
value of the variable/field and can result in data loss.
|====
|Operator|Compound Symbol
|Multiplication|*=
|Division|/=
|Remainder|%=
|Addition|+=
|Subtraction|-=
|Left Shift|<<=
|Right Shift|>>=
|Unsigned Right Shift|>>>=
|Bitwise And|&=
|Boolean And|&=
|Bitwise Xor|^=
|Boolean Xor|^=
|Bitwise Or|\|=
|Boolean Or|\|=
|String Concatenation|+=
|====
*Errors*
* If the type of value is unable to match the type of variable or field.
*Grammar*
[source,ANTLR4]
----
compound_assignment: ( ID | field ) '$=' expression;
----
Note the use of the `$=` represents the use of any of the possible binary
operators.
*Examples*
* Compound assignment for each numeric operator.
+
[source,Painless]
----
<1> int i = 10;
<2> i *= 2;
<3> i /= 5;
<4> i %= 3;
<5> i += 5;
<6> i -= 5;
<7> i <<= 2;
<8> i >>= 1;
<9> i >>>= 1;
<10> i &= 15;
<11> i ^= 12;
<12> i |= 2;
----
+
<1> declare `int i`;
store `int 10` to `i`
<2> load from `i` -> `int 10`;
multiply `int 10` and `int 2` -> `int 20`;
store `int 20` to `i`;
(note this is equivalent to `i = i*2`)
<3> load from `i` -> `int 20`;
divide `int 20` by `int 5` -> `int 4`;
store `int 4` to `i`;
(note this is equivalent to `i = i/5`)
<4> load from `i` -> `int 4`;
remainder `int 4` by `int 3` -> `int 1`;
store `int 1` to `i`;
(note this is equivalent to `i = i%3`)
<5> load from `i` -> `int 1`;
add `int 1` and `int 5` -> `int 6`;
store `int 6` to `i`;
(note this is equivalent to `i = i+5`)
<6> load from `i` -> `int 6`;
subtract `int 5` from `int 6` -> `int 1`;
store `int 1` to `i`;
(note this is equivalent to `i = i-5`)
<7> load from `i` -> `int 1`;
left shift `int 1` by `int 2` -> `int 4`;
store `int 4` to `i`;
(note this is equivalent to `i = i<<2`)
<8> load from `i` -> `int 4`;
right shift `int 4` by `int 1` -> `int 2`;
store `int 2` to `i`;
(note this is equivalent to `i = i>>1`)
<9> load from `i` -> `int 2`;
unsigned right shift `int 2` by `int 1` -> `int 1`;
store `int 1` to `i`;
(note this is equivalent to `i = i>>>1`)
<10> load from `i` -> `int 1`;
bitwise and `int 1` and `int 15` -> `int 1`;
store `int 1` to `i`;
(note this is equivalent to `i = i&2`)
<11> load from `i` -> `int 1`;
bitwise xor `int 1` and `int 12` -> `int 13`;
store `int 13` to `i`;
(note this is equivalent to `i = i^2`)
<12> load from `i` -> `int 13`;
bitwise or `int 13` and `int 2` -> `int 15`;
store `int 15` to `i`;
(note this is equivalent to `i = i|2`)
+
* Compound assignment for each boolean operator.
+
[source,Painless]
----
<1> boolean b = true;
<2> b &= false;
<3> b ^= false;
<4> b |= true;
----
+
<1> declare `boolean b`;
store `boolean true` in `b`;
<2> load from `b` -> `boolean true`;
boolean and `boolean true` and `boolean false` -> `boolean false`;
store `boolean false` to `b`;
(note this is equivalent to `b = b && false`)
<3> load from `b` -> `boolean false`;
boolean xor `boolean false` and `boolean false` -> `boolean false`;
store `boolean false` to `b`;
(note this is equivalent to `b = b ^ false`)
<4> load from `b` -> `boolean true`;
boolean or `boolean false` and `boolean true` -> `boolean true`;
store `boolean true` to `b`;
(note this is equivalent to `b = b || true`)
+
* A compound assignment with the string concatenation operator.
+
[source,Painless]
----
<1> String s = 'compound';
<2> s += ' assignment';
----
<1> declare `String s`;
store `String 'compound'` to `s`;
<2> load from `s` -> `String 'compound'`;
string concat `String 'compound'` and `String ' assignment''`
-> `String 'compound assignment'`;
store `String 'compound assignment'` to `s`;
(note this is equivalent to `s = s + ' assignment'`)
+
* A compound assignment with the `def` type.
+
[source,Painless]
----
<1> def x = 1;
<2> x += 2;
----
<1> declare `def x`;
implicit cast `int 1` to `def`;
store `def` to `x`;
<2> load from `x` -> `def`;
implicit cast `def` to `int 1` -> `int 1`;
add `int 1` and `int 2` -> `int 3`;
implicit cast `int 3` to `def` -> `def`;
store `def` to `x`;
(note this is equivalent to `x = x+2`)
+
* A compound assignment with an extra implicit cast.
+
[source,Painless]
----
<1> byte b = 1;
<2> b += 2;
----
<1> declare `byte b`;
store `byte 1` to `x`;
<2> load from `x` -> `byte 1`;
implicit cast `byte 1 to `int 1` -> `int 1`;
add `int 1` and `int 2` -> `int 3`;
implicit cast `int 3` to `byte 3` -> `byte 3`;
store `byte 3` to `b`;
(note this is equivalent to `b = b+2`)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,774 @@
[[painless-operators-reference]]
=== Operators: Reference
[[method-call-operator]]
==== Method Call
Use the `method call operator '()'` to call a member method on a
<<reference-types, reference type>> value. Implicit
<<boxing-unboxing, boxing/unboxing>> is evaluated as necessary per argument
during the method call. When a method call is made on a target `def` type value,
the parameters and return type value are considered to also be of the `def` type
and are evaluated at run-time.
An overloaded method is one that shares the same name with two or more methods.
A method is overloaded based on arity where the same name is re-used for
multiple methods as long as the number of parameters differs.
*Errors*
* If the reference type value is `null`.
* If the member method name doesn't exist for a given reference type value.
* If the number of arguments passed in is different from the number of specified
parameters.
* If the arguments cannot be implicitly cast or implicitly boxed/unboxed to the
correct type values for the parameters.
*Grammar*
[source,ANTLR4]
----
method_call: '.' ID arguments;
arguments: '(' (expression (',' expression)*)? ')';
----
*Examples*
* Method calls on different reference types.
+
[source,Painless]
----
<1> Map m = new HashMap();
<2> m.put(1, 2);
<3> int z = m.get(1);
<4> def d = new ArrayList();
<5> d.add(1);
<6> int i = Integer.parseInt(d.get(0).toString());
----
+
<1> declare `Map m`;
allocate `HashMap` instance -> `HashMap reference`;
store `HashMap reference` to `m`
<2> load from `m` -> `Map reference`;
implicit cast `int 1` to `def` -> `def`;
implicit cast `int 2` to `def` -> `def`;
call `put` on `Map reference` with arguments (`int 1`, `int 2`)
<3> declare `int z`;
load from `m` -> `Map reference`;
call `get` on `Map reference` with arguments (`int 1`) -> `def`;
implicit cast `def` to `int 2` -> `int 2`;
store `int 2` to `z`
<4> declare `def d`;
allocate `ArrayList` instance -> `ArrayList reference`;
implicit cast `ArrayList` to `def` -> `def`;
store `def` to `d`
<5> load from `d` -> `def`;
implicit cast `def` to `ArrayList reference` -> `ArrayList reference`
call `add` on `ArrayList reference` with arguments (`int 1`);
<6> declare `int i`;
load from `d` -> `def`;
implicit cast `def` to `ArrayList reference` -> `ArrayList reference`
call `get` on `ArrayList reference` with arguments (`int 1`) -> `def`;
implicit cast `def` to `Integer 1 reference` -> `Integer 1 reference`;
call `toString` on `Integer 1 reference` -> `String '1'`;
call `parseInt` on `Integer` with arguments (`String '1'`) -> `int 1`;
store `int 1` in `i`;
[[field-access-operator]]
==== Field Access
Use the `field access operator '.'` to store a value to or load a value from a
<<reference-types, reference type>> member field.
*Errors*
* If the reference type value is `null`.
* If the member field name doesn't exist for a given reference type value.
*Grammar*
[source,ANTLR4]
----
field_access: '.' ID;
----
*Examples*
The examples use the following reference type definition:
[source,Painless]
----
name:
Example
non-static member fields:
* int x
* def y
* List z
----
* Field access with the `Example` type.
+
[source,Painless]
----
<1> Example example = new Example();
<2> example.x = 1;
<3> example.y = example.x;
<4> example.z = new ArrayList();
<5> example.z.add(1);
<6> example.x = example.z.get(0);
----
+
<1> declare `Example example`;
allocate `Example` instance -> `Example reference`;
store `Example reference` to `example`
<2> load from `example` -> `Example reference`;
store `int 1` to `x` of `Example reference`
<3> load from `example` -> `Example reference @0`;
load from `example` -> `Example reference @1`;
load from `x` of `Example reference @1` -> `int 1`;
implicit cast `int 1` to `def` -> `def`;
store `def` to `y` of `Example reference @0`;
(note `Example reference @0` and `Example reference @1` are the same)
<4> load from `example` -> `Example reference`;
allocate `ArrayList` instance -> `ArrayList reference`;
implicit cast `ArrayList reference` to `List reference` -> `List reference`;
store `List reference` to `z` of `Example reference`
<5> load from `example` -> `Example reference`;
load from `z` of `Example reference` -> `List reference`;
call `add` on `List reference` with arguments (`int 1`)
<6> load from `example` -> `Example reference @0`;
load from `example` -> `Example reference @1`;
load from `z` of `Example reference @1` -> `List reference`;
call `get` on `List reference` with arguments (`int 0`) -> `int 1`;
store `int 1` in `x` of `List reference @0`;
(note `Example reference @0` and `Example reference @1` are the same)
[[null-safe-operator]]
==== Null Safe
Use the `null safe operator '?.'` instead of the method call operator or field
access operator to ensure a reference type value is `non-null` before
a method call or field access. A `null` value will be returned if the reference
type value is `null`, otherwise the method call or field access is evaluated.
*Errors*
* If the method call return type value or the field access type value is not
a reference type value and is not implicitly castable to a reference type
value.
*Grammar*
[source,ANTLR4]
----
null_safe: null_safe_method_call
| null_safe_field_access
;
null_safe_method_call: '?.' ID arguments;
arguments: '(' (expression (',' expression)*)? ')';
null_safe_field_access: '?.' ID;
----
*Examples*
The examples use the following reference type definition:
[source,Painless]
----
name:
Example
non-static member methods:
* List factory()
non-static member fields:
* List x
----
* Null safe without a `null` value.
+
[source,Painless]
----
<1> Example example = new Example();
<2> List x = example?.factory();
----
+
<1> declare `Example example`;
allocate `Example` instance -> `Example reference`;
store `Example reference` to `example`
<2> declare `List x`;
load from `example` -> `Example reference`;
null safe call `factory` on `Example reference` -> `List reference`;
store `List reference` to `x`;
+
* Null safe with a `null` value;
+
[source,Painless]
----
<1> Example example = null;
<2> List x = example?.x;
----
<1> declare `Example example`;
store `null` to `example`
<2> declare `List x`;
load from `example` -> `Example reference`;
null safe access `x` on `Example reference` -> `null`;
store `null` to `x`;
(note the *null safe operator* returned `null` because `example` is `null`)
[[list-initialization-operator]]
==== List Initialization
Use the `list initialization operator '[]'` to allocate an `List` type instance
to the heap with a set of pre-defined values. Each value used to initialize the
`List` type instance is cast to a `def` type value upon insertion into the
`List` type instance using the `add` method. The order of the specified values
is maintained.
*Grammar*
[source,ANTLR4]
----
list_initialization: '[' expression (',' expression)* ']'
| '[' ']';
----
*Examples*
* List initialization of an empty `List` type value.
+
[source,Painless]
----
<1> List empty = [];
----
+
<1> declare `List empty`;
allocate `ArrayList` instance -> `ArrayList reference`;
implicit cast `ArrayList reference` to `List reference` -> `List reference`;
store `List reference` to `empty`
+
* List initialization with static values.
+
[source,Painless]
----
<1> List list = [1, 2, 3];
----
+
<1> declare `List list`;
allocate `ArrayList` instance -> `ArrayList reference`;
call `add` on `ArrayList reference` with arguments(`int 1`);
call `add` on `ArrayList reference` with arguments(`int 2`);
call `add` on `ArrayList reference` with arguments(`int 3`);
implicit cast `ArrayList reference` to `List reference` -> `List reference`;
store `List reference` to `list`
+
* List initialization with non-static values.
+
[source,Painless]
----
<1> int i = 1;
<2> long l = 2L;
<3> float f = 3.0F;
<4> double d = 4.0;
<5> String s = "5";
<6> List list = [i, l, f*d, s];
----
+
<1> declare `int i`;
store `int 1` to `i`
<2> declare `long l`;
store `long 2` to `l`
<3> declare `float f`;
store `float 3.0` to `f`
<4> declare `double d`;
store `double 4.0` to `d`
<5> declare `String s`;
store `String "5"` to `s`
<6> declare `List list`;
allocate `ArrayList` instance -> `ArrayList reference`;
load from `i` -> `int 1`;
call `add` on `ArrayList reference` with arguments(`int 1`);
load from `l` -> `long 2`;
call `add` on `ArrayList reference` with arguments(`long 2`);
load from `f` -> `float 3.0`;
load from `d` -> `double 4.0`;
promote `float 3.0` and `double 4.0`: result `double`;
implicit cast `float 3.0` to `double 3.0` -> `double 3.0`;
multiply `double 3.0` and `double 4.0` -> `double 12.0`;
call `add` on `ArrayList reference` with arguments(`double 12.0`);
load from `s` -> `String "5"`;
call `add` on `ArrayList reference` with arguments(`String "5"`);
implicit cast `ArrayList reference` to `List reference` -> `List reference`;
store `List reference` to `list`
[[list-access-operator]]
==== List Access
Use the `list access operator '[]'` as a shortcut for a `set` method call or
`get` method call made on a `List` type value.
*Errors*
* If a value other than a `List` type value is accessed.
* If a non-integer type value is used as an index for a `set` method call or
`get` method call.
*Grammar*
[source,ANTLR4]
----
list_access: '[' expression ']'
----
*Examples*
* List access with the `List` type.
+
[source,Painless]
----
<1> List list = new ArrayList();
<2> list.add(1);
<3> list.add(2);
<4> list.add(3);
<5> list[0] = 2;
<6> list[1] = 5;
<7> int x = list[0] + list[1];
<8> int y = 1;
<9> int z = list[y];
----
+
<1> declare `List list`;
allocate `ArrayList` instance -> `ArrayList reference`;
implicit cast `ArrayList reference` to `List reference` -> `List reference`;
store `List reference` to `list`
<2> load from `list` -> `List reference`;
call `add` on `List reference` with arguments(`int 1`)
<3> load from `list` -> `List reference`;
call `add` on `List reference` with arguments(`int 2`)
<4> load from `list` -> `List reference`;
call `add` on `List reference` with arguments(`int 3`)
<5> load from `list` -> `List reference`;
call `set` on `List reference` with arguments(`int 0`, `int 2`)
<6> load from `list` -> `List reference`;
call `set` on `List reference` with arguments(`int 1`, `int 5`)
<7> declare `int x`;
load from `list` -> `List reference`;
call `get` on `List reference` with arguments(`int 0`) -> `def`;
implicit cast `def` to `int 2` -> `int 2`;
load from `list` -> `List reference`;
call `get` on `List reference` with arguments(`int 1`) -> `def`;
implicit cast `def` to `int 5` -> `int 5`;
add `int 2` and `int 5` -> `int 7`;
store `int 7` to `x`
<8> declare `int y`;
store `int 1` int `y`
<9> declare `int z`;
load from `list` -> `List reference`;
load from `y` -> `int 1`;
call `get` on `List reference` with arguments(`int 1`) -> `def`;
implicit cast `def` to `int 5` -> `int 5`;
store `int 5` to `z`
+
* List access with the `def` type.
+
[source,Painless]
----
<1> def d = new ArrayList();
<2> d.add(1);
<3> d.add(2);
<4> d.add(3);
<5> d[0] = 2;
<6> d[1] = 5;
<7> def x = d[0] + d[1];
<8> def y = 1;
<9> def z = d[y];
----
+
<1> declare `List d`;
allocate `ArrayList` instance -> `ArrayList reference`;
implicit cast `ArrayList reference` to `def` -> `def`;
store `def` to `d`
<2> load from `d` -> `def`;
implicit cast `def` to `ArrayList reference` -> `ArrayList reference`;
call `add` on `ArrayList reference` with arguments(`int 1`)
<3> load from `d` -> `def`;
implicit cast `def` to `ArrayList reference` -> `ArrayList reference`;
call `add` on `ArrayList reference` with arguments(`int 2`)
<4> load from `d` -> `def`;
implicit cast `def` to `ArrayList reference` -> `ArrayList reference`;
call `add` on `ArrayList reference` with arguments(`int 3`)
<5> load from `d` -> `def`;
implicit cast `def` to `ArrayList reference` -> `ArrayList reference`;
call `set` on `ArrayList reference` with arguments(`int 0`, `int 2`)
<6> load from `d` -> `def`;
implicit cast `def` to `ArrayList reference` -> `ArrayList reference`;
call `set` on `ArrayList reference` with arguments(`int 1`, `int 5`)
<7> declare `def x`;
load from `d` -> `def`;
implicit cast `def` to `ArrayList reference` -> `ArrayList reference`;
call `get` on `ArrayList reference` with arguments(`int 0`) -> `def`;
implicit cast `def` to `int 2` -> `int 2`;
load from `d` -> `def`;
implicit cast `def` to `ArrayList reference` -> `ArrayList reference`;
call `get` on `ArrayList reference` with arguments(`int 1`) -> `def`;
implicit cast `def` to `int 2` -> `int 2`;
add `int 2` and `int 5` -> `int 7`;
store `int 7` to `x`
<8> declare `int y`;
store `int 1` int `y`
<9> declare `int z`;
load from `d` -> `ArrayList reference`;
load from `y` -> `def`;
implicit cast `def` to `int 1` -> `int 1`;
call `get` on `ArrayList reference` with arguments(`int 1`) -> `def`;
store `def` to `z`
[[map-initialization-operator]]
==== Map Initialization
Use the `map initialization operator '[:]'` to allocate a `Map` type instance to
the heap with a set of pre-defined values. Each pair of values used to
initialize the `Map` type instance are cast to `def` type values upon insertion
into the `Map` type instance using the `put` method.
*Grammar*
[source,ANTLR4]
----
map_initialization: '[' key_pair (',' key_pair)* ']'
| '[' ':' ']';
key_pair: expression ':' expression
----
*Examples*
* Map initialization of an empty `Map` type value.
+
[source,Painless]
----
<1> Map empty = [:];
----
+
<1> declare `Map empty`;
allocate `HashMap` instance -> `HashMap reference`;
implicit cast `HashMap reference` to `Map reference` -> `Map reference`;
store `Map reference` to `empty`
+
* Map initialization with static values.
+
[source,Painless]
----
<1> Map map = [1:2, 3:4, 5:6];
----
+
<1> declare `Map map`;
allocate `HashMap` instance -> `HashMap reference`;
call `put` on `HashMap reference` with arguments(`int 1`, `int 2`);
call `put` on `HashMap reference` with arguments(`int 3`, `int 4`);
call `put` on `HashMap reference` with arguments(`int 5`, `int 6`);
implicit cast `HashMap reference` to `Map reference` -> `Map reference`;
store `Map reference` to `map`
+
* Map initialization with non-static values.
+
[source,Painless]
----
<1> byte b = 0;
<2> int i = 1;
<3> long l = 2L;
<4> float f = 3.0F;
<5> double d = 4.0;
<6> String s = "5";
<7> Map map = [b:i, l:f*d, d:s];
----
+
<1> declare `byte b`;
store `byte 0` to `b`
<2> declare `int i`;
store `int 1` to `i`
<3> declare `long l`;
store `long 2` to `l`
<4> declare `float f`;
store `float 3.0` to `f`
<5> declare `double d`;
store `double 4.0` to `d`
<6> declare `String s`;
store `String "5"` to `s`
<7> declare `Map map`;
allocate `HashMap` instance -> `HashMap reference`;
load from `b` -> `byte 0`;
load from `i` -> `int 1`;
call `put` on `HashMap reference` with arguments(`byte 0`, `int 1`);
load from `l` -> `long 2`;
load from `f` -> `float 3.0`;
load from `d` -> `double 4.0`;
promote `float 3.0` and `double 4.0`: result `double`;
implicit cast `float 3.0` to `double 3.0` -> `double 3.0`;
multiply `double 3.0` and `double 4.0` -> `double 12.0`;
call `put` on `HashMap reference` with arguments(`long 2`, `double 12.0`);
load from `d` -> `double 4.0`;
load from `s` -> `String "5"`;
call `put` on `HashMap reference` with
arguments(`double 4.0`, `String "5"`);
implicit cast `HashMap reference` to `Map reference` -> `Map reference`;
store `Map reference` to `map`
[[map-access-operator]]
==== Map Access
Use the `map access operator '[]'` as a shortcut for a `put` method call or
`get` method call made on a `Map` type value.
*Errors*
* If a value other than a `Map` type value is accessed.
*Grammar*
[source,ANTLR4]
----
map_access: '[' expression ']'
----
*Examples*
* Map access with the `Map` type.
+
[source,Painless]
----
<1> Map map = new HashMap();
<2> map['value2'] = 2;
<3> map['value5'] = 5;
<4> int x = map['value2'] + map['value5'];
<5> String y = 'value5';
<6> int z = x[z];
----
+
<1> declare `Map map`;
allocate `HashMap` instance -> `HashMap reference`;
implicit cast `HashMap reference` to `Map reference` -> `Map reference`;
store `Map reference` to `map`
<2> load from `map` -> `Map reference`;
call `put` on `Map reference` with arguments(`String 'value2'`, `int 2`)
<3> load from `map` -> `Map reference`;
call `put` on `Map reference` with arguments(`String 'value5'`, `int 5`)
<4> declare `int x`;
load from `map` -> `Map reference`;
call `get` on `Map reference` with arguments(`String 'value2'`) -> `def`;
implicit cast `def` to `int 2` -> `int 2`;
load from `map` -> `Map reference`;
call `get` on `Map reference` with arguments(`String 'value5'`) -> `def`;
implicit cast `def` to `int 5` -> `int 5`;
add `int 2` and `int 5` -> `int 7`;
store `int 7` to `x`
<5> declare `String y`;
store `String 'value5'` to `y`
<6> declare `int z`;
load from `map` -> `Map reference`;
load from `y` -> `String 'value5'`;
call `get` on `Map reference` with arguments(`String 'value5'`) -> `def`;
implicit cast `def` to `int 5` -> `int 5`;
store `int 5` to `z`
+
* Map access with the `def` type.
+
[source,Painless]
----
<1> def d = new HashMap();
<2> d['value2'] = 2;
<3> d['value5'] = 5;
<4> int x = d['value2'] + d['value5'];
<5> String y = 'value5';
<6> def z = d[y];
----
+
<1> declare `def d`;
allocate `HashMap` instance -> `HashMap reference`;
implicit cast `HashMap reference` to `def` -> `def`;
store `def` to `d`
<2> load from `d` -> `def`;
implicit cast `def` to `HashMap reference` -> `HashMap reference`;
call `put` on `HashMap reference` with arguments(`String 'value2'`, `int 2`)
<3> load from `d` -> `def`;
implicit cast `def` to `HashMap reference` -> `HashMap reference`;
call `put` on `HashMap reference` with arguments(`String 'value5'`, `int 5`)
<4> declare `int x`;
load from `d` -> `def`;
implicit cast `def` to `HashMap reference` -> `HashMap reference`;
call `get` on `HashMap reference` with arguments(`String 'value2'`)
-> `def`;
implicit cast `def` to `int 2` -> `int 2`;
load from `d` -> `def`;
call `get` on `HashMap reference` with arguments(`String 'value5'`)
-> `def`;
implicit cast `def` to `int 5` -> `int 5`;
add `int 2` and `int 5` -> `int 7`;
store `int 7` to `x`
<5> declare `String y`;
store `String 'value5'` to `y`
<6> declare `def z`;
load from `d` -> `def`;
load from `y` -> `String 'value5'`;
call `get` on `HashMap reference` with arguments(`String 'value5'`)
-> `def`;
store `def` to `z`
[[new-instance-operator]]
==== New Instance
Use the `new instance operator 'new ()'` to allocate a
<<reference-types, reference type>> instance to the heap and call a specified
constructor. Implicit <<boxing-unboxing, boxing/unboxing>> is evaluated as
necessary per argument during the constructor call.
An overloaded constructor is one that shares the same name with two or more
constructors. A constructor is overloaded based on arity where the same
reference type name is re-used for multiple constructors as long as the number
of parameters differs.
*Errors*
* If the reference type name doesn't exist for instance allocation.
* If the number of arguments passed in is different from the number of specified
parameters.
* If the arguments cannot be implicitly cast or implicitly boxed/unboxed to the
correct type values for the parameters.
*Grammar*
[source,ANTLR4]
----
new_instance: 'new' TYPE '(' (expression (',' expression)*)? ')';
----
*Examples*
* Allocation of new instances with different types.
[source,Painless]
----
<1> Map m = new HashMap();
<2> def d = new ArrayList();
<3> def e = new HashMap(m);
----
<1> declare `Map m`;
allocate `HashMap` instance -> `HashMap reference`;
implicit cast `HashMap reference` to `Map reference` -> `Map reference`;
store `Map reference` to `m`;
<2> declare `def d`;
allocate `ArrayList` instance -> `ArrayList reference`;
implicit cast `ArrayList reference` to `def` -> `def`;
store `def` to `d`;
<3> declare `def e`;
load from `m` -> `Map reference`;
allocate `HashMap` instance with arguments (`Map reference`)
-> `HashMap reference`;
implicit cast `HashMap reference` to `def` -> `def`;
store `def` to `e`;
[[string-concatenation-operator]]
==== String Concatenation
Use the `string concatenation operator '+'` to concatenate two values together
where at least one of the values is a <<string-type, `String` type>>.
*Grammar*
[source,ANTLR4]
----
concatenate: expression '+' expression;
----
*Examples*
* String concatenation with different primitive types.
+
[source,Painless]
----
<1> String x = "con";
<2> String y = x + "cat";
<3> String z = 4 + 5 + x;
----
+
<1> declare `String x`;
store `String "con"` to `x`;
<2> declare `String y`;
load from `x` -> `String "con"`;
concat `String "con"` and `String "cat"` -> `String "concat"`;
store `String "concat"` to `y`
<3> declare `String z`;
add `int 4` and `int 5` -> `int 9`;
concat `int 9` and `String "9concat"`;
store `String "9concat"` to `z`;
(note the addition is done prior to the concatenation due to precedence and
associativity of the specific operations)
+
* String concatenation with the `def` type.
+
[source,Painless]
----
<1> def d = 2;
<2> d = "con" + d + "cat";
----
+
<1> declare `def`;
implicit cast `int 2` to `def` -> `def`;
store `def` in `d`;
<2> concat `String "con"` and `int 9` -> `String "con9"`;
concat `String "con9"` and `String "con"` -> `String "con9cat"`
implicit cast `String "con9cat"` to `def` -> `def`;
store `def` to `d`;
(note the switch in type of `d` from `int` to `String`)
[[elvis-operator]]
==== Elvis
An elvis consists of two expressions. The first expression is evaluated
with to check for a `null` value. If the first expression evaluates to
`null` then the second expression is evaluated and its value used. If the first
expression evaluates to `non-null` then the resultant value of the first
expression is used. Use the `elvis operator '?:'` as a shortcut for the
conditional operator.
*Errors*
* If the first expression or second expression cannot produce a `null` value.
*Grammar*
[source,ANTLR4]
----
elvis: expression '?:' expression;
----
*Examples*
* Elvis with different reference types.
+
[source,Painless]
----
<1> List x = new ArrayList();
<2> List y = x ?: new ArrayList();
<3> y = null;
<4> List z = y ?: new ArrayList();
----
+
<1> declare `List x`;
allocate `ArrayList` instance -> `ArrayList reference`;
implicit cast `ArrayList reference` to `List reference` -> `List reference`;
store `List reference` to `x`;
<2> declare `List y`;
load `x` -> `List reference`;
`List reference` equals `null` -> `false`;
evaluate 1st expression: `List reference` -> `List reference`;
store `List reference` to `y`
<3> store `null` to `y`;
<4> declare `List z`;
load `y` -> `List reference`;
`List reference` equals `null` -> `true`;
evaluate 2nd expression:
allocate `ArrayList` instance -> `ArrayList reference`;
implicit cast `ArrayList reference` to `List reference` -> `List reference`;
store `List reference` to `z`;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,33 @@
[[painless-regexes]]
=== Regexes
Regular expression constants are directly supported. To ensure fast performance,
this is the only mechanism for creating patterns. Regular expressions
are always constants and compiled efficiently a single time.
[source,painless]
---------------------------------------------------------
Pattern p = /[aeiou]/
---------------------------------------------------------
[[pattern-flags]]
==== Pattern flags
You can define flags on patterns in Painless by adding characters after the
trailing `/` like `/foo/i` or `/foo \w #comment/iUx`. Painless exposes all of
the flags from Java's
https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html[
Pattern class] using these characters:
[cols="<,<,<",options="header",]
|=======================================================================
| Character | Java Constant | Example
|`c` | CANON_EQ | `'å' ==~ /å/c` (open in hex editor to see)
|`i` | CASE_INSENSITIVE | `'A' ==~ /a/i`
|`l` | LITERAL | `'[a]' ==~ /[a]/l`
|`m` | MULTILINE | `'a\nb\nc' =~ /^b$/m`
|`s` | DOTALL (aka single line) | `'a\nb\nc' =~ /.b./s`
|`U` | UNICODE_CHARACTER_CLASS | `'Ɛ' ==~ /\\w/U`
|`u` | UNICODE_CASE | `'Ɛ' ==~ /ɛ/iu`
|`x` | COMMENTS (aka extended) | `'a' ==~ /a #comment/x`
|=======================================================================

View File

@ -0,0 +1,6 @@
[[painless-scripts]]
=== Scripts
Scripts are composed of one-to-many <<painless-statements, statements>> and are
run in a sandbox that determines what local variables are immediately available
along with what APIs are whitelisted for use.

View File

@ -0,0 +1,14 @@
[[painless-statements]]
=== Statements
Painless supports all of Java's https://docs.oracle.com/javase/tutorial/java/nutsandbolts/flow.html[
control flow statements] except the `switch` statement.
Painless also supports the `for in` syntax from Groovy:
[source,painless]
---------------------------------------------------------
for (item : list) {
...
}
---------------------------------------------------------

View File

@ -12,16 +12,16 @@ belongs to one of the following categories: <<primitive-types, primitive>>,
A primitive type represents basic data built natively into the JVM and is A primitive type represents basic data built natively into the JVM and is
allocated to non-heap memory. Declare a primitive type allocated to non-heap memory. Declare a primitive type
<<painless-variables, variable>>, and assign it a primitive type value for <<painless-variables, variable>> or access a primitive type member field (from
evaluation during later operations. The default value for a newly-declared a reference type instance), and assign it a primitive type value for evaluation
primitive type variable is listed as part of the definitions below. A primitive during later operations. The default value for a newly-declared primitive type
type value is copied during an assignment or as an argument for a variable is listed as part of the definitions below. A primitive type value is
method/function call. copied during an assignment or as an argument for a method/function call.
A primitive type has a corresponding reference type (also known as a boxed A primitive type has a corresponding reference type (also known as a boxed
type). Use the <<field-access, field access operator>> or type). Use the <<field-access-operator, field access operator>> or
<<method-access, method call operator>> on a primitive type value to force <<method-call-operator, method call operator>> on a primitive type value to
evaluation as its corresponding reference type value. force evaluation as its corresponding reference type value.
The following primitive types are available: The following primitive types are available:
@ -83,11 +83,11 @@ logical quantity with two possible values of `true` and `false`
---- ----
+ +
<1> declare `int i`; <1> declare `int i`;
assign `int 1` to `i` store `int 1` to `i`
<2> declare `double d`; <2> declare `double d`;
assign default `double 0.0` to `d` store default `double 0.0` to `d`
<3> declare `boolean b`; <3> declare `boolean b`;
assign `boolean true` to `b` store `boolean true` to `b`
+ +
* Method call on a primitive type using the corresponding reference type. * Method call on a primitive type using the corresponding reference type.
+ +
@ -98,8 +98,8 @@ logical quantity with two possible values of `true` and `false`
---- ----
+ +
<1> declare `int i`; <1> declare `int i`;
assign `int 1` to `i` store `int 1` to `i`
<2> access `i` -> `int 1`; <2> load from `i` -> `int 1`;
box `int 1` -> `Integer 1 reference`; box `int 1` -> `Integer 1 reference`;
call `toString` on `Integer 1 reference` -> `String '1'` call `toString` on `Integer 1 reference` -> `String '1'`
@ -113,7 +113,7 @@ multiple pieces of data (member fields) and logic to manipulate that data
A reference type instance is a single set of data for one reference type A reference type instance is a single set of data for one reference type
object allocated to the heap. Use the object allocated to the heap. Use the
<<constructor-call, new instance operator>> to allocate a reference type <<new-instance-operator, new instance operator>> to allocate a reference type
instance. Use a reference type instance to load from, store to, and manipulate instance. Use a reference type instance to load from, store to, and manipulate
complex data. complex data.
@ -122,10 +122,11 @@ reference type values may refer to the same reference type instance. A change to
a reference type instance will affect all reference type values referring to a reference type instance will affect all reference type values referring to
that specific instance. that specific instance.
Declare a reference type <<painless-variables, variable>>, and assign it a Declare a reference type <<painless-variables, variable>> or access a reference
reference type value for evaluation during later operations. The default value type member field (from a reference type instance), and assign it a reference
for a newly-declared reference type variable is `null`. A reference type value type value for evaluation during later operations. The default value for a
is shallow-copied during an assignment or as an argument for a method/function newly-declared reference type variable is `null`. A reference type value is
shallow-copied during an assignment or as an argument for a method/function
call. Assign `null` to a reference type variable to indicate the reference type call. Assign `null` to a reference type variable to indicate the reference type
value refers to no reference type instance. The JVM will garbage collect a value refers to no reference type instance. The JVM will garbage collect a
reference type instance when it is no longer referred to by any reference type reference type instance when it is no longer referred to by any reference type
@ -138,8 +139,8 @@ static member field::
A static member field is a named and typed piece of data. Each reference type A static member field is a named and typed piece of data. Each reference type
*object* contains one set of data representative of its static member fields. *object* contains one set of data representative of its static member fields.
Use the <<field-access, field access operator>> in correspondence with the Use the <<field-access-operator, field access operator>> in correspondence with
reference type object name to access a static member field for loading and the reference type object name to access a static member field for loading and
storing to a specific reference type *object*. No reference type instance storing to a specific reference type *object*. No reference type instance
allocation is necessary to use a static member field. allocation is necessary to use a static member field.
@ -148,32 +149,34 @@ non-static member field::
A non-static member field is a named and typed piece of data. Each reference A non-static member field is a named and typed piece of data. Each reference
type *instance* contains one set of data representative of its reference type type *instance* contains one set of data representative of its reference type
object's non-static member fields. Use the object's non-static member fields. Use the
<<field-access, field access operator>> for loading and storing to a non-static <<field-access-operator, field access operator>> for loading and storing to a
member field of a specific reference type *instance*. An allocated reference non-static member field of a specific reference type *instance*. An allocated
type instance is required to use a non-static member field. reference type instance is required to use a non-static member field.
static member method:: static member method::
A static member method is a function called on a reference type *object*. Use A static member method is a <<painless-functions, function>> called on a
the <<method-access, method call operator>> in correspondence with the reference reference type *object*. Use the <<method-call-operator, method call operator>>
type object name to call a static member method. No reference type instance in correspondence with the reference type object name to call a static member
allocation is necessary to use a static member method. method. No reference type instance allocation is necessary to use a static
member method.
non-static member method:: non-static member method::
A non-static member method is a function called on a reference type *instance*. A non-static member method is a <<painless-functions, function>> called on a
A non-static member method called on a reference type instance can load from and reference type *instance*. A non-static member method called on a reference type
store to non-static member fields of that specific reference type instance. Use instance can load from and store to non-static member fields of that specific
the <<method-access, method call operator>> in correspondence with a specific reference type instance. Use the <<method-call-operator, method call operator>>
reference type instance to call a non-static member method. An allocated in correspondence with a specific reference type instance to call a non-static
reference type instance is required to use a non-static member method. member method. An allocated reference type instance is required to use a
non-static member method.
constructor:: constructor::
A constructor is a special type of function used to allocate a reference type A constructor is a special type of <<painless-functions, function>> used to
*instance* defined by a specific reference type *object*. Use the allocate a reference type *instance* defined by a specific reference type
<<constructor-call, new instance operator>> to allocate a reference type *object*. Use the <<new-instance-operator, new instance operator>> to allocate
instance. a reference type instance.
A reference type object follows a basic inheritance model. Consider types A and A reference type object follows a basic inheritance model. Consider types A and
B. Type A is considered to be a parent of B, and B a child of A, if B inherits B. Type A is considered to be a parent of B, and B a child of A, if B inherits
@ -198,16 +201,16 @@ relationships.
<1> declare `List l`; <1> declare `List l`;
allocate `ArrayList` instance -> `ArrayList reference`; allocate `ArrayList` instance -> `ArrayList reference`;
implicit cast `ArrayList reference` to `List reference` -> `List reference`; implicit cast `ArrayList reference` to `List reference` -> `List reference`;
assign `List reference` to `l` store `List reference` to `l`
<2> access `l` -> `List reference`; <2> load from `l` -> `List reference`;
implicit cast `int 1` to `def` -> `def` implicit cast `int 1` to `def` -> `def`
call `add` on `List reference` with arguments (`def`) call `add` on `List reference` with arguments (`def`)
<3> declare `int i`; <3> declare `int i`;
access `l` -> `List reference`; load from `l` -> `List reference`;
call `get` on `List reference` with arguments (`int 0`) -> `def`; call `get` on `List reference` with arguments (`int 0`) -> `def`;
implicit cast `def` to `int 1` -> `int 1`; implicit cast `def` to `int 1` -> `int 1`;
add `int 1` and `int 2` -> `int 3`; add `int 1` and `int 2` -> `int 3`;
assign `int 3` to `i` store `int 3` to `i`
+ +
* Sharing a reference type instance. * Sharing a reference type instance.
+ +
@ -223,26 +226,26 @@ relationships.
<1> declare `List l0`; <1> declare `List l0`;
allocate `ArrayList` instance -> `ArrayList reference`; allocate `ArrayList` instance -> `ArrayList reference`;
implicit cast `ArrayList reference` to `List reference` -> `List reference`; implicit cast `ArrayList reference` to `List reference` -> `List reference`;
assign `List reference` to `l0` store `List reference` to `l0`
<2> declare `List l1`; <2> declare `List l1`;
access `l0` -> `List reference`; load from `l0` -> `List reference`;
assign `List reference` to `l1` store `List reference` to `l1`
(note `l0` and `l1` refer to the same instance known as a shallow-copy) (note `l0` and `l1` refer to the same instance known as a shallow-copy)
<3> access `l0` -> `List reference`; <3> load from `l0` -> `List reference`;
implicit cast `int 1` to `def` -> `def` implicit cast `int 1` to `def` -> `def`
call `add` on `List reference` with arguments (`def`) call `add` on `List reference` with arguments (`def`)
<4> access `l1` -> `List reference`; <4> load from `l1` -> `List reference`;
implicit cast `int 2` to `def` -> `def` implicit cast `int 2` to `def` -> `def`
call `add` on `List reference` with arguments (`def`) call `add` on `List reference` with arguments (`def`)
<5> declare `int i`; <5> declare `int i`;
access `l0` -> `List reference`; load from `l0` -> `List reference`;
call `get` on `List reference` with arguments (`int 0`) -> `def @0`; call `get` on `List reference` with arguments (`int 0`) -> `def @0`;
implicit cast `def @0` to `int 1` -> `int 1`; implicit cast `def @0` to `int 1` -> `int 1`;
access `l1` -> `List reference`; load from `l1` -> `List reference`;
call `get` on `List reference` with arguments (`int 1`) -> `def @1`; call `get` on `List reference` with arguments (`int 1`) -> `def @1`;
implicit cast `def @1` to `int 2` -> `int 2`; implicit cast `def @1` to `int 2` -> `int 2`;
add `int 1` and `int 2` -> `int 3`; add `int 1` and `int 2` -> `int 3`;
assign `int 3` to `i`; store `int 3` to `i`;
+ +
* Using the static members of a reference type. * Using the static members of a reference type.
+ +
@ -253,11 +256,11 @@ relationships.
---- ----
+ +
<1> declare `int i`; <1> declare `int i`;
access `MAX_VALUE` on `Integer` -> `int 2147483647`; load from `MAX_VALUE` on `Integer` -> `int 2147483647`;
assign `int 2147483647` to `i` store `int 2147483647` to `i`
<2> declare `long l`; <2> declare `long l`;
call `parseLong` on `Long` with arguments (`long 123`) -> `long 123`; call `parseLong` on `Long` with arguments (`long 123`) -> `long 123`;
assign `long 123` to `l` store `long 123` to `l`
[[dynamic-types]] [[dynamic-types]]
==== Dynamic Types ==== Dynamic Types
@ -268,11 +271,12 @@ the behavior of whatever value it represents at run-time and will always
represent the child-most descendant type value of any type value when evaluated represent the child-most descendant type value of any type value when evaluated
during operations. during operations.
Declare a `def` type <<painless-variables, variable>>, and assign it Declare a `def` type <<painless-variables, variable>> or access a `def` type
any type of value for evaluation during later operations. The default value member field (from a reference type instance), and assign it any type of value
for a newly-declared `def` type variable is `null`. A `def` type variable or for evaluation during later operations. The default value for a newly-declared
method/function parameter can change the type it represents during the `def` type variable is `null`. A `def` type variable or method/function
compilation and evaluation of a script. parameter can change the type it represents during the compilation and
evaluation of a script.
Using the `def` type can have a slight impact on performance. Use only primitive Using the `def` type can have a slight impact on performance. Use only primitive
types and reference types directly when performance is critical. types and reference types directly when performance is critical.
@ -295,13 +299,13 @@ types and reference types directly when performance is critical.
+ +
<1> declare `def dp`; <1> declare `def dp`;
implicit cast `int 1` to `def` -> `def`; implicit cast `int 1` to `def` -> `def`;
assign `def` to `dp` store `def` to `dp`
<2> declare `def dr`; <2> declare `def dr`;
allocate `ArrayList` instance -> `ArrayList reference`; allocate `ArrayList` instance -> `ArrayList reference`;
implicit cast `ArrayList reference` to `def` -> `def`; implicit cast `ArrayList reference` to `def` -> `def`;
assign `def` to `dr` store `def` to `dr`
<3> access `dp` -> `def`; <3> load from `dp` -> `def`;
assign `def` to `dr`; store `def` to `dr`;
(note the switch in the type `dr` represents from `ArrayList` to `int`) (note the switch in the type `dr` represents from `ArrayList` to `int`)
+ +
* A `def` type value representing the child-most descendant of a value. * A `def` type value representing the child-most descendant of a value.
@ -317,12 +321,12 @@ types and reference types directly when performance is critical.
allocate `ArrayList` instance -> `ArrayList reference`; allocate `ArrayList` instance -> `ArrayList reference`;
implicit cast `ArrayList reference` to `Object reference` implicit cast `ArrayList reference` to `Object reference`
-> `Object reference`; -> `Object reference`;
assign `Object reference` to `l` store `Object reference` to `l`
<2> declare `def d`; <2> declare `def d`;
access `l` -> `Object reference`; load from `l` -> `Object reference`;
implicit cast `Object reference` to `def` -> `def`; implicit cast `Object reference` to `def` -> `def`;
assign `def` to `d`; store `def` to `d`;
<3> access `d` -> `def`; <3> load from `d` -> `def`;
implicit cast `def` to `ArrayList reference` -> `ArrayList reference`; implicit cast `def` to `ArrayList reference` -> `ArrayList reference`;
call `ensureCapacity` on `ArrayList reference` with arguments (`int 10`); call `ensureCapacity` on `ArrayList reference` with arguments (`int 10`);
(note `def` was implicit cast to `ArrayList reference` (note `def` was implicit cast to `ArrayList reference`
@ -333,9 +337,9 @@ types and reference types directly when performance is critical.
==== String Type ==== String Type
The `String` type is a specialized reference type that does not require The `String` type is a specialized reference type that does not require
explicit allocation. Use a <<strings, string literal>> to directly evaluate a explicit allocation. Use a <<string-literals, string literal>> to directly
`String` type value. While not required, the evaluate a `String` type value. While not required, the
<<constructor-call, new instance operator>> can allocate `String` type <<new-instance-operator, new instance operator>> can allocate `String` type
instances. instances.
*Examples* *Examples*
@ -351,15 +355,15 @@ instances.
---- ----
+ +
<1> declare `String r`; <1> declare `String r`;
assign `String "some text"` to `r` store `String "some text"` to `r`
<2> declare `String s`; <2> declare `String s`;
assign `String 'some text'` to `s` store `String 'some text'` to `s`
<3> declare `String t`; <3> declare `String t`;
allocate `String` instance with arguments (`String "some text"`) allocate `String` instance with arguments (`String "some text"`)
-> `String "some text"`; -> `String "some text"`;
assign `String "some text"` to `t` store `String "some text"` to `t`
<4> declare `String u`; <4> declare `String u`;
assign default `null` to `u` store default `null` to `u`
[[void-type]] [[void-type]]
==== void Type ==== void Type
@ -382,35 +386,38 @@ void addToList(List l, def d) {
==== Array Type ==== Array Type
An array type is a specialized reference type where an array type instance An array type is a specialized reference type where an array type instance
represents a series of values allocated to the heap. All values in an array contains a series of values allocated to the heap. Each value in an array type
type instance are of the same type. Each value is assigned an index from within instance is defined as an element. All elements in an array type instance are of
the range `[0, length)` where length is the total number of values allocated for the same type (element type) specified as part of declaration. Each element is
the array type instance. assigned an index within the range `[0, length)` where length is the total
number of elements allocated for an array type instance.
Use the <<new-array, new array operator>> or the Use the <<new-array-operator, new array operator>> or the
<<array-initialization, array initialization operator>> to allocate an array <<array-initialization-operator, array initialization operator>> to allocate an
type instance. Declare an array type <<painless-variables, variable>>, and array type instance. Declare an array type <<painless-variables, variable>> or
assign it an array type value for evaluation during later operations. The access an array type member field (from a reference type instance), and assign
default value for a newly-declared array type variable is `null`. An array type it an array type value for evaluation during later operations. The default value
value is shallow-copied during an assignment or as an argument for a for a newly-declared array type variable is `null`. An array type value is
method/function call. Assign `null` to an array type variable to indicate the shallow-copied during an assignment or as an argument for a method/function
array type value refers to no array type instance. The JVM will garbage collect call. Assign `null` to an array type variable to indicate the array type value
an array type instance when it is no longer referred to by any array type refers to no array type instance. The JVM will garbage collect an array type
values. Pass `null` as an argument to a method/function call to indicate the instance when it is no longer referred to by any array type values. Pass `null`
argument refers to no array type instance. as an argument to a method/function call to indicate the argument refers to no
array type instance.
Use the <<array-length, array length operator>> to retrieve the length of an Use the <<array-length-operator, array length operator>> to retrieve the length
array type value as an int type value. Use the of an array type value as an `int` type value. Use the
<<array-access, array access operator>> to load from and store to individual <<array-access-operator, array access operator>> to load from and store to
values within an array type value. an individual element within an array type instance.
When an array type instance is allocated with multiple dimensions using the When an array type instance is allocated with multiple dimensions using the
range `[2, d]` where `d >= 2`, each dimension in the range `[1, d-1]` is also range `[2, d]` where `d >= 2`, each element within each dimension in the range
an array type. The array type of each dimension, `n`, is an array type with the `[1, d-1]` is also an array type. The element type of each dimension, `n`, is an
number of dimensions equal to `d-n`. For example, consider `int[][][]` with 3 array type with the number of dimensions equal to `d-n`. For example, consider
dimensions. The 3rd dimension, `d-3`, is the primitive type `int`. The 2nd `int[][][]` with 3 dimensions. Each element in the 3rd dimension, `d-3`, is the
dimension, `d-2`, is the array type `int[]`. And the 1st dimension, `d-1` is primitive type `int`. Each element in the 2nd dimension, `d-2`, is the array
the array type `int[][]`. type `int[]`. And each element in the 1st dimension, `d-1` is the array type
`int[][]`.
*Examples* *Examples*
@ -426,26 +433,26 @@ the array type `int[][]`.
---- ----
+ +
<1> declare `int[] x`; <1> declare `int[] x`;
assign default `null` to `x` store default `null` to `x`
<2> declare `float[] y`; <2> declare `float[] y`;
allocate `1-d float array` instance with `length [10]` allocate `1-d float array` instance with `length [10]`
-> `1-d float array reference`; -> `1-d float array reference`;
assign `1-d float array reference` to `y` store `1-d float array reference` to `y`
<3> declare `def z`; <3> declare `def z`;
allocate `1-d float array` instance with `length [5]` allocate `1-d float array` instance with `length [5]`
-> `1-d float array reference`; -> `1-d float array reference`;
implicit cast `1-d float array reference` to `def` -> `def`; implicit cast `1-d float array reference` to `def` -> `def`;
assign `def` to `z` store `def` to `z`
<4> access `y` -> `1-d float array reference`; <4> load from `y` -> `1-d float array reference`;
assign `float 1.0` to `index [9]` of `1-d float array reference` store `float 1.0` to `index [9]` of `1-d float array reference`
<5> access `y` -> `1-d float array reference @0`; <5> load from `y` -> `1-d float array reference @0`;
access `index [9]` of `1-d float array reference @0` -> `float 1.0`; load from `index [9]` of `1-d float array reference @0` -> `float 1.0`;
access `z` -> `def`; load from `z` -> `def`;
implicit cast `def` to `1-d float array reference @1` implicit cast `def` to `1-d float array reference @1`
-> `1-d float array reference @1`; -> `1-d float array reference @1`;
assign `float 1.0` to `index [0]` of `1-d float array reference @1` store `float 1.0` to `index [0]` of `1-d float array reference @1`
+ +
* Use of a multi-dimensional array. * General use of a multi-dimensional array.
+ +
[source,Painless] [source,Painless]
---- ----
@ -457,10 +464,10 @@ the array type `int[][]`.
<1> declare `int[][][] ia`; <1> declare `int[][][] ia`;
allocate `3-d int array` instance with length `[2, 3, 4]` allocate `3-d int array` instance with length `[2, 3, 4]`
-> `3-d int array reference`; -> `3-d int array reference`;
assign `3-d int array reference` to `ia3` store `3-d int array reference` to `ia3`
<2> access `ia3` -> `3-d int array reference`; <2> load from `ia3` -> `3-d int array reference`;
assign `int 99` to `index [1, 2, 3]` of `3-d int array reference` store `int 99` to `index [1, 2, 3]` of `3-d int array reference`
<3> declare `int i`; <3> declare `int i`;
access `ia3` -> `3-d int array reference`; load from `ia3` -> `3-d int array reference`;
access `index [1, 2, 3]` of `3-d int array reference` -> `int 99`; load from `index [1, 2, 3]` of `3-d int array reference` -> `int 99`;
assign `int 99` to `i` store `int 99` to `i`

View File

@ -4,7 +4,7 @@
A variable loads and stores a value for evaluation during A variable loads and stores a value for evaluation during
<<painless-operators, operations>>. <<painless-operators, operations>>.
[[declaration]] [[variable-declaration]]
==== Declaration ==== Declaration
Declare a variable before use with the format of <<painless-types, type>> Declare a variable before use with the format of <<painless-types, type>>
@ -12,16 +12,17 @@ followed by <<painless-identifiers, identifier>>. Declare an
<<array-type, array type>> variable using an opening `[` token and a closing `]` <<array-type, array type>> variable using an opening `[` token and a closing `]`
token for each dimension directly after the identifier. Specify a token for each dimension directly after the identifier. Specify a
comma-separated list of identifiers following the type to declare multiple comma-separated list of identifiers following the type to declare multiple
variables in a single statement. Use an <<assignment, assignment operator>> variables in a single statement. Use an
combined with a declaration to immediately assign a value to a variable. <<variable-assignment, assignment operator>> combined with a declaration to
A variable not immediately assigned a value will have a default value assigned immediately assign a value to a variable. A variable not immediately assigned a
implicitly based on the type. value will have a default value assigned implicitly based on the type.
*Errors* *Errors*
* If a variable is used prior to or without declaration. * If a variable is used prior to or without declaration.
*Grammar* *Grammar*
[source,ANTLR4] [source,ANTLR4]
---- ----
declaration : type ID assignment? (',' ID assignment?)*; declaration : type ID assignment? (',' ID assignment?)*;
@ -45,37 +46,39 @@ assignment: '=' expression;
---- ----
+ +
<1> declare `int x`; <1> declare `int x`;
assign default `null` to `x` store default `null` to `x`
<2> declare `List y`; <2> declare `List y`;
assign default `null` to `y` store default `null` to `y`
<3> declare `int x`; <3> declare `int x`;
assign default `int 0` to `x`; store default `int 0` to `x`;
declare `int y`; declare `int y`;
assign `int 5` to `y`; store `int 5` to `y`;
declare `int z`; declare `int z`;
assign default `int 0` to `z`; store default `int 0` to `z`;
<4> declare `def d`; <4> declare `def d`;
assign default `null` to `d` store default `null` to `d`
<5> declare `int i`; <5> declare `int i`;
assign `int 10` to `i` store `int 10` to `i`
<6> declare `float[] f`; <6> declare `float[] f`;
assign default `null` to `f` store default `null` to `f`
<7> declare `Map[][] m`; <7> declare `Map[][] m`;
assign default `null` to `m` store default `null` to `m`
[[assignment]] [[variable-assignment]]
==== Assignment ==== Assignment
Use the *assignment operator* to store a value in a variable. Any operation Use the `assignment operator '='` to store a value in a variable for use in
that produces a value can be assigned to any variable as long as the subsequent operations. Any operation that produces a value can be assigned to
<<painless-types, types>> are the same or the resultant type can be any variable as long as the <<painless-types, types>> are the same or the
<<painless-casting, implicitly cast>> to the variable type. resultant type can be <<painless-casting, implicitly cast>> to the variable
type.
*Errors* *Errors*
* If the type of value is unable to match the type of variable. * If the type of value is unable to match the type of variable.
*Grammar* *Grammar*
[source,ANTLR4] [source,ANTLR4]
---- ----
assignment: ID '=' expression assignment: ID '=' expression
@ -92,8 +95,8 @@ assignment: ID '=' expression
---- ----
+ +
<1> declare `int i`; <1> declare `int i`;
assign default `int 0` to `i` store default `int 0` to `i`
<2> assign `int 10` to `i` <2> store `int 10` to `i`
+ +
* Declaration combined with immediate assignment. * Declaration combined with immediate assignment.
+ +
@ -104,11 +107,11 @@ assignment: ID '=' expression
---- ----
+ +
<1> declare `int i`; <1> declare `int i`;
assign `int 10` to `i` store `int 10` to `i`
<2> declare `double j`; <2> declare `double j`;
assign `double 2.0` to `j` store `double 2.0` to `j`
+ +
* Assignment of one variable to another using primitive types. * Assignment of one variable to another using primitive type values.
+ +
[source,Painless] [source,Painless]
---- ----
@ -117,12 +120,13 @@ assignment: ID '=' expression
---- ----
+ +
<1> declare `int i`; <1> declare `int i`;
assign `int 10` to `i` store `int 10` to `i`
<2> declare `int j`; <2> declare `int j`;
access `i` -> `int 10`; load from `i` -> `int 10`;
assign `int 10` to `j` store `int 10` to `j`
+ +
* Assignment with reference types using the *new instance operator*. * Assignment with reference types using the
<<new-instance-operator, new instance operator>>.
+ +
[source,Painless] [source,Painless]
---- ----
@ -132,13 +136,13 @@ assignment: ID '=' expression
+ +
<1> declare `ArrayList l`; <1> declare `ArrayList l`;
allocate `ArrayList` instance -> `ArrayList reference`; allocate `ArrayList` instance -> `ArrayList reference`;
assign `ArrayList reference` to `l` store `ArrayList reference` to `l`
<2> declare `Map m`; <2> declare `Map m`;
allocate `HashMap` instance -> `HashMap reference`; allocate `HashMap` instance -> `HashMap reference`;
implicit cast `HashMap reference` to `Map reference` -> `Map reference`; implicit cast `HashMap reference` to `Map reference` -> `Map reference`;
assign `Map reference` to `m` store `Map reference` to `m`
+ +
* Assignment of one variable to another using reference types. * Assignment of one variable to another using reference type values.
+ +
[source,Painless] [source,Painless]
---- ----
@ -151,18 +155,19 @@ assignment: ID '=' expression
<1> declare `List l`; <1> declare `List l`;
allocate `ArrayList` instance -> `ArrayList reference`; allocate `ArrayList` instance -> `ArrayList reference`;
implicit cast `ArrayList reference` to `List reference` -> `List reference`; implicit cast `ArrayList reference` to `List reference` -> `List reference`;
assign `List reference` to `l` store `List reference` to `l`
<2> declare `List k`; <2> declare `List k`;
access `l` -> `List reference`; load from `l` -> `List reference`;
assign `List reference` to `k`; store `List reference` to `k`;
(note `l` and `k` refer to the same instance known as a shallow-copy) (note `l` and `k` refer to the same instance known as a shallow-copy)
<3> declare `List m`; <3> declare `List m`;
assign default `null` to `m` store default `null` to `m`
<4> access `k` -> `List reference`; <4> load from `k` -> `List reference`;
assign `List reference` to `m`; store `List reference` to `m`;
(note `l`, `k`, and `m` refer to the same instance) (note `l`, `k`, and `m` refer to the same instance)
+ +
* Assignment with an array type variable using the *new array operator*. * Assignment with array type variables using the
<<new-array-operator, new array operator>>.
+ +
[source,Painless] [source,Painless]
---- ----
@ -176,24 +181,24 @@ assignment: ID '=' expression
---- ----
+ +
<1> declare `int[] ia1`; <1> declare `int[] ia1`;
assign default `null` to `ia1` store default `null` to `ia1`
<2> allocate `1-d int array` instance with `length [2]` <2> allocate `1-d int array` instance with `length [2]`
-> `1-d int array reference`; -> `1-d int array reference`;
assign `1-d int array reference` to `ia1` store `1-d int array reference` to `ia1`
<3> access `ia1` -> `1-d int array reference`; <3> load from `ia1` -> `1-d int array reference`;
assign `int 1` to `index [0]` of `1-d int array reference` store `int 1` to `index [0]` of `1-d int array reference`
<4> declare `int[] ib1`; <4> declare `int[] ib1`;
access `ia1` -> `1-d int array reference`; load from `ia1` -> `1-d int array reference`;
assign `1-d int array reference` to `ib1`; store `1-d int array reference` to `ib1`;
(note `ia1` and `ib1` refer to the same instance known as a shallow copy) (note `ia1` and `ib1` refer to the same instance known as a shallow copy)
<5> declare `int[][] ic2`; <5> declare `int[][] ic2`;
allocate `2-d int array` instance with `length [2, 5]` allocate `2-d int array` instance with `length [2, 5]`
-> `2-d int array reference`; -> `2-d int array reference`;
assign `2-d int array reference` to `ic2` store `2-d int array reference` to `ic2`
<6> access `ic2` -> `2-d int array reference`; <6> load from `ic2` -> `2-d int array reference`;
assign `int 2` to `index [1, 3]` of `2-d int array reference` store `int 2` to `index [1, 3]` of `2-d int array reference`
<7> access `ia1` -> `1-d int array reference`; <7> load from `ia1` -> `1-d int array reference`;
access `ic2` -> `2-d int array reference`; load from `ic2` -> `2-d int array reference`;
assign `1-d int array reference` to store `1-d int array reference` to
`index [0]` of `2-d int array reference`; `index [0]` of `2-d int array reference`;
(note `ia1`, `ib1`, and `index [0]` of `ia2` refer to the same instance) (note `ia1`, `ib1`, and `index [0]` of `ia2` refer to the same instance)

View File

@ -14,17 +14,17 @@ include::getting-started.asciidoc[]
include::setup.asciidoc[] include::setup.asciidoc[]
include::{xes-repo-dir}/setup/setup-xes.asciidoc[] include::setup/setup-xes.asciidoc[]
include::{xes-repo-dir}/monitoring/configuring-monitoring.asciidoc[] include::{xes-repo-dir}/monitoring/configuring-monitoring.asciidoc[]
include::{xes-repo-dir}/security/configuring-es.asciidoc[] include::{xes-repo-dir}/security/configuring-es.asciidoc[]
include::{xes-repo-dir}/setup/setup-xclient.asciidoc[] include::setup/setup-xclient.asciidoc[]
include::settings/configuring-xes.asciidoc[] include::settings/configuring-xes.asciidoc[]
include::{xes-repo-dir}/setup/bootstrap-checks-xes.asciidoc[] include::setup/bootstrap-checks-xes.asciidoc[]
:edit_url: :edit_url:
include::upgrade.asciidoc[] include::upgrade.asciidoc[]

View File

@ -1325,7 +1325,7 @@ This pipeline will insert these named captures as new fields within the document
// NOTCONSOLE // NOTCONSOLE
[[custom-patterns]] [[custom-patterns]]
==== Custom Patterns and Pattern Files ==== Custom Patterns
The Grok processor comes pre-packaged with a base set of pattern. These patterns may not always have The Grok processor comes pre-packaged with a base set of pattern. These patterns may not always have
what you are looking for. Pattern have a very basic format. Each entry describes has a name and the pattern itself. what you are looking for. Pattern have a very basic format. Each entry describes has a name and the pattern itself.

View File

@ -115,7 +115,7 @@ PUT my_index/_doc/1
[[match-unmatch]] [[match-unmatch]]
==== `match` and `unmatch` ==== `match` and `unmatch`
The `match` parameter uses a pattern to match on the fieldname, while The `match` parameter uses a pattern to match on the field name, while
`unmatch` uses a pattern to exclude fields matched by `match`. `unmatch` uses a pattern to exclude fields matched by `match`.
The following example matches all `string` fields whose name starts with The following example matches all `string` fields whose name starts with
@ -259,7 +259,7 @@ PUT my_index/_doc/1
-------------------------------------------------- --------------------------------------------------
// CONSOLE // CONSOLE
<1> The `english` field is mapped as a `string` field with the `english` analyzer. <1> The `english` field is mapped as a `string` field with the `english` analyzer.
<2> The `count` field is mapped as a `long` field with `doc_values` disabled <2> The `count` field is mapped as a `long` field with `doc_values` disabled.
[[template-examples]] [[template-examples]]
==== Template examples ==== Template examples

View File

@ -100,11 +100,6 @@ PUT my_index/_mapping/_doc
<1> The mapping that you specify for `my_field` should consist of the existing <1> The mapping that you specify for `my_field` should consist of the existing
mapping for that field, plus the `fielddata` parameter. mapping for that field, plus the `fielddata` parameter.
TIP: The `fielddata.*` parameter must have the same settings for fields of the
same name in the same index. Its value can be updated on existing fields
using the <<indices-put-mapping,PUT mapping API>>.
[[field-data-filtering]] [[field-data-filtering]]
==== `fielddata_frequency_filter` ==== `fielddata_frequency_filter`

View File

@ -42,6 +42,8 @@ string:: <<text,`text`>> and <<keyword,`keyword`>>
<<feature>>:: Record numeric features to boost hits at query time. <<feature>>:: Record numeric features to boost hits at query time.
<<feature-vector>>:: Record numeric feature vectors to boost hits at query time.
[float] [float]
=== Multi-fields === Multi-fields
@ -90,4 +92,4 @@ include::types/parent-join.asciidoc[]
include::types/feature.asciidoc[] include::types/feature.asciidoc[]
include::types/feature-vector.asciidoc[]

View File

@ -0,0 +1,64 @@
[[feature-vector]]
=== Feature vector datatype
A `feature_vector` field can index numeric feature vectors, so that they can
later be used to boost documents in queries with a
<<query-dsl-feature-query,`feature`>> query.
It is analogous to the <<feature,`feature`>> datatype but is better suited
when the list of features is sparse so that it wouldn't be reasonable to add
one field to the mappings for each of them.
[source,js]
--------------------------------------------------
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"topics": {
"type": "feature_vector" <1>
}
}
}
}
}
PUT my_index/_doc/1
{
"topics": { <2>
"politics": 20,
"economics": 50.8
}
}
PUT my_index/_doc/2
{
"topics": {
"politics": 5.2,
"sports": 80.1
}
}
GET my_index/_search
{
"query": {
"feature": {
"field": "topics.politics"
}
}
}
--------------------------------------------------
// CONSOLE
<1> Feature vector fields must use the `feature_vector` field type
<2> Feature vector fields must be a hash with string keys and strictly positive numeric values
NOTE: `feature_vector` fields only support single-valued features and strictly
positive values. Multi-valued fields and zero or negative values will be rejected.
NOTE: `feature_vector` fields do not support sorting or aggregating and may
only be queried using <<query-dsl-feature-query,`feature`>> queries.
NOTE: `feature_vector` fields only preserve 9 significant bits for the
precision, which translates to a relative error of about 0.4%.

View File

@ -84,3 +84,9 @@ for a particular index with the index setting `index.max_regex_length`.
Search requests with extra content after the main object will no longer be accepted Search requests with extra content after the main object will no longer be accepted
by the `_search` endpoint. A parsing exception will be thrown instead. by the `_search` endpoint. A parsing exception will be thrown instead.
==== Semantics changed for `max_concurrent_shard_requests`
`max_concurrent_shard_requests` used to limit the total number of concurrent shard
requests a single high level search request can execute. In 7.0 this changed to be the
max number of concurrent shard requests per node. The default is now `5`.

View File

@ -325,5 +325,5 @@ the <<cluster.name,`cluster.name`>>, the <<node.name,`node.name`>> and the
<<modules-network,network settings>>. <<modules-network,network settings>>.
ifdef::include-xpack[] ifdef::include-xpack[]
include::{xes-repo-dir}/node.asciidoc[] include::ml-node.asciidoc[]
endif::include-xpack[] endif::include-xpack[]

View File

@ -44,7 +44,12 @@ time setting format). Defaults to `30s`.
|`transport.tcp.compress` |Set to `true` to enable compression (`DEFLATE`) |`transport.tcp.compress` |Set to `true` to enable compression (`DEFLATE`)
between all nodes. Defaults to `false`. between all nodes. Defaults to `false`.
|`transport.ping_schedule` | Schedule a regular ping message to ensure that connections are kept alive. Defaults to `5s` in the transport client and `-1` (disabled) elsewhere. |`transport.ping_schedule` | Schedule a regular application-level ping message
to ensure that transport connections between nodes are kept alive. Defaults to
`5s` in the transport client and `-1` (disabled) elsewhere. It is preferable to
correctly configure TCP keep-alives instead of using this feature, because TCP
keep-alives apply to all kinds of long-lived connection and not just to
transport connections.
|======================================================================= |=======================================================================
@ -80,6 +85,20 @@ The following parameters can be configured like that
* `tcp_send_buffer_size`: Configures the send buffer size of the socket * `tcp_send_buffer_size`: Configures the send buffer size of the socket
* `tcp_receive_buffer_size`: Configures the receive buffer size of the socket * `tcp_receive_buffer_size`: Configures the receive buffer size of the socket
[float]
==== Long-lived idle connections
Elasticsearch opens a number of long-lived TCP connections between each pair of
nodes in the cluster, and some of these connections may be idle for an extended
period of time. Nonetheless, Elasticsearch requires these connections to remain
open, and it can disrupt the operation of the cluster if any inter-node
connections are closed by an external influence such as a firewall. It is
important to configure your network to preserve long-lived idle connections
between Elasticsearch nodes, for instance by leaving `tcp_keep_alive` enabled
and ensuring that the keepalive interval is shorter than any timeout that might
cause idle connections to be closed, or by setting `transport.ping_schedule` if
keepalives cannot be configured.
[float] [float]
=== Transport Tracer === Transport Tracer

View File

@ -2,9 +2,10 @@
=== Feature Query === Feature Query
The `feature` query is a specialized query that only works on The `feature` query is a specialized query that only works on
<<feature,`feature`>> fields. Its goal is to boost the score of documents based <<feature,`feature`>> fields and <<feature-vector,`feature_vector`>> fields.
on the values of numeric features. It is typically put in a `should` clause of Its goal is to boost the score of documents based on the values of numeric
a <<query-dsl-bool-query,`bool`>> query so that its score is added to the score features. It is typically put in a `should` clause of a
<<query-dsl-bool-query,`bool`>> query so that its score is added to the score
of the query. of the query.
Compared to using <<query-dsl-function-score-query,`function_score`>> or other Compared to using <<query-dsl-function-score-query,`function_score`>> or other
@ -13,7 +14,16 @@ efficiently skip non-competitive hits when
<<search-uri-request,`track_total_hits`>> is set to `false`. Speedups may be <<search-uri-request,`track_total_hits`>> is set to `false`. Speedups may be
spectacular. spectacular.
Here is an example: Here is an example that indexes various features:
- https://en.wikipedia.org/wiki/PageRank[`pagerank`], a measure of the
importance of a website,
- `url_length`, the length of the url, which typically correlates negatively
with relevance,
- `topics`, which associates a list of topics with every document alongside a
measure of how well the document is connected to this topic.
Then the example includes an example query that searches for `"2016"` and boosts
based or `pagerank`, `url_length` and the `sports` topic.
[source,js] [source,js]
-------------------------------------------------- --------------------------------------------------
@ -28,6 +38,9 @@ PUT test
"url_length": { "url_length": {
"type": "feature", "type": "feature",
"positive_score_impact": false "positive_score_impact": false
},
"topics": {
"type": "feature_vector"
} }
} }
} }
@ -36,14 +49,39 @@ PUT test
PUT test/_doc/1 PUT test/_doc/1
{ {
"pagerank": 10, "url": "http://en.wikipedia.org/wiki/2016_Summer_Olympics",
"url_length": 50 "content": "Rio 2016",
"pagerank": 50.3,
"url_length": 42,
"topics": {
"sports": 50,
"brazil": 30
}
} }
PUT test/_doc/2 PUT test/_doc/2
{ {
"pagerank": 100, "url": "http://en.wikipedia.org/wiki/2016_Brazilian_Grand_Prix",
"url_length": 20 "content": "Formula One motor race held on 13 November 2016 at the Autódromo José Carlos Pace in São Paulo, Brazil",
"pagerank": 50.3,
"url_length": 47,
"topics": {
"sports": 35,
"formula one": 65,
"brazil": 20
}
}
PUT test/_doc/3
{
"url": "http://en.wikipedia.org/wiki/Deadpool_(film)",
"content": "Deadpool is a 2016 American superhero film",
"pagerank": 50.3,
"url_length": 37,
"topics": {
"movies": 60,
"super hero": 65
}
} }
POST test/_refresh POST test/_refresh
@ -51,17 +89,33 @@ POST test/_refresh
GET test/_search GET test/_search
{ {
"query": { "query": {
"feature": { "bool": {
"field": "pagerank" "must": [
} {
} "match": {
} "content": "2016"
}
GET test/_search }
{ ],
"query": { "should": [
"feature": { {
"field": "url_length" "feature": {
"field": "pagerank"
}
},
{
"feature": {
"field": "url_length",
"boost": 0.1
}
},
{
"feature": {
"field": "topics.sports",
"boost": 0.4
}
}
]
} }
} }
} }

View File

@ -241,6 +241,13 @@ number of terms that must match.
The syntax is the same as the <<query-dsl-minimum-should-match,minimum should match>>. The syntax is the same as the <<query-dsl-minimum-should-match,minimum should match>>.
(Defaults to `"30%"`). (Defaults to `"30%"`).
`fail_on_unsupported_field`::
Controls whether the query should fail (throw an exception) if any of the
specified fields are not of the supported types
(`text` or `keyword'). Set this to `false` to ignore the field and continue
processing. Defaults to
`true`.
`boost_terms`:: `boost_terms`::
Each term in the formed query could be further boosted by their tf-idf score. Each term in the formed query could be further boosted by their tf-idf score.
This sets the boost factor to use when using this feature. Defaults to This sets the boost factor to use when using this feature. Defaults to

View File

@ -37,10 +37,9 @@ GET /_search
-------------------------------------------------- --------------------------------------------------
// CONSOLE // CONSOLE
WARNING: By default `span_multi queries are rewritten to a `span_or` query WARNING: `span_multi` queries will hit too many clauses failure if the number of terms that match the query exceeds the
containing **all** the expanded terms. This can be expensive if the number of expanded boolean query limit (defaults to 1024).To avoid an unbounded expansion you can set the <<query-dsl-multi-term-rewrite,
terms is large. To avoid an unbounded expansion you can set the rewrite method>> of the multi term query to `top_terms_*` rewrite. Or, if you use `span_multi` on `prefix` query only,
<<query-dsl-multi-term-rewrite,rewrite method>> of the multi term query to `top_terms_*` you can activate the <<index-prefix-config,`index_prefixes`>> field option of the `text` field instead. This will
rewrite. Or, if you use `span_multi` on `prefix` query only, you can
activate the <<index-prefix-config,`index_prefixes`>> field option of the `text` field instead. This will
rewrite any prefix query on the field to a a single term query that matches the indexed prefix. rewrite any prefix query on the field to a a single term query that matches the indexed prefix.

View File

@ -288,8 +288,9 @@ GET /_search
"pin.location" : [-70, 40], "pin.location" : [-70, 40],
"order" : "asc", "order" : "asc",
"unit" : "km", "unit" : "km",
"mode" : "min", "mode" : "min",
"distance_type" : "arc" "distance_type" : "arc",
"ignore_unmapped": true
} }
} }
], ],
@ -317,6 +318,12 @@ GET /_search
The unit to use when computing sort values. The default is `m` (meters). The unit to use when computing sort values. The default is `m` (meters).
`ignore_unmapped`::
Indicates if the unmapped field should be treated as a missing value. Setting it to `true` is equivalent to specifying
an `unmapped_type` in the field sort. The default is `false` (unmapped field are causing the search to fail).
NOTE: geo distance sorting does not support configurable missing values: the NOTE: geo distance sorting does not support configurable missing values: the
distance will always be considered equal to +Infinity+ when a document does not distance will always be considered equal to +Infinity+ when a document does not
have values for the field that is used for distance computation. have values for the field that is used for distance computation.

View File

@ -87,7 +87,7 @@ Controls how often to roll over to a new index: `hourly`, `daily`, `weekly`, or
`xpack.security.audit.index.events.include`:: `xpack.security.audit.index.events.include`::
Specifies the audit events to be indexed. The default value is Specifies the audit events to be indexed. The default value is
`anonymous_access_denied, authentication_failed, realm_authentication_failed, access_granted, access_denied, tampered_request, connection_granted, connection_denied, run_as_granted, run_as_denied`. `anonymous_access_denied, authentication_failed, realm_authentication_failed, access_granted, access_denied, tampered_request, connection_granted, connection_denied, run_as_granted, run_as_denied`.
See {xpack-ref}/auditing.html#audit-event-types[Audit Entry Types] for the See {xpack-ref}/audit-event-types.html[Audit Entry Types] for the
complete list. complete list.
`xpack.security.audit.index.events.exclude`:: `xpack.security.audit.index.events.exclude`::

View File

@ -65,6 +65,5 @@ include::install/rpm.asciidoc[]
include::install/windows.asciidoc[] include::install/windows.asciidoc[]
ifdef::include-xpack[] include::install/docker.asciidoc[]
include::{xes-repo-dir}/setup/docker.asciidoc[]
endif::include-xpack[]

View File

@ -139,7 +139,7 @@ ifdef::include-xpack[]
==== Enable automatic creation of {xpack} indices ==== Enable automatic creation of {xpack} indices
{xpack} will try to automatically create a number of indices within Elasticsearch. {xpack} will try to automatically create a number of indices within Elasticsearch.
include::{xes-repo-dir}/setup/xpack-indices.asciidoc[] include::xpack-indices.asciidoc[]
endif::include-xpack[] endif::include-xpack[]

View File

@ -1,4 +1,3 @@
[role="xpack"]
[[docker]] [[docker]]
=== Install {es} with Docker === Install {es} with Docker

View File

@ -1,11 +1,10 @@
[role="exclude"] [role="exclude"]
==== Next steps ==== Next steps
You now have a test Elasticsearch environment set up. Before you start You now have a test {es} environment set up. Before you start
serious development or go into production with Elasticsearch, you will need to serious development or go into production with {es}, you must do some additional
do some additional setup: setup:
* Learn how to <<settings,configure Elasticsearch>>. * Learn how to <<settings,configure Elasticsearch>>.
* Configure <<important-settings,important Elasticsearch settings>>. * Configure <<important-settings,important Elasticsearch settings>>.
* Configure <<system-config,important system settings>>. * Configure <<system-config,important system settings>>.

View File

@ -126,7 +126,7 @@ ifdef::include-xpack[]
==== Enable automatic creation of {xpack} indices ==== Enable automatic creation of {xpack} indices
{xpack} will try to automatically create a number of indices within {es}. {xpack} will try to automatically create a number of indices within {es}.
include::{xes-repo-dir}/setup/xpack-indices.asciidoc[] include::xpack-indices.asciidoc[]
endif::include-xpack[] endif::include-xpack[]

Some files were not shown because too many files have changed in this diff Show More