Skip to content

Commit 5866f7b

Browse files
authored
feat: Added support to get All segments used in the project (#483)
## Summary ODP Server needs a subset of segments to look for in the API call. This PR adds functionality to get all segments used in the project inside `DatafileProjectConfig`. ## Test plan - Manually tested thoroughly - Added Unit tests ## Jira [OASIS-8383](https://optimizely.atlassian.net/browse/OASIS-8383)
1 parent fb06ca7 commit 5866f7b

File tree

12 files changed

+124
-4
lines changed

12 files changed

+124
-4
lines changed

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ public class DatafileProjectConfig implements ProjectConfig {
7474
private final List<Group> groups;
7575
private final List<Rollout> rollouts;
7676
private final List<Integration> integrations;
77+
private final Set<String> allSegments;
7778

7879
// key to entity mappings
7980
private final Map<String, Attribute> attributeKeyMapping;
@@ -204,6 +205,15 @@ public DatafileProjectConfig(String accountId,
204205
this.publicKeyForODP = publicKeyForODP;
205206
this.hostForODP = hostForODP;
206207

208+
Set<String> allSegments = new HashSet<>();
209+
if (typedAudiences != null) {
210+
for(Audience audience: typedAudiences) {
211+
allSegments.addAll(audience.getSegments());
212+
}
213+
}
214+
215+
this.allSegments = allSegments;
216+
207217
Map<String, Experiment> variationIdToExperimentMap = new HashMap<String, Experiment>();
208218
for (Experiment experiment : this.experiments) {
209219
for (Variation variation : experiment.getVariations()) {
@@ -424,6 +434,10 @@ public List<Experiment> getExperiments() {
424434
return experiments;
425435
}
426436

437+
public Set<String> getAllSegments() {
438+
return this.allSegments;
439+
}
440+
427441
@Override
428442
public List<Experiment> getExperimentsForEventKey(String eventKey) {
429443
EventType event = eventNameMapping.get(eventKey);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public AndCondition(@Nonnull List<Condition> conditions) {
3838
this.conditions = conditions;
3939
}
4040

41+
@Override
4142
public List<Condition> getConditions() {
4243
return conditions;
4344
}

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

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/**
22
*
3-
* Copyright 2016-2017, 2019, Optimizely and contributors
3+
* Copyright 2016-2017, 2019, 2022, Optimizely and contributors
44
*
55
* Licensed under the Apache License, Version 2.0 (the "License");
66
* you may not use this file except in compliance with the License.
@@ -22,6 +22,9 @@
2222
import com.optimizely.ab.config.IdKeyMapped;
2323

2424
import javax.annotation.concurrent.Immutable;
25+
import java.util.HashSet;
26+
import java.util.List;
27+
import java.util.Set;
2528

2629
/**
2730
* Represents the Optimizely Audience configuration.
@@ -69,4 +72,27 @@ public String toString() {
6972
", conditions=" + conditions +
7073
'}';
7174
}
75+
76+
public Set<String> getSegments() {
77+
return getSegments(conditions);
78+
}
79+
80+
private static Set<String> getSegments(Condition conditions) {
81+
List<Condition> nestedConditions = conditions.getConditions();
82+
Set<String> segments = new HashSet<>();
83+
if (nestedConditions != null) {
84+
for (Condition nestedCondition : nestedConditions) {
85+
Set<String> nestedSegments = getSegments(nestedCondition);
86+
segments.addAll(nestedSegments);
87+
}
88+
} else {
89+
if (conditions.getClass() == UserAttribute.class) {
90+
UserAttribute userAttributeCondition = (UserAttribute) conditions;
91+
if (UserAttribute.QUALIFIED.equals(userAttributeCondition.getMatch())) {
92+
segments.add((String)userAttributeCondition.getValue());
93+
}
94+
}
95+
}
96+
return segments;
97+
}
7298
}

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

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

2828
import javax.annotation.Nullable;
2929
import javax.annotation.concurrent.Immutable;
30+
import java.util.List;
3031
import java.util.Map;
3132
import java.util.Objects;
3233

@@ -97,6 +98,11 @@ public boolean equals(Object o) {
9798
(audienceId.equals(condition.audienceId)));
9899
}
99100

101+
@Override
102+
public List<Condition> getConditions() {
103+
return null;
104+
}
105+
100106
@Override
101107
public int hashCode() {
102108

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.optimizely.ab.config.ProjectConfig;
2121

2222
import javax.annotation.Nullable;
23+
import java.util.List;
2324
import java.util.Map;
2425

2526
/**
@@ -33,4 +34,6 @@ public interface Condition<T> {
3334
String toJson();
3435

3536
String getOperandOrId();
37+
38+
List<Condition> getConditions();
3639
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import javax.annotation.Nullable;
2222
import java.util.Map;
2323

24-
public class EmptyCondition<T> implements Condition<T> {
24+
public class EmptyCondition<T> extends LeafCondition<T> {
2525
@Nullable
2626
@Override
2727
public Boolean evaluate(ProjectConfig config, OptimizelyUserContext user) {
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* Copyright 2022, Optimizely Inc. and contributors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package com.optimizely.ab.config.audience;
17+
18+
import java.util.List;
19+
20+
public abstract class LeafCondition<T> implements Condition<T> {
21+
22+
@Override
23+
public List<Condition> getConditions() {
24+
return null;
25+
}
26+
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import javax.annotation.Nullable;
2323
import javax.annotation.concurrent.Immutable;
2424
import javax.annotation.Nonnull;
25+
import java.util.Arrays;
26+
import java.util.List;
2527

2628

2729
/**
@@ -41,6 +43,11 @@ public Condition getCondition() {
4143
return condition;
4244
}
4345

46+
@Override
47+
public List<Condition> getConditions() {
48+
return Arrays.asList(condition);
49+
}
50+
4451
@Nullable
4552
public Boolean evaluate(ProjectConfig config, OptimizelyUserContext user) {
4653
Boolean conditionEval = condition == null ? null : condition.evaluate(config, user);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import javax.annotation.Nullable;
2222
import java.util.Map;
2323

24-
public class NullCondition<T> implements Condition<T> {
24+
public class NullCondition<T> extends LeafCondition<T> {
2525
@Nullable
2626
@Override
2727
public Boolean evaluate(ProjectConfig config, OptimizelyUserContext user) {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public OrCondition(@Nonnull List<Condition> conditions) {
3838
this.conditions = conditions;
3939
}
4040

41+
@Override
4142
public List<Condition> getConditions() {
4243
return conditions;
4344
}

0 commit comments

Comments
 (0)