Skip to content

Commit c12432a

Browse files
committed
refactor: strip metadata from TargetingRule and EvaluationResult
TargetingRule now holds only evaluation fields (seed, killed, defaultTreatment, conditions, trafficAllocation, trafficAllocationSeed, algo, prerequisites). Metadata (name, changeNumber, trafficTypeName, configurations, flagSets, impressionsDisabled) lives exclusively in ParsedSplit. EvaluationResult carries only (treatment, label). EvaluatorImp.getTreatment() enriches changeNumber, config, and impressionsDisabled from ParsedSplit after the engine returns. VersionedExceptionWrapper no longer carries a version field; the caller uses parsedSplit.changeNumber() in the catch block instead. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> AI-Session-Id: 724b08af-bcdd-4f98-b354-b4a62fbb2489 AI-Tool: claude-code AI-Model: unknown
1 parent 872a9ba commit c12432a

File tree

11 files changed

+77
-267
lines changed

11 files changed

+77
-267
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public RuleBasedSegmentCacheConsumer getRuleBasedSegmentCache() {
3838
@Override
3939
public EvaluationResult evaluate(String matchingKey, String bucketingKey, String ruleName, Map<String, Object> attributes) {
4040
EvaluatorImp.TreatmentLabelAndChangeNumber r = _evaluator.evaluateFeature(matchingKey, bucketingKey, ruleName, attributes);
41-
return new EvaluationResult(r.treatment, r.label, r.changeNumber, r.configurations, r.track);
41+
return new EvaluationResult(r.treatment, r.label);
4242
}
4343

4444
@Override

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,12 @@ private TreatmentLabelAndChangeNumber getTreatment(String matchingKey, String bu
116116
try {
117117
EvaluationResult r = _targetingEngine.evaluate(matchingKey, bucketingKey,
118118
parsedSplit.targetingRule(), attributes, _evaluationContext);
119-
return new TreatmentLabelAndChangeNumber(r.treatment, r.label, r.version, r.config, r.impressionsDisabled);
119+
String config = parsedSplit.configurations() != null
120+
? parsedSplit.configurations().get(r.treatment) : null;
121+
return new TreatmentLabelAndChangeNumber(r.treatment, r.label,
122+
parsedSplit.changeNumber(), config, parsedSplit.impressionsDisabled());
120123
} catch (VersionedExceptionWrapper e) {
121-
throw new ChangeNumberExceptionWrapper(e.wrappedException(), e.version());
124+
throw new ChangeNumberExceptionWrapper(e.wrappedException(), parsedSplit.changeNumber());
122125
}
123126
}
124127

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

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,9 @@ public static ParsedSplit createParsedSplitForTests(
6868
flagSets,
6969
impressionsDisabled,
7070
prerequisitesMatcher,
71-
TargetingRuleFactory.buildTargetingRule(feature, seed, killed, defaultTreatment, matcherAndSplits, trafficTypeName,
72-
changeNumber, 100, seed, algo, null, flagSets, impressionsDisabled, prerequisitesMatcher)
71+
TargetingRuleFactory.buildTargetingRule(seed, killed, defaultTreatment, matcherAndSplits,
72+
100, seed, algo,
73+
prerequisitesMatcher == null ? Collections.emptyList() : prerequisitesMatcher.getPrerequisites())
7374
);
7475
}
7576

@@ -102,8 +103,9 @@ public static ParsedSplit createParsedSplitForTests(
102103
flagSets,
103104
impressionsDisabled,
104105
prerequisitesMatcher,
105-
TargetingRuleFactory.buildTargetingRule(feature, seed, killed, defaultTreatment, matcherAndSplits, trafficTypeName,
106-
changeNumber, 100, seed, algo, configurations, flagSets, impressionsDisabled, prerequisitesMatcher)
106+
TargetingRuleFactory.buildTargetingRule(seed, killed, defaultTreatment, matcherAndSplits,
107+
100, seed, algo,
108+
prerequisitesMatcher == null ? Collections.emptyList() : prerequisitesMatcher.getPrerequisites())
107109
);
108110
}
109111

