diff --git a/server/src/main/java/org/elasticsearch/node/NodeConstruction.java b/server/src/main/java/org/elasticsearch/node/NodeConstruction.java index bb28ed4a8aff5..50f8b00827ec8 100644 --- a/server/src/main/java/org/elasticsearch/node/NodeConstruction.java +++ b/server/src/main/java/org/elasticsearch/node/NodeConstruction.java @@ -203,6 +203,7 @@ import org.elasticsearch.search.SearchService; import org.elasticsearch.search.SearchUtils; import org.elasticsearch.search.aggregations.support.AggregationUsageService; +import org.elasticsearch.search.internal.CrossClusterSearchExtension; import org.elasticsearch.shutdown.PluginShutdownService; import org.elasticsearch.snapshots.InternalSnapshotsInfoService; import org.elasticsearch.snapshots.RepositoryIntegrityHealthIndicatorService; @@ -1015,6 +1016,13 @@ public Map queryFields() { var reservedStateHandlerProviders = pluginsService.loadServiceProviders(ReservedStateHandlerProvider.class); + var crossClusterSearchExtension = pluginsService.loadSingletonServiceProvider( + CrossClusterSearchExtension.class, + CrossClusterSearchExtension.Default::new + ); + + logger.info("Cross-cluster example: [{}]", crossClusterSearchExtension.indicesExpressionRewriter().getClass()); + ActionModule actionModule = new ActionModule( settings, clusterModule.getIndexNameExpressionResolver(), diff --git a/server/src/main/java/org/elasticsearch/search/internal/CrossClusterSearchExtension.java b/server/src/main/java/org/elasticsearch/search/internal/CrossClusterSearchExtension.java new file mode 100644 index 0000000000000..313c037652057 --- /dev/null +++ b/server/src/main/java/org/elasticsearch/search/internal/CrossClusterSearchExtension.java @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +package org.elasticsearch.search.internal; + +import org.elasticsearch.action.IndicesRequest; + +public interface CrossClusterSearchExtension { + + IndicesExpressionRewriter indicesExpressionRewriter(); + + interface IndicesExpressionRewriter { + IndicesRequest.Replaceable rewrite(IndicesRequest.Replaceable request); + } + + class Default implements CrossClusterSearchExtension { + public Default() {} + + @Override + public IndicesExpressionRewriter indicesExpressionRewriter() { + return request -> { + // Default implementation does nothing, can be overridden by extensions + return request; + }; + } + } +}