Skip to content

Commit cc5ffee

Browse files
mfahadahmedaliabbasrizvi
authored andcommitted
feat(decision-listener): Incorporated new decision notification listener changes. (#258)
1 parent fa909dd commit cc5ffee

File tree

6 files changed

+221
-157
lines changed

6 files changed

+221
-157
lines changed

packages/optimizely-sdk/lib/core/decision_service/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ DecisionService.prototype._getVariationForFeatureExperiment = function(configObj
340340
return {
341341
experiment: experiment,
342342
variation: variation,
343-
decisionSource: DECISION_SOURCES.EXPERIMENT,
343+
decisionSource: DECISION_SOURCES.FEATURE_TEST,
344344
};
345345
};
346346

packages/optimizely-sdk/lib/core/decision_service/index.tests.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -869,7 +869,7 @@ describe('lib/core/decision_service', function() {
869869
'featureEnabled': true,
870870
'key': 'variation'
871871
},
872-
decisionSource: DECISION_SOURCES.EXPERIMENT,
872+
decisionSource: DECISION_SOURCES.FEATURE_TEST,
873873
};
874874
assert.deepEqual(decision, expectedDecision);
875875
sinon.assert.calledWithExactly(mockLogger.log, LOG_LEVEL.DEBUG, 'DECISION_SERVICE: User user1 is in variation variation of experiment testing_my_feature on the feature test_feature_for_experiment.');
@@ -944,7 +944,7 @@ describe('lib/core/decision_service', function() {
944944
'variables': [],
945945
'key': 'var',
946946
},
947-
decisionSource: DECISION_SOURCES.EXPERIMENT,
947+
decisionSource: DECISION_SOURCES.FEATURE_TEST,
948948
};
949949
assert.deepEqual(decision, expectedDecision);
950950
sinon.assert.calledWithExactly(mockLogger.log, LOG_LEVEL.DEBUG, 'DECISION_SERVICE: User user1 is in variation var of experiment exp_with_group on the feature feature_with_group.');

packages/optimizely-sdk/lib/core/project_config/index.js

+22
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,21 @@ module.exports = {
8989

9090
projectConfig.forcedVariationMap = {};
9191

92+
// Object containing experiment Ids that exist in any feature
93+
// for checking that experiment is a feature experiment or not.
94+
projectConfig.experimentFeatureMap = {};
95+
9296
projectConfig.featureKeyMap = fns.keyBy(projectConfig.featureFlags || [], 'key');
9397
fns.forOwn(projectConfig.featureKeyMap, function(feature) {
9498
feature.variableKeyMap = fns.keyBy(feature.variables, 'key');
9599
fns.forEach(feature.experimentIds || [], function(experimentId) {
100+
// Add this experiment in experiment-feature map.
101+
if (projectConfig.experimentFeatureMap[experimentId]) {
102+
projectConfig.experimentFeatureMap[experimentId].push(feature.id);
103+
} else {
104+
projectConfig.experimentFeatureMap[experimentId] = [feature.id];
105+
}
106+
96107
var experimentInFeature = projectConfig.experimentIdMap[experimentId];
97108
if (experimentInFeature.groupId) {
98109
feature.groupId = experimentInFeature.groupId;
@@ -594,4 +605,15 @@ module.exports = {
594605
eventWithKeyExists: function(projectConfig, eventKey) {
595606
return projectConfig.eventKeyMap.hasOwnProperty(eventKey);
596607
},
608+
609+
/**
610+
*
611+
* @param {Object} projectConfig
612+
* @param {string} experimentId
613+
* @returns {boolean} Returns true if experiment belongs to
614+
* any feature, false otherwise.
615+
*/
616+
isFeatureExperiment: function(projectConfig, experimentId) {
617+
return projectConfig.experimentFeatureMap.hasOwnProperty(experimentId);
618+
}
597619
};

packages/optimizely-sdk/lib/optimizely/index.js

+32-27
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ var LOG_MESSAGES = enums.LOG_MESSAGES;
3636
var MODULE_NAME = 'OPTIMIZELY';
3737
var DECISION_SOURCES = enums.DECISION_SOURCES;
3838
var FEATURE_VARIABLE_TYPES = enums.FEATURE_VARIABLE_TYPES;
39-
var DECISION_INFO_TYPES = enums.DECISION_INFO_TYPES;
39+
var DECISION_NOTIFICATION_TYPES = enums.DECISION_NOTIFICATION_TYPES;
4040
var NOTIFICATION_TYPES = enums.NOTIFICATION_TYPES;
4141

4242
var DEFAULT_EVENT_MAX_QUEUE_SIZE = 1;
@@ -343,10 +343,13 @@ Optimizely.prototype.getVariation = function(experimentKey, userId, attributes)
343343
}
344344

345345
var variationKey = this.decisionService.getVariation(this.configObj, experimentKey, userId, attributes);
346+
var decisionNotificationType = projectConfig.isFeatureExperiment(this.configObj, experiment.id) ? DECISION_NOTIFICATION_TYPES.FEATURE_TEST :
347+
DECISION_NOTIFICATION_TYPES.AB_TEST;
348+
346349
this.notificationCenter.sendNotifications(
347350
NOTIFICATION_TYPES.DECISION,
348351
{
349-
type: DECISION_INFO_TYPES.EXPERIMENT,
352+
type: decisionNotificationType,
350353
userId: userId,
351354
attributes: attributes || {},
352355
decisionInfo: {
@@ -501,16 +504,17 @@ Optimizely.prototype.isFeatureEnabled = function(featureKey, userId, attributes)
501504
}
502505

503506
var featureEnabled = false;
504-
var experimentKey = null;
505-
var variationKey = null;
506507
var decision = this.decisionService.getVariationForFeature(this.configObj, feature, userId, attributes);
507508
var variation = decision.variation;
508-
509+
var sourceInfo = {};
510+
509511
if (!!variation) {
510512
featureEnabled = variation.featureEnabled;
511-
if (decision.decisionSource === DECISION_SOURCES.EXPERIMENT) {
512-
experimentKey = decision.experiment.key;
513-
variationKey = decision.variation.key;
513+
if (decision.decisionSource === DECISION_SOURCES.FEATURE_TEST) {
514+
sourceInfo = {
515+
experimentKey: decision.experiment.key,
516+
variationKey: decision.variation.key,
517+
}
514518
// got a variation from the exp, so we track the impression
515519
this._sendImpressionEvent(decision.experiment.key, decision.variation.key, userId, attributes);
516520
}
@@ -523,19 +527,20 @@ Optimizely.prototype.isFeatureEnabled = function(featureKey, userId, attributes)
523527
featureEnabled = false;
524528
}
525529

530+
var featureInfo = {
531+
featureKey: featureKey,
532+
featureEnabled: featureEnabled,
533+
source: decision.decisionSource,
534+
sourceInfo: sourceInfo
535+
};
536+
526537
this.notificationCenter.sendNotifications(
527-
enums.NOTIFICATION_TYPES.DECISION,
538+
NOTIFICATION_TYPES.DECISION,
528539
{
529-
type: DECISION_INFO_TYPES.FEATURE,
540+
type: DECISION_NOTIFICATION_TYPES.FEATURE,
530541
userId: userId,
531542
attributes: attributes || {},
532-
decisionInfo: {
533-
featureKey: featureKey,
534-
featureEnabled: featureEnabled,
535-
source: decision.decisionSource,
536-
sourceExperimentKey: experimentKey,
537-
sourceVariationKey: variationKey,
538-
}
543+
decisionInfo: featureInfo,
539544
}
540545
);
541546

@@ -655,29 +660,29 @@ Optimizely.prototype._getFeatureVariableForType = function(featureKey, variableK
655660
variableKey, featureFlag.key));
656661
}
657662

658-
var experimentKey = null;
659-
var variationKey = null;
660-
if (decision.decisionSource === DECISION_SOURCES.EXPERIMENT) {
661-
experimentKey = decision.experiment.key;
662-
variationKey = decision.variation.key;
663+
var sourceInfo = {};
664+
if (decision.decisionSource === DECISION_SOURCES.FEATURE_TEST) {
665+
sourceInfo = {
666+
experimentKey: decision.experiment.key,
667+
variationKey: decision.variation.key,
668+
}
663669
}
664670

665671
var typeCastedValue = projectConfig.getTypeCastValue(variableValue, variableType, this.logger);
666672
this.notificationCenter.sendNotifications(
667-
enums.NOTIFICATION_TYPES.DECISION,
673+
NOTIFICATION_TYPES.DECISION,
668674
{
669-
type: DECISION_INFO_TYPES.FEATURE_VARIABLE,
675+
type: DECISION_NOTIFICATION_TYPES.FEATURE_VARIABLE,
670676
userId: userId,
671677
attributes: attributes || {},
672678
decisionInfo: {
673679
featureKey: featureKey,
674680
featureEnabled: featureEnabled,
681+
source: decision.decisionSource,
675682
variableKey: variableKey,
676683
variableValue: typeCastedValue,
677684
variableType: variableType,
678-
source: decision.decisionSource,
679-
sourceExperimentKey: experimentKey,
680-
sourceVariationKey: variationKey
685+
sourceInfo: sourceInfo,
681686
}
682687
}
683688
);

0 commit comments

Comments
 (0)