Skip to content

Commit ebcf26f

Browse files
Add ResolvedExpression wrapper (#114592) (#114722)
**Introduction** > In order to make adoption of failure stores simpler for all users, we are introducing a new syntactical feature to index expression resolution: The selector. > > Selectors, denoted with a :: followed by a recognized suffix will allow users to specify which component of an index abstraction they would like to operate on within an API call. In this case, an index abstraction is a concrete index, data stream, or alias; Any abstraction that can be resolved to a set of indices/shards. We define a component of an index abstraction to be some searchable unit of the index abstraction. > > To start, we will support two components: data and failures. Concrete indices are their own data components, while the data component for index aliases are all of the indices contained therein. For data streams, the data component corresponds to their backing indices. Data stream aliases mirror this, treating all backing indices of the data streams they correspond to as their data component. > > The failure component is only supported by data streams and data stream aliases. The failure component of these abstractions refer to the data streams' failure stores. Indices and index aliases do not have a failure component. For more details and examples see #113144. All this work has been cherry picked from there. **Purpose of this PR** This PR is introducing a wrapper around the resolved expression that used to be a `String` to create the base on which the selectors are going to be added. The current PR is just a refactoring and does not and should not change any existing behaviour. Co-authored-by: Elastic Machine <[email protected]>
1 parent c87614c commit ebcf26f

File tree

15 files changed

+504
-356
lines changed

15 files changed

+504
-356
lines changed

server/src/main/java/org/elasticsearch/action/admin/cluster/shards/TransportClusterSearchShardsAction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.elasticsearch.cluster.block.ClusterBlockException;
1818
import org.elasticsearch.cluster.block.ClusterBlockLevel;
1919
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
20+
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.ResolvedExpression;
2021
import org.elasticsearch.cluster.node.DiscoveryNode;
2122
import org.elasticsearch.cluster.routing.GroupShardsIterator;
2223
import org.elasticsearch.cluster.routing.ShardIterator;
@@ -84,7 +85,7 @@ protected void masterOperation(
8485
String[] concreteIndices = indexNameExpressionResolver.concreteIndexNames(clusterState, request);
8586
Map<String, Set<String>> routingMap = indexNameExpressionResolver.resolveSearchRouting(state, request.routing(), request.indices());
8687
Map<String, AliasFilter> indicesAndFilters = new HashMap<>();
87-
Set<String> indicesAndAliases = indexNameExpressionResolver.resolveExpressions(clusterState, request.indices());
88+
Set<ResolvedExpression> indicesAndAliases = indexNameExpressionResolver.resolveExpressions(clusterState, request.indices());
8889
for (String index : concreteIndices) {
8990
final AliasFilter aliasFilter = indicesService.buildAliasFilter(clusterState, index, indicesAndAliases);
9091
final String[] aliases = indexNameExpressionResolver.indexAliases(

server/src/main/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexAction.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.elasticsearch.cluster.metadata.IndexAbstraction;
2626
import org.elasticsearch.cluster.metadata.IndexMetadata;
2727
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
28+
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.ResolvedExpression;
2829
import org.elasticsearch.cluster.metadata.Metadata;
2930
import org.elasticsearch.cluster.service.ClusterService;
3031
import org.elasticsearch.common.Strings;
@@ -565,8 +566,8 @@ static void resolveIndices(
565566
if (names.length == 1 && (Metadata.ALL.equals(names[0]) || Regex.isMatchAllPattern(names[0]))) {
566567
names = new String[] { "**" };
567568
}
568-
Set<String> resolvedIndexAbstractions = resolver.resolveExpressions(clusterState, indicesOptions, true, names);
569-
for (String s : resolvedIndexAbstractions) {
569+
Set<ResolvedExpression> resolvedIndexAbstractions = resolver.resolveExpressions(clusterState, indicesOptions, true, names);
570+
for (ResolvedExpression s : resolvedIndexAbstractions) {
570571
enrichIndexAbstraction(clusterState, s, indices, aliases, dataStreams);
571572
}
572573
indices.sort(Comparator.comparing(ResolvedIndexAbstraction::getName));
@@ -597,12 +598,12 @@ private static void mergeResults(
597598

598599
private static void enrichIndexAbstraction(
599600
ClusterState clusterState,
600-
String indexAbstraction,
601+
ResolvedExpression indexAbstraction,
601602
List<ResolvedIndex> indices,
602603
List<ResolvedAlias> aliases,
603604
List<ResolvedDataStream> dataStreams
604605
) {
605-
IndexAbstraction ia = clusterState.metadata().getIndicesLookup().get(indexAbstraction);
606+
IndexAbstraction ia = clusterState.metadata().getIndicesLookup().get(indexAbstraction.resource());
606607
if (ia != null) {
607608
switch (ia.getType()) {
608609
case CONCRETE_INDEX -> {

server/src/main/java/org/elasticsearch/action/admin/indices/validate/query/TransportValidateQueryAction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.elasticsearch.cluster.block.ClusterBlockException;
2222
import org.elasticsearch.cluster.block.ClusterBlockLevel;
2323
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
24+
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.ResolvedExpression;
2425
import org.elasticsearch.cluster.routing.GroupShardsIterator;
2526
import org.elasticsearch.cluster.routing.ShardIterator;
2627
import org.elasticsearch.cluster.routing.ShardRouting;
@@ -133,7 +134,7 @@ protected void doExecute(Task task, ValidateQueryRequest request, ActionListener
133134
@Override
134135
protected ShardValidateQueryRequest newShardRequest(int numShards, ShardRouting shard, ValidateQueryRequest request) {
135136
final ClusterState clusterState = clusterService.state();
136-
final Set<String> indicesAndAliases = indexNameExpressionResolver.resolveExpressions(clusterState, request.indices());
137+
final Set<ResolvedExpression> indicesAndAliases = indexNameExpressionResolver.resolveExpressions(clusterState, request.indices());
137138
final AliasFilter aliasFilter = searchService.buildAliasFilter(clusterState, shard.getIndexName(), indicesAndAliases);
138139
return new ShardValidateQueryRequest(shard.shardId(), aliasFilter, request);
139140
}

server/src/main/java/org/elasticsearch/action/explain/TransportExplainAction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.elasticsearch.action.support.single.shard.TransportSingleShardAction;
1919
import org.elasticsearch.cluster.ClusterState;
2020
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
21+
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.ResolvedExpression;
2122
import org.elasticsearch.cluster.routing.ShardIterator;
2223
import org.elasticsearch.cluster.service.ClusterService;
2324
import org.elasticsearch.common.io.stream.Writeable;
@@ -109,7 +110,7 @@ protected boolean resolveIndex(ExplainRequest request) {
109110

110111
@Override
111112
protected void resolveRequest(ClusterState state, InternalRequest request) {
112-
final Set<String> indicesAndAliases = indexNameExpressionResolver.resolveExpressions(state, request.request().index());
113+
final Set<ResolvedExpression> indicesAndAliases = indexNameExpressionResolver.resolveExpressions(state, request.request().index());
113114
final AliasFilter aliasFilter = searchService.buildAliasFilter(state, request.concreteIndex(), indicesAndAliases);
114115
request.request().filteringAlias(aliasFilter);
115116
}

server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.elasticsearch.cluster.metadata.IndexAbstraction;
3838
import org.elasticsearch.cluster.metadata.IndexMetadata;
3939
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
40+
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.ResolvedExpression;
4041
import org.elasticsearch.cluster.node.DiscoveryNode;
4142
import org.elasticsearch.cluster.node.DiscoveryNodes;
4243
import org.elasticsearch.cluster.routing.GroupShardsIterator;
@@ -110,6 +111,7 @@
110111
import java.util.function.BiFunction;
111112
import java.util.function.Function;
112113
import java.util.function.LongSupplier;
114+
import java.util.stream.Collectors;
113115

114116
import static org.elasticsearch.action.search.SearchType.DFS_QUERY_THEN_FETCH;
115117
import static org.elasticsearch.action.search.SearchType.QUERY_THEN_FETCH;
@@ -203,14 +205,17 @@ public TransportSearchAction(
203205

204206
private Map<String, OriginalIndices> buildPerIndexOriginalIndices(
205207
ClusterState clusterState,
206-
Set<String> indicesAndAliases,
208+
Set<ResolvedExpression> indicesAndAliases,
207209
String[] indices,
208210
IndicesOptions indicesOptions
209211
) {
210212
Map<String, OriginalIndices> res = Maps.newMapWithExpectedSize(indices.length);
211213
var blocks = clusterState.blocks();
212214
// optimization: mostly we do not have any blocks so there's no point in the expensive per-index checking
213215
boolean hasBlocks = blocks.global().isEmpty() == false || blocks.indices().isEmpty() == false;
216+
// Get a distinct set of index abstraction names present from the resolved expressions to help with the reverse resolution from
217+
// concrete index to the expression that produced it.
218+
Set<String> indicesAndAliasesResources = indicesAndAliases.stream().map(ResolvedExpression::resource).collect(Collectors.toSet());
214219
for (String index : indices) {
215220
if (hasBlocks) {
216221
blocks.indexBlockedRaiseException(ClusterBlockLevel.READ, index);
@@ -227,8 +232,8 @@ private Map<String, OriginalIndices> buildPerIndexOriginalIndices(
227232
String[] finalIndices = Strings.EMPTY_ARRAY;
228233
if (aliases == null
229234
|| aliases.length == 0
230-
|| indicesAndAliases.contains(index)
231-
|| hasDataStreamRef(clusterState, indicesAndAliases, index)) {
235+
|| indicesAndAliasesResources.contains(index)
236+
|| hasDataStreamRef(clusterState, indicesAndAliasesResources, index)) {
232237
finalIndices = new String[] { index };
233238
}
234239
if (aliases != null) {
@@ -247,7 +252,11 @@ private static boolean hasDataStreamRef(ClusterState clusterState, Set<String> i
247252
return indicesAndAliases.contains(ret.getParentDataStream().getName());
248253
}
249254

250-
Map<String, AliasFilter> buildIndexAliasFilters(ClusterState clusterState, Set<String> indicesAndAliases, Index[] concreteIndices) {
255+
Map<String, AliasFilter> buildIndexAliasFilters(
256+
ClusterState clusterState,
257+
Set<ResolvedExpression> indicesAndAliases,
258+
Index[] concreteIndices
259+
) {
251260
final Map<String, AliasFilter> aliasFilterMap = new HashMap<>();
252261
for (Index index : concreteIndices) {
253262
clusterState.blocks().indexBlockedRaiseException(ClusterBlockLevel.READ, index.getName());
@@ -1237,7 +1246,10 @@ private void executeSearch(
12371246
} else {
12381247
final Index[] indices = resolvedIndices.getConcreteLocalIndices();
12391248
concreteLocalIndices = Arrays.stream(indices).map(Index::getName).toArray(String[]::new);
1240-
final Set<String> indicesAndAliases = indexNameExpressionResolver.resolveExpressions(clusterState, searchRequest.indices());
1249+
final Set<ResolvedExpression> indicesAndAliases = indexNameExpressionResolver.resolveExpressions(
1250+
clusterState,
1251+
searchRequest.indices()
1252+
);
12411253
aliasFilter = buildIndexAliasFilters(clusterState, indicesAndAliases, indices);
12421254
aliasFilter.putAll(remoteAliasMap);
12431255
localShardIterators = getLocalShardsIterator(
@@ -1810,7 +1822,7 @@ List<SearchShardIterator> getLocalShardsIterator(
18101822
ClusterState clusterState,
18111823
SearchRequest searchRequest,
18121824
String clusterAlias,
1813-
Set<String> indicesAndAliases,
1825+
Set<ResolvedExpression> indicesAndAliases,
18141826
String[] concreteIndices
18151827
) {
18161828
var routingMap = indexNameExpressionResolver.resolveSearchRouting(clusterState, searchRequest.routing(), searchRequest.indices());

server/src/main/java/org/elasticsearch/action/search/TransportSearchShardsAction.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.elasticsearch.action.support.HandledTransportAction;
1818
import org.elasticsearch.cluster.ClusterState;
1919
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
20+
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.ResolvedExpression;
2021
import org.elasticsearch.cluster.routing.GroupShardsIterator;
2122
import org.elasticsearch.cluster.service.ClusterService;
2223
import org.elasticsearch.index.Index;
@@ -127,7 +128,10 @@ public void searchShards(Task task, SearchShardsRequest searchShardsRequest, Act
127128
searchService.getRewriteContext(timeProvider::absoluteStartMillis, resolvedIndices, null),
128129
listener.delegateFailureAndWrap((delegate, searchRequest) -> {
129130
Index[] concreteIndices = resolvedIndices.getConcreteLocalIndices();
130-
final Set<String> indicesAndAliases = indexNameExpressionResolver.resolveExpressions(clusterState, searchRequest.indices());
131+
final Set<ResolvedExpression> indicesAndAliases = indexNameExpressionResolver.resolveExpressions(
132+
clusterState,
133+
searchRequest.indices()
134+
);
131135
final Map<String, AliasFilter> aliasFilters = transportSearchAction.buildIndexAliasFilters(
132136
clusterState,
133137
indicesAndAliases,

0 commit comments

Comments
 (0)