@@ -234,6 +234,16 @@ default boolean isRestorable() {
234
234
235
235
private final IndexVersion oldestIndexVersion ;
236
236
237
+ // Used in the findAliases and findDataStreamAliases functions
238
+ private interface AliasInfoGetter {
239
+ List <? extends AliasInfo > get (String entityName );
240
+ }
241
+
242
+ // Used in the findAliases and findDataStreamAliases functions
243
+ private interface AliasInfoSetter {
244
+ void put (String entityName , List <AliasInfo > aliases );
245
+ }
246
+
237
247
private Metadata (
238
248
String clusterUUID ,
239
249
boolean clusterUUIDCommitted ,
@@ -799,11 +809,63 @@ public Map<String, List<AliasMetadata>> findAllAliases(final String[] concreteIn
799
809
* aliases then the result will <b>not</b> include the index's key.
800
810
*/
801
811
public Map <String , List <AliasMetadata >> findAliases (final String [] aliases , final String [] concreteIndices ) {
812
+ ImmutableOpenMap .Builder <String , List <AliasMetadata >> mapBuilder = ImmutableOpenMap .builder ();
813
+
814
+ AliasInfoGetter getter = index -> indices .get (index ).getAliases ().values ().stream ().toList ();
815
+
816
+ AliasInfoSetter setter = (index , foundAliases ) -> {
817
+ List <AliasMetadata > d = new ArrayList <>();
818
+ foundAliases .forEach (i -> d .add ((AliasMetadata ) i ));
819
+ mapBuilder .put (index , d );
820
+ };
821
+
822
+ findAliasInfo (aliases , concreteIndices , getter , setter );
823
+
824
+ return mapBuilder .build ();
825
+ }
826
+
827
+ /**
828
+ * Finds the specific data stream aliases that match with the specified aliases directly or partially via wildcards, and
829
+ * that point to the specified data streams (directly or matching data streams via wildcards).
830
+ *
831
+ * @param aliases The aliases to look for. Might contain include or exclude wildcards.
832
+ * @param dataStreams The data streams that the aliases must point to in order to be returned
833
+ * @return A map of data stream name to the list of DataStreamAlias objects that match. If a data stream does not have matching
834
+ * aliases then the result will <b>not</b> include the data stream's key.
835
+ */
836
+ public Map <String , List <DataStreamAlias >> findDataStreamAliases (final String [] aliases , final String [] dataStreams ) {
837
+ ImmutableOpenMap .Builder <String , List <DataStreamAlias >> mapBuilder = ImmutableOpenMap .builder ();
838
+ Map <String , List <DataStreamAlias >> dataStreamAliases = dataStreamAliasesByDataStream ();
839
+
840
+ AliasInfoGetter getter = dataStream -> dataStreamAliases .getOrDefault (dataStream , Collections .emptyList ());
841
+
842
+ AliasInfoSetter setter = (dataStream , foundAliases ) -> {
843
+ List <DataStreamAlias > dsAliases = new ArrayList <>();
844
+ foundAliases .forEach (alias -> dsAliases .add ((DataStreamAlias ) alias ));
845
+ mapBuilder .put (dataStream , dsAliases );
846
+ };
847
+
848
+ findAliasInfo (aliases , dataStreams , getter , setter );
849
+
850
+ return mapBuilder .build ();
851
+ }
852
+
853
+ /**
854
+ * Find the aliases that point to the specified data streams or indices. Called from findAliases or findDataStreamAliases.
855
+ *
856
+ * @param aliases The aliases to look for. Might contain include or exclude wildcards.
857
+ * @param possibleMatches The data streams or indices that the aliases must point to in order to be returned
858
+ * @param getter A function that is used to get the alises for a given data stream or index
859
+ * @param setter A function that is used to keep track of the found aliases
860
+ */
861
+ private void findAliasInfo (final String [] aliases , final String [] possibleMatches , AliasInfoGetter getter , AliasInfoSetter setter ) {
802
862
assert aliases != null ;
803
- assert concreteIndices != null ;
804
- if (concreteIndices .length == 0 ) {
805
- return ImmutableOpenMap . of () ;
863
+ assert possibleMatches != null ;
864
+ if (possibleMatches .length == 0 ) {
865
+ return ;
806
866
}
867
+
868
+ // create patterns to use to search for targets
807
869
String [] patterns = new String [aliases .length ];
808
870
boolean [] include = new boolean [aliases .length ];
809
871
for (int i = 0 ; i < aliases .length ; i ++) {
@@ -816,14 +878,16 @@ public Map<String, List<AliasMetadata>> findAliases(final String[] aliases, fina
816
878
include [i ] = true ;
817
879
}
818
880
}
881
+
819
882
boolean matchAllAliases = patterns .length == 0 ;
820
- ImmutableOpenMap .Builder <String , List <AliasMetadata >> mapBuilder = ImmutableOpenMap .builder ();
821
- for (String index : concreteIndices ) {
822
- IndexMetadata indexMetadata = indices .get (index );
823
- List <AliasMetadata > filteredValues = new ArrayList <>();
824
- for (AliasMetadata aliasMetadata : indexMetadata .getAliases ().values ()) {
883
+
884
+ for (String index : possibleMatches ) {
885
+ List <AliasInfo > filteredValues = new ArrayList <>();
886
+
887
+ List <? extends AliasInfo > entities = getter .get (index );
888
+ for (AliasInfo aliasInfo : entities ) {
825
889
boolean matched = matchAllAliases ;
826
- String alias = aliasMetadata . alias ();
890
+ String alias = aliasInfo . getAlias ();
827
891
for (int i = 0 ; i < patterns .length ; i ++) {
828
892
if (include [i ]) {
829
893
if (matched == false ) {
@@ -835,16 +899,15 @@ public Map<String, List<AliasMetadata>> findAliases(final String[] aliases, fina
835
899
}
836
900
}
837
901
if (matched ) {
838
- filteredValues .add (aliasMetadata );
902
+ filteredValues .add (aliasInfo );
839
903
}
840
904
}
841
905
if (filteredValues .isEmpty () == false ) {
842
906
// Make the list order deterministic
843
- CollectionUtil .timSort (filteredValues , Comparator .comparing (AliasMetadata :: alias ));
844
- mapBuilder .put (index , Collections .unmodifiableList (filteredValues ));
907
+ CollectionUtil .timSort (filteredValues , Comparator .comparing (AliasInfo :: getAlias ));
908
+ setter .put (index , Collections .unmodifiableList (filteredValues ));
845
909
}
846
910
}
847
- return mapBuilder .build ();
848
911
}
849
912
850
913
/**
@@ -1264,6 +1327,25 @@ public Map<String, DataStreamAlias> dataStreamAliases() {
1264
1327
return this .custom (DataStreamMetadata .TYPE , DataStreamMetadata .EMPTY ).getDataStreamAliases ();
1265
1328
}
1266
1329
1330
+ /**
1331
+ * Return a map of DataStreamAlias objects by DataStream name
1332
+ * @return a map of DataStreamAlias objects by DataStream name
1333
+ */
1334
+ public Map <String , List <DataStreamAlias >> dataStreamAliasesByDataStream () {
1335
+ Map <String , List <DataStreamAlias >> dataStreamAliases = new HashMap <>();
1336
+
1337
+ for (DataStreamAlias dsAlias : dataStreamAliases ().values ()) {
1338
+ for (String dataStream : dsAlias .getDataStreams ()) {
1339
+ if (dataStreamAliases .containsKey (dataStream ) == false ) {
1340
+ dataStreamAliases .put (dataStream , new ArrayList <>());
1341
+ }
1342
+ dataStreamAliases .get (dataStream ).add (dsAlias );
1343
+ }
1344
+ }
1345
+
1346
+ return dataStreamAliases ;
1347
+ }
1348
+
1267
1349
public NodesShutdownMetadata nodeShutdowns () {
1268
1350
return custom (NodesShutdownMetadata .TYPE , NodesShutdownMetadata .EMPTY );
1269
1351
}
@@ -2432,7 +2514,7 @@ private static void collectAliasDuplicates(
2432
2514
reported = true ;
2433
2515
}
2434
2516
}
2435
- // This is for adding an error message for when a data steam alias has the same name as a data stream.
2517
+ // This is for adding an error message for when a data stream alias has the same name as a data stream.
2436
2518
if (reported == false && dataStreamMetadata != null && dataStreamMetadata .dataStreams ().containsKey (alias )) {
2437
2519
duplicates .add ("data stream alias and data stream have the same name (" + alias + ")" );
2438
2520
}
0 commit comments