@@ -226,23 +226,11 @@ class DefaultDecisionService: OPTDecisionService {
226
226
var decisions = [ DecisionResponse < FeatureDecision > ] ( )
227
227
228
228
for featureFlag in featureFlags {
229
- var decisionResponse = getVariationForFeature ( config: config, featureFlag: featureFlag, user: user, userProfileTracker: profileTracker)
229
+ let flagDecisionResponse = getDecisionForFlag ( config: config, featureFlag: featureFlag, user: user, userProfileTracker: profileTracker)
230
+ reasons. merge ( flagDecisionResponse. reasons)
230
231
231
- reasons. merge ( decisionResponse. reasons)
232
-
233
- if let decision = decisionResponse. result {
232
+ if let decision = flagDecisionResponse. result {
234
233
decisions. append ( DecisionResponse ( result: decision, reasons: reasons) )
235
- continue
236
- }
237
-
238
- decisionResponse = getVariationForFeatureRollout ( config: config, featureFlag: featureFlag, user: user)
239
-
240
- reasons. merge ( decisionResponse. reasons)
241
-
242
- if let decision = decisionResponse. result {
243
- decisions. append ( DecisionResponse ( result: decision, reasons: reasons) )
244
- } else {
245
- decisions. append ( DecisionResponse ( result: nil , reasons: reasons) )
246
234
}
247
235
}
248
236
@@ -254,6 +242,43 @@ class DefaultDecisionService: OPTDecisionService {
254
242
return decisions
255
243
}
256
244
245
+ func getDecisionForFlag( config: ProjectConfig ,
246
+ featureFlag: FeatureFlag ,
247
+ user: OptimizelyUserContext ,
248
+ userProfileTracker: UserProfileTracker ? = nil ,
249
+ options: [ OptimizelyDecideOption ] ? = nil ) -> DecisionResponse < FeatureDecision > {
250
+ let reasons = DecisionReasons ( options: options)
251
+
252
+ let holdouts = config. getHoldoutForFlag ( id: featureFlag. id)
253
+ for holdout in holdouts {
254
+ let holdoutDecision = getVariationForHoldout ( config: config,
255
+ flagKey: featureFlag. key,
256
+ holdout: holdout,
257
+ user: user)
258
+ reasons. merge ( holdoutDecision. reasons)
259
+ if let variation = holdoutDecision. result {
260
+ let featureDicision = FeatureDecision ( experiment: holdout, variation: variation, source: Constants . DecisionSource. holdout. rawValue)
261
+ return DecisionResponse ( result: featureDicision, reasons: reasons)
262
+ }
263
+ }
264
+
265
+ let flagExpDecision = getVariationForFeatureExperiments ( config: config, featureFlag: featureFlag, user: user, userProfileTracker: userProfileTracker)
266
+ reasons. merge ( flagExpDecision. reasons)
267
+
268
+ if let decision = flagExpDecision. result {
269
+ return DecisionResponse ( result: decision, reasons: reasons)
270
+ }
271
+
272
+ let rolloutDecision = getVariationForFeatureRollout ( config: config, featureFlag: featureFlag, user: user)
273
+ reasons. merge ( rolloutDecision. reasons)
274
+
275
+ if let decision = rolloutDecision. result {
276
+ return DecisionResponse ( result: decision, reasons: reasons)
277
+ } else {
278
+ return DecisionResponse ( result: nil , reasons: reasons)
279
+ }
280
+ }
281
+
257
282
/// Determines the feature decision for a feature flag, considering experiments and holdouts.
258
283
/// - Parameters:
259
284
/// - config: The project configuration.
@@ -262,26 +287,13 @@ class DefaultDecisionService: OPTDecisionService {
262
287
/// - userProfileTracker: Optional tracker for user profile data.
263
288
/// - options: Optional decision options.
264
289
/// - Returns: A `DecisionResponse` with the feature decision (if any) and reasons.
265
- func getVariationForFeature ( config: ProjectConfig ,
290
+ func getVariationForFeatureExperiments ( config: ProjectConfig ,
266
291
featureFlag: FeatureFlag ,
267
292
user: OptimizelyUserContext ,
268
293
userProfileTracker: UserProfileTracker ? = nil ,
269
294
options: [ OptimizelyDecideOption ] ? = nil ) -> DecisionResponse < FeatureDecision > {
270
295
let reasons = DecisionReasons ( options: options)
271
296
272
- let holdouts = config. getHoldoutForFlag ( id: featureFlag. id)
273
- for holdout in holdouts {
274
- let dicisionResponse = getVariationForHoldout ( config: config,
275
- flagKey: featureFlag. key,
276
- holdout: holdout,
277
- user: user)
278
- reasons. merge ( dicisionResponse. reasons)
279
- if let variation = dicisionResponse. result {
280
- let featureDicision = FeatureDecision ( experiment: holdout, variation: variation, source: Constants . DecisionSource. holdout. rawValue)
281
- return DecisionResponse ( result: featureDicision, reasons: reasons)
282
- }
283
- }
284
-
285
297
let experimentIds = featureFlag. experimentIds
286
298
if experimentIds. isEmpty {
287
299
let info = LogMessage . featureHasNoExperiments ( featureFlag. key)
0 commit comments