@@ -48,92 +48,114 @@ public ResolvedIndexExpressions resolveIndexAbstractions(
48
48
boolean includeDataStreams
49
49
) {
50
50
final ResolvedIndexExpressions .Builder resolvedExpressionsBuilder = ResolvedIndexExpressions .builder ();
51
-
52
51
boolean wildcardSeen = false ;
53
52
for (String index : indices ) {
54
- String indexAbstraction ;
55
- boolean minus = false ;
56
- if (index .charAt (0 ) == '-' && wildcardSeen ) {
57
- indexAbstraction = index .substring (1 );
58
- minus = true ;
59
- } else {
60
- indexAbstraction = index ;
61
- }
53
+ wildcardSeen = resolveIndexAbstraction (
54
+ resolvedExpressionsBuilder ,
55
+ index ,
56
+ indicesOptions ,
57
+ projectMetadata ,
58
+ allAuthorizedAndAvailableBySelector ,
59
+ isAuthorized ,
60
+ includeDataStreams ,
61
+ wildcardSeen
62
+ );
63
+ }
64
+ return resolvedExpressionsBuilder .build ();
65
+ }
62
66
63
- // Always check to see if there's a selector on the index expression
64
- final Tuple <String , String > expressionAndSelector = IndexNameExpressionResolver .splitSelectorExpression (indexAbstraction );
65
- final String selectorString = expressionAndSelector .v2 ();
66
- if (indicesOptions .allowSelectors () == false && selectorString != null ) {
67
- throw new UnsupportedSelectorException (indexAbstraction );
68
- }
69
- indexAbstraction = expressionAndSelector .v1 ();
70
- IndexComponentSelector selector = IndexComponentSelector .getByKeyOrThrow (selectorString );
67
+ private boolean resolveIndexAbstraction (
68
+ ResolvedIndexExpressions .Builder resolvedExpressionsBuilder ,
69
+ String index ,
70
+ IndicesOptions indicesOptions ,
71
+ ProjectMetadata projectMetadata ,
72
+ Function <IndexComponentSelector , Set <String >> allAuthorizedAndAvailableBySelector ,
73
+ BiPredicate <String , IndexComponentSelector > isAuthorized ,
74
+ boolean includeDataStreams ,
75
+ boolean wildcardSeen
76
+ ) {
77
+ String indexAbstraction ;
78
+ boolean minus = false ;
79
+ if (index .charAt (0 ) == '-' && wildcardSeen ) {
80
+ indexAbstraction = index .substring (1 );
81
+ minus = true ;
82
+ } else {
83
+ indexAbstraction = index ;
84
+ }
85
+
86
+ // Always check to see if there's a selector on the index expression
87
+ final Tuple <String , String > expressionAndSelector = IndexNameExpressionResolver .splitSelectorExpression (indexAbstraction );
88
+ final String selectorString = expressionAndSelector .v2 ();
89
+ if (indicesOptions .allowSelectors () == false && selectorString != null ) {
90
+ throw new UnsupportedSelectorException (indexAbstraction );
91
+ }
92
+ indexAbstraction = expressionAndSelector .v1 ();
93
+ IndexComponentSelector selector = IndexComponentSelector .getByKeyOrThrow (selectorString );
71
94
72
- // we always need to check for date math expressions
73
- indexAbstraction = IndexNameExpressionResolver .resolveDateMathExpression (indexAbstraction );
95
+ // we always need to check for date math expressions
96
+ indexAbstraction = IndexNameExpressionResolver .resolveDateMathExpression (indexAbstraction );
74
97
75
- if (indicesOptions .expandWildcardExpressions () && Regex .isSimpleMatchPattern (indexAbstraction )) {
76
- wildcardSeen = true ;
77
- final HashSet <String > resolvedIndices = new HashSet <>();
78
- for (String authorizedIndex : allAuthorizedAndAvailableBySelector .apply (selector )) {
79
- if (Regex .simpleMatch (indexAbstraction , authorizedIndex )
98
+ if (indicesOptions .expandWildcardExpressions () && Regex .isSimpleMatchPattern (indexAbstraction )) {
99
+ wildcardSeen = true ;
100
+ final HashSet <String > resolvedIndices = new HashSet <>();
101
+ for (String authorizedIndex : allAuthorizedAndAvailableBySelector .apply (selector )) {
102
+ if (Regex .simpleMatch (indexAbstraction , authorizedIndex )
103
+ && isIndexVisible (
104
+ indexAbstraction ,
105
+ selectorString ,
106
+ authorizedIndex ,
107
+ indicesOptions ,
108
+ projectMetadata ,
109
+ indexNameExpressionResolver ,
110
+ includeDataStreams
111
+ )) {
112
+ resolveSelectorsAndCollect (authorizedIndex , selectorString , indicesOptions , resolvedIndices , projectMetadata );
113
+ }
114
+ }
115
+ if (resolvedIndices .isEmpty ()) {
116
+ // es core honours allow_no_indices for each wildcard expression, we do the same here by throwing index not found.
117
+ if (indicesOptions .allowNoIndices () == false ) {
118
+ throw new IndexNotFoundException (indexAbstraction );
119
+ }
120
+ resolvedExpressionsBuilder .addLocalExpressions (index , new HashSet <>(), SUCCESS );
121
+ } else {
122
+ if (minus ) {
123
+ resolvedExpressionsBuilder .excludeFromLocalExpressions (resolvedIndices );
124
+ } else {
125
+ resolvedExpressionsBuilder .addLocalExpressions (index , resolvedIndices , SUCCESS );
126
+ }
127
+ }
128
+ } else {
129
+ final HashSet <String > resolvedIndices = new HashSet <>();
130
+ resolveSelectorsAndCollect (indexAbstraction , selectorString , indicesOptions , resolvedIndices , projectMetadata );
131
+ if (minus ) {
132
+ resolvedExpressionsBuilder .excludeFromLocalExpressions (resolvedIndices );
133
+ } else {
134
+ final boolean authorized = isAuthorized .test (indexAbstraction , selector );
135
+ if (authorized ) {
136
+ final boolean visible = indexExists (projectMetadata , indexAbstraction )
80
137
&& isIndexVisible (
81
138
indexAbstraction ,
82
139
selectorString ,
83
- authorizedIndex ,
140
+ indexAbstraction ,
84
141
indicesOptions ,
85
142
projectMetadata ,
86
143
indexNameExpressionResolver ,
87
144
includeDataStreams
88
- )) {
89
- resolveSelectorsAndCollect (authorizedIndex , selectorString , indicesOptions , resolvedIndices , projectMetadata );
90
- }
91
- }
92
- if (resolvedIndices .isEmpty ()) {
93
- // es core honours allow_no_indices for each wildcard expression, we do the same here by throwing index not found.
94
- if (indicesOptions .allowNoIndices () == false ) {
95
- throw new IndexNotFoundException (indexAbstraction );
96
- }
97
- resolvedExpressionsBuilder .addLocalExpressions (index , new HashSet <>(), SUCCESS );
98
- } else {
99
- if (minus ) {
100
- resolvedExpressionsBuilder .excludeFromLocalExpressions (resolvedIndices );
101
- } else {
102
- resolvedExpressionsBuilder .addLocalExpressions (index , resolvedIndices , SUCCESS );
103
- }
104
- }
105
- } else {
106
- final HashSet <String > resolvedIndices = new HashSet <>();
107
- resolveSelectorsAndCollect (indexAbstraction , selectorString , indicesOptions , resolvedIndices , projectMetadata );
108
- if (minus ) {
109
- resolvedExpressionsBuilder .excludeFromLocalExpressions (resolvedIndices );
145
+ );
146
+ final LocalIndexResolutionResult result = visible ? SUCCESS : CONCRETE_RESOURCE_NOT_VISIBLE ;
147
+ resolvedExpressionsBuilder .addLocalExpressions (index , resolvedIndices , result );
148
+ } else if (indicesOptions .ignoreUnavailable ()) {
149
+ // ignoreUnavailable implies that the request should not fail if an index is not authorized
150
+ // so we map this expression to an empty list,
151
+ resolvedExpressionsBuilder .addLocalExpressions (index , new HashSet <>(), CONCRETE_RESOURCE_UNAUTHORIZED );
110
152
} else {
111
- final boolean authorized = isAuthorized .test (indexAbstraction , selector );
112
- if (authorized ) {
113
- final boolean visible = indexExists (projectMetadata , indexAbstraction )
114
- && isIndexVisible (
115
- indexAbstraction ,
116
- selectorString ,
117
- indexAbstraction ,
118
- indicesOptions ,
119
- projectMetadata ,
120
- indexNameExpressionResolver ,
121
- includeDataStreams
122
- );
123
- final LocalIndexResolutionResult result = visible ? SUCCESS : CONCRETE_RESOURCE_NOT_VISIBLE ;
124
- resolvedExpressionsBuilder .addLocalExpressions (index , resolvedIndices , result );
125
- } else if (indicesOptions .ignoreUnavailable ()) {
126
- // ignoreUnavailable implies that the request should not fail if an index is not authorized
127
- // so we map this expression to an empty list,
128
- resolvedExpressionsBuilder .addLocalExpressions (index , new HashSet <>(), CONCRETE_RESOURCE_UNAUTHORIZED );
129
- } else {
130
- // store the calculated expansion as unauthorized, it will be rejected later
131
- resolvedExpressionsBuilder .addLocalExpressions (index , resolvedIndices , CONCRETE_RESOURCE_UNAUTHORIZED );
132
- }
153
+ // store the calculated expansion as unauthorized, it will be rejected later
154
+ resolvedExpressionsBuilder .addLocalExpressions (index , resolvedIndices , CONCRETE_RESOURCE_UNAUTHORIZED );
133
155
}
134
156
}
135
157
}
136
- return resolvedExpressionsBuilder . build () ;
158
+ return wildcardSeen ;
137
159
}
138
160
139
161
private static void resolveSelectorsAndCollect (
0 commit comments