Create Index API: Allow to provide mappings. closes #541.

This commit is contained in:
kimchy 2010-11-27 00:28:18 +02:00
parent 151715dc2f
commit 526f28f479
2 changed files with 41 additions and 14 deletions

View File

@ -192,7 +192,7 @@ public class CreateIndexRequest extends MasterNodeOperationRequest {
*/ */
public CreateIndexRequest mapping(String type, Map source) { public CreateIndexRequest mapping(String type, Map source) {
// wrap it in a type map if its not // wrap it in a type map if its not
if (source.size() != 1 || source.containsKey(type)) { if (source.size() != 1 || !source.containsKey(type)) {
source = MapBuilder.<String, Object>newMapBuilder().put(type, source).map(); source = MapBuilder.<String, Object>newMapBuilder().put(type, source).map();
} }
try { try {

View File

@ -23,18 +23,19 @@ import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse; import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.client.Client; import org.elasticsearch.client.Client;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.settings.SettingsException; import org.elasticsearch.common.settings.SettingsException;
import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.indices.IndexAlreadyExistsException; import org.elasticsearch.indices.IndexAlreadyExistsException;
import org.elasticsearch.indices.InvalidIndexNameException; import org.elasticsearch.indices.InvalidIndexNameException;
import org.elasticsearch.rest.*; import org.elasticsearch.rest.*;
import org.elasticsearch.rest.action.support.RestXContentBuilder; import org.elasticsearch.rest.action.support.RestXContentBuilder;
import java.io.IOException; import java.io.IOException;
import java.util.Map;
import static org.elasticsearch.ExceptionsHelper.*; import static org.elasticsearch.ExceptionsHelper.*;
import static org.elasticsearch.common.unit.TimeValue.*; import static org.elasticsearch.common.unit.TimeValue.*;
@ -51,12 +52,36 @@ public class RestCreateIndexAction extends BaseRestHandler {
controller.registerHandler(RestRequest.Method.POST, "/{index}", this); controller.registerHandler(RestRequest.Method.POST, "/{index}", this);
} }
@SuppressWarnings({"unchecked"})
@Override public void handleRequest(final RestRequest request, final RestChannel channel) { @Override public void handleRequest(final RestRequest request, final RestChannel channel) {
String bodySettings = request.contentAsString(); CreateIndexRequest createIndexRequest = new CreateIndexRequest(request.param("index"));
Settings indexSettings = ImmutableSettings.Builder.EMPTY_SETTINGS; if (request.hasContent()) {
if (Strings.hasText(bodySettings)) { XContentType xContentType = XContentFactory.xContentType(request.contentByteArray(), request.contentByteArrayOffset(), request.contentLength());
if (xContentType != null) {
try { try {
indexSettings = ImmutableSettings.settingsBuilder().loadFromSource(bodySettings).build(); Map<String, Object> source = XContentFactory.xContent(xContentType)
.createParser(request.contentByteArray(), request.contentByteArrayOffset(), request.contentLength()).mapAndClose();
if (source.containsKey("settings")) {
createIndexRequest.settings((Map<String, Object>) source.get("settings"));
}
if (source.containsKey("mappings")) {
Map<String, Object> mappings = (Map<String, Object>) source.get("mappings");
for (Map.Entry<String, Object> entry : mappings.entrySet()) {
createIndexRequest.mapping(entry.getKey(), (Map<String, Object>) entry.getValue());
}
}
} catch (Exception e) {
try {
channel.sendResponse(new XContentThrowableRestResponse(request, e));
} catch (IOException e1) {
logger.warn("Failed to send response", e1);
return;
}
}
} else {
// its plain settings, parse and set them
try {
createIndexRequest.settings(request.contentAsString());
} catch (Exception e) { } catch (Exception e) {
try { try {
channel.sendResponse(new XContentThrowableRestResponse(request, BAD_REQUEST, new SettingsException("Failed to parse index settings", e))); channel.sendResponse(new XContentThrowableRestResponse(request, BAD_REQUEST, new SettingsException("Failed to parse index settings", e)));
@ -66,8 +91,10 @@ public class RestCreateIndexAction extends BaseRestHandler {
} }
} }
} }
CreateIndexRequest createIndexRequest = new CreateIndexRequest(request.param("index"), indexSettings); }
createIndexRequest.timeout(request.paramAsTime("timeout", timeValueSeconds(10))); createIndexRequest.timeout(request.paramAsTime("timeout", timeValueSeconds(10)));
client.admin().indices().create(createIndexRequest, new ActionListener<CreateIndexResponse>() { client.admin().indices().create(createIndexRequest, new ActionListener<CreateIndexResponse>() {
@Override public void onResponse(CreateIndexResponse response) { @Override public void onResponse(CreateIndexResponse response) {
try { try {