11package io .split .engine .evaluator ;
22
33import io .split .client .dtos .ConditionType ;
4+ import io .split .client .dtos .FallbackTreatment ;
5+ import io .split .client .dtos .FallbackTreatmentCalculator ;
6+ import io .split .client .dtos .FallbackTreatmentsConfiguration ;
47import io .split .client .exceptions .ChangeNumberExceptionWrapper ;
58import io .split .engine .experiments .ParsedCondition ;
69import io .split .engine .experiments .ParsedSplit ;
@@ -26,19 +29,22 @@ public class EvaluatorImp implements Evaluator {
2629 private final SegmentCacheConsumer _segmentCacheConsumer ;
2730 private final EvaluationContext _evaluationContext ;
2831 private final SplitCacheConsumer _splitCacheConsumer ;
32+ private final FallbackTreatmentCalculator _fallbackTreatmentCalculator ;
2933
3034 public EvaluatorImp (SplitCacheConsumer splitCacheConsumer , SegmentCacheConsumer segmentCache ,
31- RuleBasedSegmentCacheConsumer ruleBasedSegmentCacheConsumer ) {
35+ RuleBasedSegmentCacheConsumer ruleBasedSegmentCacheConsumer ,
36+ FallbackTreatmentCalculator fallbackTreatmentCalculator ) {
3237 _splitCacheConsumer = checkNotNull (splitCacheConsumer );
3338 _segmentCacheConsumer = checkNotNull (segmentCache );
3439 _evaluationContext = new EvaluationContext (this , _segmentCacheConsumer , ruleBasedSegmentCacheConsumer );
40+ _fallbackTreatmentCalculator = fallbackTreatmentCalculator ;
3541 }
3642
3743 @ Override
3844 public TreatmentLabelAndChangeNumber evaluateFeature (String matchingKey , String bucketingKey , String featureFlag , Map <String ,
3945 Object > attributes ) {
4046 ParsedSplit parsedSplit = _splitCacheConsumer .get (featureFlag );
41- return evaluateParsedSplit (matchingKey , bucketingKey , attributes , parsedSplit );
47+ return evaluateParsedSplit (matchingKey , bucketingKey , attributes , parsedSplit , featureFlag );
4248 }
4349
4450 @ Override
@@ -49,7 +55,7 @@ public Map<String, TreatmentLabelAndChangeNumber> evaluateFeatures(String matchi
4955 if (parsedSplits == null ) {
5056 return results ;
5157 }
52- featureFlags .forEach (s -> results .put (s , evaluateParsedSplit (matchingKey , bucketingKey , attributes , parsedSplits .get (s ))));
58+ featureFlags .forEach (s -> results .put (s , evaluateParsedSplit (matchingKey , bucketingKey , attributes , parsedSplits .get (s ), s )));
5359 return results ;
5460 }
5561
@@ -172,18 +178,22 @@ private String getConfig(ParsedSplit parsedSplit, String returnedTreatment) {
172178 }
173179
174180 private TreatmentLabelAndChangeNumber evaluateParsedSplit (String matchingKey , String bucketingKey , Map <String , Object > attributes ,
175- ParsedSplit parsedSplit ) {
181+ ParsedSplit parsedSplit , String featureName ) {
176182 try {
183+
177184 if (parsedSplit == null ) {
178- return new TreatmentLabelAndChangeNumber (Treatments .CONTROL , Labels .DEFINITION_NOT_FOUND );
185+ FallbackTreatment fallbackTreatment = _fallbackTreatmentCalculator .resolve (featureName , Labels .DEFINITION_NOT_FOUND );
186+ return new TreatmentLabelAndChangeNumber (fallbackTreatment .getTreatment (), fallbackTreatment .getLabel ());
179187 }
180188 return getTreatment (matchingKey , bucketingKey , parsedSplit , attributes );
181189 } catch (ChangeNumberExceptionWrapper e ) {
182190 _log .error ("Evaluator Exception" , e .wrappedException ());
183- return new EvaluatorImp .TreatmentLabelAndChangeNumber (Treatments .CONTROL , Labels .EXCEPTION , e .changeNumber ());
191+ FallbackTreatment fallbackTreatment = _fallbackTreatmentCalculator .resolve (featureName , Labels .EXCEPTION );
192+ return new TreatmentLabelAndChangeNumber (fallbackTreatment .getTreatment (), fallbackTreatment .getLabel (), e .changeNumber ());
184193 } catch (Exception e ) {
185194 _log .error ("Evaluator Exception" , e );
186- return new EvaluatorImp .TreatmentLabelAndChangeNumber (Treatments .CONTROL , Labels .EXCEPTION );
195+ FallbackTreatment fallbackTreatment = _fallbackTreatmentCalculator .resolve (featureName , Labels .EXCEPTION );
196+ return new TreatmentLabelAndChangeNumber (fallbackTreatment .getTreatment (), fallbackTreatment .getLabel ());
187197 }
188198 }
189199
0 commit comments