Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 91b48ee

Browse files
authored
Merge pull request #567 from splitio/prereq-evaluator
Update Evaluator
2 parents de8d76d + 32ea00d commit 91b48ee

File tree

12 files changed

+168
-89
lines changed

12 files changed

+168
-89
lines changed

client/src/main/java/io/split/client/api/SplitView.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public class SplitView {
2828
public List<String> sets;
2929
public String defaultTreatment;
3030
public boolean impressionsDisabled;
31-
public List<Prerequisites> prerequisites;
31+
public String prerequisites;
3232

3333
public static SplitView fromParsedSplit(ParsedSplit parsedSplit) {
3434
SplitView splitView = new SplitView();
@@ -50,7 +50,7 @@ public static SplitView fromParsedSplit(ParsedSplit parsedSplit) {
5050
splitView.treatments = new ArrayList<String>(treatments);
5151
splitView.configs = parsedSplit.configurations() == null? Collections.<String, String>emptyMap() : parsedSplit.configurations() ;
5252
splitView.impressionsDisabled = parsedSplit.impressionsDisabled();
53-
splitView.prerequisites = parsedSplit.prerequisites() != null ? parsedSplit.prerequisites(): new ArrayList<>();
53+
splitView.prerequisites = parsedSplit.prerequisites() != null ? parsedSplit.prerequisites().toString(): "";
5454

5555
return splitView;
5656
}

client/src/main/java/io/split/engine/evaluator/EvaluatorImp.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ private List<String> getFeatureFlagNamesByFlagSets(List<String> flagSets) {
8888
private TreatmentLabelAndChangeNumber getTreatment(String matchingKey, String bucketingKey, ParsedSplit parsedSplit, Map<String,
8989
Object> attributes) throws ChangeNumberExceptionWrapper {
9090
try {
91+
String config = parsedSplit.configurations() != null ? parsedSplit.configurations().get(parsedSplit.defaultTreatment()) : null;
9192
if (parsedSplit.killed()) {
92-
String config = parsedSplit.configurations() != null ? parsedSplit.configurations().get(parsedSplit.defaultTreatment()) : null;
9393
return new TreatmentLabelAndChangeNumber(
9494
parsedSplit.defaultTreatment(),
9595
Labels.KILLED,
@@ -98,6 +98,17 @@ private TreatmentLabelAndChangeNumber getTreatment(String matchingKey, String bu
9898
parsedSplit.impressionsDisabled());
9999
}
100100

101+
String bk = (bucketingKey == null) ? matchingKey : bucketingKey;
102+
103+
if (!parsedSplit.prerequisites().match(matchingKey, bk, attributes, _evaluationContext)) {
104+
return new TreatmentLabelAndChangeNumber(
105+
parsedSplit.defaultTreatment(),
106+
Labels.PREREQUISITES_NOT_MET,
107+
parsedSplit.changeNumber(),
108+
config,
109+
parsedSplit.impressionsDisabled());
110+
}
111+
101112
/*
102113
* There are three parts to a single Feature flag: 1) Whitelists 2) Traffic Allocation
103114
* 3) Rollout. The flag inRollout is there to understand when we move into the Rollout
@@ -106,8 +117,6 @@ private TreatmentLabelAndChangeNumber getTreatment(String matchingKey, String bu
106117
*/
107118
boolean inRollout = false;
108119

109-
String bk = (bucketingKey == null) ? matchingKey : bucketingKey;
110-
111120
for (ParsedCondition parsedCondition : parsedSplit.parsedConditions()) {
112121

113122
if (!inRollout && parsedCondition.conditionType() == ConditionType.ROLLOUT) {
@@ -118,7 +127,7 @@ private TreatmentLabelAndChangeNumber getTreatment(String matchingKey, String bu
118127

119128
if (bucket > parsedSplit.trafficAllocation()) {
120129
// out of split
121-
String config = parsedSplit.configurations() != null ?
130+
config = parsedSplit.configurations() != null ?
122131
parsedSplit.configurations().get(parsedSplit.defaultTreatment()) : null;
123132
return new TreatmentLabelAndChangeNumber(parsedSplit.defaultTreatment(), Labels.NOT_IN_SPLIT,
124133
parsedSplit.changeNumber(), config, parsedSplit.impressionsDisabled());
@@ -130,7 +139,7 @@ private TreatmentLabelAndChangeNumber getTreatment(String matchingKey, String bu
130139

131140
if (parsedCondition.matcher().match(matchingKey, bucketingKey, attributes, _evaluationContext)) {
132141
String treatment = Splitter.getTreatment(bk, parsedSplit.seed(), parsedCondition.partitions(), parsedSplit.algo());
133-
String config = parsedSplit.configurations() != null ? parsedSplit.configurations().get(treatment) : null;
142+
config = parsedSplit.configurations() != null ? parsedSplit.configurations().get(treatment) : null;
134143
return new TreatmentLabelAndChangeNumber(
135144
treatment,
136145
parsedCondition.label(),
@@ -140,7 +149,7 @@ private TreatmentLabelAndChangeNumber getTreatment(String matchingKey, String bu
140149
}
141150
}
142151

143-
String config = parsedSplit.configurations() != null ? parsedSplit.configurations().get(parsedSplit.defaultTreatment()) : null;
152+
config = parsedSplit.configurations() != null ? parsedSplit.configurations().get(parsedSplit.defaultTreatment()) : null;
144153
return new TreatmentLabelAndChangeNumber(
145154
parsedSplit.defaultTreatment(),
146155
Labels.DEFAULT_RULE,
@@ -158,7 +167,6 @@ private TreatmentLabelAndChangeNumber evaluateParsedSplit(String matchingKey, St
158167
if (parsedSplit == null) {
159168
return new TreatmentLabelAndChangeNumber(Treatments.CONTROL, Labels.DEFINITION_NOT_FOUND);
160169
}
161-
162170
return getTreatment(matchingKey, bucketingKey, parsedSplit, attributes);
163171
} catch (ChangeNumberExceptionWrapper e) {
164172
_log.error("Evaluator Exception", e.wrappedException());

client/src/main/java/io/split/engine/evaluator/Labels.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ public class Labels {
77
public static final String DEFINITION_NOT_FOUND = "definition not found";
88
public static final String EXCEPTION = "exception";
99
public static final String UNSUPPORTED_MATCHER = "targeting rule type unsupported by sdk";
10+
public static final String PREREQUISITES_NOT_MET = "prerequisites not met";
1011
}

client/src/main/java/io/split/engine/experiments/ParsedSplit.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package io.split.engine.experiments;
22

33
import com.google.common.collect.ImmutableList;
4-
import io.split.client.dtos.Prerequisites;
54
import io.split.engine.matchers.AttributeMatcher;
5+
import io.split.engine.matchers.PrerequisitesMatcher;
66
import io.split.engine.matchers.RuleBasedSegmentMatcher;
77
import io.split.engine.matchers.UserDefinedSegmentMatcher;
88

@@ -35,7 +35,7 @@ public class ParsedSplit {
3535
private final Map<String, String> _configurations;
3636
private final HashSet<String> _flagSets;
3737
private final boolean _impressionsDisabled;
38-
private List<Prerequisites> _prerequisites;
38+
private PrerequisitesMatcher _prerequisites;
3939

4040
public static ParsedSplit createParsedSplitForTests(
4141
String feature,
@@ -48,7 +48,7 @@ public static ParsedSplit createParsedSplitForTests(
4848
int algo,
4949
HashSet<String> flagSets,
5050
boolean impressionsDisabled,
51-
List<Prerequisites> prerequisites
51+
PrerequisitesMatcher prerequisites
5252
) {
5353
return new ParsedSplit(
5454
feature,
@@ -80,7 +80,7 @@ public static ParsedSplit createParsedSplitForTests(
8080
Map<String, String> configurations,
8181
HashSet<String> flagSets,
8282
boolean impressionsDisabled,
83-
List<Prerequisites> prerequisites
83+
PrerequisitesMatcher prerequisites
8484
) {
8585
return new ParsedSplit(
8686
feature,
@@ -114,7 +114,7 @@ public ParsedSplit(
114114
Map<String, String> configurations,
115115
HashSet<String> flagSets,
116116
boolean impressionsDisabled,
117-
List<Prerequisites> prerequisites
117+
PrerequisitesMatcher prerequisites
118118
) {
119119
_split = feature;
120120
_seed = seed;
@@ -179,7 +179,7 @@ public Map<String, String> configurations() {
179179
public boolean impressionsDisabled() {
180180
return _impressionsDisabled;
181181
}
182-
public List<Prerequisites> prerequisites() { return _prerequisites; }
182+
public PrerequisitesMatcher prerequisites() { return _prerequisites; }
183183

184184
@Override
185185
public int hashCode() {

client/src/main/java/io/split/engine/experiments/SplitParser.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import io.split.client.dtos.Partition;
77
import io.split.client.dtos.Split;
88
import io.split.engine.matchers.CombiningMatcher;
9+
import io.split.engine.matchers.PrerequisitesMatcher;
910
import org.slf4j.Logger;
1011
import org.slf4j.LoggerFactory;
1112

@@ -69,6 +70,6 @@ private ParsedSplit parseWithoutExceptionHandling(Split split) {
6970
split.configurations,
7071
split.sets,
7172
split.impressionsDisabled,
72-
split.prerequisites);
73+
new PrerequisitesMatcher(split.prerequisites));
7374
}
7475
}

client/src/main/java/io/split/engine/matchers/PrerequisitesMatcher.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ public boolean match(Object matchValue, String bucketingKey, Map<String, Object>
2424
if (!(matchValue instanceof String)) {
2525
return false;
2626
}
27+
28+
if (_prerequisites == null) {
29+
return true;
30+
}
31+
2732
for (Prerequisites prerequisites : _prerequisites) {
2833
String treatment = evaluationContext.getEvaluator().evaluateFeature((String) matchValue, bucketingKey,
2934
prerequisites.featureFlagName, attributes). treatment;
@@ -38,8 +43,10 @@ public boolean match(Object matchValue, String bucketingKey, Map<String, Object>
3843
public String toString() {
3944
StringBuilder bldr = new StringBuilder();
4045
bldr.append("prerequisites: ");
41-
bldr.append(this._prerequisites.stream().map(pr -> pr.featureFlagName + " " +
42-
pr.treatments.toString()).map(Object::toString).collect(Collectors.joining(", ")));
46+
if (this._prerequisites != null) {
47+
bldr.append(this._prerequisites.stream().map(pr -> pr.featureFlagName + " " +
48+
pr.treatments.toString()).map(Object::toString).collect(Collectors.joining(", ")));
49+
}
4350
return bldr.toString();
4451
}
4552

0 commit comments

Comments
 (0)