Skip to content

Commit 2a65b5c

Browse files
committed
alias/stream filtering
1 parent dbb3906 commit 2a65b5c

File tree

2 files changed

+43
-8
lines changed

2 files changed

+43
-8
lines changed

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

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
import java.util.SortedMap;
6666
import java.util.TreeMap;
6767
import java.util.function.Predicate;
68+
import java.util.stream.Collectors;
6869
import java.util.stream.Stream;
6970

7071
import static org.elasticsearch.action.search.TransportSearchHelper.checkCCSVersionCompatibility;
@@ -135,12 +136,12 @@ public boolean equals(Object o) {
135136
if (this == o) return true;
136137
if (o == null || getClass() != o.getClass()) return false;
137138
Request request = (Request) o;
138-
return Arrays.equals(names, request.names);
139+
return Arrays.equals(names, request.names) && indexModes.equals(request.indexModes);
139140
}
140141

141142
@Override
142143
public int hashCode() {
143-
return Arrays.hashCode(names);
144+
return Objects.hash(Arrays.hashCode(names), indexModes);
144145
}
145146

146147
@Override
@@ -668,14 +669,39 @@ private static void mergeResults(
668669
}
669670
indices.add(index.copy(RemoteClusterAware.buildRemoteIndexName(clusterAlias, index.getName())));
670671
}
671-
if (indexModes.isEmpty() == false && indexModes.contains(IndexMode.STANDARD) == false) {
672-
continue;
673-
}
672+
Set<String> indexNames = indices.stream().map(ResolvedIndexAbstraction::getName).collect(Collectors.toSet());
674673
for (ResolvedAlias alias : response.aliases) {
675-
aliases.add(alias.copy(RemoteClusterAware.buildRemoteIndexName(clusterAlias, alias.getName())));
674+
if (indexModes.isEmpty() == false) {
675+
// We need to filter out aliases that point to no indices after index mode filtering
676+
String[] filteredIndices = Arrays.stream(alias.getIndices())
677+
.filter(idxName -> indexNames.contains(RemoteClusterAware.buildRemoteIndexName(clusterAlias, idxName)))
678+
.toArray(String[]::new);
679+
if (filteredIndices.length == 0) {
680+
continue;
681+
}
682+
alias = new ResolvedAlias(RemoteClusterAware.buildRemoteIndexName(clusterAlias, alias.getName()), filteredIndices);
683+
} else {
684+
alias = alias.copy(RemoteClusterAware.buildRemoteIndexName(clusterAlias, alias.getName()));
685+
}
686+
aliases.add(alias);
676687
}
677688
for (ResolvedDataStream dataStream : response.dataStreams) {
678-
dataStreams.add(dataStream.copy(RemoteClusterAware.buildRemoteIndexName(clusterAlias, dataStream.getName())));
689+
if (indexModes.isEmpty() == false) {
690+
String[] filteredBackingIndices = Arrays.stream(dataStream.getBackingIndices())
691+
.filter(idxName -> indexNames.contains(RemoteClusterAware.buildRemoteIndexName(clusterAlias, idxName)))
692+
.toArray(String[]::new);
693+
if (filteredBackingIndices.length == 0) {
694+
continue;
695+
}
696+
dataStream = new ResolvedDataStream(
697+
RemoteClusterAware.buildRemoteIndexName(clusterAlias, dataStream.getName()),
698+
filteredBackingIndices,
699+
dataStream.getTimestampField()
700+
);
701+
} else {
702+
dataStream = dataStream.copy(RemoteClusterAware.buildRemoteIndexName(clusterAlias, dataStream.getName()));
703+
}
704+
dataStreams.add(dataStream);
679705
}
680706
}
681707
}

server/src/test/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexRequestTests.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,12 @@
1212
import org.elasticsearch.action.admin.indices.resolve.ResolveIndexAction.Request;
1313
import org.elasticsearch.action.support.IndicesOptions;
1414
import org.elasticsearch.common.io.stream.Writeable;
15+
import org.elasticsearch.index.IndexMode;
1516
import org.elasticsearch.test.AbstractWireSerializingTestCase;
1617

18+
import java.util.Arrays;
19+
import java.util.EnumSet;
20+
1721
public class ResolveIndexRequestTests extends AbstractWireSerializingTestCase<Request> {
1822

1923
@Override
@@ -35,7 +39,12 @@ protected Request createTestInstance() {
3539
randomBoolean(),
3640
randomBoolean()
3741
);
38-
return new Request(names, indicesOptions);
42+
if (randomBoolean()) {
43+
return new Request(names, indicesOptions);
44+
} else {
45+
EnumSet<IndexMode> randomModes = EnumSet.copyOf(randomNonEmptySubsetOf(Arrays.asList(IndexMode.values())));
46+
return new Request(names, indicesOptions, randomBoolean() ? null : randomModes);
47+
}
3948
}
4049

4150
@Override

0 commit comments

Comments
 (0)