Skip to content

Commit 188204a

Browse files
committed
Update decision service
1 parent 98735fc commit 188204a

File tree

1 file changed

+38
-7
lines changed

1 file changed

+38
-7
lines changed

lib/optimizely/decision_service.rb

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)