@@ -312,14 +312,45 @@ def get_variations_for_feature_list(project_config, feature_flags, user_context,
312312
313313 decisions = [ ]
314314 feature_flags . each do |feature_flag |
315- # check if the feature is being experiment on and whether the user is bucketed into the experiment
316- decision_result = get_variation_for_feature_experiment ( project_config , feature_flag , user_context , user_profile_tracker , decide_options )
317- # Only process rollout if no experiment decision was found and no error
318- if decision_result . decision . nil? && !decision_result . error
319- decision_result_rollout = get_variation_for_feature_rollout ( project_config , feature_flag , user_context ) unless decision_result . decision
320- decision_result . decision = decision_result_rollout . decision
321- decision_result . reasons . push ( *decision_result_rollout . reasons )
315+ # Check holdouts first
316+ holdouts = project_config . get_holdouts_for_flag ( feature_flag [ 'id' ] )
317+ decision_result = nil
318+
319+ if holdouts && !holdouts . empty?
320+ # Check each holdout
321+ holdouts . each do |holdout |
322+ holdout_decision = get_variation_for_holdout ( holdout , user_context , project_config )
323+
324+ if holdout_decision . decision
325+ # User is bucketed into a holdout
326+ decision_result = holdout_decision
327+ break
328+ else
329+ # User didn't bucket into this holdout, try next or continue to experiments
330+ decision_result = holdout_decision unless decision_result
331+ end
332+ end
322333 end
334+
335+ # If no holdout decision, check if the feature is being experiment on and whether the user is bucketed into the experiment
336+ if decision_result . nil? || decision_result . decision . nil?
337+ decision_result_exp = get_variation_for_feature_experiment ( project_config , feature_flag , user_context , user_profile_tracker , decide_options )
338+ if decision_result
339+ decision_result . reasons . push ( *decision_result_exp . reasons )
340+ decision_result . decision = decision_result_exp . decision if decision_result_exp . decision
341+ decision_result . error = decision_result_exp . error if decision_result_exp . error
342+ else
343+ decision_result = decision_result_exp
344+ end
345+
346+ # Only process rollout if no experiment decision was found and no error
347+ if decision_result . decision . nil? && !decision_result . error
348+ decision_result_rollout = get_variation_for_feature_rollout ( project_config , feature_flag , user_context ) unless decision_result . decision
349+ decision_result . decision = decision_result_rollout . decision
350+ decision_result . reasons . push ( *decision_result_rollout . reasons )
351+ end
352+ end
353+
323354 decisions << decision_result
324355 end
325356 user_profile_tracker &.save_user_profile
0 commit comments