Skip to content

Commit a620d01

Browse files
committed
New decision listener implementations.
1 parent 9b751ad commit a620d01

File tree

4 files changed

+152
-98
lines changed

4 files changed

+152
-98
lines changed

OptimizelySDK/Data Model/ProjectConfig.swift

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class ProjectConfig : Codable {
2424
// NOTE: experiment.forcedVariations use [ExperimentKey: VariationKey] instead of ids
2525

2626
private var whitelistUsers = [String: [String: String]]()
27+
private var experimentFeatureMap = [String: [String]]()
2728

2829
init(datafile: Data) throws {
2930
do {
@@ -36,6 +37,7 @@ class ProjectConfig : Codable {
3637
if !isValidVersion(version: self.project.version) {
3738
throw OptimizelyError.dataFileVersionInvalid(self.project.version)
3839
}
40+
generateExperimentFeatureMap()
3941
}
4042

4143
convenience init(datafile: String) throws {
@@ -87,6 +89,20 @@ extension ProjectConfig {
8789
// old versions (< 4) of datafiles not supported
8890
return ["4"].contains(version)
8991
}
92+
93+
private func generateExperimentFeatureMap() {
94+
for feature in project.featureFlags {
95+
for id in feature.experimentIds {
96+
if var featureIdArray = experimentFeatureMap[id] {
97+
featureIdArray.append(feature.id)
98+
experimentFeatureMap[id] = featureIdArray
99+
}
100+
else {
101+
experimentFeatureMap[id] = [feature.id]
102+
}
103+
}
104+
}
105+
}
90106
}
91107

92108
// MARK: - Project Access
@@ -171,6 +187,13 @@ extension ProjectConfig {
171187
return project.getAudience(id: id)
172188
}
173189

190+
/**
191+
* Returns true if experiment belongs to any feature, false otherwise.
192+
*/
193+
func isFeatureExperiment(id: String) -> Bool {
194+
return experimentFeatureMap.keys.contains(id)
195+
}
196+
174197
/**
175198
* Get forced variation for a given experiment key and user id.
176199
*/

OptimizelySDK/Optimizely/OptimizelyManager.swift

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -292,11 +292,10 @@ open class OptimizelyManager: NSObject {
292292
throw OptimizelyError.experimentUnknown
293293
}
294294

295-
var args: Array<Any?> = (self.notificationCenter as! DefaultNotificationCenter).getArgumentsForDecisionListener(notificationType: Constants.DecisionTypeKeys.experiment, userId: userId, attributes: attributes)
295+
let decisionType = config.isFeatureExperiment(id: experiment.id) ? Constants.DecisionTypeKeys.featureTest : Constants.DecisionTypeKeys.abTest
296+
var args: Array<Any?> = (self.notificationCenter as! DefaultNotificationCenter).getArgumentsForDecisionListener(notificationType: decisionType, userId: userId, attributes: attributes)
296297

297298
var decisionInfo = [String:Any]()
298-
decisionInfo[Constants.NotificationKeys.experiment] = nil
299-
decisionInfo[Constants.NotificationKeys.variation] = nil
300299

301300
// fix DecisionService to throw error
302301
guard let variation = decisionService.getVariation(config: config, userId: userId, experiment: experiment, attributes: attributes ?? OptimizelyAttributes()) else {
@@ -305,8 +304,11 @@ open class OptimizelyManager: NSObject {
305304
throw OptimizelyError.variationUnknown
306305
}
307306

308-
decisionInfo[Constants.NotificationKeys.experiment] = experimentKey
309-
decisionInfo[Constants.NotificationKeys.variation] = variation.key
307+
var sourceInfo = [String:Any]()
308+
sourceInfo[Constants.ExperimentDecisionInfoKeys.experiment] = experiment.key
309+
sourceInfo[Constants.ExperimentDecisionInfoKeys.variation] = variation.key
310+
decisionInfo = sourceInfo
311+
310312
args.append(decisionInfo)
311313
self.notificationCenter.sendNotifications(type: NotificationType.Decision.rawValue, args: args)
312314

@@ -378,12 +380,13 @@ open class OptimizelyManager: NSObject {
378380
// fix DecisionService to throw error
379381
let pair = decisionService.getVariationForFeature(config: config, featureFlag: featureFlag, userId: userId, attributes: attributes ?? OptimizelyAttributes())
380382

381-
var args: Array<Any?> = (self.notificationCenter as! DefaultNotificationCenter).getArgumentsForDecisionListener(notificationType: Constants.DecisionTypeKeys.isFeatureEnabled, userId: userId, attributes: attributes)
383+
var args: Array<Any?> = (self.notificationCenter as! DefaultNotificationCenter).getArgumentsForDecisionListener(notificationType: Constants.DecisionTypeKeys.feature, userId: userId, attributes: attributes)
382384

383385
var decisionInfo = [String:Any]()
384386
decisionInfo[Constants.DecisionInfoKeys.feature] = featureKey
385387
decisionInfo[Constants.DecisionInfoKeys.source] = Constants.DecisionSource.Rollout
386388
decisionInfo[Constants.DecisionInfoKeys.featureEnabled] = false
389+
decisionInfo[Constants.DecisionInfoKeys.sourceInfo] = [:]
387390

388391
guard let variation = pair?.variation else {
389392
args.append(decisionInfo)
@@ -396,8 +399,10 @@ open class OptimizelyManager: NSObject {
396399
// we came from an experiment if experiment is not nil
397400
if let experiment = pair?.experiment {
398401

399-
decisionInfo[Constants.DecisionInfoKeys.sourceExperiment] = experiment.key
400-
decisionInfo[Constants.DecisionInfoKeys.sourceVariation] = variation.key
402+
var sourceInfo = [String:Any]()
403+
sourceInfo[Constants.ExperimentDecisionInfoKeys.experiment] = experiment.key
404+
sourceInfo[Constants.ExperimentDecisionInfoKeys.variation] = variation.key
405+
decisionInfo[Constants.DecisionInfoKeys.sourceInfo] = sourceInfo
401406

402407
// TODO: fix to throw errors
403408
guard let body = BatchEventBuilder.createImpressionEvent(config: config,
@@ -427,7 +432,7 @@ open class OptimizelyManager: NSObject {
427432
}
428433

429434
decisionInfo[Constants.DecisionInfoKeys.featureEnabled] = featureEnabled
430-
decisionInfo[Constants.DecisionInfoKeys.source] = (pair?.experiment != nil ? Constants.DecisionSource.Experiment : Constants.DecisionSource.Rollout)
435+
decisionInfo[Constants.DecisionInfoKeys.source] = (pair?.experiment != nil ? Constants.DecisionSource.FeatureTest : Constants.DecisionSource.Rollout)
431436
args.append(decisionInfo)
432437
self.notificationCenter.sendNotifications(type: NotificationType.Decision.rawValue, args: args)
433438

@@ -531,8 +536,7 @@ open class OptimizelyManager: NSObject {
531536
}
532537

533538
var decisionInfo = [String:Any]()
534-
decisionInfo[Constants.DecisionInfoKeys.sourceExperiment] = nil
535-
decisionInfo[Constants.DecisionInfoKeys.sourceVariation] = nil
539+
decisionInfo[Constants.DecisionInfoKeys.sourceInfo] = [:]
536540

537541
// TODO: [Jae] optional? fallback to empty string is OK?
538542
var featureValue = variable.defaultValue ?? ""
@@ -544,8 +548,10 @@ open class OptimizelyManager: NSObject {
544548
let decision = self.decisionService.getVariationForFeature(config: config, featureFlag: featureFlag, userId: userId, attributes: _attributes)
545549
if let decision = decision {
546550
if let experiment = decision.experiment {
547-
decisionInfo[Constants.DecisionInfoKeys.sourceExperiment] = experiment.key
548-
decisionInfo[Constants.DecisionInfoKeys.sourceVariation] = decision.variation?.key
551+
var sourceInfo = [String:Any]()
552+
sourceInfo[Constants.ExperimentDecisionInfoKeys.experiment] = experiment.key
553+
sourceInfo[Constants.ExperimentDecisionInfoKeys.variation] = decision.variation?.key
554+
decisionInfo[Constants.DecisionInfoKeys.sourceInfo] = sourceInfo
549555
}
550556
if let featureVariable = decision.variation?.variables?.filter({$0.id == variable.id}).first {
551557
if let featureEnabled = decision.variation?.featureEnabled, featureEnabled {
@@ -589,7 +595,7 @@ open class OptimizelyManager: NSObject {
589595
decisionInfo[Constants.DecisionInfoKeys.variable] = variableKey
590596
decisionInfo[Constants.DecisionInfoKeys.variableType] = typeName
591597
decisionInfo[Constants.DecisionInfoKeys.variableValue] = value
592-
decisionInfo[Constants.DecisionInfoKeys.source] = (decision?.experiment != nil ? Constants.DecisionSource.Experiment : Constants.DecisionSource.Rollout)
598+
decisionInfo[Constants.DecisionInfoKeys.source] = (decision?.experiment != nil ? Constants.DecisionSource.FeatureTest : Constants.DecisionSource.Rollout)
593599
args.append(decisionInfo)
594600

595601
self.notificationCenter.sendNotifications(type: NotificationType.Decision.rawValue, args: args)

0 commit comments

Comments
 (0)