Create Index API: Allow to provide mappings. closes #541.
This commit is contained in:
parent
151715dc2f
commit
526f28f479
|
@ -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.<String, Object>newMapBuilder().put(type, source).map();
|
||||
}
|
||||
try {
|
||||
|
|
|
@ -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<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) {
|
||||
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<CreateIndexResponse>() {
|
||||
@Override public void onResponse(CreateIndexResponse response) {
|
||||
try {
|
||||
|
|
Loading…
Reference in New Issue