From 526f28f47981bfa83d79f5c09b2f6b5724649b78 Mon Sep 17 00:00:00 2001 From: kimchy Date: Sat, 27 Nov 2010 00:28:18 +0200 Subject: [PATCH] Create Index API: Allow to provide mappings. closes #541. --- .../indices/create/CreateIndexRequest.java | 2 +- .../indices/create/RestCreateIndexAction.java | 53 ++++++++++++++----- 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexRequest.java b/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexRequest.java index 95ab2f6b7b7..a0bd4ca2b34 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexRequest.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexRequest.java @@ -192,7 +192,7 @@ public class CreateIndexRequest extends MasterNodeOperationRequest { */ public CreateIndexRequest mapping(String type, Map source) { // 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.newMapBuilder().put(type, source).map(); } try { diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/admin/indices/create/RestCreateIndexAction.java b/modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/admin/indices/create/RestCreateIndexAction.java index f612b3738cb..42c7a9cc150 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/admin/indices/create/RestCreateIndexAction.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/admin/indices/create/RestCreateIndexAction.java @@ -23,18 +23,19 @@ import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; import org.elasticsearch.action.admin.indices.create.CreateIndexResponse; import org.elasticsearch.client.Client; -import org.elasticsearch.common.Strings; import org.elasticsearch.common.inject.Inject; -import org.elasticsearch.common.settings.ImmutableSettings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.SettingsException; 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.InvalidIndexNameException; import org.elasticsearch.rest.*; import org.elasticsearch.rest.action.support.RestXContentBuilder; import java.io.IOException; +import java.util.Map; import static org.elasticsearch.ExceptionsHelper.*; import static org.elasticsearch.common.unit.TimeValue.*; @@ -51,23 +52,49 @@ public class RestCreateIndexAction extends BaseRestHandler { controller.registerHandler(RestRequest.Method.POST, "/{index}", this); } + @SuppressWarnings({"unchecked"}) @Override public void handleRequest(final RestRequest request, final RestChannel channel) { - String bodySettings = request.contentAsString(); - Settings indexSettings = ImmutableSettings.Builder.EMPTY_SETTINGS; - if (Strings.hasText(bodySettings)) { - try { - indexSettings = ImmutableSettings.settingsBuilder().loadFromSource(bodySettings).build(); - } catch (Exception e) { + CreateIndexRequest createIndexRequest = new CreateIndexRequest(request.param("index")); + if (request.hasContent()) { + XContentType xContentType = XContentFactory.xContentType(request.contentByteArray(), request.contentByteArrayOffset(), request.contentLength()); + if (xContentType != null) { try { - channel.sendResponse(new XContentThrowableRestResponse(request, BAD_REQUEST, new SettingsException("Failed to parse index settings", e))); - } catch (IOException e1) { - logger.warn("Failed to send response", e1); - return; + Map source = XContentFactory.xContent(xContentType) + .createParser(request.contentByteArray(), request.contentByteArrayOffset(), request.contentLength()).mapAndClose(); + if (source.containsKey("settings")) { + createIndexRequest.settings((Map) source.get("settings")); + } + if (source.containsKey("mappings")) { + Map mappings = (Map) source.get("mappings"); + for (Map.Entry entry : mappings.entrySet()) { + createIndexRequest.mapping(entry.getKey(), (Map) 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) { + try { + channel.sendResponse(new XContentThrowableRestResponse(request, BAD_REQUEST, new SettingsException("Failed to parse index settings", e))); + } catch (IOException e1) { + logger.warn("Failed to send response", e1); + return; + } } } } - CreateIndexRequest createIndexRequest = new CreateIndexRequest(request.param("index"), indexSettings); + createIndexRequest.timeout(request.paramAsTime("timeout", timeValueSeconds(10))); + client.admin().indices().create(createIndexRequest, new ActionListener() { @Override public void onResponse(CreateIndexResponse response) { try {