@@ -4,11 +4,11 @@ import (
44 "fmt"
55 "time"
66
7- "github.com/splitio/go-split-commons/v8 /dtos"
8- "github.com/splitio/go-split-commons/v8 /engine"
9- "github.com/splitio/go-split-commons/v8 /engine/evaluator/impressionlabels"
10- "github.com/splitio/go-split-commons/v8 /engine/grammar"
11- "github.com/splitio/go-split-commons/v8 /storage"
7+ "github.com/splitio/go-split-commons/v9 /dtos"
8+ "github.com/splitio/go-split-commons/v9 /engine"
9+ "github.com/splitio/go-split-commons/v9 /engine/evaluator/impressionlabels"
10+ "github.com/splitio/go-split-commons/v9 /engine/grammar"
11+ "github.com/splitio/go-split-commons/v9 /storage"
1212
1313 "github.com/splitio/go-toolkit/v5/logging"
1414)
@@ -37,10 +37,11 @@ type Results struct {
3737
3838// Evaluator struct is the main evaluator
3939type Evaluator struct {
40- splitStorage storage.SplitStorageConsumer
41- eng * engine.Engine
42- logger logging.LoggerInterface
43- ruleBuilder grammar.RuleBuilder
40+ splitStorage storage.SplitStorageConsumer
41+ eng * engine.Engine
42+ logger logging.LoggerInterface
43+ ruleBuilder grammar.RuleBuilder
44+ fallbackTratmentCalculator dtos.FallbackTreatmentCalculator
4445}
4546
4647// NewEvaluator instantiates an Evaluator struct and returns a reference to it
@@ -53,21 +54,25 @@ func NewEvaluator(
5354 logger logging.LoggerInterface ,
5455 featureFlagRules []string ,
5556 ruleBasedSegmentRules []string ,
57+ fallbackTreatmentCalculator dtos.FallbackTreatmentCalculator ,
5658) * Evaluator {
5759 e := & Evaluator {
58- splitStorage : splitStorage ,
59- eng : eng ,
60- logger : logger ,
60+ splitStorage : splitStorage ,
61+ eng : eng ,
62+ logger : logger ,
63+ fallbackTratmentCalculator : fallbackTreatmentCalculator ,
6164 }
6265 e .ruleBuilder = grammar .NewRuleBuilder (segmentStorage , ruleBasedSegmentStorage , largeSegmentStorage , featureFlagRules , ruleBasedSegmentRules , logger , e )
6366 return e
6467}
6568
6669func (e * Evaluator ) evaluateTreatment (key string , bucketingKey string , featureFlag string , splitDto * dtos.SplitDTO , attributes map [string ]interface {}) * Result {
6770 var config * string
71+ label := impressionlabels .SplitNotFound
6872 if splitDto == nil {
69- e .logger .Warning (fmt .Sprintf ("Feature flag %s not found, returning control." , featureFlag ))
70- return & Result {Treatment : Control , Label : impressionlabels .SplitNotFound , Config : config }
73+ fallbackTratment := e .fallbackTratmentCalculator .Resolve (featureFlag , & label )
74+ e .logger .Warning (fmt .Sprintf ("Feature flag %s not found, returning fallback treatment." , featureFlag ))
75+ return & Result {Treatment : * fallbackTratment .Treatment , Label : * fallbackTratment .Label (), Config : fallbackTratment .Config }
7176 }
7277
7378 split := grammar .NewSplit (splitDto , e .logger , e .ruleBuilder )
@@ -113,6 +118,15 @@ func (e *Evaluator) evaluateTreatment(key string, bucketingKey string, featureFl
113118 label = impressionlabels .NoConditionMatched
114119 }
115120
121+ if * treatment == Control {
122+ fallbackTreatment := e .fallbackTratmentCalculator .Resolve (featureFlag , & label )
123+ return & Result {
124+ Treatment : * fallbackTreatment .Treatment ,
125+ Label : * fallbackTreatment .Label (),
126+ Config : fallbackTreatment .Config ,
127+ }
128+ }
129+
116130 if _ , ok := split .Configurations ()[* treatment ]; ok {
117131 treatmentConfig := split .Configurations ()[* treatment ]
118132 config = & treatmentConfig
0 commit comments