allow to provide fields for multi get

This commit is contained in:
kimchy 2011-06-28 11:54:52 +03:00
parent 2e83a2f045
commit f6ebee3785
5 changed files with 74 additions and 7 deletions

View File

@ -44,6 +44,7 @@ public class MultiGetRequest implements ActionRequest {
private String type; private String type;
private String id; private String id;
private String routing; private String routing;
private String[] fields;
Item() { Item() {
@ -86,6 +87,15 @@ public class MultiGetRequest implements ActionRequest {
return this.routing; return this.routing;
} }
public Item fields(String... fields) {
this.fields = fields;
return this;
}
public String[] fields() {
return this.fields;
}
public static Item readItem(StreamInput in) throws IOException { public static Item readItem(StreamInput in) throws IOException {
Item item = new Item(); Item item = new Item();
item.readFrom(in); item.readFrom(in);
@ -101,6 +111,13 @@ public class MultiGetRequest implements ActionRequest {
if (in.readBoolean()) { if (in.readBoolean()) {
routing = in.readUTF(); routing = in.readUTF();
} }
int size = in.readVInt();
if (size > 0) {
fields = new String[size];
for (int i = 0; i < size; i++) {
fields[i] = in.readUTF();
}
}
} }
@Override public void writeTo(StreamOutput out) throws IOException { @Override public void writeTo(StreamOutput out) throws IOException {
@ -118,6 +135,14 @@ public class MultiGetRequest implements ActionRequest {
out.writeBoolean(true); out.writeBoolean(true);
out.writeUTF(routing); out.writeUTF(routing);
} }
if (fields == null) {
out.writeVInt(0);
} else {
out.writeVInt(fields.length);
for (String field : fields) {
out.writeUTF(field);
}
}
} }
} }
@ -216,6 +241,7 @@ public class MultiGetRequest implements ActionRequest {
String type = defaultType; String type = defaultType;
String id = null; String id = null;
String routing = null; String routing = null;
List<String> fields = null;
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
if (token == XContentParser.Token.FIELD_NAME) { if (token == XContentParser.Token.FIELD_NAME) {
currentFieldName = parser.currentName(); currentFieldName = parser.currentName();
@ -229,9 +255,16 @@ public class MultiGetRequest implements ActionRequest {
} else if ("_routing".equals(currentFieldName) || "routing".equals(currentFieldName)) { } else if ("_routing".equals(currentFieldName) || "routing".equals(currentFieldName)) {
routing = parser.text(); routing = parser.text();
} }
} else if (token == XContentParser.Token.START_ARRAY) {
if ("fields".equals(currentFieldName)) {
fields = new ArrayList<String>();
while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) {
fields.add(parser.text());
} }
} }
add(new Item(index, type, id).routing(routing)); }
}
add(new Item(index, type, id).routing(routing).fields(fields == null ? null : fields.toArray(new String[fields.size()])));
} }
} else if ("ids".equals(currentFieldName)) { } else if ("ids".equals(currentFieldName)) {
while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) { while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) {

View File

@ -39,6 +39,7 @@ public class MultiGetShardRequest extends SingleShardOperationRequest {
TIntArrayList locations; TIntArrayList locations;
List<String> types; List<String> types;
List<String> ids; List<String> ids;
List<String[]> fields;
MultiGetShardRequest() { MultiGetShardRequest() {
@ -50,6 +51,7 @@ public class MultiGetShardRequest extends SingleShardOperationRequest {
locations = new TIntArrayList(); locations = new TIntArrayList();
types = new ArrayList<String>(); types = new ArrayList<String>();
ids = new ArrayList<String>(); ids = new ArrayList<String>();
fields = new ArrayList<String[]>();
} }
public int shardId() { public int shardId() {
@ -88,10 +90,11 @@ public class MultiGetShardRequest extends SingleShardOperationRequest {
return this; return this;
} }
public void add(int location, @Nullable String type, String id) { public void add(int location, @Nullable String type, String id, String[] fields) {
locations.add(location); this.locations.add(location);
types.add(type); this.types.add(type);
ids.add(id); this.ids.add(id);
this.fields.add(fields);
} }
@Override public void readFrom(StreamInput in) throws IOException { @Override public void readFrom(StreamInput in) throws IOException {
@ -100,6 +103,7 @@ public class MultiGetShardRequest extends SingleShardOperationRequest {
locations = new TIntArrayList(size); locations = new TIntArrayList(size);
types = new ArrayList<String>(size); types = new ArrayList<String>(size);
ids = new ArrayList<String>(size); ids = new ArrayList<String>(size);
fields = new ArrayList<String[]>(size);
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
locations.add(in.readVInt()); locations.add(in.readVInt());
if (in.readBoolean()) { if (in.readBoolean()) {
@ -108,6 +112,16 @@ public class MultiGetShardRequest extends SingleShardOperationRequest {
types.add(null); types.add(null);
} }
ids.add(in.readUTF()); ids.add(in.readUTF());
int size1 = in.readVInt();
if (size1 > 0) {
String[] fields = new String[size1];
for (int j = 0; j < size1; j++) {
fields[j] = in.readUTF();
}
this.fields.add(fields);
} else {
fields.add(null);
}
} }
if (in.readBoolean()) { if (in.readBoolean()) {
@ -134,6 +148,14 @@ public class MultiGetShardRequest extends SingleShardOperationRequest {
out.writeUTF(types.get(i)); out.writeUTF(types.get(i));
} }
out.writeUTF(ids.get(i)); out.writeUTF(ids.get(i));
if (fields.get(i) == null) {
out.writeVInt(0);
} else {
out.writeVInt(fields.get(i).length);
for (String field : fields.get(i)) {
out.writeUTF(field);
}
}
} }
if (preference == null) { if (preference == null) {

View File

@ -67,7 +67,7 @@ public class TransportMultiGetAction extends BaseAction<MultiGetRequest, MultiGe
shardRequests.put(shardId, shardRequest); shardRequests.put(shardId, shardRequest);
} }
shardRequest.add(i, item.type(), item.id()); shardRequest.add(i, item.type(), item.id(), item.fields());
} }
final MultiGetItemResponse[] responses = new MultiGetItemResponse[request.items.size()]; final MultiGetItemResponse[] responses = new MultiGetItemResponse[request.items.size()];

View File

@ -102,9 +102,10 @@ public class TransportShardMultiGetAction extends TransportShardSingleOperationA
for (int i = 0; i < request.locations.size(); i++) { for (int i = 0; i < request.locations.size(); i++) {
String type = request.types.get(i); String type = request.types.get(i);
String id = request.ids.get(i); String id = request.ids.get(i);
String[] fields = request.fields.get(i);
try { try {
GetResponse getResponse = TransportGetAction.load(logger, scriptService, indexService, indexShard, request.index(), type, id, null, request.realtime()); GetResponse getResponse = TransportGetAction.load(logger, scriptService, indexService, indexShard, request.index(), type, id, fields, request.realtime());
response.add(request.locations.get(i), getResponse); response.add(request.locations.get(i), getResponse);
} catch (Exception e) { } catch (Exception e) {
response.add(request.locations.get(i), new MultiGetResponse.Failure(request.index(), type, id, ExceptionsHelper.detailedMessage(e))); response.add(request.locations.get(i), new MultiGetResponse.Failure(request.index(), type, id, ExceptionsHelper.detailedMessage(e)));

View File

@ -23,6 +23,7 @@ import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse;
import org.elasticsearch.action.admin.cluster.health.ClusterHealthStatus; import org.elasticsearch.action.admin.cluster.health.ClusterHealthStatus;
import org.elasticsearch.action.delete.DeleteResponse; import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.get.MultiGetRequest;
import org.elasticsearch.action.get.MultiGetResponse; import org.elasticsearch.action.get.MultiGetResponse;
import org.elasticsearch.client.Client; import org.elasticsearch.client.Client;
import org.elasticsearch.common.settings.ImmutableSettings; import org.elasticsearch.common.settings.ImmutableSettings;
@ -176,5 +177,15 @@ public class GetActionTests extends AbstractNodesTests {
assertThat(response.responses()[3].response().exists(), equalTo(true)); assertThat(response.responses()[3].response().exists(), equalTo(true));
assertThat(response.responses()[4].id(), equalTo("11")); assertThat(response.responses()[4].id(), equalTo("11"));
assertThat(response.responses()[4].response().exists(), equalTo(false)); assertThat(response.responses()[4].response().exists(), equalTo(false));
// multi get with specific field
response = client.prepareMultiGet()
.add(new MultiGetRequest.Item("test", "type1", "1").fields("field"))
.add(new MultiGetRequest.Item("test", "type1", "3").fields("field"))
.execute().actionGet();
assertThat(response.responses().length, equalTo(2));
assertThat(response.responses()[0].response().source(), nullValue());
assertThat(response.responses()[0].response().field("field").values().get(0).toString(), equalTo("value1"));
} }
} }