Skip to content

Commit 94cba07

Browse files
Seperate common logic from Experiment and Holdout
1 parent e19c975 commit 94cba07

File tree

3 files changed

+98
-194
lines changed

3 files changed

+98
-194
lines changed

core-api/src/main/java/com/optimizely/ab/config/Experiment.java

Lines changed: 1 addition & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,14 @@
3434
*/
3535
@Immutable
3636
@JsonIgnoreProperties(ignoreUnknown = true)
37-
public class Experiment implements IdKeyMapped {
37+
public class Experiment implements ExperimentCore {
3838

3939
private final String id;
4040
private final String key;
4141
private final String status;
4242
private final String layerId;
4343
private final String groupId;
4444

45-
private final String AND = "AND";
46-
private final String OR = "OR";
47-
private final String NOT = "NOT";
48-
4945
private final List<String> audienceIds;
5046
private final Condition<AudienceIdCondition> audienceConditions;
5147
private final List<Variation> variations;
@@ -176,98 +172,6 @@ public boolean isLaunched() {
176172
return status.equals(ExperimentStatus.LAUNCHED.toString());
177173
}
178174

179-
public String serializeConditions(Map<String, String> audiencesMap) {
180-
Condition condition = this.audienceConditions;
181-
return condition instanceof EmptyCondition ? "" : this.serialize(condition, audiencesMap);
182-
}
183-
184-
private String getNameFromAudienceId(String audienceId, Map<String, String> audiencesMap) {
185-
StringBuilder audienceName = new StringBuilder();
186-
if (audiencesMap != null && audiencesMap.get(audienceId) != null) {
187-
audienceName.append("\"" + audiencesMap.get(audienceId) + "\"");
188-
} else {
189-
audienceName.append("\"" + audienceId + "\"");
190-
}
191-
return audienceName.toString();
192-
}
193-
194-
private String getOperandOrAudienceId(Condition condition, Map<String, String> audiencesMap) {
195-
if (condition != null) {
196-
if (condition instanceof AudienceIdCondition) {
197-
return this.getNameFromAudienceId(condition.getOperandOrId(), audiencesMap);
198-
} else {
199-
return condition.getOperandOrId();
200-
}
201-
} else {
202-
return "";
203-
}
204-
}
205-
206-
public String serialize(Condition condition, Map<String, String> audiencesMap) {
207-
StringBuilder stringBuilder = new StringBuilder();
208-
List<Condition> conditions;
209-
210-
String operand = this.getOperandOrAudienceId(condition, audiencesMap);
211-
switch (operand){
212-
case (AND):
213-
conditions = ((AndCondition<?>) condition).getConditions();
214-
stringBuilder.append(this.getNameOrNextCondition(operand, conditions, audiencesMap));
215-
break;
216-
case (OR):
217-
conditions = ((OrCondition<?>) condition).getConditions();
218-
stringBuilder.append(this.getNameOrNextCondition(operand, conditions, audiencesMap));
219-
break;
220-
case (NOT):
221-
stringBuilder.append(operand + " ");
222-
Condition notCondition = ((NotCondition<?>) condition).getCondition();
223-
if (notCondition instanceof AudienceIdCondition) {
224-
stringBuilder.append(serialize(notCondition, audiencesMap));
225-
} else {
226-
stringBuilder.append("(" + serialize(notCondition, audiencesMap) + ")");
227-
}
228-
break;
229-
default:
230-
stringBuilder.append(operand);
231-
break;
232-
}
233-
234-
return stringBuilder.toString();
235-
}
236-
237-
public String getNameOrNextCondition(String operand, List<Condition> conditions, Map<String, String> audiencesMap) {
238-
StringBuilder stringBuilder = new StringBuilder();
239-
int index = 0;
240-
if (conditions.isEmpty()) {
241-
return "";
242-
} else if (conditions.size() == 1) {
243-
return serialize(conditions.get(0), audiencesMap);
244-
} else {
245-
for (Condition con : conditions) {
246-
index++;
247-
if (index + 1 <= conditions.size()) {
248-
if (con instanceof AudienceIdCondition) {
249-
String audienceName = this.getNameFromAudienceId(((AudienceIdCondition<?>) con).getAudienceId(),
250-
audiencesMap);
251-
stringBuilder.append( audienceName + " ");
252-
} else {
253-
stringBuilder.append("(" + serialize(con, audiencesMap) + ") ");
254-
}
255-
stringBuilder.append(operand);
256-
stringBuilder.append(" ");
257-
} else {
258-
if (con instanceof AudienceIdCondition) {
259-
String audienceName = this.getNameFromAudienceId(((AudienceIdCondition<?>) con).getAudienceId(),
260-
audiencesMap);
261-
stringBuilder.append(audienceName);
262-
} else {
263-
stringBuilder.append("(" + serialize(con, audiencesMap) + ")");
264-
}
265-
}
266-
}
267-
}
268-
return stringBuilder.toString();
269-
}
270-
271175
@Override
272176
public String toString() {
273177
return "Experiment{" +

core-api/src/main/java/com/optimizely/ab/config/ExperimentCore.java

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@
2727
import java.util.Map;
2828

2929
public interface ExperimentCore extends IdKeyMapped {
30+
String AND = "AND";
31+
String OR = "OR";
32+
String NOT = "NOT";
33+
3034
String getLayerId();
3135
String getGroupId();
3236
List<String> getAudienceIds();
@@ -36,4 +40,96 @@ public interface ExperimentCore extends IdKeyMapped {
3640
Map<String, Variation> getVariationKeyToVariationMap();
3741
Map<String, Variation> getVariationIdToVariationMap();
3842
Map<String, String> getUserIdToVariationKeyMap();
43+
44+
default String serializeConditions(Map<String, String> audiencesMap) {
45+
Condition condition = this.getAudienceConditions();
46+
return condition instanceof EmptyCondition ? "" : this.serialize(condition, audiencesMap);
47+
}
48+
49+
default String getNameFromAudienceId(String audienceId, Map<String, String> audiencesMap) {
50+
StringBuilder audienceName = new StringBuilder();
51+
if (audiencesMap != null && audiencesMap.get(audienceId) != null) {
52+
audienceName.append("\"" + audiencesMap.get(audienceId) + "\"");
53+
} else {
54+
audienceName.append("\"" + audienceId + "\"");
55+
}
56+
return audienceName.toString();
57+
}
58+
59+
default String getOperandOrAudienceId(Condition condition, Map<String, String> audiencesMap) {
60+
if (condition != null) {
61+
if (condition instanceof AudienceIdCondition) {
62+
return this.getNameFromAudienceId(condition.getOperandOrId(), audiencesMap);
63+
} else {
64+
return condition.getOperandOrId();
65+
}
66+
} else {
67+
return "";
68+
}
69+
}
70+
71+
default String serialize(Condition condition, Map<String, String> audiencesMap) {
72+
StringBuilder stringBuilder = new StringBuilder();
73+
List<Condition> conditions;
74+
75+
String operand = this.getOperandOrAudienceId(condition, audiencesMap);
76+
switch (operand){
77+
case (AND):
78+
conditions = ((AndCondition<?>) condition).getConditions();
79+
stringBuilder.append(this.getNameOrNextCondition(operand, conditions, audiencesMap));
80+
break;
81+
case (OR):
82+
conditions = ((OrCondition<?>) condition).getConditions();
83+
stringBuilder.append(this.getNameOrNextCondition(operand, conditions, audiencesMap));
84+
break;
85+
case (NOT):
86+
stringBuilder.append(operand + " ");
87+
Condition notCondition = ((NotCondition<?>) condition).getCondition();
88+
if (notCondition instanceof AudienceIdCondition) {
89+
stringBuilder.append(serialize(notCondition, audiencesMap));
90+
} else {
91+
stringBuilder.append("(" + serialize(notCondition, audiencesMap) + ")");
92+
}
93+
break;
94+
default:
95+
stringBuilder.append(operand);
96+
break;
97+
}
98+
99+
return stringBuilder.toString();
100+
}
101+
102+
default String getNameOrNextCondition(String operand, List<Condition> conditions, Map<String, String> audiencesMap) {
103+
StringBuilder stringBuilder = new StringBuilder();
104+
int index = 0;
105+
if (conditions.isEmpty()) {
106+
return "";
107+
} else if (conditions.size() == 1) {
108+
return serialize(conditions.get(0), audiencesMap);
109+
} else {
110+
for (Condition con : conditions) {
111+
index++;
112+
if (index + 1 <= conditions.size()) {
113+
if (con instanceof AudienceIdCondition) {
114+
String audienceName = this.getNameFromAudienceId(((AudienceIdCondition<?>) con).getAudienceId(),
115+
audiencesMap);
116+
stringBuilder.append( audienceName + " ");
117+
} else {
118+
stringBuilder.append("(" + serialize(con, audiencesMap) + ") ");
119+
}
120+
stringBuilder.append(operand);
121+
stringBuilder.append(" ");
122+
} else {
123+
if (con instanceof AudienceIdCondition) {
124+
String audienceName = this.getNameFromAudienceId(((AudienceIdCondition<?>) con).getAudienceId(),
125+
audiencesMap);
126+
stringBuilder.append(audienceName);
127+
} else {
128+
stringBuilder.append("(" + serialize(con, audiencesMap) + ")");
129+
}
130+
}
131+
}
132+
}
133+
return stringBuilder.toString();
134+
}
39135
}

core-api/src/main/java/com/optimizely/ab/config/Holdout.java

Lines changed: 1 addition & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,6 @@ public class Holdout implements ExperimentCore {
4646
private final String layerId;
4747
private final String groupId;
4848

49-
private final String AND = "AND";
50-
private final String OR = "OR";
51-
private final String NOT = "NOT";
52-
5349
private final List<String> audienceIds;
5450
private final Condition<AudienceIdCondition> audienceConditions;
5551
private final List<Variation> variations;
@@ -174,101 +170,9 @@ public boolean isRunning() {
174170
return status.equals(Holdout.HoldoutStatus.RUNNING.toString());
175171
}
176172

177-
public String serializeConditions(Map<String, String> audiencesMap) {
178-
Condition condition = this.audienceConditions;
179-
return condition instanceof EmptyCondition ? "" : this.serialize(condition, audiencesMap);
180-
}
181-
182-
private String getNameFromAudienceId(String audienceId, Map<String, String> audiencesMap) {
183-
StringBuilder audienceName = new StringBuilder();
184-
if (audiencesMap != null && audiencesMap.get(audienceId) != null) {
185-
audienceName.append("\"" + audiencesMap.get(audienceId) + "\"");
186-
} else {
187-
audienceName.append("\"" + audienceId + "\"");
188-
}
189-
return audienceName.toString();
190-
}
191-
192-
private String getOperandOrAudienceId(Condition condition, Map<String, String> audiencesMap) {
193-
if (condition != null) {
194-
if (condition instanceof AudienceIdCondition) {
195-
return this.getNameFromAudienceId(condition.getOperandOrId(), audiencesMap);
196-
} else {
197-
return condition.getOperandOrId();
198-
}
199-
} else {
200-
return "";
201-
}
202-
}
203-
204-
public String serialize(Condition condition, Map<String, String> audiencesMap) {
205-
StringBuilder stringBuilder = new StringBuilder();
206-
List<Condition> conditions;
207-
208-
String operand = this.getOperandOrAudienceId(condition, audiencesMap);
209-
switch (operand){
210-
case (AND):
211-
conditions = ((AndCondition<?>) condition).getConditions();
212-
stringBuilder.append(this.getNameOrNextCondition(operand, conditions, audiencesMap));
213-
break;
214-
case (OR):
215-
conditions = ((OrCondition<?>) condition).getConditions();
216-
stringBuilder.append(this.getNameOrNextCondition(operand, conditions, audiencesMap));
217-
break;
218-
case (NOT):
219-
stringBuilder.append(operand + " ");
220-
Condition notCondition = ((NotCondition<?>) condition).getCondition();
221-
if (notCondition instanceof AudienceIdCondition) {
222-
stringBuilder.append(serialize(notCondition, audiencesMap));
223-
} else {
224-
stringBuilder.append("(" + serialize(notCondition, audiencesMap) + ")");
225-
}
226-
break;
227-
default:
228-
stringBuilder.append(operand);
229-
break;
230-
}
231-
232-
return stringBuilder.toString();
233-
}
234-
235-
public String getNameOrNextCondition(String operand, List<Condition> conditions, Map<String, String> audiencesMap) {
236-
StringBuilder stringBuilder = new StringBuilder();
237-
int index = 0;
238-
if (conditions.isEmpty()) {
239-
return "";
240-
} else if (conditions.size() == 1) {
241-
return serialize(conditions.get(0), audiencesMap);
242-
} else {
243-
for (Condition con : conditions) {
244-
index++;
245-
if (index + 1 <= conditions.size()) {
246-
if (con instanceof AudienceIdCondition) {
247-
String audienceName = this.getNameFromAudienceId(((AudienceIdCondition<?>) con).getAudienceId(),
248-
audiencesMap);
249-
stringBuilder.append( audienceName + " ");
250-
} else {
251-
stringBuilder.append("(" + serialize(con, audiencesMap) + ") ");
252-
}
253-
stringBuilder.append(operand);
254-
stringBuilder.append(" ");
255-
} else {
256-
if (con instanceof AudienceIdCondition) {
257-
String audienceName = this.getNameFromAudienceId(((AudienceIdCondition<?>) con).getAudienceId(),
258-
audiencesMap);
259-
stringBuilder.append(audienceName);
260-
} else {
261-
stringBuilder.append("(" + serialize(con, audiencesMap) + ")");
262-
}
263-
}
264-
}
265-
}
266-
return stringBuilder.toString();
267-
}
268-
269173
@Override
270174
public String toString() {
271-
return "Experiment{" +
175+
return "Holdout {" +
272176
"id='" + id + '\'' +
273177
", key='" + key + '\'' +
274178
", groupId='" + groupId + '\'' +

0 commit comments

Comments
 (0)