Make sure that the parent option on the update request only is delgated to upsert index request.

Closes #4538
This commit is contained in:
Martijn van Groningen 2015-02-09 13:39:39 +01:00
parent 75713f4190
commit 6d1a1b328b
6 changed files with 35 additions and 22 deletions

View File

@ -197,10 +197,15 @@ The update operation supports similar parameters as the index API,
including: including:
[horizontal] [horizontal]
`routing`:: Sets the routing that will be used to route the `routing`:: Routing is used to route the update request to the right shard
document to the relevant shard. and sets the routing for the upsert request if the document being
updated doesn't exist. Can't be used to update the routing of an
existing document.
`parent`:: Simply sets the routing. `parent`:: Parent is used to route the update request to the right shard
and sets the parent for the upsert request if the document being
updated doesn't exist. Can't be used to update the `parent` of an
existing document.
`timeout`:: Timeout waiting for a shard to become available. `timeout`:: Timeout waiting for a shard to become available.

View File

@ -38,7 +38,7 @@
}, },
"parent": { "parent": {
"type": "string", "type": "string",
"description": "ID of the parent document" "description": "ID of the parent document. Is is only used for routing and when for the upsert request"
}, },
"refresh": { "refresh": {
"type": "boolean", "type": "boolean",

View File

@ -353,12 +353,12 @@ public class BulkRequest extends ActionRequest<BulkRequest> implements Composite
} else if ("update".equals(action)) { } else if ("update".equals(action)) {
UpdateRequest updateRequest = new UpdateRequest(index, type, id).routing(routing).parent(parent).retryOnConflict(retryOnConflict) UpdateRequest updateRequest = new UpdateRequest(index, type, id).routing(routing).parent(parent).retryOnConflict(retryOnConflict)
.version(version).versionType(versionType) .version(version).versionType(versionType)
.routing(routing)
.parent(parent)
.source(data.slice(from, nextMarker - from)); .source(data.slice(from, nextMarker - from));
IndexRequest upsertRequest = updateRequest.upsertRequest(); IndexRequest upsertRequest = updateRequest.upsertRequest();
if (upsertRequest != null) { if (upsertRequest != null) {
upsertRequest.routing(routing);
upsertRequest.parent(parent); // order is important, set it after routing, so it will set the routing
upsertRequest.timestamp(timestamp); upsertRequest.timestamp(timestamp);
upsertRequest.ttl(ttl); upsertRequest.ttl(ttl);
upsertRequest.version(version); upsertRequest.version(version);
@ -366,8 +366,6 @@ public class BulkRequest extends ActionRequest<BulkRequest> implements Composite
} }
IndexRequest doc = updateRequest.doc(); IndexRequest doc = updateRequest.doc();
if (doc != null) { if (doc != null) {
doc.routing(routing);
doc.parent(parent); // order is important, set it after routing, so it will set the routing
doc.timestamp(timestamp); doc.timestamp(timestamp);
doc.ttl(ttl); doc.ttl(ttl);
doc.version(version); doc.version(version);

View File

@ -118,15 +118,16 @@ public class UpdateHelper extends AbstractComponent {
update.setGetResult(getResult); update.setGetResult(getResult);
return new Result(update, Operation.NONE, upsertDoc, XContentType.JSON); return new Result(update, Operation.NONE, upsertDoc, XContentType.JSON);
} }
indexRequest.source((Map)ctx.get("_source")); indexRequest.source((Map) ctx.get("_source"));
} }
indexRequest.index(request.index()).type(request.type()).id(request.id()) indexRequest.index(request.index()).type(request.type()).id(request.id())
// it has to be a "create!" // it has to be a "create!"
.create(true) .create(true)
.routing(request.routing())
.ttl(ttl) .ttl(ttl)
.refresh(request.refresh()) .refresh(request.refresh())
.routing(request.routing())
.parent(request.parent())
.consistencyLevel(request.consistencyLevel()); .consistencyLevel(request.consistencyLevel());
indexRequest.operationThreaded(false); indexRequest.operationThreaded(false);
if (request.versionType() != VersionType.INTERNAL) { if (request.versionType() != VersionType.INTERNAL) {

View File

@ -55,6 +55,9 @@ public class UpdateRequest extends InstanceShardOperationRequest<UpdateRequest>
@Nullable @Nullable
private String routing; private String routing;
@Nullable
private String parent;
@Nullable @Nullable
String script; String script;
@Nullable @Nullable
@ -174,17 +177,6 @@ public class UpdateRequest extends InstanceShardOperationRequest<UpdateRequest>
return this; return this;
} }
/**
* Sets the parent id of this document. Will simply set the routing to this value, as it is only
* used for routing with delete requests.
*/
public UpdateRequest parent(String parent) {
if (routing == null) {
routing = parent;
}
return this;
}
/** /**
* Controls the shard routing of the request. Using this value to hash the shard * Controls the shard routing of the request. Using this value to hash the shard
* and not the id. * and not the id.
@ -194,6 +186,21 @@ public class UpdateRequest extends InstanceShardOperationRequest<UpdateRequest>
return this.routing; return this.routing;
} }
/**
* The parent id is used for the upsert request and also implicitely sets the routing if not already set.
*/
public UpdateRequest parent(String parent) {
this.parent = parent;
if (routing == null) {
routing = parent;
}
return this;
}
public String parent() {
return parent;
}
int shardId() { int shardId() {
return this.shardId; return this.shardId;
} }
@ -631,6 +638,7 @@ public class UpdateRequest extends InstanceShardOperationRequest<UpdateRequest>
type = in.readString(); type = in.readString();
id = in.readString(); id = in.readString();
routing = in.readOptionalString(); routing = in.readOptionalString();
parent = in.readOptionalString();
script = in.readOptionalString(); script = in.readOptionalString();
if(Strings.hasLength(script)) { if(Strings.hasLength(script)) {
scriptType = ScriptService.ScriptType.readFrom(in); scriptType = ScriptService.ScriptType.readFrom(in);
@ -668,6 +676,7 @@ public class UpdateRequest extends InstanceShardOperationRequest<UpdateRequest>
out.writeString(type); out.writeString(type);
out.writeString(id); out.writeString(id);
out.writeOptionalString(routing); out.writeOptionalString(routing);
out.writeOptionalString(parent);
out.writeOptionalString(script); out.writeOptionalString(script);
if (Strings.hasLength(script)) { if (Strings.hasLength(script)) {
ScriptService.ScriptType.writeTo(scriptType, out); ScriptService.ScriptType.writeTo(scriptType, out);

View File

@ -57,7 +57,7 @@ public class RestUpdateAction extends BaseRestHandler {
UpdateRequest updateRequest = new UpdateRequest(request.param("index"), request.param("type"), request.param("id")); UpdateRequest updateRequest = new UpdateRequest(request.param("index"), request.param("type"), request.param("id"));
updateRequest.listenerThreaded(false); updateRequest.listenerThreaded(false);
updateRequest.routing(request.param("routing")); updateRequest.routing(request.param("routing"));
updateRequest.parent(request.param("parent")); // order is important, set it after routing, so it will set the routing updateRequest.parent(request.param("parent"));
updateRequest.timeout(request.paramAsTime("timeout", updateRequest.timeout())); updateRequest.timeout(request.paramAsTime("timeout", updateRequest.timeout()));
updateRequest.refresh(request.paramAsBoolean("refresh", updateRequest.refresh())); updateRequest.refresh(request.paramAsBoolean("refresh", updateRequest.refresh()));
String consistencyLevel = request.param("consistency"); String consistencyLevel = request.param("consistency");