Skip to content

Commit

Permalink
Retain originalIndex info when rewriting FieldCapabilities requests (#…
Browse files Browse the repository at this point in the history
…27761)

A FieldCapabilities request can cover multiple indices (or aliases pointing to multiple indices).
When rewriting the request for each index, store the original requested indices.
  • Loading branch information
albertzaharovits committed Dec 19, 2017
1 parent c102f98 commit a917800
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 2 deletions.
Expand Up @@ -19,7 +19,10 @@

package org.elasticsearch.action.fieldcaps;

import org.elasticsearch.Version;
import org.elasticsearch.action.ActionRequestValidationException;
import org.elasticsearch.action.OriginalIndices;
import org.elasticsearch.action.support.IndicesOptions;
import org.elasticsearch.action.support.single.shard.SingleShardRequest;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
Expand All @@ -30,32 +33,54 @@ public class FieldCapabilitiesIndexRequest
extends SingleShardRequest<FieldCapabilitiesIndexRequest> {

private String[] fields;
private OriginalIndices originalIndices;

// For serialization
FieldCapabilitiesIndexRequest() {}

FieldCapabilitiesIndexRequest(String[] fields, String index) {
FieldCapabilitiesIndexRequest(String[] fields, String index, OriginalIndices originalIndices) {
super(index);
if (fields == null || fields.length == 0) {
throw new IllegalArgumentException("specified fields can't be null or empty");
}
this.fields = fields;
assert index != null;
this.index(index);
this.originalIndices = originalIndices;
}

public String[] fields() {
return fields;
}

@Override
public String[] indices() {
return originalIndices.indices();
}

@Override
public IndicesOptions indicesOptions() {
return originalIndices.indicesOptions();
}

@Override
public void readFrom(StreamInput in) throws IOException {
super.readFrom(in);
fields = in.readStringArray();
if (in.getVersion().onOrAfter(Version.V_6_2_0)) {
originalIndices = OriginalIndices.readOriginalIndices(in);
} else {
originalIndices = OriginalIndices.NONE;
}
}

@Override
public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out);
out.writeStringArray(fields);
if (out.getVersion().onOrAfter(Version.V_6_2_0)) {
OriginalIndices.writeOriginalIndices(originalIndices, out);
}
}

@Override
Expand Down
Expand Up @@ -110,7 +110,7 @@ public void onFailure(Exception e) {
}
};
for (String index : concreteIndices) {
shardAction.execute(new FieldCapabilitiesIndexRequest(request.fields(), index), innerListener);
shardAction.execute(new FieldCapabilitiesIndexRequest(request.fields(), index, localIndices), innerListener);
}

// this is the cross cluster part of this API - we force the other cluster to not merge the results but instead
Expand Down
15 changes: 15 additions & 0 deletions core/src/test/java/org/elasticsearch/action/IndicesRequestIT.java
Expand Up @@ -59,6 +59,8 @@
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.explain.ExplainAction;
import org.elasticsearch.action.explain.ExplainRequest;
import org.elasticsearch.action.fieldcaps.FieldCapabilitiesAction;
import org.elasticsearch.action.fieldcaps.FieldCapabilitiesRequest;
import org.elasticsearch.action.get.GetAction;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.MultiGetAction;
Expand Down Expand Up @@ -188,6 +190,19 @@ public void testGetFieldMappings() {
assertSameIndices(getFieldMappingsRequest, getFieldMappingsShardAction);
}

public void testFieldCapabilities() {
String fieldCapabilitiesShardAction = FieldCapabilitiesAction.NAME + "[index][s]";
interceptTransportActions(fieldCapabilitiesShardAction);

FieldCapabilitiesRequest fieldCapabilitiesRequest = new FieldCapabilitiesRequest();
fieldCapabilitiesRequest.indices(randomIndicesOrAliases());
fieldCapabilitiesRequest.fields(randomAlphaOfLength(8));
internalCluster().coordOnlyNodeClient().fieldCaps(fieldCapabilitiesRequest).actionGet();

clearInterceptedActions();
assertSameIndices(fieldCapabilitiesRequest, fieldCapabilitiesShardAction);
}

public void testAnalyze() {
String analyzeShardAction = AnalyzeAction.NAME + "[s]";
interceptTransportActions(analyzeShardAction);
Expand Down

0 comments on commit a917800

Please sign in to comment.