Skip to content

Commit b48a831

Browse files
authored
Merge pull request #502 from splitio/semver-between-matcher
Semver between matcher
2 parents 4abdc3e + 780ceee commit b48a831

File tree

7 files changed

+103
-2
lines changed

7 files changed

+103
-2
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.split.client.dtos;
2+
3+
/**
4+
* Metadata to support the between matcher.
5+
*
6+
* @author adil
7+
*/
8+
public class BetweenStringMatcherData {
9+
public String start;
10+
public String end;
11+
}

client/src/main/java/io/split/client/dtos/Matcher.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public class Matcher {
1313
public WhitelistMatcherData whitelistMatcherData;
1414
public UnaryNumericMatcherData unaryNumericMatcherData;
1515
public BetweenMatcherData betweenMatcherData;
16+
public BetweenStringMatcherData betweenStringMatcherData;
1617
public DependencyMatcherData dependencyMatcherData;
1718
public Boolean booleanMatcherData;
1819
public String stringMatcherData;

client/src/main/java/io/split/client/dtos/MatcherType.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,6 @@ public enum MatcherType {
3636
EQUAL_TO_SEMVER,
3737
GREATER_THAN_OR_EQUAL_TO_SEMVER,
3838
LESS_THAN_OR_EQUAL_TO_SEMVER,
39-
IN_LIST_SEMVER
39+
IN_LIST_SEMVER,
40+
BETWEEN_SEMVER
4041
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ public class Labels {
66
public static final String KILLED = "killed";
77
public static final String DEFINITION_NOT_FOUND = "definition not found";
88
public static final String EXCEPTION = "exception";
9-
public static final String UNSUPPORTED_MATCHER = "unsupported matcher type";
9+
public static final String UNSUPPORTED_MATCHER = "targeting rule type unsupported by sdk";
1010
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import io.split.engine.matchers.GreaterThanOrEqualToSemverMatcher;
3333
import io.split.engine.matchers.LessThanOrEqualToSemverMatcher;
3434
import io.split.engine.matchers.InListSemverMatcher;
35+
import io.split.engine.matchers.BetweenSemverMatcher;
3536

3637
import org.slf4j.Logger;
3738
import org.slf4j.LoggerFactory;
@@ -214,6 +215,10 @@ private AttributeMatcher toMatcher(Matcher matcher) {
214215
checkNotNull(matcher.whitelistMatcherData, "whitelistMatcherData is required for IN_LIST_SEMVER matcher type");
215216
delegate = new InListSemverMatcher(matcher.whitelistMatcherData.whitelist);
216217
break;
218+
case BETWEEN_SEMVER:
219+
checkNotNull(matcher.betweenStringMatcherData, "betweenStringMatcherData is required for BETWEEN_SEMVER matcher type");
220+
delegate = new BetweenSemverMatcher(matcher.betweenStringMatcherData.start, matcher.betweenStringMatcherData.end);
221+
break;
217222
default:
218223
throw new IllegalArgumentException("Unknown matcher type: " + matcher.matcherType);
219224
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package io.split.engine.matchers;
2+
3+
import io.split.engine.evaluator.EvaluationContext;
4+
5+
import java.util.Map;
6+
7+
public class BetweenSemverMatcher implements Matcher {
8+
9+
private final Semver _semverStart;
10+
private final Semver _semverEnd;
11+
12+
public BetweenSemverMatcher(String semverStart, String semverEnd) {
13+
_semverStart = Semver.build(semverStart);
14+
_semverEnd = Semver.build(semverEnd);
15+
}
16+
17+
@Override
18+
public boolean match(Object matchValue, String bucketingKey, Map<String, Object> attributes, EvaluationContext evaluationContext) {
19+
if (matchValue == null || _semverStart == null || _semverEnd == null) {
20+
return false;
21+
}
22+
Semver matchSemver = Semver.build(matchValue.toString());
23+
if (matchSemver == null) {
24+
return false;
25+
}
26+
27+
return matchSemver.Compare(_semverStart) >= 0 && matchSemver.Compare(_semverEnd) <= 0;
28+
}
29+
30+
@Override
31+
public String toString() {
32+
StringBuilder bldr = new StringBuilder();
33+
bldr.append("between semver ");
34+
bldr.append(_semverStart.Version());
35+
bldr.append(" and ");
36+
bldr.append(_semverEnd.Version());
37+
return bldr.toString();
38+
}
39+
40+
@Override
41+
public int hashCode() {
42+
int result = 17;
43+
result = 31 * result + _semverStart.hashCode() + _semverEnd.hashCode();
44+
return result;
45+
}
46+
47+
@Override
48+
public boolean equals(Object obj) {
49+
if (obj == null) return false;
50+
if (this == obj) return true;
51+
if (!(obj instanceof BetweenSemverMatcher)) return false;
52+
53+
BetweenSemverMatcher other = (BetweenSemverMatcher) obj;
54+
55+
return _semverStart == other._semverStart && _semverEnd == other._semverEnd;
56+
}
57+
58+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package io.split.engine.matchers;
2+
3+
import org.junit.Test;
4+
5+
import static org.junit.Assert.assertTrue;
6+
import static org.junit.Assert.assertFalse;
7+
8+
/**
9+
* Tests for EqualToSemverMatcher
10+
*/
11+
12+
public class BetweenSemverMatcherTest {
13+
14+
@Test
15+
public void works() {
16+
BetweenSemverMatcher betweenSemverMatcher = new BetweenSemverMatcher("2.1.8", "3.0.0");
17+
18+
assertTrue( betweenSemverMatcher.match("2.1.8", null, null, null));
19+
assertTrue( betweenSemverMatcher.match("2.1.9", null, null, null));
20+
assertFalse( betweenSemverMatcher.match("2.1.8-rc", null, null, null));
21+
assertTrue( betweenSemverMatcher.match("3.0.0+build", null, null, null));
22+
assertFalse( betweenSemverMatcher.match("4.5.8", null, null, null));
23+
assertFalse( betweenSemverMatcher.match("1.0.4", null, null, null));
24+
}
25+
}

0 commit comments

Comments
 (0)