5050import org .elasticsearch .logging .LogManager ;
5151import org .elasticsearch .logging .Logger ;
5252import org .elasticsearch .search .SearchService ;
53+ import org .elasticsearch .search .crossproject .CrossProjectModeDecider ;
5354import org .elasticsearch .tasks .CancellableTask ;
5455import org .elasticsearch .tasks .Task ;
5556import org .elasticsearch .threadpool .ThreadPool ;
8182import java .util .stream .Collectors ;
8283
8384import static org .elasticsearch .action .search .TransportSearchHelper .checkCCSVersionCompatibility ;
85+ import static org .elasticsearch .search .crossproject .CrossProjectIndexResolutionValidator .indicesOptionsForCrossProjectFanout ;
8486
8587public 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 ());
0 commit comments