Added types exists api
The types exists api checks whether one or more types exists in one or more indices. ## Example usage curl -XHEAD 'localhost:9200/twitter/tweet' ## Options * `index` - One or more indices. Either specified as query string parameter or in the uri path. * `type` - One or more types. Either specified as query string parameter or in the uri path. * `ignore_missing` - Determines what type of indices to exclude from a request. The option can have the following values: `none` or `missing`. Closes #2273
This commit is contained in:
parent
6fc0b83e07
commit
8080fdc509
|
@ -50,8 +50,10 @@ import org.elasticsearch.action.admin.indices.create.CreateIndexAction;
|
|||
import org.elasticsearch.action.admin.indices.create.TransportCreateIndexAction;
|
||||
import org.elasticsearch.action.admin.indices.delete.DeleteIndexAction;
|
||||
import org.elasticsearch.action.admin.indices.delete.TransportDeleteIndexAction;
|
||||
import org.elasticsearch.action.admin.indices.exists.IndicesExistsAction;
|
||||
import org.elasticsearch.action.admin.indices.exists.TransportIndicesExistsAction;
|
||||
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsAction;
|
||||
import org.elasticsearch.action.admin.indices.exists.indices.TransportIndicesExistsAction;
|
||||
import org.elasticsearch.action.admin.indices.exists.types.TransportTypesExistsAction;
|
||||
import org.elasticsearch.action.admin.indices.exists.types.TypesExistsAction;
|
||||
import org.elasticsearch.action.admin.indices.flush.FlushAction;
|
||||
import org.elasticsearch.action.admin.indices.flush.TransportFlushAction;
|
||||
import org.elasticsearch.action.admin.indices.gateway.snapshot.GatewaySnapshotAction;
|
||||
|
@ -98,7 +100,6 @@ import org.elasticsearch.action.deletebyquery.TransportDeleteByQueryAction;
|
|||
import org.elasticsearch.action.deletebyquery.TransportIndexDeleteByQueryAction;
|
||||
import org.elasticsearch.action.deletebyquery.TransportShardDeleteByQueryAction;
|
||||
import org.elasticsearch.action.explain.ExplainAction;
|
||||
import org.elasticsearch.action.explain.ExplainResponse;
|
||||
import org.elasticsearch.action.explain.TransportExplainAction;
|
||||
import org.elasticsearch.action.get.*;
|
||||
import org.elasticsearch.action.index.IndexAction;
|
||||
|
@ -179,6 +180,7 @@ public class ActionModule extends AbstractModule {
|
|||
registerAction(OpenIndexAction.INSTANCE, TransportOpenIndexAction.class);
|
||||
registerAction(CloseIndexAction.INSTANCE, TransportCloseIndexAction.class);
|
||||
registerAction(IndicesExistsAction.INSTANCE, TransportIndicesExistsAction.class);
|
||||
registerAction(TypesExistsAction.INSTANCE, TransportTypesExistsAction.class);
|
||||
registerAction(PutMappingAction.INSTANCE, TransportPutMappingAction.class);
|
||||
registerAction(DeleteMappingAction.INSTANCE, TransportDeleteMappingAction.class);
|
||||
registerAction(IndicesAliasesAction.INSTANCE, TransportIndicesAliasesAction.class);
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package org.elasticsearch.action.admin.indices.exists;
|
||||
package org.elasticsearch.action.admin.indices.exists.indices;
|
||||
|
||||
import org.elasticsearch.action.admin.indices.IndicesAction;
|
||||
import org.elasticsearch.client.IndicesAdminClient;
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package org.elasticsearch.action.admin.indices.exists;
|
||||
package org.elasticsearch.action.admin.indices.exists.indices;
|
||||
|
||||
import org.elasticsearch.action.ActionRequestValidationException;
|
||||
import org.elasticsearch.action.support.master.MasterNodeOperationRequest;
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package org.elasticsearch.action.admin.indices.exists;
|
||||
package org.elasticsearch.action.admin.indices.exists.indices;
|
||||
|
||||
import org.elasticsearch.action.ActionListener;
|
||||
import org.elasticsearch.action.admin.indices.support.BaseIndicesRequestBuilder;
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package org.elasticsearch.action.admin.indices.exists;
|
||||
package org.elasticsearch.action.admin.indices.exists.indices;
|
||||
|
||||
import org.elasticsearch.action.ActionResponse;
|
||||
import org.elasticsearch.common.io.stream.StreamInput;
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package org.elasticsearch.action.admin.indices.exists;
|
||||
package org.elasticsearch.action.admin.indices.exists.indices;
|
||||
|
||||
import org.elasticsearch.ElasticSearchException;
|
||||
import org.elasticsearch.action.ActionListener;
|
|
@ -0,0 +1,97 @@
|
|||
/*
|
||||
* Licensed to ElasticSearch and Shay Banon under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. ElasticSearch licenses this
|
||||
* file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.elasticsearch.action.admin.indices.exists.types;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import org.elasticsearch.ElasticSearchException;
|
||||
import org.elasticsearch.action.support.master.TransportMasterNodeOperationAction;
|
||||
import org.elasticsearch.cluster.ClusterService;
|
||||
import org.elasticsearch.cluster.ClusterState;
|
||||
import org.elasticsearch.cluster.block.ClusterBlockException;
|
||||
import org.elasticsearch.cluster.block.ClusterBlockLevel;
|
||||
import org.elasticsearch.cluster.metadata.MappingMetaData;
|
||||
import org.elasticsearch.common.inject.Inject;
|
||||
import org.elasticsearch.common.settings.Settings;
|
||||
import org.elasticsearch.threadpool.ThreadPool;
|
||||
import org.elasticsearch.transport.TransportService;
|
||||
|
||||
/**
|
||||
* Types exists transport action.
|
||||
*/
|
||||
public class TransportTypesExistsAction extends TransportMasterNodeOperationAction<TypesExistsRequest, TypesExistsResponse> {
|
||||
|
||||
@Inject
|
||||
public TransportTypesExistsAction(Settings settings, TransportService transportService, ClusterService clusterService,
|
||||
ThreadPool threadPool) {
|
||||
super(settings, transportService, clusterService, threadPool);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String executor() {
|
||||
return ThreadPool.Names.MANAGEMENT;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String transportAction() {
|
||||
return TypesExistsAction.NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TypesExistsRequest newRequest() {
|
||||
return new TypesExistsRequest();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TypesExistsResponse newResponse() {
|
||||
return new TypesExistsResponse();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ClusterBlockException checkBlock(TypesExistsRequest request, ClusterState state) {
|
||||
return state.blocks().indicesBlockedException(ClusterBlockLevel.METADATA, request.indices());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TypesExistsResponse masterOperation(TypesExistsRequest request, ClusterState state) throws ElasticSearchException {
|
||||
String[] concreteIndices = state.metaData().concreteIndices(request.indices(), request.ignoreIndices(), false);
|
||||
if (concreteIndices.length == 0) {
|
||||
return new TypesExistsResponse(false);
|
||||
}
|
||||
|
||||
for (String concreteIndex : concreteIndices) {
|
||||
if (!state.metaData().hasConcreteIndex(concreteIndex)) {
|
||||
return new TypesExistsResponse(false);
|
||||
}
|
||||
|
||||
ImmutableMap<String, MappingMetaData> mappings = state.metaData().getIndices().get(concreteIndex).mappings();
|
||||
if (mappings.isEmpty()) {
|
||||
return new TypesExistsResponse(false);
|
||||
}
|
||||
|
||||
for (String type : request.types()) {
|
||||
if (!mappings.containsKey(type)) {
|
||||
return new TypesExistsResponse(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return new TypesExistsResponse(true);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
* Licensed to ElasticSearch and Shay Banon under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. ElasticSearch licenses this
|
||||
* file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.elasticsearch.action.admin.indices.exists.types;
|
||||
|
||||
import org.elasticsearch.action.admin.indices.IndicesAction;
|
||||
import org.elasticsearch.client.IndicesAdminClient;
|
||||
|
||||
/**
|
||||
*/
|
||||
public class TypesExistsAction extends IndicesAction<TypesExistsRequest, TypesExistsResponse, TypesExistsRequestBuilder> {
|
||||
|
||||
public static final TypesExistsAction INSTANCE = new TypesExistsAction();
|
||||
public static final String NAME = "indices/types/exists";
|
||||
|
||||
private TypesExistsAction() {
|
||||
super(NAME);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TypesExistsResponse newResponse() {
|
||||
return new TypesExistsResponse();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TypesExistsRequestBuilder newRequestBuilder(IndicesAdminClient client) {
|
||||
return new TypesExistsRequestBuilder(client);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,101 @@
|
|||
/*
|
||||
* Licensed to ElasticSearch and Shay Banon under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. ElasticSearch licenses this
|
||||
* file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.elasticsearch.action.admin.indices.exists.types;
|
||||
|
||||
import org.elasticsearch.action.ActionRequestValidationException;
|
||||
import org.elasticsearch.action.support.IgnoreIndices;
|
||||
import org.elasticsearch.action.support.master.MasterNodeOperationRequest;
|
||||
import org.elasticsearch.common.io.stream.StreamInput;
|
||||
import org.elasticsearch.common.io.stream.StreamOutput;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import static org.elasticsearch.action.ValidateActions.addValidationError;
|
||||
|
||||
/**
|
||||
*/
|
||||
public class TypesExistsRequest extends MasterNodeOperationRequest {
|
||||
|
||||
private String[] indices;
|
||||
private String[] types;
|
||||
|
||||
private IgnoreIndices ignoreIndices = IgnoreIndices.NONE;
|
||||
|
||||
TypesExistsRequest() {
|
||||
}
|
||||
|
||||
public TypesExistsRequest(String[] indices, String... types) {
|
||||
this.indices = indices;
|
||||
this.types = types;
|
||||
}
|
||||
|
||||
public String[] indices() {
|
||||
return indices;
|
||||
}
|
||||
|
||||
public void indices(String[] indices) {
|
||||
this.indices = indices;
|
||||
}
|
||||
|
||||
public String[] types() {
|
||||
return types;
|
||||
}
|
||||
|
||||
public void types(String[] types) {
|
||||
this.types = types;
|
||||
}
|
||||
|
||||
public IgnoreIndices ignoreIndices() {
|
||||
return ignoreIndices;
|
||||
}
|
||||
|
||||
public TypesExistsRequest ignoreIndices(IgnoreIndices ignoreIndices) {
|
||||
this.ignoreIndices = ignoreIndices;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ActionRequestValidationException validate() {
|
||||
ActionRequestValidationException validationException = null;
|
||||
if (indices == null) { // Specifying '*' via rest api results in an empty array
|
||||
validationException = addValidationError("index/indices is missing", validationException);
|
||||
}
|
||||
if (types == null || types.length == 0) {
|
||||
validationException = addValidationError("type/types is missing", validationException);
|
||||
}
|
||||
|
||||
return validationException;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeTo(StreamOutput out) throws IOException {
|
||||
super.writeTo(out);
|
||||
out.writeStringArray(indices);
|
||||
out.writeStringArray(types);
|
||||
out.writeByte(ignoreIndices.id());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readFrom(StreamInput in) throws IOException {
|
||||
super.readFrom(in);
|
||||
indices = in.readStringArray();
|
||||
types = in.readStringArray();
|
||||
ignoreIndices = IgnoreIndices.fromId(in.readByte());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
* Licensed to ElasticSearch and Shay Banon under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. ElasticSearch licenses this
|
||||
* file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.elasticsearch.action.admin.indices.exists.types;
|
||||
|
||||
import org.elasticsearch.action.ActionListener;
|
||||
import org.elasticsearch.action.admin.indices.support.BaseIndicesRequestBuilder;
|
||||
import org.elasticsearch.action.support.IgnoreIndices;
|
||||
import org.elasticsearch.client.IndicesAdminClient;
|
||||
import org.elasticsearch.common.Strings;
|
||||
|
||||
/**
|
||||
* A builder for {@link TypesExistsRequest}.
|
||||
*/
|
||||
public class TypesExistsRequestBuilder extends BaseIndicesRequestBuilder<TypesExistsRequest, TypesExistsResponse> {
|
||||
|
||||
/**
|
||||
* @param indices What indices to check for types
|
||||
*/
|
||||
public TypesExistsRequestBuilder(IndicesAdminClient indicesClient, String... indices) {
|
||||
super(indicesClient, new TypesExistsRequest(indices, Strings.EMPTY_ARRAY));
|
||||
}
|
||||
|
||||
TypesExistsRequestBuilder(IndicesAdminClient client) {
|
||||
super(client, new TypesExistsRequest());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param indices What indices to check for types
|
||||
*/
|
||||
public TypesExistsRequestBuilder setIndices(String[] indices) {
|
||||
request.indices(indices);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param types The types to check if they exist
|
||||
*/
|
||||
public TypesExistsRequestBuilder setTypes(String... types) {
|
||||
request.types(types);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ignoreIndices Specifies how to resolve indices that aren't active / ready
|
||||
*/
|
||||
public TypesExistsRequestBuilder setIgnoreIndices(IgnoreIndices ignoreIndices) {
|
||||
request.ignoreIndices(ignoreIndices);
|
||||
return this;
|
||||
}
|
||||
|
||||
protected void doExecute(ActionListener<TypesExistsResponse> listener) {
|
||||
client.typesExists(request, listener);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* Licensed to ElasticSearch and Shay Banon under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. ElasticSearch licenses this
|
||||
* file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.elasticsearch.action.admin.indices.exists.types;
|
||||
|
||||
import org.elasticsearch.action.ActionResponse;
|
||||
import org.elasticsearch.common.io.stream.StreamInput;
|
||||
import org.elasticsearch.common.io.stream.StreamOutput;
|
||||
import org.elasticsearch.common.io.stream.Streamable;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Whether all of the existed types exist.
|
||||
*/
|
||||
public class TypesExistsResponse implements ActionResponse, Streamable {
|
||||
|
||||
private boolean exists;
|
||||
|
||||
TypesExistsResponse() {
|
||||
}
|
||||
|
||||
public TypesExistsResponse(boolean exists) {
|
||||
this.exists = exists;
|
||||
}
|
||||
|
||||
public boolean exists() {
|
||||
return this.exists;
|
||||
}
|
||||
|
||||
public boolean isExists() {
|
||||
return exists();
|
||||
}
|
||||
|
||||
public void readFrom(StreamInput in) throws IOException {
|
||||
exists = in.readBoolean();
|
||||
}
|
||||
|
||||
public void writeTo(StreamOutput out) throws IOException {
|
||||
out.writeBoolean(exists);
|
||||
}
|
||||
}
|
|
@ -39,9 +39,12 @@ import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
|
|||
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
|
||||
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequestBuilder;
|
||||
import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse;
|
||||
import org.elasticsearch.action.admin.indices.exists.IndicesExistsRequest;
|
||||
import org.elasticsearch.action.admin.indices.exists.IndicesExistsRequestBuilder;
|
||||
import org.elasticsearch.action.admin.indices.exists.IndicesExistsResponse;
|
||||
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
|
||||
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequestBuilder;
|
||||
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
|
||||
import org.elasticsearch.action.admin.indices.exists.types.TypesExistsRequest;
|
||||
import org.elasticsearch.action.admin.indices.exists.types.TypesExistsRequestBuilder;
|
||||
import org.elasticsearch.action.admin.indices.exists.types.TypesExistsResponse;
|
||||
import org.elasticsearch.action.admin.indices.flush.FlushRequest;
|
||||
import org.elasticsearch.action.admin.indices.flush.FlushRequestBuilder;
|
||||
import org.elasticsearch.action.admin.indices.flush.FlushResponse;
|
||||
|
@ -129,6 +132,28 @@ public interface IndicesAdminClient {
|
|||
*/
|
||||
IndicesExistsRequestBuilder prepareExists(String... indices);
|
||||
|
||||
|
||||
/**
|
||||
* Types Exists.
|
||||
*
|
||||
* @param request The types exists request
|
||||
* @return The result future
|
||||
*/
|
||||
ActionFuture<TypesExistsResponse> typesExists(TypesExistsRequest request);
|
||||
|
||||
/**
|
||||
* Types exists
|
||||
*
|
||||
* @param request The types exists
|
||||
* @param listener A listener to be notified with a result
|
||||
*/
|
||||
void typesExists(TypesExistsRequest request, ActionListener<TypesExistsResponse> listener);
|
||||
|
||||
/**
|
||||
* Indices exists.
|
||||
*/
|
||||
TypesExistsRequestBuilder prepareTypesExists(String... index);
|
||||
|
||||
/**
|
||||
* Indices stats.
|
||||
*/
|
||||
|
|
|
@ -32,7 +32,7 @@ import org.elasticsearch.action.admin.indices.cache.clear.ClearIndicesCacheReque
|
|||
import org.elasticsearch.action.admin.indices.close.CloseIndexRequest;
|
||||
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
|
||||
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
|
||||
import org.elasticsearch.action.admin.indices.exists.IndicesExistsRequest;
|
||||
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
|
||||
import org.elasticsearch.action.admin.indices.flush.FlushRequest;
|
||||
import org.elasticsearch.action.admin.indices.gateway.snapshot.GatewaySnapshotRequest;
|
||||
import org.elasticsearch.action.admin.indices.mapping.delete.DeleteMappingRequest;
|
||||
|
@ -195,7 +195,7 @@ public class Requests {
|
|||
*
|
||||
* @param indices The indices to check if they exists or not.
|
||||
* @return The indices exists request
|
||||
* @see org.elasticsearch.client.IndicesAdminClient#exists(org.elasticsearch.action.admin.indices.exists.IndicesExistsRequest)
|
||||
* @see org.elasticsearch.client.IndicesAdminClient#exists(org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest)
|
||||
*/
|
||||
public static IndicesExistsRequest indicesExistsRequest(String... indices) {
|
||||
return new IndicesExistsRequest(indices);
|
||||
|
|
|
@ -45,10 +45,14 @@ import org.elasticsearch.action.admin.indices.delete.DeleteIndexAction;
|
|||
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
|
||||
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequestBuilder;
|
||||
import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse;
|
||||
import org.elasticsearch.action.admin.indices.exists.IndicesExistsAction;
|
||||
import org.elasticsearch.action.admin.indices.exists.IndicesExistsRequest;
|
||||
import org.elasticsearch.action.admin.indices.exists.IndicesExistsRequestBuilder;
|
||||
import org.elasticsearch.action.admin.indices.exists.IndicesExistsResponse;
|
||||
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsAction;
|
||||
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
|
||||
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequestBuilder;
|
||||
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
|
||||
import org.elasticsearch.action.admin.indices.exists.types.TypesExistsAction;
|
||||
import org.elasticsearch.action.admin.indices.exists.types.TypesExistsRequest;
|
||||
import org.elasticsearch.action.admin.indices.exists.types.TypesExistsRequestBuilder;
|
||||
import org.elasticsearch.action.admin.indices.exists.types.TypesExistsResponse;
|
||||
import org.elasticsearch.action.admin.indices.flush.FlushAction;
|
||||
import org.elasticsearch.action.admin.indices.flush.FlushRequest;
|
||||
import org.elasticsearch.action.admin.indices.flush.FlushRequestBuilder;
|
||||
|
@ -141,6 +145,21 @@ public abstract class AbstractIndicesAdminClient implements InternalIndicesAdmin
|
|||
return new IndicesExistsRequestBuilder(this, indices);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionFuture<TypesExistsResponse> typesExists(TypesExistsRequest request) {
|
||||
return execute(TypesExistsAction.INSTANCE, request);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void typesExists(TypesExistsRequest request, ActionListener<TypesExistsResponse> listener) {
|
||||
execute(TypesExistsAction.INSTANCE, request, listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TypesExistsRequestBuilder prepareTypesExists(String... index) {
|
||||
return new TypesExistsRequestBuilder(this, index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionFuture<IndicesAliasesResponse> aliases(final IndicesAliasesRequest request) {
|
||||
return execute(IndicesAliasesAction.INSTANCE, request);
|
||||
|
|
|
@ -39,7 +39,8 @@ import org.elasticsearch.rest.action.admin.indices.cache.clear.RestClearIndicesC
|
|||
import org.elasticsearch.rest.action.admin.indices.close.RestCloseIndexAction;
|
||||
import org.elasticsearch.rest.action.admin.indices.create.RestCreateIndexAction;
|
||||
import org.elasticsearch.rest.action.admin.indices.delete.RestDeleteIndexAction;
|
||||
import org.elasticsearch.rest.action.admin.indices.exists.RestIndicesExistsAction;
|
||||
import org.elasticsearch.rest.action.admin.indices.exists.indices.RestIndicesExistsAction;
|
||||
import org.elasticsearch.rest.action.admin.indices.exists.types.RestTypesExistsAction;
|
||||
import org.elasticsearch.rest.action.admin.indices.flush.RestFlushAction;
|
||||
import org.elasticsearch.rest.action.admin.indices.gateway.snapshot.RestGatewaySnapshotAction;
|
||||
import org.elasticsearch.rest.action.admin.indices.mapping.delete.RestDeleteMappingAction;
|
||||
|
@ -109,6 +110,7 @@ public class RestActionModule extends AbstractModule {
|
|||
bind(RestClusterRerouteAction.class).asEagerSingleton();
|
||||
|
||||
bind(RestIndicesExistsAction.class).asEagerSingleton();
|
||||
bind(RestTypesExistsAction.class).asEagerSingleton();
|
||||
bind(RestIndicesStatsAction.class).asEagerSingleton();
|
||||
bind(RestIndicesStatusAction.class).asEagerSingleton();
|
||||
bind(RestIndicesSegmentsAction.class).asEagerSingleton();
|
||||
|
|
|
@ -17,12 +17,12 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package org.elasticsearch.rest.action.admin.indices.exists;
|
||||
package org.elasticsearch.rest.action.admin.indices.exists.indices;
|
||||
|
||||
import org.elasticsearch.ExceptionsHelper;
|
||||
import org.elasticsearch.action.ActionListener;
|
||||
import org.elasticsearch.action.admin.indices.exists.IndicesExistsRequest;
|
||||
import org.elasticsearch.action.admin.indices.exists.IndicesExistsResponse;
|
||||
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
|
||||
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
|
||||
import org.elasticsearch.client.Client;
|
||||
import org.elasticsearch.common.inject.Inject;
|
||||
import org.elasticsearch.common.settings.Settings;
|
|
@ -0,0 +1,82 @@
|
|||
/*
|
||||
* Licensed to ElasticSearch and Shay Banon under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. ElasticSearch licenses this
|
||||
* file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.elasticsearch.rest.action.admin.indices.exists.types;
|
||||
|
||||
import org.elasticsearch.ExceptionsHelper;
|
||||
import org.elasticsearch.action.ActionListener;
|
||||
import org.elasticsearch.action.admin.indices.exists.types.TypesExistsRequest;
|
||||
import org.elasticsearch.action.admin.indices.exists.types.TypesExistsResponse;
|
||||
import org.elasticsearch.action.support.IgnoreIndices;
|
||||
import org.elasticsearch.client.Client;
|
||||
import org.elasticsearch.common.inject.Inject;
|
||||
import org.elasticsearch.common.settings.Settings;
|
||||
import org.elasticsearch.rest.*;
|
||||
|
||||
import static org.elasticsearch.rest.RestRequest.Method.HEAD;
|
||||
import static org.elasticsearch.rest.RestStatus.NOT_FOUND;
|
||||
import static org.elasticsearch.rest.RestStatus.OK;
|
||||
import static org.elasticsearch.rest.action.support.RestActions.splitIndices;
|
||||
import static org.elasticsearch.rest.action.support.RestActions.splitTypes;
|
||||
|
||||
/**
|
||||
* Rest api for checking if a type exists.
|
||||
*/
|
||||
public class RestTypesExistsAction extends BaseRestHandler {
|
||||
|
||||
@Inject
|
||||
public RestTypesExistsAction(Settings settings, Client client, RestController controller) {
|
||||
super(settings, client);
|
||||
controller.registerHandler(HEAD, "/{index}/{type}", this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleRequest(final RestRequest request, final RestChannel channel) {
|
||||
TypesExistsRequest typesExistsRequest = new TypesExistsRequest(
|
||||
splitIndices(request.param("index")), splitTypes(request.param("type"))
|
||||
);
|
||||
typesExistsRequest.listenerThreaded(false);
|
||||
if (request.hasParam("ignore_indices")) {
|
||||
typesExistsRequest.ignoreIndices(IgnoreIndices.fromString(request.param("ignore_indices")));
|
||||
}
|
||||
client.admin().indices().typesExists(typesExistsRequest, new ActionListener<TypesExistsResponse>() {
|
||||
@Override
|
||||
public void onResponse(TypesExistsResponse response) {
|
||||
try {
|
||||
if (response.exists()) {
|
||||
channel.sendResponse(new StringRestResponse(OK));
|
||||
} else {
|
||||
channel.sendResponse(new StringRestResponse(NOT_FOUND));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
onFailure(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable e) {
|
||||
try {
|
||||
channel.sendResponse(new StringRestResponse(ExceptionsHelper.status(e)));
|
||||
} catch (Exception e1) {
|
||||
logger.error("Failed to send failure response", e1);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
|
@ -22,7 +22,7 @@ package org.elasticsearch.test.integration.blocks;
|
|||
import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsRequestBuilder;
|
||||
import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsResponse;
|
||||
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
|
||||
import org.elasticsearch.action.admin.indices.exists.IndicesExistsResponse;
|
||||
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
|
||||
import org.elasticsearch.action.admin.indices.settings.UpdateSettingsRequestBuilder;
|
||||
import org.elasticsearch.action.admin.indices.settings.UpdateSettingsResponse;
|
||||
import org.elasticsearch.action.index.IndexRequestBuilder;
|
||||
|
|
|
@ -22,7 +22,7 @@ package org.elasticsearch.test.integration.document;
|
|||
import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse;
|
||||
import org.elasticsearch.action.admin.cluster.health.ClusterHealthStatus;
|
||||
import org.elasticsearch.action.admin.indices.cache.clear.ClearIndicesCacheResponse;
|
||||
import org.elasticsearch.action.admin.indices.exists.IndicesExistsResponse;
|
||||
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
|
||||
import org.elasticsearch.action.admin.indices.flush.FlushResponse;
|
||||
import org.elasticsearch.action.admin.indices.optimize.OptimizeResponse;
|
||||
import org.elasticsearch.action.admin.indices.refresh.RefreshResponse;
|
||||
|
|
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
* Licensed to ElasticSearch and Shay Banon under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. ElasticSearch licenses this
|
||||
* file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.elasticsearch.test.integration.indices.exists.types;
|
||||
|
||||
import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse;
|
||||
import org.elasticsearch.action.admin.indices.exists.types.TypesExistsResponse;
|
||||
import org.elasticsearch.action.support.IgnoreIndices;
|
||||
import org.elasticsearch.client.Client;
|
||||
import org.elasticsearch.test.integration.AbstractNodesTests;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
|
||||
public class TypesExistsTests extends AbstractNodesTests {
|
||||
|
||||
@Test
|
||||
public void testSimple() throws Exception {
|
||||
startNode("node1");
|
||||
Client client = client("node1");
|
||||
client.admin().indices().prepareCreate("test1")
|
||||
.addMapping("type1", jsonBuilder().startObject().startObject("type1").endObject().endObject())
|
||||
.addMapping("type2", jsonBuilder().startObject().startObject("type2").endObject().endObject())
|
||||
.execute().actionGet();
|
||||
client.admin().indices().prepareCreate("test2")
|
||||
.addMapping("type1", jsonBuilder().startObject().startObject("type1").endObject().endObject())
|
||||
.execute().actionGet();
|
||||
client.admin().indices().prepareAliases().addAlias("test1", "alias1").execute().actionGet();
|
||||
ClusterHealthResponse healthResponse = client.admin().cluster()
|
||||
.prepareHealth("test1", "test2").setWaitForYellowStatus().execute().actionGet();
|
||||
assertThat(healthResponse.timedOut(), equalTo(false));
|
||||
|
||||
TypesExistsResponse response = client.admin().indices().prepareTypesExists("test1").setTypes("type1").execute().actionGet();
|
||||
assertThat(response.exists(), equalTo(true));
|
||||
response = client.admin().indices().prepareTypesExists("test1").setTypes("type2").execute().actionGet();
|
||||
assertThat(response.exists(), equalTo(true));
|
||||
response = client.admin().indices().prepareTypesExists("test1").setTypes("type3").execute().actionGet();
|
||||
assertThat(response.exists(), equalTo(false));
|
||||
response = client.admin().indices().prepareTypesExists("notExist").setTypes("type1").setIgnoreIndices(IgnoreIndices.MISSING).execute().actionGet();
|
||||
assertThat(response.exists(), equalTo(false));
|
||||
response = client.admin().indices().prepareTypesExists("notExist").setTypes("type0").setIgnoreIndices(IgnoreIndices.MISSING).execute().actionGet();
|
||||
assertThat(response.exists(), equalTo(false));
|
||||
response = client.admin().indices().prepareTypesExists("alias1").setTypes("type1").execute().actionGet();
|
||||
assertThat(response.exists(), equalTo(true));
|
||||
response = client.admin().indices().prepareTypesExists("*").setTypes("type1").execute().actionGet();
|
||||
assertThat(response.exists(), equalTo(true));
|
||||
response = client.admin().indices().prepareTypesExists("test1", "test2").setTypes("type1").execute().actionGet();
|
||||
assertThat(response.exists(), equalTo(true));
|
||||
response = client.admin().indices().prepareTypesExists("test1", "test2").setTypes("type2").execute().actionGet();
|
||||
assertThat(response.exists(), equalTo(false));
|
||||
|
||||
client.close();
|
||||
closeAllNodes();
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue