Skip to content

Commit 3dd69d6

Browse files
Enable flat index expressions support for _field_caps
1 parent 7aa001c commit 3dd69d6

File tree

3 files changed

+33
-3
lines changed

3 files changed

+33
-3
lines changed

server/src/main/java/org/elasticsearch/action/fieldcaps/FieldCapabilitiesRequest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,11 @@ public boolean allowsRemoteIndices() {
243243
return true;
244244
}
245245

246+
@Override
247+
public boolean allowsCrossProject() {
248+
return true;
249+
}
250+
246251
@Override
247252
public boolean includeDataStreams() {
248253
return true;

server/src/main/java/org/elasticsearch/action/fieldcaps/TransportFieldCapabilitiesAction.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import org.elasticsearch.logging.LogManager;
5151
import org.elasticsearch.logging.Logger;
5252
import org.elasticsearch.search.SearchService;
53+
import org.elasticsearch.search.crossproject.CrossProjectModeDecider;
5354
import org.elasticsearch.tasks.CancellableTask;
5455
import org.elasticsearch.tasks.Task;
5556
import org.elasticsearch.threadpool.ThreadPool;
@@ -81,6 +82,7 @@
8182
import java.util.stream.Collectors;
8283

8384
import static org.elasticsearch.action.search.TransportSearchHelper.checkCCSVersionCompatibility;
85+
import static org.elasticsearch.search.crossproject.CrossProjectIndexResolutionValidator.indicesOptionsForCrossProjectFanout;
8486

8587
public class TransportFieldCapabilitiesAction extends HandledTransportAction<FieldCapabilitiesRequest, FieldCapabilitiesResponse> {
8688
public static final String NAME = "indices:data/read/field_caps";
@@ -102,6 +104,7 @@ public class TransportFieldCapabilitiesAction extends HandledTransportAction<Fie
102104
private final boolean ccsCheckCompatibility;
103105
private final ThreadPool threadPool;
104106
private final TimeValue forceConnectTimeoutSecs;
107+
private final CrossProjectModeDecider crossProjectModeDecider;
105108

106109
@Inject
107110
public TransportFieldCapabilitiesAction(
@@ -130,6 +133,7 @@ public TransportFieldCapabilitiesAction(
130133
this.ccsCheckCompatibility = SearchService.CCS_VERSION_CHECK_SETTING.get(clusterService.getSettings());
131134
this.threadPool = threadPool;
132135
this.forceConnectTimeoutSecs = clusterService.getSettings().getAsTime("search.ccs.force_connect_timeout", null);
136+
this.crossProjectModeDecider = new CrossProjectModeDecider(clusterService.getSettings());
133137
}
134138

135139
@Override
@@ -310,7 +314,13 @@ private <R extends ActionResponse> void doExecuteForked(
310314
for (Map.Entry<String, OriginalIndices> remoteIndices : remoteClusterIndices.entrySet()) {
311315
String clusterAlias = remoteIndices.getKey();
312316
OriginalIndices originalIndices = remoteIndices.getValue();
313-
FieldCapabilitiesRequest remoteRequest = prepareRemoteRequest(clusterAlias, request, originalIndices, nowInMillis);
317+
FieldCapabilitiesRequest remoteRequest = prepareRemoteRequest(
318+
clusterAlias,
319+
request,
320+
originalIndices,
321+
nowInMillis,
322+
crossProjectModeDecider
323+
);
314324
ActionListener<FieldCapabilitiesResponse> remoteListener = ActionListener.wrap(response -> {
315325
for (FieldCapabilitiesIndexResponse resp : response.getIndexResponses()) {
316326
String indexName = RemoteClusterAware.buildRemoteIndexName(clusterAlias, resp.getIndexName());
@@ -475,12 +485,17 @@ private static FieldCapabilitiesRequest prepareRemoteRequest(
475485
String clusterAlias,
476486
FieldCapabilitiesRequest request,
477487
OriginalIndices originalIndices,
478-
long nowInMillis
488+
long nowInMillis,
489+
CrossProjectModeDecider crossProjectModeDecider
479490
) {
480491
FieldCapabilitiesRequest remoteRequest = new FieldCapabilitiesRequest();
481492
remoteRequest.clusterAlias(clusterAlias);
482493
remoteRequest.setMergeResults(false); // we need to merge on this node
483494
remoteRequest.indicesOptions(originalIndices.indicesOptions());
495+
if (crossProjectModeDecider.resolvesCrossProject(request)) {
496+
remoteRequest.indicesOptions(indicesOptionsForCrossProjectFanout(remoteRequest.indicesOptions()));
497+
}
498+
484499
remoteRequest.indices(originalIndices.indices());
485500
remoteRequest.fields(request.fields());
486501
remoteRequest.filters(request.filters());

server/src/main/java/org/elasticsearch/rest/action/RestFieldCapabilitiesAction.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.elasticsearch.rest.RestRequest;
1919
import org.elasticsearch.rest.Scope;
2020
import org.elasticsearch.rest.ServerlessScope;
21+
import org.elasticsearch.search.crossproject.CrossProjectModeDecider;
2122
import org.elasticsearch.xcontent.ObjectParser;
2223
import org.elasticsearch.xcontent.ParseField;
2324

@@ -33,9 +34,11 @@
3334
public class RestFieldCapabilitiesAction extends BaseRestHandler {
3435

3536
private final Settings settings;
37+
private final CrossProjectModeDecider crossProjectModeDecider;
3638

3739
public RestFieldCapabilitiesAction(Settings settings) {
3840
this.settings = settings;
41+
this.crossProjectModeDecider = new CrossProjectModeDecider(settings);
3942
}
4043

4144
@Override
@@ -55,14 +58,21 @@ public String getName() {
5558

5659
@Override
5760
public RestChannelConsumer prepareRequest(final RestRequest request, final NodeClient client) throws IOException {
58-
if (settings != null && settings.getAsBoolean("serverless.cross_project.enabled", false)) {
61+
final boolean crossProjectEnabled = crossProjectModeDecider.crossProjectEnabled();
62+
if (crossProjectModeDecider.crossProjectEnabled()) {
5963
// accept but drop project_routing param until fully supported
6064
request.param("project_routing");
6165
}
6266

6367
final String[] indices = Strings.splitStringByCommaToArray(request.param("index"));
6468
final FieldCapabilitiesRequest fieldRequest = new FieldCapabilitiesRequest();
6569
fieldRequest.indices(indices);
70+
if (crossProjectEnabled && fieldRequest.allowsCrossProject()) {
71+
var cpsIdxOpts = IndicesOptions.builder(fieldRequest.indicesOptions())
72+
.crossProjectModeOptions(new IndicesOptions.CrossProjectModeOptions(true))
73+
.build();
74+
fieldRequest.indicesOptions(cpsIdxOpts);
75+
}
6676

6777
fieldRequest.indicesOptions(IndicesOptions.fromRequest(request, fieldRequest.indicesOptions()));
6878
fieldRequest.includeUnmapped(request.paramAsBoolean("include_unmapped", false));

0 commit comments

Comments
 (0)