@@ -398,20 +398,6 @@ DecisionResponse<FeatureDecision> getVariationFromExperiment(@Nonnull ProjectCon
398398 for (String experimentId : featureFlag .getExperimentIds ()) {
399399 Experiment experiment = projectConfig .getExperimentIdMapping ().get (experimentId );
400400
401- // Check local holdouts targeting this experiment rule before regular evaluation (FSSDK-12369)
402- if (experiment != null ) {
403- List <Holdout > localHoldouts = projectConfig .getHoldoutConfig ().getHoldoutsForRule (experiment .getId ());
404- for (Holdout holdout : localHoldouts ) {
405- DecisionResponse <Variation > holdoutDecision = getVariationForHoldout (holdout , user , projectConfig );
406- reasons .merge (holdoutDecision .getReasons ());
407- if (holdoutDecision .getResult () != null ) {
408- return new DecisionResponse <>(
409- new FeatureDecision (holdout , holdoutDecision .getResult (), FeatureDecision .DecisionSource .HOLDOUT ),
410- reasons );
411- }
412- }
413- }
414-
415401 DecisionResponse <Variation > decisionVariation =
416402 getVariationFromExperimentRule (projectConfig , featureFlag .getKey (), experiment , user , options , userProfileTracker , decisionPath );
417403 reasons .merge (decisionVariation .getReasons ());
@@ -483,18 +469,6 @@ DecisionResponse<FeatureDecision> getVariationForFeatureInRollout(@Nonnull Featu
483469 while (index < rolloutRulesLength ) {
484470 Experiment rule = rollout .getExperiments ().get (index );
485471
486- // Check local holdouts targeting this delivery rule before regular evaluation (FSSDK-12369)
487- List <Holdout > localHoldoutsForRule = projectConfig .getHoldoutConfig ().getHoldoutsForRule (rule .getId ());
488- boolean localHoldoutHit = false ;
489- for (Holdout holdout : localHoldoutsForRule ) {
490- DecisionResponse <Variation > holdoutDecision = getVariationForHoldout (holdout , user , projectConfig );
491- reasons .merge (holdoutDecision .getReasons ());
492- if (holdoutDecision .getResult () != null ) {
493- FeatureDecision holdoutFeatureDecision = new FeatureDecision (holdout , holdoutDecision .getResult (), FeatureDecision .DecisionSource .HOLDOUT );
494- return new DecisionResponse (holdoutFeatureDecision , reasons );
495- }
496- }
497-
498472 DecisionResponse <AbstractMap .SimpleEntry > decisionVariationResponse = getVariationFromDeliveryRule (
499473 projectConfig ,
500474 featureFlag .getKey (),
@@ -872,6 +846,16 @@ private DecisionResponse<Variation> getVariationFromExperimentRule(@Nonnull Proj
872846 return new DecisionResponse (variation , reasons );
873847 }
874848
849+ // Check local holdouts targeting this specific experiment rule (FSSDK-12369)
850+ List <Holdout > localHoldouts = projectConfig .getHoldoutConfig ().getHoldoutsForRule (rule .getId ());
851+ for (Holdout holdout : localHoldouts ) {
852+ DecisionResponse <Variation > holdoutDecision = getVariationForHoldout (holdout , user , projectConfig );
853+ reasons .merge (holdoutDecision .getReasons ());
854+ if (holdoutDecision .getResult () != null ) {
855+ return new DecisionResponse <>(holdoutDecision .getResult (), reasons );
856+ }
857+ }
858+
875859 //regular decision
876860 DecisionResponse <Variation > decisionResponse = getVariation (rule , user , projectConfig , options , userProfileTracker , null , decisionPath );
877861 reasons .merge (decisionResponse .getReasons ());
@@ -922,6 +906,17 @@ DecisionResponse<AbstractMap.SimpleEntry> getVariationFromDeliveryRule(@Nonnull
922906 return new DecisionResponse (variationToSkipToEveryoneElsePair , reasons );
923907 }
924908
909+ // Check local holdouts targeting this specific delivery rule (FSSDK-12369)
910+ List <Holdout > localHoldouts = projectConfig .getHoldoutConfig ().getHoldoutsForRule (rule .getId ());
911+ for (Holdout holdout : localHoldouts ) {
912+ DecisionResponse <Variation > holdoutDecision = getVariationForHoldout (holdout , user , projectConfig );
913+ reasons .merge (holdoutDecision .getReasons ());
914+ if (holdoutDecision .getResult () != null ) {
915+ variationToSkipToEveryoneElsePair = new AbstractMap .SimpleEntry <>(holdoutDecision .getResult (), false );
916+ return new DecisionResponse (variationToSkipToEveryoneElsePair , reasons );
917+ }
918+ }
919+
925920 // Handle a regular decision
926921 String bucketingId = getBucketingId (user .getUserId (), user .getAttributes ());
927922 Boolean everyoneElse = (ruleIndex == rules .size () - 1 );
0 commit comments