Skip to content

Commit 8b9e769

Browse files
CR: Support overrides to exclusions
1 parent 71a0d88 commit 8b9e769

File tree

2 files changed

+43
-28
lines changed

2 files changed

+43
-28
lines changed

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

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

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));
299+
String[] patterns = new String[aliases.length];
300+
boolean[] include = new boolean[aliases.length];
301+
for (int i = 0; i < aliases.length; i++) {
302+
String alias = aliases[i];
303+
if (alias.charAt(0) == '-') {
304+
patterns[i] = alias.substring(1);
305+
include[i] = false;
308306
} else {
309-
includeAliases.add(alias);
307+
patterns[i] = alias;
308+
include[i] = true;
310309
}
311310
}
312-
String[] included = includeAliases.toArray(Strings.EMPTY_ARRAY);
313-
String[] excluded = excludeAliases.toArray(Strings.EMPTY_ARRAY);
314-
boolean matchAllAliases = matchAllAliases(included);
311+
boolean matchAllAliases = patterns.length == 0;
315312
ImmutableOpenMap.Builder<String, List<AliasMetaData>> mapBuilder = ImmutableOpenMap.builder();
316313
for (String index : concreteIndices) {
317314
IndexMetaData indexMetaData = indices.get(index);
318315
List<AliasMetaData> filteredValues = new ArrayList<>();
319316
for (ObjectCursor<AliasMetaData> cursor : indexMetaData.getAliases().values()) {
320317
AliasMetaData value = cursor.value;
321-
if ((matchAllAliases || Regex.simpleMatch(included, value.alias()))
322-
&& Regex.simpleMatch(excluded, value.alias()) == false) {
318+
boolean matched = matchAllAliases;
319+
String alias = value.alias();
320+
for (int i = 0; i < patterns.length; i++) {
321+
if (include[i]) {
322+
if (matched == false) {
323+
matched = Regex.simpleMatch(patterns[i], alias);
324+
}
325+
} else if (matched) {
326+
matched = Regex.simpleMatch(patterns[i], alias) == false;
327+
}
328+
}
329+
if (matched) {
323330
filteredValues.add(value);
324331
}
325332
}
@@ -333,15 +340,6 @@ private ImmutableOpenMap<String, List<AliasMetaData>> findAliases(String[] origi
333340
return mapBuilder.build();
334341
}
335342

336-
private static boolean matchAllAliases(final String[] aliases) {
337-
for (String alias : aliases) {
338-
if (alias.equals(ALL)) {
339-
return true;
340-
}
341-
}
342-
return aliases.length == 0;
343-
}
344-
345343
/**
346344
* Checks if at least one of the specified aliases exists in the specified concrete indices. Wildcards are supported in the
347345
* alias names for partial matches.

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

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

112-
public void testFindAliasWithMultiIndexAndExclusion() {
112+
public void testFindAliasWithExclusion() {
113113
MetaData metaData = MetaData.builder().put(
114114
IndexMetaData.builder("index")
115115
.settings(Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT))
@@ -118,10 +118,27 @@ public void testFindAliasWithMultiIndexAndExclusion() {
118118
.putAlias(AliasMetaData.builder("alias1").build())
119119
.putAlias(AliasMetaData.builder("alias2").build())
120120
).build();
121-
ImmutableOpenMap<String, List<AliasMetaData>> aliases =
122-
metaData.findAliases(new GetAliasesRequest().aliases("*", "-alias1"), new String[] {"index"});
121+
List<AliasMetaData> aliases =
122+
metaData.findAliases(new GetAliasesRequest().aliases("*", "-alias1"), new String[] {"index"}).get("index");
123123
assertThat(aliases.size(), equalTo(1));
124-
assertThat(aliases.get("index").get(0).alias(), equalTo("alias2"));
124+
assertThat(aliases.get(0).alias(), equalTo("alias2"));
125+
}
126+
127+
public void testFindAliasWithExclusionAndOverride() {
128+
MetaData metaData = MetaData.builder().put(
129+
IndexMetaData.builder("index")
130+
.settings(Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT))
131+
.numberOfShards(1)
132+
.numberOfReplicas(0)
133+
.putAlias(AliasMetaData.builder("aa").build())
134+
.putAlias(AliasMetaData.builder("ab").build())
135+
.putAlias(AliasMetaData.builder("bb").build())
136+
).build();
137+
List<AliasMetaData> aliases =
138+
metaData.findAliases(new GetAliasesRequest().aliases("a*", "-*b", "b*"), new String[] {"index"}).get("index");
139+
assertThat(aliases.size(), equalTo(2));
140+
assertThat(aliases.get(0).alias(), equalTo("aa"));
141+
assertThat(aliases.get(1).alias(), equalTo("bb"));
125142
}
126143

127144
public void testIndexAndAliasWithSameName() {

0 commit comments

Comments
 (0)