@@ -126,9 +128,9 @@ public ParsedSplit(
126128
this(feature, seed, killed, defaultTreatment, matcherAndSplits, trafficTypeName, changeNumber,
127129
trafficAllocation, trafficAllocationSeed, algo, configurations, flagSets,
128130
impressionsDisabled, prerequisitesMatcher,
129-
TargetingRuleFactory.buildTargetingRule(feature, seed, killed, defaultTreatment, matcherAndSplits, trafficTypeName,
130-
changeNumber, trafficAllocation, trafficAllocationSeed, algo, configurations,
131-
flagSets, impressionsDisabled, prerequisitesMatcher));
131+
TargetingRuleFactory.buildTargetingRule(seed, killed, defaultTreatment, matcherAndSplits,
132+
trafficAllocation, trafficAllocationSeed, algo,
133+
prerequisitesMatcher == null ? Collections.emptyList() : prerequisitesMatcher.getPrerequisites()));
132134
}
133135

134136
public ParsedSplit(

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

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import java.util.ArrayList;
44
import java.util.Collections;
5-
import java.util.HashSet;
65
import java.util.List;
76
import java.util.Objects;
87
import java.util.stream.Collectors;
@@ -75,19 +74,13 @@ private ParsedSplit parseWithoutExceptionHandling(Split split) {
7574
.collect(Collectors.toList());
7675

7776
TargetingRule targetingRule = new TargetingRule(
78-
split.name,
7977
split.seed,
8078
split.killed,
8179
split.defaultTreatment,
8280
targetingConditionList,
83-
split.trafficTypeName,
84-
split.changeNumber,
8581
split.trafficAllocation,
8682
split.trafficAllocationSeed,
8783
split.algo,
88-
split.configurations,
89-
split.sets == null ? new HashSet<>() : split.sets,
90-
split.impressionsDisabled,
9184
prerequisites);
9285

9386
return new ParsedSplit(

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

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

3-
import io.split.rules.matchers.PrerequisitesMatcher;
43
import io.split.rules.model.Condition;
54
import io.split.rules.model.ConditionType;
65
import io.split.rules.model.Partition;
76
import io.split.rules.model.Prerequisite;
87
import io.split.rules.model.TargetingRule;
98

109
import java.util.Collections;
11-
import java.util.HashSet;
1210
import java.util.List;
13-
import java.util.Map;
1411
import java.util.stream.Collectors;
1512

1613
public final class TargetingRuleFactory {
@@ -20,27 +17,19 @@ private TargetingRuleFactory() {
2017
}
2118

2219
public static TargetingRule buildTargetingRule(
23-
String feature, int seed, boolean killed, String defaultTreatment,
24-
List<ParsedCondition> matcherAndSplits, String trafficTypeName, long changeNumber,
20+
int seed, boolean killed, String defaultTreatment,
21+
List<ParsedCondition> matcherAndSplits,
2522
int trafficAllocation, int trafficAllocationSeed, int algo,
26-
Map<String, String> configurations, HashSet<String> flagSets,
27-
boolean impressionsDisabled, PrerequisitesMatcher prerequisitesMatcher) {
23+
List<Prerequisite> prerequisites) {
2824

2925
List<Condition> conditions = matcherAndSplits == null
3026
? Collections.emptyList()
3127
: matcherAndSplits.stream()
3228
.map(TargetingRuleFactory::toTargetingCondition)
3329
.collect(Collectors.toList());
3430

35-
List<Prerequisite> prereqs = prerequisitesMatcher == null
36-
? Collections.emptyList()
37-
: prerequisitesMatcher.getPrerequisites() == null
38-
? Collections.emptyList()
39-
: Collections.unmodifiableList(prerequisitesMatcher.getPrerequisites());
40-
41-
return new TargetingRule(feature, seed, killed, defaultTreatment, conditions, trafficTypeName,
42-
changeNumber, trafficAllocation, trafficAllocationSeed, algo, configurations,
43-
flagSets == null ? new HashSet<>() : flagSets, impressionsDisabled, prereqs);
31+
return new TargetingRule(seed, killed, defaultTreatment, conditions,
32+
trafficAllocation, trafficAllocationSeed, algo, prerequisites);
4433
}
4534

4635
private static Condition toTargetingCondition(ParsedCondition c) {

0 commit comments

Comments
 (0)