Skip to content

Commit b51c228

Browse files
Add operation type enum
1 parent c6507b0 commit b51c228

File tree

3 files changed

+34
-24
lines changed

3 files changed

+34
-24
lines changed

Sources/Implementation/DefaultDecisionService.swift

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,15 @@ struct VariationDecision {
3434
var cmabUUID: String?
3535
}
3636

37+
enum OperationType {
38+
case async
39+
case sync
40+
}
41+
42+
typealias OPType = OperationType
3743
typealias UserProfile = OPTUserProfileService.UPProfile
3844

45+
3946
class DefaultDecisionService: OPTDecisionService {
4047
let bucketer: OPTBucketer
4148
let userProfileService: OPTUserProfileService
@@ -168,7 +175,7 @@ class DefaultDecisionService: OPTDecisionService {
168175
user: OptimizelyUserContext,
169176
options: [OptimizelyDecideOption]? = nil,
170177
userProfileTracker: UserProfileTracker?) -> DecisionResponse<Variation> {
171-
let decisionResponse = self.getVariation(config: config, experiment: experiment, user: user, ignoreCmab: true, userProfileTracker: userProfileTracker)
178+
let decisionResponse = self.getVariation(config: config, experiment: experiment, user: user, opType: .sync, userProfileTracker: userProfileTracker)
172179

173180
return DecisionResponse(result: decisionResponse.result?.variation, reasons: decisionResponse.reasons)
174181
}
@@ -179,14 +186,14 @@ class DefaultDecisionService: OPTDecisionService {
179186
/// - experiment: The experiment to evaluate.
180187
/// - user: The user context.
181188
/// - options: Optional decision options.
182-
/// - ignoreCmab: Flag to skip cmab decision
189+
/// - opType: Operation type, either sync or async
183190
/// - userProfileTracker: Optional tracker for user profile data.
184191
/// - Returns: A `DecisionResponse` with the variation (if any) and decision reasons.
185192
private func getVariation(config: ProjectConfig,
186193
experiment: Experiment,
187194
user: OptimizelyUserContext,
188195
options: [OptimizelyDecideOption]? = nil,
189-
ignoreCmab: Bool,
196+
opType: OPType,
190197
userProfileTracker: UserProfileTracker?) -> DecisionResponse<VariationDecision> {
191198
let reasons = DecisionReasons(options: options)
192199
let userId = user.userId
@@ -252,7 +259,10 @@ class DefaultDecisionService: OPTDecisionService {
252259
// Acquire bucketingId .
253260
let bucketingId = getBucketingId(userId: userId, attributes: attributes)
254261

255-
if experiment.isCmab, !ignoreCmab {
262+
if experiment.isCmab {
263+
if opType == .sync {
264+
/// fixme
265+
}
256266
let cmabDecisionResponse = getDecisionForCmabExperiment(config: config,
257267
experiment: experiment,
258268
user: user,
@@ -305,16 +315,16 @@ class DefaultDecisionService: OPTDecisionService {
305315
user: OptimizelyUserContext,
306316
options: [OptimizelyDecideOption]? = nil) -> DecisionResponse<FeatureDecision> {
307317

308-
self.getVariationForFeature(config: config, featureFlag: featureFlag, user: user, ignoreCmab: true, options: options)
318+
self.getVariationForFeature(config: config, featureFlag: featureFlag, user: user, opType: .sync, options: options)
309319
}
310320

311321
func getVariationForFeature(config: ProjectConfig,
312322
featureFlag: FeatureFlag,
313323
user: OptimizelyUserContext,
314-
ignoreCmab: Bool,
324+
opType: OPType,
315325
options: [OptimizelyDecideOption]? = nil) -> DecisionResponse<FeatureDecision> {
316326

317-
let response = getVariationForFeatureList(config: config, featureFlags: [featureFlag], user: user, ignoreCmab: ignoreCmab, options: options).first
327+
let response = getVariationForFeatureList(config: config, featureFlags: [featureFlag], user: user, opType: opType, options: options).first
318328

319329
guard response?.result != nil else {
320330
let reasons = response?.reasons ?? DecisionReasons(options: options)
@@ -334,7 +344,7 @@ class DefaultDecisionService: OPTDecisionService {
334344
func getVariationForFeatureList(config: ProjectConfig,
335345
featureFlags: [FeatureFlag],
336346
user: OptimizelyUserContext,
337-
ignoreCmab: Bool = true,
347+
opType: OPType = .sync,
338348
options: [OptimizelyDecideOption]? = nil) -> [DecisionResponse<FeatureDecision>] {
339349

340350
let userId = user.userId
@@ -348,7 +358,7 @@ class DefaultDecisionService: OPTDecisionService {
348358
var decisions = [DecisionResponse<FeatureDecision>]()
349359

350360
for featureFlag in featureFlags {
351-
let flagDecisionResponse = getDecisionForFlag(config: config, featureFlag: featureFlag, user: user, userProfileTracker: profileTracker, ignoreCmab: ignoreCmab)
361+
let flagDecisionResponse = getDecisionForFlag(config: config, featureFlag: featureFlag, user: user, userProfileTracker: profileTracker, opType: opType)
352362
decisions.append(flagDecisionResponse)
353363
}
354364

@@ -372,7 +382,7 @@ class DefaultDecisionService: OPTDecisionService {
372382
featureFlag: FeatureFlag,
373383
user: OptimizelyUserContext,
374384
userProfileTracker: UserProfileTracker? = nil,
375-
ignoreCmab: Bool,
385+
opType: OPType,
376386
options: [OptimizelyDecideOption]? = nil) -> DecisionResponse<FeatureDecision> {
377387
let reasons = DecisionReasons(options: options)
378388

@@ -389,7 +399,7 @@ class DefaultDecisionService: OPTDecisionService {
389399
}
390400
}
391401

392-
let flagExpDecision = getVariationForFeatureExperiments(config: config, featureFlag: featureFlag, user: user, userProfileTracker: userProfileTracker, ignoreCmab: ignoreCmab)
402+
let flagExpDecision = getVariationForFeatureExperiments(config: config, featureFlag: featureFlag, user: user, userProfileTracker: userProfileTracker, opType: opType)
393403
reasons.merge(flagExpDecision.reasons)
394404

395405
if let decision = flagExpDecision.result {
@@ -418,7 +428,7 @@ class DefaultDecisionService: OPTDecisionService {
418428
featureFlag: FeatureFlag,
419429
user: OptimizelyUserContext,
420430
userProfileTracker: UserProfileTracker? = nil,
421-
ignoreCmab: Bool = true,
431+
opType: OPType = .sync,
422432
options: [OptimizelyDecideOption]? = nil) -> DecisionResponse<FeatureDecision> {
423433
let reasons = DecisionReasons(options: options)
424434

@@ -438,7 +448,7 @@ class DefaultDecisionService: OPTDecisionService {
438448
rule: experiment,
439449
user: user,
440450
userProfileTracker: userProfileTracker,
441-
ignoreCmab: ignoreCmab,
451+
opType: opType,
442452
options: options)
443453
reasons.merge(decisionResponse.reasons)
444454
if let result = decisionResponse.result {
@@ -597,7 +607,7 @@ class DefaultDecisionService: OPTDecisionService {
597607
rule: Experiment,
598608
user: OptimizelyUserContext,
599609
userProfileTracker: UserProfileTracker?,
600-
ignoreCmab: Bool = true,
610+
opType: OPType = .sync,
601611
options: [OptimizelyDecideOption]? = nil) -> DecisionResponse<VariationDecision> {
602612
let reasons = DecisionReasons(options: options)
603613
// check forced-decision first
@@ -614,7 +624,7 @@ class DefaultDecisionService: OPTDecisionService {
614624
let decisionResponse = getVariation(config: config,
615625
experiment: rule,
616626
user: user,
617-
ignoreCmab: ignoreCmab,
627+
opType: opType,
618628
userProfileTracker: userProfileTracker)
619629
let variationResult = decisionResponse.result
620630
reasons.merge(decisionResponse.reasons)

Sources/Optimizely+Decide/OptimizelyClient+Decide.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ extension OptimizelyClient {
8080
var allOptions = defaultDecideOptions + (options ?? [])
8181
allOptions.removeAll(where: { $0 == .enabledFlagsOnly })
8282

83-
let decisionMap = decide(user: user, keys: [key], options: allOptions, ignoreCmab: true, ignoreDefaultOptions: true)
83+
let decisionMap = decide(user: user, keys: [key], options: allOptions, opType: .sync, ignoreDefaultOptions: true)
8484
return decisionMap[key] ?? OptimizelyDecision.errorDecision(key: key, user: user, error: .generic)
8585
}
8686

@@ -104,7 +104,7 @@ extension OptimizelyClient {
104104
var allOptions = self.defaultDecideOptions + (options ?? [])
105105
allOptions.removeAll(where: { $0 == .enabledFlagsOnly })
106106

107-
let decisionMap = self.decide(user: user, keys: [key], options: allOptions, ignoreCmab: false, ignoreDefaultOptions: true)
107+
let decisionMap = self.decide(user: user, keys: [key], options: allOptions, opType: .async, ignoreDefaultOptions: true)
108108
let decision = decisionMap[key] ?? OptimizelyDecision.errorDecision(key: key, user: user, error: .generic)
109109
completion(decision)
110110
}
@@ -113,22 +113,22 @@ extension OptimizelyClient {
113113
func decide(user: OptimizelyUserContext,
114114
keys: [String],
115115
options: [OptimizelyDecideOption]? = nil) -> [String: OptimizelyDecision] {
116-
return decide(user: user, keys: keys, options: options, ignoreCmab: true, ignoreDefaultOptions: false)
116+
return decide(user: user, keys: keys, options: options, opType: .sync, ignoreDefaultOptions: false)
117117
}
118118

119119
func decideAsync(user: OptimizelyUserContext,
120120
keys: [String],
121121
options: [OptimizelyDecideOption]? = nil, completion: @escaping DecideForKeysCompletion) {
122122
decisionQueue.async {
123-
let decisions = self.decide(user: user, keys: keys, options: options, ignoreCmab: false, ignoreDefaultOptions: false)
123+
let decisions = self.decide(user: user, keys: keys, options: options, opType: .async, ignoreDefaultOptions: false)
124124
completion(decisions)
125125
}
126126
}
127127

128128
private func decide(user: OptimizelyUserContext,
129129
keys: [String],
130130
options: [OptimizelyDecideOption]? = nil,
131-
ignoreCmab: Bool,
131+
opType: OPType,
132132
ignoreDefaultOptions: Bool) -> [String: OptimizelyDecision] {
133133
guard let config = self.config else {
134134
logger.e(OptimizelyError.sdkNotReady)
@@ -171,7 +171,7 @@ extension OptimizelyClient {
171171
}
172172
}
173173

174-
let decisionList = (decisionService as? DefaultDecisionService)?.getVariationForFeatureList(config: config, featureFlags: flagsWithoutForceDecision, user: user, ignoreCmab: ignoreCmab, options: allOptions)
174+
let decisionList = (decisionService as? DefaultDecisionService)?.getVariationForFeatureList(config: config, featureFlags: flagsWithoutForceDecision, user: user, opType: opType, options: allOptions)
175175

176176
for index in 0..<flagsWithoutForceDecision.count {
177177
if decisionList?.indices.contains(index) ?? false {
@@ -209,7 +209,7 @@ extension OptimizelyClient {
209209
keys: [String],
210210
options: [OptimizelyDecideOption]? = nil,
211211
ignoreDefaultOptions: Bool) -> [String: OptimizelyDecision] {
212-
return self.decide(user: user, keys: keys, options: options, ignoreCmab: true, ignoreDefaultOptions: ignoreDefaultOptions)
212+
return self.decide(user: user, keys: keys, options: options, opType: .sync, ignoreDefaultOptions: ignoreDefaultOptions)
213213
}
214214

215215
private func createOptimizelyDecision(flagKey: String,
@@ -307,7 +307,7 @@ extension OptimizelyClient {
307307
return
308308
}
309309

310-
let decision = self.decide(user: user, keys: config.featureFlagKeys, options: options, ignoreCmab: false, ignoreDefaultOptions: false)
310+
let decision = self.decide(user: user, keys: config.featureFlagKeys, options: options, opType: .async, ignoreDefaultOptions: false)
311311
completion(decision)
312312
}
313313
}

Tests/OptimizelyTests-Common/DecisionListenerTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1267,7 +1267,7 @@ class FakeDecisionService: DefaultDecisionService {
12671267
return DecisionResponse.responseNoReasons(result: featureDecision)
12681268
}
12691269

1270-
override func getVariationForFeatureExperiments(config: ProjectConfig, featureFlag: FeatureFlag, user: OptimizelyUserContext, userProfileTracker: UserProfileTracker? = nil, ignoreCmab: Bool = true, options: [OptimizelyDecideOption]? = nil) -> DecisionResponse<FeatureDecision> {
1270+
override func getVariationForFeatureExperiments(config: ProjectConfig, featureFlag: FeatureFlag, user: OptimizelyUserContext, userProfileTracker: UserProfileTracker? = nil, opType: OPType = .sync, options: [OptimizelyDecideOption]? = nil) -> DecisionResponse<FeatureDecision> {
12711271
guard let experiment = self.experiment, let tmpVariation = self.variation else {
12721272
return DecisionResponse.nilNoReasons()
12731273
}

0 commit comments

Comments
 (0)