@@ -167,7 +167,14 @@ def get_variation_for_feature(project_config, feature_flag, user_context, decide
167167 # user_context - Optimizely user context instance
168168 #
169169 # Returns DecisionResult struct.
170- get_variations_for_feature_list ( project_config , [ feature_flag ] , user_context , decide_options ) . first
170+ holdouts = project_config . get_holdouts_for_flag ( feature_flag [ 'key' ] )
171+
172+ if holdouts && !holdouts . empty?
173+ # Has holdouts - use get_decision_for_flag which checks holdouts first
174+ get_decision_for_flag ( feature_flag , user_context , project_config , decide_options )
175+ else
176+ get_variations_for_feature_list ( project_config , [ feature_flag ] , user_context , decide_options ) . first
177+ end
171178 end
172179
173180 def get_decision_for_flag ( feature_flag , user_context , project_config , decide_options = [ ] , user_profile_tracker = nil , decide_reasons = nil )
@@ -211,14 +218,20 @@ def get_decision_for_flag(feature_flag, user_context, project_config, decide_opt
211218 reasons . push ( *rollout_decision . reasons )
212219
213220 if rollout_decision . decision
214- message = "The user '#{ user_id } ' is bucketed into a rollout for feature flag '#{ feature_flag [ 'key' ] } '."
215- @logger . log ( Logger ::INFO , message )
216- reasons . push ( message )
221+ # Check if this was a forced decision (last reason contains "forced decision map")
222+ is_forced_decision = reasons . last &.include? ( 'forced decision map' )
223+
224+ unless is_forced_decision
225+ # Only add the "bucketed into rollout" message for normal bucketing
226+ message = "The user '#{ user_id } ' is bucketed into a rollout for feature flag '#{ feature_flag [ 'key' ] } '."
227+ @logger . log ( Logger ::INFO , message )
228+ reasons . push ( message )
229+ end
230+
217231 DecisionResult . new ( rollout_decision . decision , rollout_decision . error , reasons )
218232 else
219233 message = "The user '#{ user_id } ' is not bucketed into a rollout for feature flag '#{ feature_flag [ 'key' ] } '."
220234 @logger . log ( Logger ::INFO , message )
221- reasons . push ( message )
222235 DecisionResult . new ( nil , false , reasons )
223236 end
224237 end
@@ -298,14 +311,14 @@ def get_variations_for_feature_list(project_config, feature_flags, user_context,
298311
299312 decisions = [ ]
300313 feature_flags . each do |feature_flag |
301- # check if the feature is being experiment on and whether the user is bucketed into the experiment
302- decision_result = get_variation_for_feature_experiment ( project_config , feature_flag , user_context , user_profile_tracker , decide_options )
303- # Only process rollout if no experiment decision was found and no error
304- if decision_result . decision . nil? && ! decision_result . error
305- decision_result_rollout = get_variation_for_feature_rollout ( project_config , feature_flag , user_context ) unless decision_result . decision
306- decision_result . decision = decision_result_rollout . decision
307- decision_result . reasons . push ( * decision_result_rollout . reasons )
308- end
314+ decision_result = get_decision_for_flag (
315+ feature_flag ,
316+ user_context ,
317+ project_config ,
318+ decide_options ,
319+ user_profile_tracker ,
320+ [ ]
321+ )
309322 decisions << decision_result
310323 end
311324 user_profile_tracker &.save_user_profile
0 commit comments