@@ -143,12 +143,17 @@ def get_variation(experiment_key, user_id, attributes = nil)
143
143
end
144
144
145
145
variation_id = @decision_service . get_variation ( experiment_key , user_id , attributes )
146
+ variation = @config . get_variation_from_id ( experiment_key , variation_id ) unless variation_id . nil?
147
+ variation_key = variation [ 'key' ] if variation
146
148
147
- unless variation_id . nil?
148
- variation = @config . get_variation_from_id ( experiment_key , variation_id )
149
- return variation [ 'key' ] if variation
150
- end
151
- nil
149
+ @notification_center . send_notifications (
150
+ NotificationCenter ::NOTIFICATION_TYPES [ :DECISION ] ,
151
+ Helpers ::Constants ::DECISION_INFO_TYPES [ 'EXPERIMENT' ] , user_id , ( attributes || { } ) ,
152
+ experiment_key : experiment_key ,
153
+ variation_key : variation_key
154
+ )
155
+
156
+ variation_key
152
157
end
153
158
154
159
# Force a user into a variation for a given experiment.
@@ -257,30 +262,44 @@ def is_feature_enabled(feature_flag_key, user_id, attributes = nil)
257
262
end
258
263
259
264
decision = @decision_service . get_variation_for_feature ( feature_flag , user_id , attributes )
260
- if decision . nil?
261
- @logger . log ( Logger ::INFO ,
262
- "Feature '#{ feature_flag_key } ' is not enabled for user '#{ user_id } '." )
263
- return false
264
- end
265
265
266
- variation = decision [ 'variation' ]
267
- if decision . source == Optimizely ::DecisionService ::DECISION_SOURCE_EXPERIMENT
268
- # Send event if Decision came from an experiment.
269
- send_impression ( decision . experiment , variation [ 'key' ] , user_id , attributes )
270
- else
271
- @logger . log ( Logger ::DEBUG ,
272
- "The user '#{ user_id } ' is not being experimented on in feature '#{ feature_flag_key } '." )
266
+ feature_enabled = false
267
+ source_string = Optimizely ::DecisionService ::DECISION_SOURCE_ROLLOUT
268
+ if decision . is_a? ( Optimizely ::DecisionService ::Decision )
269
+ variation = decision [ 'variation' ]
270
+ feature_enabled = variation [ 'featureEnabled' ]
271
+ if decision . source == Optimizely ::DecisionService ::DECISION_SOURCE_EXPERIMENT
272
+ source_string = Optimizely ::DecisionService ::DECISION_SOURCE_EXPERIMENT
273
+ experiment_key = decision . experiment [ 'key' ]
274
+ variation_key = variation [ 'key' ]
275
+ # Send event if Decision came from an experiment.
276
+ send_impression ( decision . experiment , variation [ 'key' ] , user_id , attributes )
277
+ else
278
+ @logger . log ( Logger ::DEBUG ,
279
+ "The user '#{ user_id } ' is not being experimented on in feature '#{ feature_flag_key } '." )
280
+ end
273
281
end
274
282
275
- if variation [ 'featureEnabled' ] == true
283
+ @notification_center . send_notifications (
284
+ NotificationCenter ::NOTIFICATION_TYPES [ :DECISION ] ,
285
+ Helpers ::Constants ::DECISION_INFO_TYPES [ 'FEATURE' ] ,
286
+ user_id , ( attributes || { } ) ,
287
+ feature_key : feature_flag_key ,
288
+ feature_enabled : feature_enabled ,
289
+ source : source_string . upcase ,
290
+ source_experiment_key : experiment_key ,
291
+ source_variation_key : variation_key
292
+ )
293
+
294
+ if feature_enabled == true
276
295
@logger . log ( Logger ::INFO ,
277
296
"Feature '#{ feature_flag_key } ' is enabled for user '#{ user_id } '." )
278
297
return true
279
- else
280
- @logger . log ( Logger ::INFO ,
281
- "Feature '#{ feature_flag_key } ' is not enabled for user '#{ user_id } '." )
282
- return false
283
298
end
299
+
300
+ @logger . log ( Logger ::INFO ,
301
+ "Feature '#{ feature_flag_key } ' is not enabled for user '#{ user_id } '." )
302
+ false
284
303
end
285
304
286
305
# Gets keys of all feature flags which are enabled for the user.
@@ -461,25 +480,39 @@ def get_feature_variable_for_type(feature_flag_key, variable_key, variable_type,
461
480
# Error message logged in ProjectConfig- get_feature_flag_from_key
462
481
return nil if variable . nil?
463
482
483
+ feature_enabled = false
484
+
464
485
# Returns nil if type differs
465
486
if variable [ 'type' ] != variable_type
466
487
@logger . log ( Logger ::WARN ,
467
488
"Requested variable as type '#{ variable_type } ' but variable '#{ variable_key } ' is of type '#{ variable [ 'type' ] } '." )
468
489
return nil
469
490
else
491
+ source_string = Optimizely ::DecisionService ::DECISION_SOURCE_ROLLOUT
470
492
decision = @decision_service . get_variation_for_feature ( feature_flag , user_id , attributes )
471
493
variable_value = variable [ 'defaultValue' ]
472
494
if decision
473
495
variation = decision [ 'variation' ]
474
- variation_variable_usages = @config . variation_id_to_variable_usage_map [ variation [ 'id' ] ]
475
- variable_id = variable [ 'id' ]
476
- if variation [ 'featureEnabled' ] && variation_variable_usages &.key? ( variable_id )
477
- variable_value = variation_variable_usages [ variable_id ] [ 'value' ]
478
- @logger . log ( Logger ::INFO ,
479
- "Got variable value '#{ variable_value } ' for variable '#{ variable_key } ' of feature flag '#{ feature_flag_key } '." )
496
+ if decision [ 'source' ] == Optimizely ::DecisionService ::DECISION_SOURCE_EXPERIMENT
497
+ experiment_key = decision . experiment [ 'key' ]
498
+ variation_key = variation [ 'key' ]
499
+ source_string = Optimizely ::DecisionService ::DECISION_SOURCE_EXPERIMENT
500
+ end
501
+ feature_enabled = variation [ 'featureEnabled' ]
502
+ if feature_enabled == true
503
+ variation_variable_usages = @config . variation_id_to_variable_usage_map [ variation [ 'id' ] ]
504
+ variable_id = variable [ 'id' ]
505
+ if variation_variable_usages &.key? ( variable_id )
506
+ variable_value = variation_variable_usages [ variable_id ] [ 'value' ]
507
+ @logger . log ( Logger ::INFO ,
508
+ "Got variable value '#{ variable_value } ' for variable '#{ variable_key } ' of feature flag '#{ feature_flag_key } '." )
509
+ else
510
+ @logger . log ( Logger ::DEBUG ,
511
+ "Variable '#{ variable_key } ' is not used in variation '#{ variation [ 'key' ] } '. Returning the default variable value '#{ variable_value } '." )
512
+ end
480
513
else
481
514
@logger . log ( Logger ::DEBUG ,
482
- "Variable '#{ variable_key } ' is not used in variation '#{ variation [ 'key' ] } '. Returning the default variable value '#{ variable_value } '." )
515
+ "Feature '#{ feature_flag_key } ' for variation '#{ variation [ 'key' ] } ' is not enabled . Returning the default variable value '#{ variable_value } '." )
483
516
end
484
517
else
485
518
@logger . log ( Logger ::INFO ,
@@ -489,6 +522,19 @@ def get_feature_variable_for_type(feature_flag_key, variable_key, variable_type,
489
522
490
523
variable_value = Helpers ::VariableType . cast_value_to_type ( variable_value , variable_type , @logger )
491
524
525
+ @notification_center . send_notifications (
526
+ NotificationCenter ::NOTIFICATION_TYPES [ :DECISION ] ,
527
+ Helpers ::Constants ::DECISION_INFO_TYPES [ 'FEATURE_VARIABLE' ] , user_id , ( attributes || { } ) ,
528
+ feature_key : feature_flag_key ,
529
+ feature_enabled : feature_enabled ,
530
+ variable_key : variable_key ,
531
+ variable_type : variable_type ,
532
+ variable_value : variable_value ,
533
+ source : source_string . upcase ,
534
+ source_experiment_key : experiment_key ,
535
+ source_variation_key : variation_key
536
+ )
537
+
492
538
variable_value
493
539
end
494
540
0 commit comments