Skip to content

Commit 576dd2d

Browse files
CORE: Make Pattern Exclusion Work with Aliases
* Adds the pattern exclusion logic to finding aliases * Closes #33395
1 parent 42469a9 commit 576dd2d

File tree

2 files changed

+33
-4
lines changed

2 files changed

+33
-4
lines changed

server/src/main/java/org/elasticsearch/cluster/metadata/MetaData.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -296,14 +296,28 @@ private ImmutableOpenMap<String, List<AliasMetaData>> findAliases(String[] origi
296296
return ImmutableOpenMap.of();
297297
}
298298

299-
boolean matchAllAliases = matchAllAliases(aliases);
299+
List<String> includeAliases = new ArrayList<>();
300+
List<String> excludeAliases = new ArrayList<>();
301+
boolean wildcardSeen = false;
302+
for (final String alias : aliases) {
303+
if (Regex.isSimpleMatchPattern(alias)) {
304+
wildcardSeen = true;
305+
}
306+
if (wildcardSeen && alias.charAt(0) == '-') {
307+
excludeAliases.add(alias.substring(1));
308+
} else {
309+
includeAliases.add(alias);
310+
}
311+
}
312+
boolean matchAllAliases = matchAllAliases(includeAliases);
300313
ImmutableOpenMap.Builder<String, List<AliasMetaData>> mapBuilder = ImmutableOpenMap.builder();
301314
for (String index : concreteIndices) {
302315
IndexMetaData indexMetaData = indices.get(index);
303316
List<AliasMetaData> filteredValues = new ArrayList<>();
304317
for (ObjectCursor<AliasMetaData> cursor : indexMetaData.getAliases().values()) {
305318
AliasMetaData value = cursor.value;
306-
if (matchAllAliases || Regex.simpleMatch(aliases, value.alias())) {
319+
if ((matchAllAliases || Regex.simpleMatch(includeAliases, value.alias()))
320+
&& Regex.simpleMatch(excludeAliases, value.alias()) == false) {
307321
filteredValues.add(value);
308322
}
309323
}
@@ -317,13 +331,13 @@ private ImmutableOpenMap<String, List<AliasMetaData>> findAliases(String[] origi
317331
return mapBuilder.build();
318332
}
319333

320-
private static boolean matchAllAliases(final String[] aliases) {
334+
private static boolean matchAllAliases(final List<String> aliases) {
321335
for (String alias : aliases) {
322336
if (alias.equals(ALL)) {
323337
return true;
324338
}
325339
}
326-
return aliases.length == 0;
340+
return aliases.isEmpty();
327341
}
328342

329343
/**

server/src/test/java/org/elasticsearch/cluster/metadata/MetaDataTests.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,21 @@ public void testFindAliases() {
109109
}
110110
}
111111

112+
public void testFindAliasWithMultiIndexAndExclusion() {
113+
MetaData metaData = MetaData.builder().put(
114+
IndexMetaData.builder("index")
115+
.settings(Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT))
116+
.numberOfShards(1)
117+
.numberOfReplicas(0)
118+
.putAlias(AliasMetaData.builder("alias1").build())
119+
.putAlias(AliasMetaData.builder("alias2").build())
120+
).build();
121+
ImmutableOpenMap<String, List<AliasMetaData>> aliases =
122+
metaData.findAliases(new GetAliasesRequest().aliases("*", "-alias1"), new String[] {"index"});
123+
assertThat(aliases.size(), equalTo(1));
124+
assertThat(aliases.get("index").get(0).alias(), equalTo("alias2"));
125+
}
126+
112127
public void testIndexAndAliasWithSameName() {
113128
IndexMetaData.Builder builder = IndexMetaData.builder("index")
114129
.settings(Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT))

0 commit comments

Comments
 (0)