From 1cfd2ca26bf77266aaade59eea33445e873cda3b Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Wed, 3 Dec 2025 13:06:22 -0700 Subject: [PATCH 01/25] Always error out if CCS expression shows up when CCS is not supported --- .../cluster/metadata/IndexNameExpressionResolver.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java index 8861cd73fd4fc..fa19e10c3dc38 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java @@ -418,7 +418,7 @@ protected static Collection resolveExpressionsToResources(Co baseExpression = DateMathExpressionResolver.resolveExpression(baseExpression, context::getStartTime); // Validate base expression - validateResourceExpression(context, baseExpression, expressions); + validateResourceExpression(baseExpression, expressions); // Check if it's wildcard boolean isWildcard = expandWildcards && WildcardExpressionResolver.isWildcard(baseExpression); @@ -457,7 +457,7 @@ protected static Collection resolveExpressionsToResources(Co * - Ensure it doesn't start with `_` * - Ensure it's not a remote expression unless the allow unavailable targets is enabled. */ - private static void validateResourceExpression(Context context, String current, String[] expressions) { + private static void validateResourceExpression(String current, String[] expressions) { if (Strings.isEmpty(current)) { throw notFoundException(current); } @@ -468,16 +468,13 @@ private static void validateResourceExpression(Context context, String current, if (current.charAt(0) == '_') { throw new InvalidIndexNameException(current, "must not start with '_'."); } - ensureRemoteExpressionRequireIgnoreUnavailable(context.getOptions(), current, expressions); + ensureRemoteExpressionRequireIgnoreUnavailable(current, expressions); } /** * Throws an exception if the expression is a remote expression and we do not allow unavailable targets */ - private static void ensureRemoteExpressionRequireIgnoreUnavailable(IndicesOptions options, String current, String[] expressions) { - if (options.ignoreUnavailable()) { - return; - } + private static void ensureRemoteExpressionRequireIgnoreUnavailable(String current, String[] expressions) { if (RemoteClusterAware.isRemoteIndexName(current)) { List crossClusterIndices = RemoteClusterAware.getRemoteIndexExpressions(expressions); throw new IllegalArgumentException( From 0cc995c5ce0b3a02cfc7566ccee873f4f82726e3 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Wed, 3 Dec 2025 13:08:18 -0700 Subject: [PATCH 02/25] Update docs/changelog/139009.yaml --- docs/changelog/139009.yaml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 docs/changelog/139009.yaml diff --git a/docs/changelog/139009.yaml b/docs/changelog/139009.yaml new file mode 100644 index 0000000000000..e969417be2467 --- /dev/null +++ b/docs/changelog/139009.yaml @@ -0,0 +1,5 @@ +pr: 139009 +summary: Always error out if CCS expression shows up when CCS is not supported +area: CCS +type: bug +issues: [] From 3c38e78940ed5778066cc244e3c2783679e02f5c Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Wed, 3 Dec 2025 15:16:47 -0700 Subject: [PATCH 03/25] Better fix with context option --- .../indices/resolve/ResolveIndexAction.java | 1 + .../metadata/IndexNameExpressionResolver.java | 31 ++++++++++++++----- .../indices/resolve/ResolveIndexTests.java | 1 + 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexAction.java b/server/src/main/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexAction.java index 5de102c35b104..edf40783d3dc8 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexAction.java +++ b/server/src/main/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexAction.java @@ -783,6 +783,7 @@ static void resolveIndices( projectState.metadata(), indicesOptions, true, + false, names ); for (ResolvedExpression s : resolvedIndexAbstractions) { diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java index fa19e10c3dc38..3b66e09edf548 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java @@ -418,7 +418,7 @@ protected static Collection resolveExpressionsToResources(Co baseExpression = DateMathExpressionResolver.resolveExpression(baseExpression, context::getStartTime); // Validate base expression - validateResourceExpression(baseExpression, expressions); + validateResourceExpression(context, baseExpression, expressions); // Check if it's wildcard boolean isWildcard = expandWildcards && WildcardExpressionResolver.isWildcard(baseExpression); @@ -457,7 +457,7 @@ protected static Collection resolveExpressionsToResources(Co * - Ensure it doesn't start with `_` * - Ensure it's not a remote expression unless the allow unavailable targets is enabled. */ - private static void validateResourceExpression(String current, String[] expressions) { + private static void validateResourceExpression(Context context, String current, String[] expressions) { if (Strings.isEmpty(current)) { throw notFoundException(current); } @@ -468,14 +468,14 @@ private static void validateResourceExpression(String current, String[] expressi if (current.charAt(0) == '_') { throw new InvalidIndexNameException(current, "must not start with '_'."); } - ensureRemoteExpressionRequireIgnoreUnavailable(current, expressions); + checkForRemoteIndexExpression(context, current, expressions); } /** - * Throws an exception if the expression is a remote expression and we do not allow unavailable targets + * Throws an exception if the expression is a remote expression */ - private static void ensureRemoteExpressionRequireIgnoreUnavailable(String current, String[] expressions) { - if (RemoteClusterAware.isRemoteIndexName(current)) { + private static void checkForRemoteIndexExpression(Context context, String current, String[] expressions) { + if (context.isAllowRemoteIndices() == false && RemoteClusterAware.isRemoteIndexName(current)) { List crossClusterIndices = RemoteClusterAware.getRemoteIndexExpressions(expressions); throw new IllegalArgumentException( "Cross-cluster calls are not supported in this context but remote indices were requested: " + crossClusterIndices @@ -577,6 +577,7 @@ public Index[] concreteIndices(ProjectMetadata project, IndicesRequest request, false, request.includeDataStreams(), false, + false, getSystemIndexAccessLevel(), getSystemIndexAccessPredicate(), getNetNewSystemIndexPredicate() @@ -1002,7 +1003,7 @@ public static void assertExpressionHasNullOrDataSelector(String expression) { * Resolve an array of expressions to the set of indices and aliases that these expressions match. */ public Set resolveExpressions(ProjectMetadata project, String... expressions) { - return resolveExpressions(project, IndicesOptions.lenientExpandOpen(), false, expressions); + return resolveExpressions(project, IndicesOptions.lenientExpandOpen(), false, true, expressions); } /** @@ -1014,15 +1015,18 @@ public Set resolveExpressions( ProjectMetadata project, IndicesOptions indicesOptions, boolean preserveDataStreams, + boolean allowRemoteIndices, String... expressions ) { Context context = new Context( project, indicesOptions, + System.currentTimeMillis(), true, false, true, preserveDataStreams, + allowRemoteIndices, getSystemIndexAccessLevel(), getSystemIndexAccessPredicate(), getNetNewSystemIndexPredicate() @@ -1221,7 +1225,10 @@ public Map> resolveSearchRouting(ProjectMetadata project, @N Context context = new Context( project, IndicesOptions.lenientExpandOpen(), + System.currentTimeMillis(), + false, false, + true, false, true, getSystemIndexAccessLevel(), @@ -1526,6 +1533,7 @@ public static class Context { private final boolean resolveToWriteIndex; private final boolean includeDataStreams; private final boolean preserveDataStreams; + private final boolean allowRemoteIndices; private final SystemIndexAccessLevel systemIndexAccessLevel; private final Predicate systemIndexAccessPredicate; private final Predicate netNewSystemIndexPredicate; @@ -1569,6 +1577,7 @@ public static class Context { resolveToWriteIndex, includeDataStreams, false, + false, systemIndexAccessLevel, systemIndexAccessPredicate, netNewSystemIndexPredicate @@ -1594,6 +1603,7 @@ public static class Context { resolveToWriteIndex, includeDataStreams, preserveDataStreams, + false, systemIndexAccessLevel, systemIndexAccessPredicate, netNewSystemIndexPredicate @@ -1616,6 +1626,7 @@ public static class Context { false, false, false, + false, systemIndexAccessLevel, systemIndexAccessPredicate, netNewSystemIndexPredicate @@ -1630,6 +1641,7 @@ protected Context( boolean resolveToWriteIndex, boolean includeDataStreams, boolean preserveDataStreams, + boolean allowRemoteIndices, SystemIndexAccessLevel systemIndexAccessLevel, Predicate systemIndexAccessPredicate, Predicate netNewSystemIndexPredicate @@ -1641,6 +1653,7 @@ protected Context( this.resolveToWriteIndex = resolveToWriteIndex; this.includeDataStreams = includeDataStreams; this.preserveDataStreams = preserveDataStreams; + this.allowRemoteIndices = allowRemoteIndices; this.systemIndexAccessLevel = systemIndexAccessLevel; this.systemIndexAccessPredicate = systemIndexAccessPredicate; this.netNewSystemIndexPredicate = netNewSystemIndexPredicate; @@ -1683,6 +1696,10 @@ public boolean isPreserveDataStreams() { return preserveDataStreams; } + public boolean isAllowRemoteIndices() { + return allowRemoteIndices; + } + /** * Used to determine system index access is allowed in this context (e.g. for this request). */ diff --git a/server/src/test/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexTests.java b/server/src/test/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexTests.java index d9a2d885b82a6..197371404a31b 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexTests.java @@ -330,6 +330,7 @@ public void testResolveHiddenProperlyWithDateMath() { project, IndicesOptions.LENIENT_EXPAND_OPEN, true, + false, requestedIndex ); assertThat(resolvedIndices.size(), is(1)); From c1944c25bdc48fccfe3a129177c7ccc8dba4a57e Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Wed, 3 Dec 2025 15:18:03 -0700 Subject: [PATCH 04/25] bug ref --- docs/changelog/139009.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog/139009.yaml b/docs/changelog/139009.yaml index e969417be2467..71a68deb7ff90 100644 --- a/docs/changelog/139009.yaml +++ b/docs/changelog/139009.yaml @@ -2,4 +2,4 @@ pr: 139009 summary: Always error out if CCS expression shows up when CCS is not supported area: CCS type: bug -issues: [] +issues: [ 138987 ] From 5664342d97e5338f88bba01bb33c4ac4135e6a13 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Wed, 3 Dec 2025 15:38:48 -0700 Subject: [PATCH 05/25] Reduce ctor explosion --- .../metadata/IndexNameExpressionResolver.java | 72 ++++--------------- .../IndexNameExpressionResolverTests.java | 5 ++ 2 files changed, 18 insertions(+), 59 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java index 3b66e09edf548..aeac12ad90169 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java @@ -235,6 +235,12 @@ public String[] concreteIndexNames(ProjectMetadata project, IndicesOptions optio Context context = new Context( project, options, + System.currentTimeMillis(), + false, + false, + false, + false, + false, getSystemIndexAccessLevel(), getSystemIndexAccessPredicate(), getNetNewSystemIndexPredicate() @@ -299,10 +305,12 @@ public List dataStreams(ProjectMetadata project, IndicesOpti Context context = new Context( project, options, + System.currentTimeMillis(), false, false, true, true, + false, getSystemIndexAccessLevel(), getSystemIndexAccessPredicate(), getNetNewSystemIndexPredicate() @@ -1539,48 +1547,18 @@ public static class Context { private final Predicate netNewSystemIndexPredicate; Context(ProjectMetadata project, IndicesOptions options, SystemIndexAccessLevel systemIndexAccessLevel) { - this(project, options, systemIndexAccessLevel, Predicates.always(), Predicates.never()); - } - - Context( - ProjectMetadata project, - IndicesOptions options, - SystemIndexAccessLevel systemIndexAccessLevel, - Predicate systemIndexAccessPredicate, - Predicate netNewSystemIndexPredicate - ) { this( project, options, System.currentTimeMillis(), - systemIndexAccessLevel, - systemIndexAccessPredicate, - netNewSystemIndexPredicate - ); - } - - Context( - ProjectMetadata project, - IndicesOptions options, - boolean preserveAliases, - boolean resolveToWriteIndex, - boolean includeDataStreams, - SystemIndexAccessLevel systemIndexAccessLevel, - Predicate systemIndexAccessPredicate, - Predicate netNewSystemIndexPredicate - ) { - this( - project, - options, - System.currentTimeMillis(), - preserveAliases, - resolveToWriteIndex, - includeDataStreams, + false, + false, + false, false, false, systemIndexAccessLevel, - systemIndexAccessPredicate, - netNewSystemIndexPredicate + Predicates.always(), + Predicates.never() ); } @@ -1590,7 +1568,6 @@ public static class Context { boolean preserveAliases, boolean resolveToWriteIndex, boolean includeDataStreams, - boolean preserveDataStreams, SystemIndexAccessLevel systemIndexAccessLevel, Predicate systemIndexAccessPredicate, Predicate netNewSystemIndexPredicate @@ -1602,29 +1579,6 @@ public static class Context { preserveAliases, resolveToWriteIndex, includeDataStreams, - preserveDataStreams, - false, - systemIndexAccessLevel, - systemIndexAccessPredicate, - netNewSystemIndexPredicate - ); - } - - Context( - ProjectMetadata project, - IndicesOptions options, - long startTime, - SystemIndexAccessLevel systemIndexAccessLevel, - Predicate systemIndexAccessPredicate, - Predicate netNewSystemIndexPredicate - ) { - this( - project, - options, - startTime, - false, - false, - false, false, false, systemIndexAccessLevel, diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java index 51d5e48f8c1bb..7ac1a843723bb 100644 --- a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java @@ -3320,6 +3320,11 @@ public void testDateMathMixedArray() { .build(), IndicesOptions.strictExpand(), now, + false, + false, + false, + false, + false, SystemIndexAccessLevel.NONE, Predicates.never(), Predicates.never() From ea87ec01a14e1eca25ade9a3a5096667689ed8cf Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Wed, 3 Dec 2025 15:43:35 -0700 Subject: [PATCH 06/25] improve comment --- .../cluster/metadata/IndexNameExpressionResolver.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java index aeac12ad90169..34542f95ea81c 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java @@ -480,7 +480,7 @@ private static void validateResourceExpression(Context context, String current, } /** - * Throws an exception if the expression is a remote expression + * Throws an exception if the expression is a remote expression and we do not allow it. */ private static void checkForRemoteIndexExpression(Context context, String current, String[] expressions) { if (context.isAllowRemoteIndices() == false && RemoteClusterAware.isRemoteIndexName(current)) { From 266048a14f976bd3704d4cc7167e2029d2933bea Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Wed, 3 Dec 2025 16:46:32 -0700 Subject: [PATCH 07/25] fix tests --- .../action/search/TransportSearchAction.java | 4 +++ .../IndexNameExpressionResolverTests.java | 29 ++++++++++++------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java index a773340dac65f..3de0f1ede1243 100644 --- a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java @@ -304,6 +304,10 @@ private Map resolveIndexBoosts(SearchRequest searchRequest, Clust Map concreteIndexBoosts = new HashMap<>(); for (SearchSourceBuilder.IndexBoost ib : source.indexBoosts()) { + if (RemoteClusterAware.isRemoteIndexName(ib.getIndex())) { + continue; + // FIXME: no, but really, what is supposed to happen here??? + } Index[] concreteIndices = indexNameExpressionResolver.concreteIndices( clusterState, searchRequest.indicesOptions(), diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java index 7ac1a843723bb..cb47c64b12537 100644 --- a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java @@ -3364,16 +3364,29 @@ public void testMathExpressionSupportWithOlderDate() { assertEquals(resolved, "older-date-2020-12"); } + private IndexNameExpressionResolver.Context makeRandomContext(IndicesOptions options, boolean allowRemotes) { + ProjectMetadata project = ProjectMetadata.builder(randomUniqueProjectId()).build(); + return new IndexNameExpressionResolver.Context( + project, + options, + System.currentTimeMillis(), + false, + false, + false, + false, + allowRemotes, + SystemIndexAccessLevel.NONE, + Predicates.always(), + Predicates.never() + ); + } + public void testRemoteIndex() { ProjectMetadata project = ProjectMetadata.builder(randomUniqueProjectId()).build(); { IndicesOptions options = IndicesOptions.fromOptions(false, randomBoolean(), randomBoolean(), randomBoolean(), randomBoolean()); - IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context( - project, - options, - SystemIndexAccessLevel.NONE - ); + IndexNameExpressionResolver.Context context = makeRandomContext(options, false); IllegalArgumentException iae = expectThrows( IllegalArgumentException.class, () -> indexNameExpressionResolver.concreteIndexNames(context, "cluster:index", "local") @@ -3391,11 +3404,7 @@ public void testRemoteIndex() { } { IndicesOptions options = IndicesOptions.fromOptions(true, true, randomBoolean(), randomBoolean(), randomBoolean()); - IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context( - project, - options, - SystemIndexAccessLevel.NONE - ); + IndexNameExpressionResolver.Context context = makeRandomContext(options, true); String[] indexNames = indexNameExpressionResolver.concreteIndexNames(context, "cluster:index", "local"); assertEquals(0, indexNames.length); } From e177894d03ab33982446f1e5379acaf7a98f9d72 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Thu, 4 Dec 2025 12:43:03 -0700 Subject: [PATCH 08/25] Fix semantic query tests --- .../elasticsearch/action/search/TransportSearchAction.java | 4 ---- .../ccs/AbstractSemanticCrossClusterSearchTestCase.java | 5 +++-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java index 3de0f1ede1243..a773340dac65f 100644 --- a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java @@ -304,10 +304,6 @@ private Map resolveIndexBoosts(SearchRequest searchRequest, Clust Map concreteIndexBoosts = new HashMap<>(); for (SearchSourceBuilder.IndexBoost ib : source.indexBoosts()) { - if (RemoteClusterAware.isRemoteIndexName(ib.getIndex())) { - continue; - // FIXME: no, but really, what is supposed to happen here??? - } Index[] concreteIndices = indexNameExpressionResolver.concreteIndices( clusterState, searchRequest.indicesOptions(), diff --git a/x-pack/plugin/inference/src/internalClusterTest/java/org/elasticsearch/search/ccs/AbstractSemanticCrossClusterSearchTestCase.java b/x-pack/plugin/inference/src/internalClusterTest/java/org/elasticsearch/search/ccs/AbstractSemanticCrossClusterSearchTestCase.java index 6c268a318549b..bc68f45d563e9 100644 --- a/x-pack/plugin/inference/src/internalClusterTest/java/org/elasticsearch/search/ccs/AbstractSemanticCrossClusterSearchTestCase.java +++ b/x-pack/plugin/inference/src/internalClusterTest/java/org/elasticsearch/search/ccs/AbstractSemanticCrossClusterSearchTestCase.java @@ -35,6 +35,7 @@ import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.test.AbstractMultiClustersTestCase; +import org.elasticsearch.transport.RemoteClusterAware; import org.elasticsearch.transport.RemoteConnectionInfo; import org.elasticsearch.xpack.inference.FakeMlPlugin; import org.elasticsearch.xpack.inference.LocalStateInferencePlugin; @@ -167,7 +168,7 @@ protected void assertSearchResponse( Consumer searchRequestModifier ) throws Exception { SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().query(queryBuilder).size(expectedSearchResults.size()); - indices.forEach(i -> searchSourceBuilder.indexBoost(i.index(), i.boost())); + indices.forEach(i -> searchSourceBuilder.indexBoost(RemoteClusterAware.splitIndexName(i.index())[1], i.boost())); SearchRequest searchRequest = new SearchRequest(convertToArray(indices), searchSourceBuilder); searchRequest.indicesOptions(IndicesOptions.LENIENT_EXPAND_OPEN); @@ -239,7 +240,7 @@ protected static Map sparseVectorMapping() { } protected static String fullyQualifiedIndexName(String clusterAlias, String indexName) { - return clusterAlias + ":" + indexName; + return RemoteClusterAware.buildRemoteIndexName(clusterAlias, indexName); } protected static float[] generateDenseVectorFieldValue(int dimensions, DenseVectorFieldMapper.ElementType elementType, float value) { From 734f118e786cb7cc0895d895428f6d3af99e67cd Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Thu, 4 Dec 2025 12:51:47 -0700 Subject: [PATCH 09/25] more tests --- .../rest-api-spec/test/search/40_indices_boost.yml | 11 +++++++++++ .../metadata/IndexNameExpressionResolverTests.java | 12 ++++++++++++ 2 files changed, 23 insertions(+) diff --git a/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search/40_indices_boost.yml b/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search/40_indices_boost.yml index 9e6b4582d8f22..f1e379750f57d 100644 --- a/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search/40_indices_boost.yml +++ b/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search/40_indices_boost.yml @@ -151,3 +151,14 @@ setup: - match: { hits.total: 2} - match: { hits.hits.0._index: test_2 } - match: { hits.hits.1._index: test_1 } + +--- +"Remote expressions not supported in indices boost": + - do: + catch: /Cross-cluster calls are not supported in this context but remote indices were requested:/ + search: + rest_total_hits_as_int: true + ignore_unavailable: true + index: _all + body: + indices_boost: [{nonexistent: 2.0}, {test_1: 1.0}, {test_2: 2.0}] diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java index cb47c64b12537..c5dea6c47cfea 100644 --- a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java @@ -3408,6 +3408,18 @@ public void testRemoteIndex() { String[] indexNames = indexNameExpressionResolver.concreteIndexNames(context, "cluster:index", "local"); assertEquals(0, indexNames.length); } + { + IndicesOptions options = IndicesOptions.fromOptions(true, true, randomBoolean(), randomBoolean(), randomBoolean()); + IndexNameExpressionResolver.Context context = makeRandomContext(options, false); + IllegalArgumentException iae = expectThrows( + IllegalArgumentException.class, + () -> indexNameExpressionResolver.concreteIndexNames(context, "cluster:index", "local") + ); + assertEquals( + "Cross-cluster calls are not supported in this context but remote indices were requested: [cluster:index]", + iae.getMessage() + ); + } } public void testResolveWriteIndexAbstraction() { From 9217de33ae9d22c0107bdbc2c5f3b9038f4d3d10 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Thu, 4 Dec 2025 13:36:41 -0700 Subject: [PATCH 10/25] fix test --- .../resources/rest-api-spec/test/search/40_indices_boost.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search/40_indices_boost.yml b/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search/40_indices_boost.yml index f1e379750f57d..b197b1125e242 100644 --- a/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search/40_indices_boost.yml +++ b/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search/40_indices_boost.yml @@ -161,4 +161,4 @@ setup: ignore_unavailable: true index: _all body: - indices_boost: [{nonexistent: 2.0}, {test_1: 1.0}, {test_2: 2.0}] + indices_boost: [{nonexistent: 2.0}, {remote1:test_1: 1.0}, {test_2: 2.0}] From 711f73fa413aa609605a16e4f91b37788d214136 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Thu, 4 Dec 2025 15:43:44 -0700 Subject: [PATCH 11/25] disable bwc --- rest-api-spec/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/rest-api-spec/build.gradle b/rest-api-spec/build.gradle index f0c124cdc2c90..82859c2f767bd 100644 --- a/rest-api-spec/build.gradle +++ b/rest-api-spec/build.gradle @@ -113,4 +113,5 @@ tasks.named("yamlRestCompatTestTransform").configure ({ task -> task.skipTest("search/140_pre_filter_search_shards/prefilter on non-indexed date fields", "prefiltering can now use skippers on dv-only fields") // Expected deprecation warning to compat yaml tests: task.addAllowedWarningRegex("Use of the \\[max_size\\] rollover condition has been deprecated in favour of the \\[max_primary_shard_size\\] condition and will be removed in a later version") + task.skipTest("search/40_indices_boost/Remote expressions not supported in indices boost", "Recent fix, old version do not support it") }) From 9709893352d300e61eade0cb9afab814c82296f8 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Thu, 4 Dec 2025 15:43:57 -0700 Subject: [PATCH 12/25] temp fix for SQL --- .../xpack/ql/index/IndexResolver.java | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/x-pack/plugin/ql/src/main/java/org/elasticsearch/xpack/ql/index/IndexResolver.java b/x-pack/plugin/ql/src/main/java/org/elasticsearch/xpack/ql/index/IndexResolver.java index ceb868aa74ba9..a835ec320f713 100644 --- a/x-pack/plugin/ql/src/main/java/org/elasticsearch/xpack/ql/index/IndexResolver.java +++ b/x-pack/plugin/ql/src/main/java/org/elasticsearch/xpack/ql/index/IndexResolver.java @@ -28,6 +28,7 @@ import org.elasticsearch.index.mapper.TimeSeriesParams; import org.elasticsearch.search.crossproject.CrossProjectIndexResolutionValidator; import org.elasticsearch.transport.NoSuchRemoteClusterException; +import org.elasticsearch.transport.RemoteClusterAware; import org.elasticsearch.xpack.ql.QlIllegalArgumentException; import org.elasticsearch.xpack.ql.type.DataType; import org.elasticsearch.xpack.ql.type.DataTypeRegistry; @@ -742,22 +743,32 @@ public void resolveAsSeparateMappings( } } client.fieldCaps(fieldRequest, listener.delegateFailureAndWrap((delegate, response) -> { - client.admin().indices().getAliases(createGetAliasesRequest(response, includeFrozen), wrap(aliases -> { - delegate.onResponse(separateMappings(typeRegistry, javaRegex, response, aliases.getAliases())); - }, ex -> { - if (ex instanceof IndexNotFoundException || ex instanceof ElasticsearchSecurityException) { - delegate.onResponse(separateMappings(typeRegistry, javaRegex, response, null)); - } else { - delegate.onFailure(ex); - } - })); + GetAliasesRequest request = createGetAliasesRequest(response, includeFrozen); + if (request.indices().length == 0) { + delegate.onResponse(separateMappings(typeRegistry, javaRegex, response, null)); + } else { + client.admin().indices().getAliases(request, wrap(aliases -> { + delegate.onResponse(separateMappings(typeRegistry, javaRegex, response, aliases.getAliases())); + }, ex -> { + if (ex instanceof IndexNotFoundException || ex instanceof ElasticsearchSecurityException) { + delegate.onResponse(separateMappings(typeRegistry, javaRegex, response, null)); + } else { + delegate.onFailure(ex); + } + })); + } })); } + private static String[] onlyLocalIndices(String[] indices) { + // FIXME: this is not really a good solution, but will do for now + return Arrays.stream(indices).filter(i -> RemoteClusterAware.isRemoteIndexName(i) == false).toArray(String[]::new); + } + private static GetAliasesRequest createGetAliasesRequest(FieldCapabilitiesResponse response, boolean includeFrozen) { return new GetAliasesRequest(MasterNodeRequest.INFINITE_MASTER_NODE_TIMEOUT).aliases("*") - .indices(response.getIndices()) + .indices(onlyLocalIndices(response.getIndices())) .indicesOptions(includeFrozen ? FIELD_CAPS_FROZEN_INDICES_OPTIONS : FIELD_CAPS_INDICES_OPTIONS); } From 0bbf3206651a81b10d6135a6015d357810adbf41 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Thu, 4 Dec 2025 18:42:47 -0700 Subject: [PATCH 13/25] More test fixes --- .../metadata/IndexNameExpressionResolver.java | 2 +- .../xpack/transform/action/TransformUpdater.java | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java index 34542f95ea81c..b108b3364d5a4 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java @@ -463,7 +463,7 @@ protected static Collection resolveExpressionsToResources(Co * Validates the requested expression by performing the following checks: * - Ensure it's not empty * - Ensure it doesn't start with `_` - * - Ensure it's not a remote expression unless the allow unavailable targets is enabled. + * - Ensure it's not a remote expression unless remotes are allowed by the context. */ private static void validateResourceExpression(Context context, String current, String[] expressions) { if (Strings.isEmpty(current)) { diff --git a/x-pack/plugin/transform/src/main/java/org/elasticsearch/xpack/transform/action/TransformUpdater.java b/x-pack/plugin/transform/src/main/java/org/elasticsearch/xpack/transform/action/TransformUpdater.java index f5a6f510765b5..85e2e81799969 100644 --- a/x-pack/plugin/transform/src/main/java/org/elasticsearch/xpack/transform/action/TransformUpdater.java +++ b/x-pack/plugin/transform/src/main/java/org/elasticsearch/xpack/transform/action/TransformUpdater.java @@ -21,6 +21,7 @@ import org.elasticsearch.core.TimeValue; import org.elasticsearch.index.engine.VersionConflictEngineException; import org.elasticsearch.persistent.PersistentTasksCustomMetadata; +import org.elasticsearch.transport.RemoteClusterAware; import org.elasticsearch.xpack.core.ClientHelper; import org.elasticsearch.xpack.core.XPackSettings; import org.elasticsearch.xpack.core.security.SecurityContext; @@ -36,6 +37,7 @@ import org.elasticsearch.xpack.transform.persistence.TransformConfigManager; import org.elasticsearch.xpack.transform.persistence.TransformIndex; +import java.util.Arrays; import java.util.Map; /** @@ -335,17 +337,19 @@ private static void updateTransformConfiguration( final String destinationIndex = config.getDestination().getIndex(); String[] dest = indexNameExpressionResolver.concreteIndexNames(clusterState, IndicesOptions.lenientExpandOpen(), destinationIndex); - String[] src = indexNameExpressionResolver.concreteIndexNames( - clusterState, - IndicesOptions.lenientExpandOpen(), - true, - config.getSource().getIndex() - ); + // FIXME: what do we do with remote indices? + String[] sourceIndices = Arrays.stream(config.getSource().getIndex()) + .filter(ind -> RemoteClusterAware.isRemoteIndexName(ind) == false) + .toArray(String[]::new); + String[] src = sourceIndices.length > 0 + ? indexNameExpressionResolver.concreteIndexNames(clusterState, IndicesOptions.lenientExpandOpen(), true, sourceIndices) + : null; // If we are running, we should verify that the destination index exists and create it if it does not if (PersistentTasksCustomMetadata.getTaskWithId(clusterState, config.getId()) != null && dest.length == 0 // Verify we have source indices. The user could defer_validations and if the task is already running // we allow source indices to disappear. If the source and destination indices do not exist, don't do anything // the transform will just have to dynamically create the destination index without special mapping. + && src != null && src.length > 0) { TransformIndex.createDestinationIndex( client, From a1bfc7a72c34135468c0311b929183000c4feb3d Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Mon, 8 Dec 2025 12:03:04 -0700 Subject: [PATCH 14/25] Fix test --- .../resources/rest-api-spec/test/search/40_indices_boost.yml | 2 ++ .../main/java/org/elasticsearch/search/SearchFeatures.java | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search/40_indices_boost.yml b/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search/40_indices_boost.yml index b197b1125e242..f5c15a50e1844 100644 --- a/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search/40_indices_boost.yml +++ b/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search/40_indices_boost.yml @@ -154,6 +154,8 @@ setup: --- "Remote expressions not supported in indices boost": + - requires: + features: ["search.indices_boost_remote_index_fix"] - do: catch: /Cross-cluster calls are not supported in this context but remote indices were requested:/ search: diff --git a/server/src/main/java/org/elasticsearch/search/SearchFeatures.java b/server/src/main/java/org/elasticsearch/search/SearchFeatures.java index 3cc3d2d15553b..ca832fea3b859 100644 --- a/server/src/main/java/org/elasticsearch/search/SearchFeatures.java +++ b/server/src/main/java/org/elasticsearch/search/SearchFeatures.java @@ -35,6 +35,7 @@ public Set getFeatures() { public static final NodeFeature SEARCH_WITH_NO_DIMENSIONS_BUGFIX = new NodeFeature("search.vectors.no_dimensions_bugfix"); public static final NodeFeature SEARCH_RESCORE_SCRIPT = new NodeFeature("search.rescore.script"); public static final NodeFeature NEGATIVE_FUNCTION_SCORE_BAD_REQUEST = new NodeFeature("search.negative.function.score.bad.request"); + public static final NodeFeature INDICES_BOOST_REMOTE_INDEX_FIX = new NodeFeature("search.indices_boost_remote_index_fix"); @Override public Set getTestFeatures() { @@ -47,7 +48,8 @@ public Set getTestFeatures() { BBQ_HNSW_DEFAULT_INDEXING, SEARCH_WITH_NO_DIMENSIONS_BUGFIX, SEARCH_RESCORE_SCRIPT, - NEGATIVE_FUNCTION_SCORE_BAD_REQUEST + NEGATIVE_FUNCTION_SCORE_BAD_REQUEST, + INDICES_BOOST_REMOTE_INDEX_FIX ); } } From a7e0a17146ae30c7f4b2f271f1e5d37447034605 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Mon, 8 Dec 2025 14:15:40 -0700 Subject: [PATCH 15/25] fix test --- .../resources/rest-api-spec/test/search/40_indices_boost.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search/40_indices_boost.yml b/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search/40_indices_boost.yml index f5c15a50e1844..6cb30d66e6a3b 100644 --- a/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search/40_indices_boost.yml +++ b/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search/40_indices_boost.yml @@ -155,7 +155,8 @@ setup: --- "Remote expressions not supported in indices boost": - requires: - features: ["search.indices_boost_remote_index_fix"] + cluster_features: ["search.indices_boost_remote_index_fix"] + reason: "indices_boost remote index fix must be present" - do: catch: /Cross-cluster calls are not supported in this context but remote indices were requested:/ search: From e83781efd54bb1866fae449cbd7d736aaf301ac6 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Mon, 8 Dec 2025 15:00:57 -0700 Subject: [PATCH 16/25] Update comments --- .../org/elasticsearch/xpack/ql/index/IndexResolver.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/x-pack/plugin/ql/src/main/java/org/elasticsearch/xpack/ql/index/IndexResolver.java b/x-pack/plugin/ql/src/main/java/org/elasticsearch/xpack/ql/index/IndexResolver.java index a835ec320f713..d43c5e8a01243 100644 --- a/x-pack/plugin/ql/src/main/java/org/elasticsearch/xpack/ql/index/IndexResolver.java +++ b/x-pack/plugin/ql/src/main/java/org/elasticsearch/xpack/ql/index/IndexResolver.java @@ -761,8 +761,12 @@ public void resolveAsSeparateMappings( } + /** + * Filter out remote index expressions. + * TODO: SQL Metadata commands currently do not support remote indices. + * See also: showTablesIdentifierPatternOnAliases-Ignore + */ private static String[] onlyLocalIndices(String[] indices) { - // FIXME: this is not really a good solution, but will do for now return Arrays.stream(indices).filter(i -> RemoteClusterAware.isRemoteIndexName(i) == false).toArray(String[]::new); } From 2977d9794c5e89e77ef55f35c5dc7ea7c3b9c032 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Tue, 9 Dec 2025 16:27:17 -0700 Subject: [PATCH 17/25] Update docs/changelog/139009.yaml --- docs/changelog/139009.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog/139009.yaml b/docs/changelog/139009.yaml index 71a68deb7ff90..e969417be2467 100644 --- a/docs/changelog/139009.yaml +++ b/docs/changelog/139009.yaml @@ -2,4 +2,4 @@ pr: 139009 summary: Always error out if CCS expression shows up when CCS is not supported area: CCS type: bug -issues: [ 138987 ] +issues: [] From aba5bea4bc46cd315752550ec67652fca30d5e7b Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Tue, 9 Dec 2025 16:52:10 -0700 Subject: [PATCH 18/25] add test --- .../test/indices.get_mapping/70_remote.yml | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/indices.get_mapping/70_remote.yml diff --git a/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/indices.get_mapping/70_remote.yml b/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/indices.get_mapping/70_remote.yml new file mode 100644 index 0000000000000..d3500aaf0aed4 --- /dev/null +++ b/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/indices.get_mapping/70_remote.yml @@ -0,0 +1,37 @@ +--- +setup: + - do: + indices.create: + index: test_1 + +--- +"Remote index mapping, should fail": + - requires: + cluster_features: [ "search.indices_boost_remote_index_fix" ] + reason: "indices_boost remote index fix must be present" + - do: + catch: /Cross-cluster calls are not supported in this context but remote indices were requested:/ + indices.get_mapping: + index: remote1:test_1 + +--- +"Remote and local index mapping, should fail": + - requires: + cluster_features: [ "search.indices_boost_remote_index_fix" ] + reason: "indices_boost remote index fix must be present" + - do: + catch: /Cross-cluster calls are not supported in this context but remote indices were requested:/ + indices.get_mapping: + index: test_1,remote1:test_1 + +--- +"Remote index mapping, ignore_unavailable=true, should fail": + - requires: + cluster_features: [ "search.indices_boost_remote_index_fix" ] + reason: "indices_boost remote index fix must be present" + - do: + catch: /Cross-cluster calls are not supported in this context but remote indices were requested:/ + indices.get_mapping: + ignore_unavailable: true + index: remote1:test_1 + From 225e8a900209d595ed072123190e25fdb69c59d3 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Tue, 9 Dec 2025 17:00:05 -0700 Subject: [PATCH 19/25] Revert "Update docs/changelog/139009.yaml" This reverts commit 2977d9794c5e89e77ef55f35c5dc7ea7c3b9c032. --- docs/changelog/139009.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog/139009.yaml b/docs/changelog/139009.yaml index e969417be2467..71a68deb7ff90 100644 --- a/docs/changelog/139009.yaml +++ b/docs/changelog/139009.yaml @@ -2,4 +2,4 @@ pr: 139009 summary: Always error out if CCS expression shows up when CCS is not supported area: CCS type: bug -issues: [] +issues: [ 138987 ] From 30dea666f855f6920aaa0e0a16121aa6553c3641 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Wed, 17 Dec 2025 16:20:19 -0700 Subject: [PATCH 20/25] Update docs/changelog/139009.yaml --- docs/changelog/139009.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog/139009.yaml b/docs/changelog/139009.yaml index 71a68deb7ff90..e969417be2467 100644 --- a/docs/changelog/139009.yaml +++ b/docs/changelog/139009.yaml @@ -2,4 +2,4 @@ pr: 139009 summary: Always error out if CCS expression shows up when CCS is not supported area: CCS type: bug -issues: [ 138987 ] +issues: [] From 589d80798843c2626a9dd7fbade1fd2c7c628768 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Tue, 23 Dec 2025 15:32:12 -0700 Subject: [PATCH 21/25] Maybe this is not needed --- rest-api-spec/build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/rest-api-spec/build.gradle b/rest-api-spec/build.gradle index 94abada367c7a..6e8da45741731 100644 --- a/rest-api-spec/build.gradle +++ b/rest-api-spec/build.gradle @@ -122,5 +122,4 @@ tasks.named("yamlRestCompatTestTransform").configure ({ task -> task.skipTest("search/140_pre_filter_search_shards/prefilter on non-indexed date fields", "prefiltering can now use skippers on dv-only fields") // Expected deprecation warning to compat yaml tests: task.addAllowedWarningRegex("Use of the \\[max_size\\] rollover condition has been deprecated in favour of the \\[max_primary_shard_size\\] condition and will be removed in a later version") - task.skipTest("search/40_indices_boost/Remote expressions not supported in indices boost", "Recent fix, old version do not support it") }) From 83d2c823dce241fda8f9bcd86a036f761f031b9f Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Fri, 2 Jan 2026 10:57:05 -0700 Subject: [PATCH 22/25] Update 139009.yaml --- docs/changelog/139009.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog/139009.yaml b/docs/changelog/139009.yaml index e969417be2467..71a68deb7ff90 100644 --- a/docs/changelog/139009.yaml +++ b/docs/changelog/139009.yaml @@ -2,4 +2,4 @@ pr: 139009 summary: Always error out if CCS expression shows up when CCS is not supported area: CCS type: bug -issues: [] +issues: [ 138987 ] From f9965a85fe2e622d41aae2eb1c6c3c78b5d079ac Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Mon, 5 Jan 2026 10:10:58 -0700 Subject: [PATCH 23/25] rename method to emphasize it ignores remote expressions --- .../TransportClusterSearchShardsAction.java | 2 +- .../query/TransportValidateQueryAction.java | 2 +- .../explain/TransportExplainAction.java | 2 +- .../action/search/TransportSearchAction.java | 2 +- .../search/TransportSearchShardsAction.java | 2 +- .../metadata/IndexNameExpressionResolver.java | 8 ++--- .../IndexNameExpressionResolverTests.java | 36 +++++++++---------- .../esql/enrich/AbstractLookupService.java | 2 +- 8 files changed, 28 insertions(+), 28 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/action/admin/cluster/shards/TransportClusterSearchShardsAction.java b/server/src/main/java/org/elasticsearch/action/admin/cluster/shards/TransportClusterSearchShardsAction.java index 78e6b5da9230c..c159804d356db 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/cluster/shards/TransportClusterSearchShardsAction.java +++ b/server/src/main/java/org/elasticsearch/action/admin/cluster/shards/TransportClusterSearchShardsAction.java @@ -101,7 +101,7 @@ protected void masterOperation( request.indices() ); Map indicesAndFilters = new HashMap<>(); - Set indicesAndAliases = indexNameExpressionResolver.resolveExpressions(project.metadata(), request.indices()); + Set indicesAndAliases = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project.metadata(), request.indices()); for (String index : concreteIndices) { final AliasFilter aliasFilter = indicesService.buildAliasFilter(project, index, indicesAndAliases); final String[] aliases = indexNameExpressionResolver.allIndexAliases(project.metadata(), index, indicesAndAliases); diff --git a/server/src/main/java/org/elasticsearch/action/admin/indices/validate/query/TransportValidateQueryAction.java b/server/src/main/java/org/elasticsearch/action/admin/indices/validate/query/TransportValidateQueryAction.java index 6b5a4ffeaf14e..3227be0133595 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/indices/validate/query/TransportValidateQueryAction.java +++ b/server/src/main/java/org/elasticsearch/action/admin/indices/validate/query/TransportValidateQueryAction.java @@ -152,7 +152,7 @@ private ProjectState getProjectState() { @Override protected ShardValidateQueryRequest newShardRequest(int numShards, ShardRouting shard, ValidateQueryRequest request) { final ProjectState projectState = getProjectState(); - final Set indicesAndAliases = indexNameExpressionResolver.resolveExpressions( + final Set indicesAndAliases = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes( projectState.metadata(), request.indices() ); diff --git a/server/src/main/java/org/elasticsearch/action/explain/TransportExplainAction.java b/server/src/main/java/org/elasticsearch/action/explain/TransportExplainAction.java index 1a97373afbcaa..6fea177b888c5 100644 --- a/server/src/main/java/org/elasticsearch/action/explain/TransportExplainAction.java +++ b/server/src/main/java/org/elasticsearch/action/explain/TransportExplainAction.java @@ -128,7 +128,7 @@ protected boolean resolveIndex(ExplainRequest request) { @Override protected void resolveRequest(ProjectState state, InternalRequest request) { - final Set indicesAndAliases = indexNameExpressionResolver.resolveExpressions( + final Set indicesAndAliases = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes( state.metadata(), request.request().index() ); diff --git a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java index 8134021f4962f..0f472fd9fe4d3 100644 --- a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java @@ -1722,7 +1722,7 @@ private void executeSearch( } else { final Index[] indices = resolvedIndices.getConcreteLocalIndices(); concreteLocalIndices = Arrays.stream(indices).map(Index::getName).toArray(String[]::new); - final Set indicesAndAliases = indexNameExpressionResolver.resolveExpressions( + final Set indicesAndAliases = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes( projectState.metadata(), searchRequest.indices() ); diff --git a/server/src/main/java/org/elasticsearch/action/search/TransportSearchShardsAction.java b/server/src/main/java/org/elasticsearch/action/search/TransportSearchShardsAction.java index 1a98d1d91c5ca..5d9b8801a9d29 100644 --- a/server/src/main/java/org/elasticsearch/action/search/TransportSearchShardsAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/TransportSearchShardsAction.java @@ -144,7 +144,7 @@ public void searchShards(Task task, SearchShardsRequest searchShardsRequest, Act ), listener.delegateFailureAndWrap((delegate, searchRequest) -> { Index[] concreteIndices = resolvedIndices.getConcreteLocalIndices(); - final Set indicesAndAliases = indexNameExpressionResolver.resolveExpressions( + final Set indicesAndAliases = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes( project.metadata(), searchRequest.indices() ); diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java index 802a1f2782db2..cb53f2e68f413 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java @@ -1012,7 +1012,7 @@ public static void assertExpressionHasNullOrDataSelector(String expression) { /** * Resolve an array of expressions to the set of indices and aliases that these expressions match. */ - public Set resolveExpressions(ProjectMetadata project, String... expressions) { + public Set resolveExpressionsIgnoringRemotes(ProjectMetadata project, String... expressions) { return resolveExpressions(project, IndicesOptions.lenientExpandOpen(), false, true, expressions); } @@ -1056,7 +1056,7 @@ public Set resolveExpressions( * given index. *

Only aliases with filters are returned. If the indices list contains a non-filtering reference to * the index itself - null is returned. Returns {@code null} if no filtering is required. - * NOTE: The provided expressions must have been resolved already via {@link #resolveExpressions}. + * NOTE: The provided expressions must have been resolved already via {@link #resolveExpressionsIgnoringRemotes}. */ public String[] filteringAliases(ProjectMetadata project, String index, Set resolvedExpressions) { return indexAliases( @@ -1072,7 +1072,7 @@ public String[] filteringAliases(ProjectMetadata project, String index, SetNOTE: The provided expressions must have been resolved already via {@link #resolveExpressions}. + * NOTE: The provided expressions must have been resolved already via {@link #resolveExpressionsIgnoringRemotes}. */ public String[] allIndexAliases(ProjectMetadata project, String index, Set resolvedExpressions) { return indexAliases(project, index, Predicates.always(), ALL_DATA_STREAM_ALIASES, true, resolvedExpressions); @@ -1092,7 +1092,7 @@ boolean iterateIndexAliases(int indexAliasesSize, int resolvedExpressionsSize) { * Iterates through the list of indices and selects the effective list of required aliases for the given index. *

Only aliases where the given predicate tests successfully are returned. If the indices list contains a non-required reference to * the index itself - null is returned. Returns {@code null} if no filtering is required. - *

NOTE: the provided expressions must have been resolved already via {@link #resolveExpressions}. + *

NOTE: the provided expressions must have been resolved already via {@link #resolveExpressionsIgnoringRemotes}. */ public String[] indexAliases( ProjectMetadata project, diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java index 035f00e1a6c02..448d6fa9a9276 100644 --- a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java @@ -1610,7 +1610,7 @@ public void testFilterClosedIndicesOnAliases() { assertArrayEquals(new String[] { "test-0" }, strings); } - public void testResolveExpressions() { + public void testResolveExpressionsIgnoringRemotes() { ProjectMetadata project = ProjectMetadata.builder(Metadata.DEFAULT_PROJECT_ID) .put(indexBuilder("test-0").state(State.OPEN).putAlias(AliasMetadata.builder("alias-0").filter("{ \"term\": \"foo\"}"))) .put(indexBuilder("test-1").state(State.OPEN).putAlias(AliasMetadata.builder("alias-1"))) @@ -1618,7 +1618,7 @@ public void testResolveExpressions() { assertEquals( Set.of(new ResolvedExpression("alias-0", DATA), new ResolvedExpression("alias-1", DATA)), - indexNameExpressionResolver.resolveExpressions(project, "alias-*") + indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, "alias-*") ); assertEquals( Set.of( @@ -1626,7 +1626,7 @@ public void testResolveExpressions() { new ResolvedExpression("alias-0", DATA), new ResolvedExpression("alias-1", DATA) ), - indexNameExpressionResolver.resolveExpressions(project, "test-0", "alias-*") + indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, "test-0", "alias-*") ); assertEquals( Set.of( @@ -1635,11 +1635,11 @@ public void testResolveExpressions() { new ResolvedExpression("alias-0", DATA), new ResolvedExpression("alias-1", DATA) ), - indexNameExpressionResolver.resolveExpressions(project, "test-*", "alias-*") + indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, "test-*", "alias-*") ); assertEquals( Set.of(new ResolvedExpression("test-1", DATA), new ResolvedExpression("alias-1", DATA)), - indexNameExpressionResolver.resolveExpressions(project, "*-1") + indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, "*-1") ); } @@ -1681,7 +1681,7 @@ public void testIndexAliases() { .putAlias(AliasMetadata.builder("test-alias-non-filtering")) ) .build(); - Set resolvedExpressions = indexNameExpressionResolver.resolveExpressions(project, "test-*"); + Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, "test-*"); String[] strings = indexNameExpressionResolver.allIndexAliases(project, "test-0", resolvedExpressions); Arrays.sort(strings); @@ -1716,21 +1716,21 @@ public void testIndexAliasesDataStreamAliases() { ProjectMetadata project = projectBuilder.build(); { // Only resolve aliases that refer to dataStreamName1 - Set resolvedExpressions = indexNameExpressionResolver.resolveExpressions(project, "l*"); + Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, "l*"); String index = backingIndex1.getIndex().getName(); String[] result = indexNameExpressionResolver.allIndexAliases(project, index, resolvedExpressions); assertThat(result, arrayContainingInAnyOrder("logs_foo", "logs", "logs_bar")); } { // Only resolve aliases that refer to dataStreamName2 - Set resolvedExpressions = indexNameExpressionResolver.resolveExpressions(project, "l*"); + Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, "l*"); String index = backingIndex2.getIndex().getName(); String[] result = indexNameExpressionResolver.allIndexAliases(project, index, resolvedExpressions); assertThat(result, arrayContainingInAnyOrder("logs_baz", "logs_baz2")); } { // Null is returned, because skipping identity check and resolvedExpressions contains the backing index name - Set resolvedExpressions = indexNameExpressionResolver.resolveExpressions(project, "l*"); + Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, "l*"); String index = backingIndex2.getIndex().getName(); String[] result = indexNameExpressionResolver.indexAliases( project, @@ -1744,28 +1744,28 @@ public void testIndexAliasesDataStreamAliases() { } { // Null is returned, because the wildcard expands to a list of aliases containing an unfiltered alias for dataStreamName1 - Set resolvedExpressions = indexNameExpressionResolver.resolveExpressions(project, "l*"); + Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, "l*"); String index = backingIndex1.getIndex().getName(); String[] result = indexNameExpressionResolver.filteringAliases(project, index, resolvedExpressions); assertThat(result, nullValue()); } { // Null is returned, because an unfiltered alias is targeting the same data stream - Set resolvedExpressions = indexNameExpressionResolver.resolveExpressions(project, "logs_bar", "logs"); + Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, "logs_bar", "logs"); String index = backingIndex1.getIndex().getName(); String[] result = indexNameExpressionResolver.filteringAliases(project, index, resolvedExpressions); assertThat(result, nullValue()); } { // Null is returned because we target the data stream name and skipIdentity is false - Set resolvedExpressions = indexNameExpressionResolver.resolveExpressions(project, dataStreamName1, "logs"); + Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, dataStreamName1, "logs"); String index = backingIndex1.getIndex().getName(); String[] result = indexNameExpressionResolver.filteringAliases(project, index, resolvedExpressions); assertThat(result, nullValue()); } { // The filtered alias is returned because although we target the data stream name, skipIdentity is true - Set resolvedExpressions = indexNameExpressionResolver.resolveExpressions(project, dataStreamName1, "logs"); + Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, dataStreamName1, "logs"); String index = backingIndex1.getIndex().getName(); String[] result = indexNameExpressionResolver.indexAliases( project, @@ -1799,21 +1799,21 @@ public void testIndexAliasesDataStreamFailureStoreAndAliases() { ProjectMetadata project = projectBuilder.build(); { // Resolving the failure component with a backing index should return null - Set resolvedExpressions = indexNameExpressionResolver.resolveExpressions(project, "l*::failures"); + Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, "l*::failures"); String index = randomBoolean() ? backingIndex1.getIndex().getName() : backingIndex2.getIndex().getName(); String[] result = indexNameExpressionResolver.allIndexAliases(project, index, resolvedExpressions); assertThat(result, nullValue()); } { // Only resolve aliases that refer to dataStreamName1 failure store - Set resolvedExpressions = indexNameExpressionResolver.resolveExpressions(project, "l*::failures"); + Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, "l*::failures"); String index = failureIndex1.getIndex().getName(); String[] result = indexNameExpressionResolver.allIndexAliases(project, index, resolvedExpressions); assertThat(result, arrayContainingInAnyOrder("logs_foo::failures", "logs::failures", "logs_bar::failures")); } { // Null is returned, because we perform the identity check and resolvedExpressions contains the failure index name - Set resolvedExpressions = indexNameExpressionResolver.resolveExpressions(project, "l*::failures"); + Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, "l*::failures"); String index = failureIndex1.getIndex().getName(); String[] result = indexNameExpressionResolver.indexAliases( project, @@ -1827,14 +1827,14 @@ public void testIndexAliasesDataStreamFailureStoreAndAliases() { } { // Null is returned, because the wildcard expands to a list of aliases containing an unfiltered alias for dataStreamName1 - Set resolvedExpressions = indexNameExpressionResolver.resolveExpressions(project, "l*::failures"); + Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, "l*::failures"); String index = failureIndex1.getIndex().getName(); String[] result = indexNameExpressionResolver.filteringAliases(project, index, resolvedExpressions); assertThat(result, nullValue()); } { // Null is returned because we target the failure store of the data stream - Set resolvedExpressions = indexNameExpressionResolver.resolveExpressions(project, "logs::failures"); + Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, "logs::failures"); String index = failureIndex1.getIndex().getName(); String[] result = indexNameExpressionResolver.filteringAliases(project, index, resolvedExpressions); assertThat(result, nullValue()); diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/enrich/AbstractLookupService.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/enrich/AbstractLookupService.java index dcfdd03fed9c1..984af52d2594c 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/enrich/AbstractLookupService.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/enrich/AbstractLookupService.java @@ -290,7 +290,7 @@ private void doLookup(T request, CancellableTask task, ActionListener AliasFilter aliasFilter = indicesService.buildAliasFilter( projectState, request.shardId.getIndex().getName(), - indexNameExpressionResolver.resolveExpressions(projectState.metadata(), request.indexPattern) + indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(projectState.metadata(), request.indexPattern) ); LookupShardContext shardContext = lookupShardContextFactory.create(request.shardId); From 92396d79d7c876edc98c5fed94f42c16b2017484 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Mon, 5 Jan 2026 10:13:09 -0700 Subject: [PATCH 24/25] fix comments --- .../cluster/metadata/IndexNameExpressionResolver.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java index cb53f2e68f413..28bc7d1eb1f77 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java @@ -1056,7 +1056,7 @@ public Set resolveExpressions( * given index. *

Only aliases with filters are returned. If the indices list contains a non-filtering reference to * the index itself - null is returned. Returns {@code null} if no filtering is required. - * NOTE: The provided expressions must have been resolved already via {@link #resolveExpressionsIgnoringRemotes}. + * NOTE: The provided expressions must have been resolved already via {@link #resolveExpressions}. */ public String[] filteringAliases(ProjectMetadata project, String index, Set resolvedExpressions) { return indexAliases( @@ -1072,7 +1072,7 @@ public String[] filteringAliases(ProjectMetadata project, String index, SetNOTE: The provided expressions must have been resolved already via {@link #resolveExpressionsIgnoringRemotes}. + * NOTE: The provided expressions must have been resolved already via {@link #resolveExpressions}. */ public String[] allIndexAliases(ProjectMetadata project, String index, Set resolvedExpressions) { return indexAliases(project, index, Predicates.always(), ALL_DATA_STREAM_ALIASES, true, resolvedExpressions); @@ -1092,7 +1092,7 @@ boolean iterateIndexAliases(int indexAliasesSize, int resolvedExpressionsSize) { * Iterates through the list of indices and selects the effective list of required aliases for the given index. *

Only aliases where the given predicate tests successfully are returned. If the indices list contains a non-required reference to * the index itself - null is returned. Returns {@code null} if no filtering is required. - *

NOTE: the provided expressions must have been resolved already via {@link #resolveExpressionsIgnoringRemotes}. + *

NOTE: the provided expressions must have been resolved already via {@link #resolveExpressions}. */ public String[] indexAliases( ProjectMetadata project, From a577e2661b40ce2ee3864f8184eb7ec8f6333ae4 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Mon, 5 Jan 2026 10:14:34 -0700 Subject: [PATCH 25/25] ws --- .../TransportClusterSearchShardsAction.java | 5 ++- .../IndexNameExpressionResolverTests.java | 43 +++++++++++++++---- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/action/admin/cluster/shards/TransportClusterSearchShardsAction.java b/server/src/main/java/org/elasticsearch/action/admin/cluster/shards/TransportClusterSearchShardsAction.java index c159804d356db..833b356862cc7 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/cluster/shards/TransportClusterSearchShardsAction.java +++ b/server/src/main/java/org/elasticsearch/action/admin/cluster/shards/TransportClusterSearchShardsAction.java @@ -101,7 +101,10 @@ protected void masterOperation( request.indices() ); Map indicesAndFilters = new HashMap<>(); - Set indicesAndAliases = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project.metadata(), request.indices()); + Set indicesAndAliases = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes( + project.metadata(), + request.indices() + ); for (String index : concreteIndices) { final AliasFilter aliasFilter = indicesService.buildAliasFilter(project, index, indicesAndAliases); final String[] aliases = indexNameExpressionResolver.allIndexAliases(project.metadata(), index, indicesAndAliases); diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java index 448d6fa9a9276..1a599683c8052 100644 --- a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java @@ -1751,21 +1751,33 @@ public void testIndexAliasesDataStreamAliases() { } { // Null is returned, because an unfiltered alias is targeting the same data stream - Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, "logs_bar", "logs"); + Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes( + project, + "logs_bar", + "logs" + ); String index = backingIndex1.getIndex().getName(); String[] result = indexNameExpressionResolver.filteringAliases(project, index, resolvedExpressions); assertThat(result, nullValue()); } { // Null is returned because we target the data stream name and skipIdentity is false - Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, dataStreamName1, "logs"); + Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes( + project, + dataStreamName1, + "logs" + ); String index = backingIndex1.getIndex().getName(); String[] result = indexNameExpressionResolver.filteringAliases(project, index, resolvedExpressions); assertThat(result, nullValue()); } { // The filtered alias is returned because although we target the data stream name, skipIdentity is true - Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, dataStreamName1, "logs"); + Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes( + project, + dataStreamName1, + "logs" + ); String index = backingIndex1.getIndex().getName(); String[] result = indexNameExpressionResolver.indexAliases( project, @@ -1799,21 +1811,30 @@ public void testIndexAliasesDataStreamFailureStoreAndAliases() { ProjectMetadata project = projectBuilder.build(); { // Resolving the failure component with a backing index should return null - Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, "l*::failures"); + Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes( + project, + "l*::failures" + ); String index = randomBoolean() ? backingIndex1.getIndex().getName() : backingIndex2.getIndex().getName(); String[] result = indexNameExpressionResolver.allIndexAliases(project, index, resolvedExpressions); assertThat(result, nullValue()); } { // Only resolve aliases that refer to dataStreamName1 failure store - Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, "l*::failures"); + Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes( + project, + "l*::failures" + ); String index = failureIndex1.getIndex().getName(); String[] result = indexNameExpressionResolver.allIndexAliases(project, index, resolvedExpressions); assertThat(result, arrayContainingInAnyOrder("logs_foo::failures", "logs::failures", "logs_bar::failures")); } { // Null is returned, because we perform the identity check and resolvedExpressions contains the failure index name - Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, "l*::failures"); + Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes( + project, + "l*::failures" + ); String index = failureIndex1.getIndex().getName(); String[] result = indexNameExpressionResolver.indexAliases( project, @@ -1827,14 +1848,20 @@ public void testIndexAliasesDataStreamFailureStoreAndAliases() { } { // Null is returned, because the wildcard expands to a list of aliases containing an unfiltered alias for dataStreamName1 - Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, "l*::failures"); + Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes( + project, + "l*::failures" + ); String index = failureIndex1.getIndex().getName(); String[] result = indexNameExpressionResolver.filteringAliases(project, index, resolvedExpressions); assertThat(result, nullValue()); } { // Null is returned because we target the failure store of the data stream - Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes(project, "logs::failures"); + Set resolvedExpressions = indexNameExpressionResolver.resolveExpressionsIgnoringRemotes( + project, + "logs::failures" + ); String index = failureIndex1.getIndex().getName(); String[] result = indexNameExpressionResolver.filteringAliases(project, index, resolvedExpressions); assertThat(result, nullValue());