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

Skip to content

Commit de8d76d

Browse files
authored
Merge pull request #566 from splitio/prereq-matcher
Added prereq matcher
2 parents 3d6800d + d843920 commit de8d76d

File tree

2 files changed

+114
-0
lines changed

2 files changed

+114
-0
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package io.split.engine.matchers;
2+
3+
import io.split.client.dtos.Prerequisites;
4+
import io.split.engine.evaluator.EvaluationContext;
5+
6+
import java.util.List;
7+
import java.util.Map;
8+
import java.util.Objects;
9+
import java.util.stream.Collectors;
10+
11+
public class PrerequisitesMatcher implements Matcher {
12+
private List<Prerequisites> _prerequisites;
13+
14+
public PrerequisitesMatcher(List<Prerequisites> prerequisites) {
15+
_prerequisites = prerequisites;
16+
}
17+
18+
@Override
19+
public boolean match(Object matchValue, String bucketingKey, Map<String, Object> attributes, EvaluationContext evaluationContext) {
20+
if (matchValue == null) {
21+
return false;
22+
}
23+
24+
if (!(matchValue instanceof String)) {
25+
return false;
26+
}
27+
for (Prerequisites prerequisites : _prerequisites) {
28+
String treatment = evaluationContext.getEvaluator().evaluateFeature((String) matchValue, bucketingKey,
29+
prerequisites.featureFlagName, attributes). treatment;
30+
if (!prerequisites.treatments.contains(treatment)) {
31+
return false;
32+
}
33+
}
34+
return true;
35+
}
36+
37+
@Override
38+
public String toString() {
39+
StringBuilder bldr = new StringBuilder();
40+
bldr.append("prerequisites: ");
41+
bldr.append(this._prerequisites.stream().map(pr -> pr.featureFlagName + " " +
42+
pr.treatments.toString()).map(Object::toString).collect(Collectors.joining(", ")));
43+
return bldr.toString();
44+
}
45+
46+
@Override
47+
public boolean equals(Object o) {
48+
if (this == o) return true;
49+
if (o == null || getClass() != o.getClass()) return false;
50+
51+
PrerequisitesMatcher that = (PrerequisitesMatcher) o;
52+
53+
return Objects.equals(_prerequisites, that._prerequisites);
54+
}
55+
56+
@Override
57+
public int hashCode() {
58+
int result = _prerequisites != null ? _prerequisites.hashCode() : 0;
59+
result = 31 * result + (_prerequisites != null ? _prerequisites.hashCode() : 0);
60+
return result;
61+
}
62+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package io.split.engine.matchers;
2+
3+
import io.split.client.dtos.Prerequisites;
4+
import io.split.client.utils.Json;
5+
import io.split.engine.evaluator.EvaluationContext;
6+
import io.split.engine.evaluator.Evaluator;
7+
import io.split.engine.evaluator.EvaluatorImp;
8+
import io.split.storages.RuleBasedSegmentCache;
9+
import io.split.storages.SegmentCache;
10+
import org.junit.Assert;
11+
import org.junit.Test;
12+
import org.mockito.Mockito;
13+
14+
import java.util.Arrays;
15+
import java.util.List;
16+
17+
/**
18+
* Tests for Prerequisites matcher
19+
*/
20+
public class PrerequisitesMatcherTest {
21+
22+
@Test
23+
public void works() {
24+
Evaluator evaluator = Mockito.mock(Evaluator.class);
25+
EvaluationContext evaluationContext = new EvaluationContext(evaluator, Mockito.mock(SegmentCache.class), Mockito.mock(RuleBasedSegmentCache.class));
26+
List<Prerequisites> prerequisites = Arrays.asList(Json.fromJson("{\"n\": \"split1\", \"ts\": [\"on\"]}", Prerequisites.class), Json.fromJson("{\"n\": \"split2\", \"ts\": [\"off\"]}", Prerequisites.class));
27+
PrerequisitesMatcher matcher = new PrerequisitesMatcher(prerequisites);
28+
Assert.assertEquals("prerequisites: split1 [on], split2 [off]", matcher.toString());
29+
PrerequisitesMatcher matcher2 = new PrerequisitesMatcher(prerequisites);
30+
Assert.assertTrue(matcher.equals(matcher2));
31+
Assert.assertTrue(matcher.hashCode() != 0);
32+
33+
Mockito.when(evaluator.evaluateFeature("user", "user", "split1", null)).thenReturn(new EvaluatorImp.TreatmentLabelAndChangeNumber("on", ""));
34+
Mockito.when(evaluator.evaluateFeature("user", "user", "split2", null)).thenReturn(new EvaluatorImp.TreatmentLabelAndChangeNumber("off", ""));
35+
Assert.assertTrue(matcher.match("user", "user", null, evaluationContext));
36+
37+
Mockito.when(evaluator.evaluateFeature("user", "user", "split2", null)).thenReturn(new EvaluatorImp.TreatmentLabelAndChangeNumber("on", ""));
38+
Assert.assertFalse(matcher.match("user", "user", null, evaluationContext));
39+
}
40+
41+
@Test
42+
public void invalidParams() {
43+
Evaluator evaluator = Mockito.mock(Evaluator.class);
44+
EvaluationContext evaluationContext = new EvaluationContext(evaluator, Mockito.mock(SegmentCache.class), Mockito.mock(RuleBasedSegmentCache.class));
45+
46+
List<Prerequisites> prerequisites = Arrays.asList(Json.fromJson("{\"n\": \"split1\", \"ts\": [\"on\"]}", Prerequisites.class), Json.fromJson("{\"n\": \"split2\", \"ts\": [\"off\"]}", Prerequisites.class));
47+
PrerequisitesMatcher matcher = new PrerequisitesMatcher(prerequisites);
48+
Mockito.when(evaluator.evaluateFeature("user", "user", "split1", null)).thenReturn(new EvaluatorImp.TreatmentLabelAndChangeNumber("on", ""));
49+
Assert.assertFalse(matcher.match(null, null, null, evaluationContext));
50+
Assert.assertFalse(matcher.match(123, null, null, evaluationContext));
51+
}
52+
}

0 commit comments

Comments
 (0)