mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-03-26 01:48:45 +00:00
Add _operation field to index, update, delete responses
Performing the bulk request shown in #19267 now results in the following: ``` {"_index":"test","_type":"test","_id":"1","_version":1,"_operation":"create","forced_refresh":false,"_shards":{"total":2,"successful":1,"failed":0},"status":201} {"_index":"test","_type":"test","_id":"1","_version":1,"_operation":"noop","forced_refresh":false,"_shards":{"total":2,"successful":1,"failed":0},"status":200} ```
This commit is contained in:
parent
b208a7dbae
commit
8f2882a442
@ -25,6 +25,7 @@ import org.elasticsearch.action.support.replication.ReplicationResponse;
|
|||||||
import org.elasticsearch.common.Nullable;
|
import org.elasticsearch.common.Nullable;
|
||||||
import org.elasticsearch.common.io.stream.StreamInput;
|
import org.elasticsearch.common.io.stream.StreamInput;
|
||||||
import org.elasticsearch.common.io.stream.StreamOutput;
|
import org.elasticsearch.common.io.stream.StreamOutput;
|
||||||
|
import org.elasticsearch.common.io.stream.Writeable;
|
||||||
import org.elasticsearch.common.xcontent.StatusToXContent;
|
import org.elasticsearch.common.xcontent.StatusToXContent;
|
||||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
import org.elasticsearch.index.IndexSettings;
|
import org.elasticsearch.index.IndexSettings;
|
||||||
@ -32,29 +33,83 @@ import org.elasticsearch.index.shard.ShardId;
|
|||||||
import org.elasticsearch.rest.RestStatus;
|
import org.elasticsearch.rest.RestStatus;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A base class for the response of a write operation that involves a single doc
|
* A base class for the response of a write operation that involves a single doc
|
||||||
*/
|
*/
|
||||||
public abstract class DocWriteResponse extends ReplicationResponse implements WriteResponse, StatusToXContent {
|
public abstract class DocWriteResponse extends ReplicationResponse implements WriteResponse, StatusToXContent {
|
||||||
|
|
||||||
|
public enum Operation implements Writeable {
|
||||||
|
CREATE(0),
|
||||||
|
INDEX(1),
|
||||||
|
DELETE(2),
|
||||||
|
NOOP(3);
|
||||||
|
|
||||||
|
private final byte op;
|
||||||
|
private final String lowercase;
|
||||||
|
|
||||||
|
Operation(int op) {
|
||||||
|
this.op = (byte) op;
|
||||||
|
this.lowercase = this.toString().toLowerCase(Locale.ENGLISH);
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte getOp() {
|
||||||
|
return op;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLowercase() {
|
||||||
|
return lowercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Operation readFrom(StreamInput in) throws IOException{
|
||||||
|
Byte opcode = in.readByte();
|
||||||
|
switch(opcode){
|
||||||
|
case 0:
|
||||||
|
return CREATE;
|
||||||
|
case 1:
|
||||||
|
return INDEX;
|
||||||
|
case 2:
|
||||||
|
return DELETE;
|
||||||
|
case 3:
|
||||||
|
return NOOP;
|
||||||
|
default:
|
||||||
|
throw new IllegalArgumentException("Unknown operation code: " + opcode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeTo(StreamOutput out) throws IOException {
|
||||||
|
out.writeByte(op);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private ShardId shardId;
|
private ShardId shardId;
|
||||||
private String id;
|
private String id;
|
||||||
private String type;
|
private String type;
|
||||||
private long version;
|
private long version;
|
||||||
private boolean forcedRefresh;
|
private boolean forcedRefresh;
|
||||||
|
protected Operation operation;
|
||||||
|
|
||||||
public DocWriteResponse(ShardId shardId, String type, String id, long version) {
|
public DocWriteResponse(ShardId shardId, String type, String id, long version, Operation operation) {
|
||||||
this.shardId = shardId;
|
this.shardId = shardId;
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.version = version;
|
this.version = version;
|
||||||
|
this.operation = operation;
|
||||||
}
|
}
|
||||||
|
|
||||||
// needed for deserialization
|
// needed for deserialization
|
||||||
protected DocWriteResponse() {
|
protected DocWriteResponse() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The change that occurred to the document.
|
||||||
|
*/
|
||||||
|
public Operation getOperation() {
|
||||||
|
return operation;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The index the document was changed in.
|
* The index the document was changed in.
|
||||||
*/
|
*/
|
||||||
@ -143,6 +198,7 @@ public abstract class DocWriteResponse extends ReplicationResponse implements Wr
|
|||||||
id = in.readString();
|
id = in.readString();
|
||||||
version = in.readZLong();
|
version = in.readZLong();
|
||||||
forcedRefresh = in.readBoolean();
|
forcedRefresh = in.readBoolean();
|
||||||
|
operation = Operation.readFrom(in);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -153,22 +209,17 @@ public abstract class DocWriteResponse extends ReplicationResponse implements Wr
|
|||||||
out.writeString(id);
|
out.writeString(id);
|
||||||
out.writeZLong(version);
|
out.writeZLong(version);
|
||||||
out.writeBoolean(forcedRefresh);
|
out.writeBoolean(forcedRefresh);
|
||||||
}
|
operation.writeTo(out);
|
||||||
|
|
||||||
static final class Fields {
|
|
||||||
static final String _INDEX = "_index";
|
|
||||||
static final String _TYPE = "_type";
|
|
||||||
static final String _ID = "_id";
|
|
||||||
static final String _VERSION = "_version";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
|
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
|
||||||
ReplicationResponse.ShardInfo shardInfo = getShardInfo();
|
ReplicationResponse.ShardInfo shardInfo = getShardInfo();
|
||||||
builder.field(Fields._INDEX, shardId.getIndexName())
|
builder.field("_index", shardId.getIndexName())
|
||||||
.field(Fields._TYPE, type)
|
.field("_type", type)
|
||||||
.field(Fields._ID, id)
|
.field("_id", id)
|
||||||
.field(Fields._VERSION, version)
|
.field("_version", version)
|
||||||
|
.field("_operation", getOperation().getLowercase())
|
||||||
.field("forced_refresh", forcedRefresh);
|
.field("forced_refresh", forcedRefresh);
|
||||||
shardInfo.toXContent(builder, params);
|
shardInfo.toXContent(builder, params);
|
||||||
return builder;
|
return builder;
|
||||||
|
@ -248,7 +248,7 @@ public class TransportShardBulkAction extends TransportWriteAction<BulkShardRequ
|
|||||||
BytesReference indexSourceAsBytes = indexRequest.source();
|
BytesReference indexSourceAsBytes = indexRequest.source();
|
||||||
// add the response
|
// add the response
|
||||||
IndexResponse indexResponse = result.getResponse();
|
IndexResponse indexResponse = result.getResponse();
|
||||||
UpdateResponse updateResponse = new UpdateResponse(indexResponse.getShardInfo(), indexResponse.getShardId(), indexResponse.getType(), indexResponse.getId(), indexResponse.getVersion(), indexResponse.isCreated());
|
UpdateResponse updateResponse = new UpdateResponse(indexResponse.getShardInfo(), indexResponse.getShardId(), indexResponse.getType(), indexResponse.getId(), indexResponse.getVersion(), indexResponse.getOperation());
|
||||||
if (updateRequest.fields() != null && updateRequest.fields().length > 0) {
|
if (updateRequest.fields() != null && updateRequest.fields().length > 0) {
|
||||||
Tuple<XContentType, Map<String, Object>> sourceAndContent = XContentHelper.convertToMap(indexSourceAsBytes, true);
|
Tuple<XContentType, Map<String, Object>> sourceAndContent = XContentHelper.convertToMap(indexSourceAsBytes, true);
|
||||||
updateResponse.setGetResult(updateHelper.extractGetResult(updateRequest, request.index(), indexResponse.getVersion(), sourceAndContent.v2(), sourceAndContent.v1(), indexSourceAsBytes));
|
updateResponse.setGetResult(updateHelper.extractGetResult(updateRequest, request.index(), indexResponse.getVersion(), sourceAndContent.v2(), sourceAndContent.v1(), indexSourceAsBytes));
|
||||||
@ -261,7 +261,7 @@ public class TransportShardBulkAction extends TransportWriteAction<BulkShardRequ
|
|||||||
WriteResult<DeleteResponse> writeResult = updateResult.writeResult;
|
WriteResult<DeleteResponse> writeResult = updateResult.writeResult;
|
||||||
DeleteResponse response = writeResult.getResponse();
|
DeleteResponse response = writeResult.getResponse();
|
||||||
DeleteRequest deleteRequest = updateResult.request();
|
DeleteRequest deleteRequest = updateResult.request();
|
||||||
updateResponse = new UpdateResponse(response.getShardInfo(), response.getShardId(), response.getType(), response.getId(), response.getVersion(), false);
|
updateResponse = new UpdateResponse(response.getShardInfo(), response.getShardId(), response.getType(), response.getId(), response.getVersion(), response.getOperation());
|
||||||
updateResponse.setGetResult(updateHelper.extractGetResult(updateRequest, request.index(), response.getVersion(), updateResult.result.updatedSourceAsMap(), updateResult.result.updateSourceContentType(), null));
|
updateResponse.setGetResult(updateHelper.extractGetResult(updateRequest, request.index(), response.getVersion(), updateResult.result.updatedSourceAsMap(), updateResult.result.updateSourceContentType(), null));
|
||||||
// Replace the update request to the translated delete request to execute on the replica.
|
// Replace the update request to the translated delete request to execute on the replica.
|
||||||
item = request.items()[requestIndex] = new BulkItemRequest(request.items()[requestIndex].id(), deleteRequest);
|
item = request.items()[requestIndex] = new BulkItemRequest(request.items()[requestIndex].id(), deleteRequest);
|
||||||
|
@ -20,8 +20,6 @@
|
|||||||
package org.elasticsearch.action.delete;
|
package org.elasticsearch.action.delete;
|
||||||
|
|
||||||
import org.elasticsearch.action.DocWriteResponse;
|
import org.elasticsearch.action.DocWriteResponse;
|
||||||
import org.elasticsearch.common.io.stream.StreamInput;
|
|
||||||
import org.elasticsearch.common.io.stream.StreamOutput;
|
|
||||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
import org.elasticsearch.index.shard.ShardId;
|
import org.elasticsearch.index.shard.ShardId;
|
||||||
import org.elasticsearch.rest.RestStatus;
|
import org.elasticsearch.rest.RestStatus;
|
||||||
@ -36,52 +34,29 @@ import java.io.IOException;
|
|||||||
*/
|
*/
|
||||||
public class DeleteResponse extends DocWriteResponse {
|
public class DeleteResponse extends DocWriteResponse {
|
||||||
|
|
||||||
private boolean found;
|
|
||||||
|
|
||||||
public DeleteResponse() {
|
public DeleteResponse() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public DeleteResponse(ShardId shardId, String type, String id, long version, boolean found) {
|
public DeleteResponse(ShardId shardId, String type, String id, long version, boolean found) {
|
||||||
super(shardId, type, id, version);
|
super(shardId, type, id, version, found ? Operation.DELETE : Operation.NOOP);
|
||||||
this.found = found;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns <tt>true</tt> if a doc was found to delete.
|
* Returns <tt>true</tt> if a doc was found to delete.
|
||||||
*/
|
*/
|
||||||
public boolean isFound() {
|
public boolean isFound() {
|
||||||
return found;
|
return operation == Operation.DELETE;
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void readFrom(StreamInput in) throws IOException {
|
|
||||||
super.readFrom(in);
|
|
||||||
found = in.readBoolean();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeTo(StreamOutput out) throws IOException {
|
|
||||||
super.writeTo(out);
|
|
||||||
out.writeBoolean(found);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RestStatus status() {
|
public RestStatus status() {
|
||||||
if (found == false) {
|
return isFound() ? super.status() : RestStatus.NOT_FOUND;
|
||||||
return RestStatus.NOT_FOUND;
|
|
||||||
}
|
|
||||||
return super.status();
|
|
||||||
}
|
|
||||||
|
|
||||||
static final class Fields {
|
|
||||||
static final String FOUND = "found";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
|
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
|
||||||
builder.field(Fields.FOUND, isFound());
|
builder.field("found", isFound());
|
||||||
super.toXContent(builder, params);
|
super.toXContent(builder, params);
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
@ -94,7 +69,7 @@ public class DeleteResponse extends DocWriteResponse {
|
|||||||
builder.append(",type=").append(getType());
|
builder.append(",type=").append(getType());
|
||||||
builder.append(",id=").append(getId());
|
builder.append(",id=").append(getId());
|
||||||
builder.append(",version=").append(getVersion());
|
builder.append(",version=").append(getVersion());
|
||||||
builder.append(",found=").append(found);
|
builder.append(",operation=").append(getOperation().getLowercase());
|
||||||
builder.append(",shards=").append(getShardInfo());
|
builder.append(",shards=").append(getShardInfo());
|
||||||
return builder.append("]").toString();
|
return builder.append("]").toString();
|
||||||
}
|
}
|
||||||
|
@ -36,42 +36,24 @@ import java.io.IOException;
|
|||||||
*/
|
*/
|
||||||
public class IndexResponse extends DocWriteResponse {
|
public class IndexResponse extends DocWriteResponse {
|
||||||
|
|
||||||
private boolean created;
|
|
||||||
|
|
||||||
public IndexResponse() {
|
public IndexResponse() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public IndexResponse(ShardId shardId, String type, String id, long version, boolean created) {
|
public IndexResponse(ShardId shardId, String type, String id, long version, boolean created) {
|
||||||
super(shardId, type, id, version);
|
super(shardId, type, id, version, created ? Operation.CREATE : Operation.INDEX);
|
||||||
this.created = created;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the document was created, false if updated.
|
* Returns true if the document was created, false if updated.
|
||||||
*/
|
*/
|
||||||
public boolean isCreated() {
|
public boolean isCreated() {
|
||||||
return this.created;
|
return this.operation == Operation.CREATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RestStatus status() {
|
public RestStatus status() {
|
||||||
if (created) {
|
return isCreated() ? RestStatus.CREATED : super.status();
|
||||||
return RestStatus.CREATED;
|
|
||||||
}
|
|
||||||
return super.status();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void readFrom(StreamInput in) throws IOException {
|
|
||||||
super.readFrom(in);
|
|
||||||
created = in.readBoolean();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeTo(StreamOutput out) throws IOException {
|
|
||||||
super.writeTo(out);
|
|
||||||
out.writeBoolean(created);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -82,19 +64,15 @@ public class IndexResponse extends DocWriteResponse {
|
|||||||
builder.append(",type=").append(getType());
|
builder.append(",type=").append(getType());
|
||||||
builder.append(",id=").append(getId());
|
builder.append(",id=").append(getId());
|
||||||
builder.append(",version=").append(getVersion());
|
builder.append(",version=").append(getVersion());
|
||||||
builder.append(",created=").append(created);
|
builder.append(",operation=").append(getOperation().getLowercase());
|
||||||
builder.append(",shards=").append(getShardInfo());
|
builder.append(",shards=").append(getShardInfo());
|
||||||
return builder.append("]").toString();
|
return builder.append("]").toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
static final class Fields {
|
|
||||||
static final String CREATED = "created";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
|
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
|
||||||
super.toXContent(builder, params);
|
super.toXContent(builder, params);
|
||||||
builder.field(Fields.CREATED, isCreated());
|
builder.field("created", isCreated());
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,7 @@ package org.elasticsearch.action.update;
|
|||||||
import org.elasticsearch.ExceptionsHelper;
|
import org.elasticsearch.ExceptionsHelper;
|
||||||
import org.elasticsearch.action.ActionListener;
|
import org.elasticsearch.action.ActionListener;
|
||||||
import org.elasticsearch.action.ActionRunnable;
|
import org.elasticsearch.action.ActionRunnable;
|
||||||
|
import org.elasticsearch.action.DocWriteResponse;
|
||||||
import org.elasticsearch.action.RoutingMissingException;
|
import org.elasticsearch.action.RoutingMissingException;
|
||||||
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;
|
||||||
@ -185,7 +186,7 @@ public class TransportUpdateAction extends TransportInstanceSingleOperationActio
|
|||||||
indexAction.execute(upsertRequest, new ActionListener<IndexResponse>() {
|
indexAction.execute(upsertRequest, new ActionListener<IndexResponse>() {
|
||||||
@Override
|
@Override
|
||||||
public void onResponse(IndexResponse response) {
|
public void onResponse(IndexResponse response) {
|
||||||
UpdateResponse update = new UpdateResponse(response.getShardInfo(), response.getShardId(), response.getType(), response.getId(), response.getVersion(), response.isCreated());
|
UpdateResponse update = new UpdateResponse(response.getShardInfo(), response.getShardId(), response.getType(), response.getId(), response.getVersion(), response.getOperation());
|
||||||
if (request.fields() != null && request.fields().length > 0) {
|
if (request.fields() != null && request.fields().length > 0) {
|
||||||
Tuple<XContentType, Map<String, Object>> sourceAndContent = XContentHelper.convertToMap(upsertSourceBytes, true);
|
Tuple<XContentType, Map<String, Object>> sourceAndContent = XContentHelper.convertToMap(upsertSourceBytes, true);
|
||||||
update.setGetResult(updateHelper.extractGetResult(request, request.concreteIndex(), response.getVersion(), sourceAndContent.v2(), sourceAndContent.v1(), upsertSourceBytes));
|
update.setGetResult(updateHelper.extractGetResult(request, request.concreteIndex(), response.getVersion(), sourceAndContent.v2(), sourceAndContent.v1(), upsertSourceBytes));
|
||||||
@ -223,7 +224,7 @@ public class TransportUpdateAction extends TransportInstanceSingleOperationActio
|
|||||||
indexAction.execute(indexRequest, new ActionListener<IndexResponse>() {
|
indexAction.execute(indexRequest, new ActionListener<IndexResponse>() {
|
||||||
@Override
|
@Override
|
||||||
public void onResponse(IndexResponse response) {
|
public void onResponse(IndexResponse response) {
|
||||||
UpdateResponse update = new UpdateResponse(response.getShardInfo(), response.getShardId(), response.getType(), response.getId(), response.getVersion(), response.isCreated());
|
UpdateResponse update = new UpdateResponse(response.getShardInfo(), response.getShardId(), response.getType(), response.getId(), response.getVersion(), response.getOperation());
|
||||||
update.setGetResult(updateHelper.extractGetResult(request, request.concreteIndex(), response.getVersion(), result.updatedSourceAsMap(), result.updateSourceContentType(), indexSourceBytes));
|
update.setGetResult(updateHelper.extractGetResult(request, request.concreteIndex(), response.getVersion(), result.updatedSourceAsMap(), result.updateSourceContentType(), indexSourceBytes));
|
||||||
update.setForcedRefresh(response.forcedRefresh());
|
update.setForcedRefresh(response.forcedRefresh());
|
||||||
listener.onResponse(update);
|
listener.onResponse(update);
|
||||||
@ -252,7 +253,7 @@ public class TransportUpdateAction extends TransportInstanceSingleOperationActio
|
|||||||
deleteAction.execute(deleteRequest, new ActionListener<DeleteResponse>() {
|
deleteAction.execute(deleteRequest, new ActionListener<DeleteResponse>() {
|
||||||
@Override
|
@Override
|
||||||
public void onResponse(DeleteResponse response) {
|
public void onResponse(DeleteResponse response) {
|
||||||
UpdateResponse update = new UpdateResponse(response.getShardInfo(), response.getShardId(), response.getType(), response.getId(), response.getVersion(), false);
|
UpdateResponse update = new UpdateResponse(response.getShardInfo(), response.getShardId(), response.getType(), response.getId(), response.getVersion(), response.getOperation());
|
||||||
update.setGetResult(updateHelper.extractGetResult(request, request.concreteIndex(), response.getVersion(), result.updatedSourceAsMap(), result.updateSourceContentType(), null));
|
update.setGetResult(updateHelper.extractGetResult(request, request.concreteIndex(), response.getVersion(), result.updatedSourceAsMap(), result.updateSourceContentType(), null));
|
||||||
update.setForcedRefresh(response.forcedRefresh());
|
update.setForcedRefresh(response.forcedRefresh());
|
||||||
listener.onResponse(update);
|
listener.onResponse(update);
|
||||||
|
@ -116,7 +116,7 @@ public class UpdateHelper extends AbstractComponent {
|
|||||||
request.script.getScript());
|
request.script.getScript());
|
||||||
}
|
}
|
||||||
UpdateResponse update = new UpdateResponse(shardId, getResult.getType(), getResult.getId(),
|
UpdateResponse update = new UpdateResponse(shardId, getResult.getType(), getResult.getId(),
|
||||||
getResult.getVersion(), false);
|
getResult.getVersion(), UpdateResponse.convert(Operation.NONE));
|
||||||
update.setGetResult(getResult);
|
update.setGetResult(getResult);
|
||||||
return new Result(update, Operation.NONE, upsertDoc, XContentType.JSON);
|
return new Result(update, Operation.NONE, upsertDoc, XContentType.JSON);
|
||||||
}
|
}
|
||||||
@ -234,12 +234,12 @@ public class UpdateHelper extends AbstractComponent {
|
|||||||
.setRefreshPolicy(request.getRefreshPolicy());
|
.setRefreshPolicy(request.getRefreshPolicy());
|
||||||
return new Result(deleteRequest, Operation.DELETE, updatedSourceAsMap, updateSourceContentType);
|
return new Result(deleteRequest, Operation.DELETE, updatedSourceAsMap, updateSourceContentType);
|
||||||
} else if ("none".equals(operation)) {
|
} else if ("none".equals(operation)) {
|
||||||
UpdateResponse update = new UpdateResponse(shardId, getResult.getType(), getResult.getId(), getResult.getVersion(), false);
|
UpdateResponse update = new UpdateResponse(shardId, getResult.getType(), getResult.getId(), getResult.getVersion(), UpdateResponse.convert(Operation.NONE));
|
||||||
update.setGetResult(extractGetResult(request, request.index(), getResult.getVersion(), updatedSourceAsMap, updateSourceContentType, getResult.internalSourceRef()));
|
update.setGetResult(extractGetResult(request, request.index(), getResult.getVersion(), updatedSourceAsMap, updateSourceContentType, getResult.internalSourceRef()));
|
||||||
return new Result(update, Operation.NONE, updatedSourceAsMap, updateSourceContentType);
|
return new Result(update, Operation.NONE, updatedSourceAsMap, updateSourceContentType);
|
||||||
} else {
|
} else {
|
||||||
logger.warn("Used update operation [{}] for script [{}], doing nothing...", operation, request.script.getScript());
|
logger.warn("Used update operation [{}] for script [{}], doing nothing...", operation, request.script.getScript());
|
||||||
UpdateResponse update = new UpdateResponse(shardId, getResult.getType(), getResult.getId(), getResult.getVersion(), false);
|
UpdateResponse update = new UpdateResponse(shardId, getResult.getType(), getResult.getId(), getResult.getVersion(), UpdateResponse.convert(Operation.NONE));
|
||||||
return new Result(update, Operation.NONE, updatedSourceAsMap, updateSourceContentType);
|
return new Result(update, Operation.NONE, updatedSourceAsMap, updateSourceContentType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,11 +29,8 @@ import org.elasticsearch.rest.RestStatus;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
public class UpdateResponse extends DocWriteResponse {
|
public class UpdateResponse extends DocWriteResponse {
|
||||||
|
|
||||||
private boolean created;
|
|
||||||
private GetResult getResult;
|
private GetResult getResult;
|
||||||
|
|
||||||
public UpdateResponse() {
|
public UpdateResponse() {
|
||||||
@ -43,14 +40,28 @@ public class UpdateResponse extends DocWriteResponse {
|
|||||||
* Constructor to be used when a update didn't translate in a write.
|
* Constructor to be used when a update didn't translate in a write.
|
||||||
* For example: update script with operation set to none
|
* For example: update script with operation set to none
|
||||||
*/
|
*/
|
||||||
public UpdateResponse(ShardId shardId, String type, String id, long version, boolean created) {
|
public UpdateResponse(ShardId shardId, String type, String id, long version, Operation operation) {
|
||||||
this(new ShardInfo(0, 0), shardId, type, id, version, created);
|
this(new ShardInfo(0, 0), shardId, type, id, version, operation);
|
||||||
}
|
}
|
||||||
|
|
||||||
public UpdateResponse(ShardInfo shardInfo, ShardId shardId, String type, String id, long version, boolean created) {
|
public UpdateResponse(ShardInfo shardInfo, ShardId shardId, String type, String id,
|
||||||
super(shardId, type, id, version);
|
long version, Operation operation) {
|
||||||
|
super(shardId, type, id, version, operation);
|
||||||
setShardInfo(shardInfo);
|
setShardInfo(shardInfo);
|
||||||
this.created = created;
|
}
|
||||||
|
|
||||||
|
public static Operation convert(UpdateHelper.Operation op) {
|
||||||
|
switch(op) {
|
||||||
|
case UPSERT:
|
||||||
|
return Operation.CREATE;
|
||||||
|
case INDEX:
|
||||||
|
return Operation.INDEX;
|
||||||
|
case DELETE:
|
||||||
|
return Operation.DELETE;
|
||||||
|
case NONE:
|
||||||
|
return Operation.NOOP;
|
||||||
|
}
|
||||||
|
throw new IllegalArgumentException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setGetResult(GetResult getResult) {
|
public void setGetResult(GetResult getResult) {
|
||||||
@ -65,22 +76,17 @@ public class UpdateResponse extends DocWriteResponse {
|
|||||||
* Returns true if document was created due to an UPSERT operation
|
* Returns true if document was created due to an UPSERT operation
|
||||||
*/
|
*/
|
||||||
public boolean isCreated() {
|
public boolean isCreated() {
|
||||||
return this.created;
|
return this.operation == Operation.CREATE;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RestStatus status() {
|
public RestStatus status() {
|
||||||
if (created) {
|
return isCreated() ? RestStatus.CREATED : super.status();
|
||||||
return RestStatus.CREATED;
|
|
||||||
}
|
|
||||||
return super.status();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void readFrom(StreamInput in) throws IOException {
|
public void readFrom(StreamInput in) throws IOException {
|
||||||
super.readFrom(in);
|
super.readFrom(in);
|
||||||
created = in.readBoolean();
|
|
||||||
if (in.readBoolean()) {
|
if (in.readBoolean()) {
|
||||||
getResult = GetResult.readGetResult(in);
|
getResult = GetResult.readGetResult(in);
|
||||||
}
|
}
|
||||||
@ -89,7 +95,6 @@ public class UpdateResponse extends DocWriteResponse {
|
|||||||
@Override
|
@Override
|
||||||
public void writeTo(StreamOutput out) throws IOException {
|
public void writeTo(StreamOutput out) throws IOException {
|
||||||
super.writeTo(out);
|
super.writeTo(out);
|
||||||
out.writeBoolean(created);
|
|
||||||
if (getResult == null) {
|
if (getResult == null) {
|
||||||
out.writeBoolean(false);
|
out.writeBoolean(false);
|
||||||
} else {
|
} else {
|
||||||
@ -122,7 +127,7 @@ public class UpdateResponse extends DocWriteResponse {
|
|||||||
builder.append(",type=").append(getType());
|
builder.append(",type=").append(getType());
|
||||||
builder.append(",id=").append(getId());
|
builder.append(",id=").append(getId());
|
||||||
builder.append(",version=").append(getVersion());
|
builder.append(",version=").append(getVersion());
|
||||||
builder.append(",created=").append(created);
|
builder.append(",operation=").append(getOperation().getLowercase());
|
||||||
builder.append(",shards=").append(getShardInfo());
|
builder.append(",shards=").append(getShardInfo());
|
||||||
return builder.append("]").toString();
|
return builder.append("]").toString();
|
||||||
}
|
}
|
||||||
|
@ -57,7 +57,7 @@ $ cat requests
|
|||||||
{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }
|
{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }
|
||||||
{ "field1" : "value1" }
|
{ "field1" : "value1" }
|
||||||
$ curl -s -XPOST localhost:9200/_bulk --data-binary "@requests"; echo
|
$ curl -s -XPOST localhost:9200/_bulk --data-binary "@requests"; echo
|
||||||
{"took":7,"items":[{"create":{"_index":"test","_type":"type1","_id":"1","_version":1}}]}
|
{"took":7, "errors": false, "items":[{"index":{"_index":"test","_type":"type1","_id":"1","_version":1,"_operation":"create","forced_refresh":false}}]}
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
|
||||||
Because this format uses literal `\n`'s as delimiters, please be sure
|
Because this format uses literal `\n`'s as delimiters, please be sure
|
||||||
|
@ -25,7 +25,8 @@ The result of the above delete operation is:
|
|||||||
"_index" : "twitter",
|
"_index" : "twitter",
|
||||||
"_type" : "tweet",
|
"_type" : "tweet",
|
||||||
"_id" : "1",
|
"_id" : "1",
|
||||||
"_version" : 2
|
"_version" : 2,
|
||||||
|
"_operation: delete"
|
||||||
}
|
}
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
|
||||||
|
@ -31,6 +31,7 @@ The result of the above index operation is:
|
|||||||
"_id" : "1",
|
"_id" : "1",
|
||||||
"_version" : 1,
|
"_version" : 1,
|
||||||
"created" : true,
|
"created" : true,
|
||||||
|
"_operation" : create,
|
||||||
"forced_refresh": false
|
"forced_refresh": false
|
||||||
}
|
}
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
@ -231,6 +232,7 @@ The result of the above index operation is:
|
|||||||
"_id" : "6a8ca01c-7896-48e9-81cc-9f70661fcb32",
|
"_id" : "6a8ca01c-7896-48e9-81cc-9f70661fcb32",
|
||||||
"_version" : 1,
|
"_version" : 1,
|
||||||
"created" : true,
|
"created" : true,
|
||||||
|
"_operation": "create",
|
||||||
"forced_refresh": false
|
"forced_refresh": false
|
||||||
}
|
}
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
@ -132,8 +132,20 @@ curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
|
|||||||
}'
|
}'
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
|
||||||
If `name` was `new_name` before the request was sent then document is still
|
If `name` was `new_name` before the request was sent then the entire update
|
||||||
reindexed.
|
request is ignored. The `operation` element in the response returns `noop` if
|
||||||
|
the request was ignored.
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
--------------------------------------------------
|
||||||
|
{
|
||||||
|
"_index": "test",
|
||||||
|
"_type": "type1",
|
||||||
|
"_id": "1",
|
||||||
|
"_version": 1,
|
||||||
|
"_operation": noop
|
||||||
|
}
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
[[upserts]]
|
[[upserts]]
|
||||||
[float]
|
[float]
|
||||||
|
@ -314,7 +314,7 @@ public class AsyncBulkByScrollActionTests extends ESTestCase {
|
|||||||
};
|
};
|
||||||
ScrollableHitSource.Response response = new ScrollableHitSource.Response(false, emptyList(), 0, emptyList(), null);
|
ScrollableHitSource.Response response = new ScrollableHitSource.Response(false, emptyList(), 0, emptyList(), null);
|
||||||
simulateScrollResponse(new DummyAbstractAsyncBulkByScrollAction(), timeValueNanos(System.nanoTime()), 10, response);
|
simulateScrollResponse(new DummyAbstractAsyncBulkByScrollAction(), timeValueNanos(System.nanoTime()), 10, response);
|
||||||
ExecutionException e = expectThrows(ExecutionException.class, () -> listener.get());
|
ExecutionException e = expectThrows(ExecutionException.class, () -> listener.get());
|
||||||
assertThat(e.getMessage(), equalTo("EsRejectedExecutionException[test]"));
|
assertThat(e.getMessage(), equalTo("EsRejectedExecutionException[test]"));
|
||||||
assertThat(client.scrollsCleared, contains(scrollId));
|
assertThat(client.scrollsCleared, contains(scrollId));
|
||||||
|
|
||||||
@ -773,7 +773,7 @@ public class AsyncBulkByScrollActionTests extends ESTestCase {
|
|||||||
UpdateRequest update = (UpdateRequest) item;
|
UpdateRequest update = (UpdateRequest) item;
|
||||||
opType = "update";
|
opType = "update";
|
||||||
response = new UpdateResponse(shardId, update.type(), update.id(),
|
response = new UpdateResponse(shardId, update.type(), update.id(),
|
||||||
randomIntBetween(0, Integer.MAX_VALUE), true);
|
randomIntBetween(0, Integer.MAX_VALUE), DocWriteResponse.Operation.CREATE);
|
||||||
} else if (item instanceof DeleteRequest) {
|
} else if (item instanceof DeleteRequest) {
|
||||||
DeleteRequest delete = (DeleteRequest) item;
|
DeleteRequest delete = (DeleteRequest) item;
|
||||||
opType = "delete";
|
opType = "delete";
|
||||||
|
@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
"Delete operation field":
|
||||||
|
|
||||||
|
- do:
|
||||||
|
index:
|
||||||
|
index: test_1
|
||||||
|
type: test
|
||||||
|
id: 1
|
||||||
|
body: { foo: bar }
|
||||||
|
|
||||||
|
- do:
|
||||||
|
delete:
|
||||||
|
index: test_1
|
||||||
|
type: test
|
||||||
|
id: 1
|
||||||
|
|
||||||
|
- match: { _operation: delete }
|
||||||
|
|
||||||
|
- do:
|
||||||
|
catch: missing
|
||||||
|
delete:
|
||||||
|
index: test_1
|
||||||
|
type: test
|
||||||
|
id: 1
|
||||||
|
|
||||||
|
- match: { _operation: noop }
|
@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
"Index operation field":
|
||||||
|
|
||||||
|
- do:
|
||||||
|
index:
|
||||||
|
index: test_index
|
||||||
|
type: test
|
||||||
|
id: 1
|
||||||
|
body: { foo: bar }
|
||||||
|
|
||||||
|
- match: { _operation: create }
|
||||||
|
|
||||||
|
- do:
|
||||||
|
index:
|
||||||
|
index: test_index
|
||||||
|
type: test
|
||||||
|
id: 1
|
||||||
|
body: { foo: bar }
|
||||||
|
op_type: index
|
||||||
|
|
||||||
|
- match: { _operation: index }
|
@ -0,0 +1,52 @@
|
|||||||
|
---
|
||||||
|
"Update operation field":
|
||||||
|
|
||||||
|
- do:
|
||||||
|
update:
|
||||||
|
index: test_1
|
||||||
|
type: test
|
||||||
|
id: 1
|
||||||
|
body:
|
||||||
|
doc: { foo: bar }
|
||||||
|
doc_as_upsert: true
|
||||||
|
|
||||||
|
- match: { _version: 1 }
|
||||||
|
- match: { _operation: create }
|
||||||
|
|
||||||
|
- do:
|
||||||
|
update:
|
||||||
|
index: test_1
|
||||||
|
type: test
|
||||||
|
id: 1
|
||||||
|
body:
|
||||||
|
doc: { foo: bar }
|
||||||
|
doc_as_upsert: true
|
||||||
|
|
||||||
|
- match: { _version: 1 }
|
||||||
|
- match: { _operation: noop }
|
||||||
|
|
||||||
|
- do:
|
||||||
|
update:
|
||||||
|
index: test_1
|
||||||
|
type: test
|
||||||
|
id: 1
|
||||||
|
body:
|
||||||
|
doc: { foo: bar }
|
||||||
|
doc_as_upsert: true
|
||||||
|
detect_noop: false
|
||||||
|
|
||||||
|
- match: { _version: 2 }
|
||||||
|
- match: { _operation: index }
|
||||||
|
|
||||||
|
- do:
|
||||||
|
update:
|
||||||
|
index: test_1
|
||||||
|
type: test
|
||||||
|
id: 1
|
||||||
|
body:
|
||||||
|
doc: { foo: baz }
|
||||||
|
doc_as_upsert: true
|
||||||
|
detect_noop: true
|
||||||
|
|
||||||
|
- match: { _version: 3 }
|
||||||
|
- match: { _operation: index }
|
Loading…
x
Reference in New Issue
Block a user