improvement to string splitting caused fields= on get to return the source back, fix it and also optimize this case when using realtime get, closes #1164.
This commit is contained in:
parent
47b0750171
commit
cbde265ab8
|
@ -125,10 +125,11 @@ public class TransportGetAction extends TransportShardSingleOperationAction<GetR
|
|||
}
|
||||
|
||||
public static GetResponse load(ESLogger logger, ScriptService scriptService, IndexService indexService, IndexShard indexShard, String index, String type, String id, String[] gFields, boolean realtime) throws ElasticSearchException {
|
||||
boolean loadSource = gFields == null || gFields.length > 0;
|
||||
Engine.GetResult get = null;
|
||||
if (type == null || type.equals("_all")) {
|
||||
for (String typeX : indexService.mapperService().types()) {
|
||||
get = indexShard.get(new Engine.Get(realtime, UidFieldMapper.TERM_FACTORY.createTerm(Uid.createUid(typeX, id))));
|
||||
get = indexShard.get(new Engine.Get(realtime, UidFieldMapper.TERM_FACTORY.createTerm(Uid.createUid(typeX, id))).loadSource(loadSource));
|
||||
if (get.exists()) {
|
||||
type = typeX;
|
||||
break;
|
||||
|
@ -138,7 +139,7 @@ public class TransportGetAction extends TransportShardSingleOperationAction<GetR
|
|||
return new GetResponse(index, type, id, -1, false, null, null);
|
||||
}
|
||||
} else {
|
||||
get = indexShard.get(new Engine.Get(realtime, UidFieldMapper.TERM_FACTORY.createTerm(Uid.createUid(type, id))));
|
||||
get = indexShard.get(new Engine.Get(realtime, UidFieldMapper.TERM_FACTORY.createTerm(Uid.createUid(type, id))).loadSource(loadSource));
|
||||
if (!get.exists()) {
|
||||
return new GetResponse(index, type, id, -1, false, null, null);
|
||||
}
|
||||
|
@ -243,13 +244,17 @@ public class TransportGetAction extends TransportShardSingleOperationAction<GetR
|
|||
return new GetResponse(index, type, id, get.version(), get.exists(), source == null ? null : new BytesHolder(source), fields);
|
||||
} else {
|
||||
BytesHolder source = get.source();
|
||||
assert source != null;
|
||||
|
||||
Map<String, GetField> fields = null;
|
||||
boolean sourceRequested = false;
|
||||
|
||||
// we can only load scripts that can run against the source
|
||||
if (gFields != null && gFields.length > 0) {
|
||||
if (gFields == null) {
|
||||
sourceRequested = true;
|
||||
} else if (gFields.length == 0) {
|
||||
// no fields, and no source
|
||||
sourceRequested = false;
|
||||
} else {
|
||||
Map<String, Object> sourceAsMap = SourceLookup.sourceAsMap(source.bytes(), source.offset(), source.length());
|
||||
SearchLookup searchLookup = null;
|
||||
for (String field : gFields) {
|
||||
|
@ -297,8 +302,6 @@ public class TransportGetAction extends TransportShardSingleOperationAction<GetR
|
|||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
sourceRequested = true;
|
||||
}
|
||||
|
||||
return new GetResponse(index, type, id, get.version(), get.exists(), sourceRequested ? source : null, fields);
|
||||
|
|
|
@ -597,6 +597,7 @@ public interface Engine extends IndexShardComponent, CloseableComponent {
|
|||
static class Get {
|
||||
private final boolean realtime;
|
||||
private final Term uid;
|
||||
private boolean loadSource = true;
|
||||
|
||||
public Get(boolean realtime, Term uid) {
|
||||
this.realtime = realtime;
|
||||
|
@ -610,6 +611,15 @@ public interface Engine extends IndexShardComponent, CloseableComponent {
|
|||
public Term uid() {
|
||||
return uid;
|
||||
}
|
||||
|
||||
public boolean loadSource() {
|
||||
return this.loadSource;
|
||||
}
|
||||
|
||||
public Get loadSource(boolean loadSource) {
|
||||
this.loadSource = loadSource;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
static class GetResult {
|
||||
|
@ -621,7 +631,7 @@ public interface Engine extends IndexShardComponent, CloseableComponent {
|
|||
|
||||
public static final GetResult NOT_EXISTS = new GetResult(false, -1, null);
|
||||
|
||||
public GetResult(boolean exists, long version, BytesHolder source) {
|
||||
public GetResult(boolean exists, long version, @Nullable BytesHolder source) {
|
||||
this.source = source;
|
||||
this.exists = exists;
|
||||
this.version = version;
|
||||
|
@ -645,7 +655,7 @@ public interface Engine extends IndexShardComponent, CloseableComponent {
|
|||
return this.version;
|
||||
}
|
||||
|
||||
public BytesHolder source() {
|
||||
@Nullable public BytesHolder source() {
|
||||
return source;
|
||||
}
|
||||
|
||||
|
|
|
@ -305,6 +305,9 @@ public class RobinEngine extends AbstractIndexShardComponent implements Engine {
|
|||
if (versionValue.delete()) {
|
||||
return GetResult.NOT_EXISTS;
|
||||
}
|
||||
if (!get.loadSource()) {
|
||||
return new GetResult(true, versionValue.version(), null);
|
||||
}
|
||||
byte[] data = translog.read(versionValue.translogLocation());
|
||||
if (data != null) {
|
||||
try {
|
||||
|
|
|
@ -26,6 +26,7 @@ import org.elasticsearch.action.get.GetResponse;
|
|||
import org.elasticsearch.action.get.MultiGetRequest;
|
||||
import org.elasticsearch.action.get.MultiGetResponse;
|
||||
import org.elasticsearch.client.Client;
|
||||
import org.elasticsearch.common.Strings;
|
||||
import org.elasticsearch.common.settings.ImmutableSettings;
|
||||
import org.elasticsearch.test.integration.AbstractNodesTests;
|
||||
import org.testng.annotations.AfterClass;
|
||||
|
@ -73,6 +74,11 @@ public class GetActionTests extends AbstractNodesTests {
|
|||
assertThat(response.sourceAsMap().get("field1").toString(), equalTo("value1"));
|
||||
assertThat(response.sourceAsMap().get("field2").toString(), equalTo("value2"));
|
||||
|
||||
logger.info("--> realtime get 1 (no source)");
|
||||
response = client.prepareGet("test", "type1", "1").setFields(Strings.EMPTY_ARRAY).execute().actionGet();
|
||||
assertThat(response.exists(), equalTo(true));
|
||||
assertThat(response.source(), nullValue());
|
||||
|
||||
logger.info("--> realtime get 1 (no type)");
|
||||
response = client.prepareGet("test", null, "1").execute().actionGet();
|
||||
assertThat(response.exists(), equalTo(true));
|
||||
|
|
Loading…
Reference in New Issue