From 249209cf5aa53683d6354360904866acb70e026d Mon Sep 17 00:00:00 2001 From: Bilal Al Date: Mon, 29 Apr 2024 11:01:24 -0700 Subject: [PATCH 1/4] added between semver matcher --- .../client/dtos/BetweenStringMatcherData.java | 11 ++++ .../java/io/split/client/dtos/Matcher.java | 1 + .../io/split/client/dtos/MatcherType.java | 3 +- .../split/engine/experiments/SplitParser.java | 5 ++ .../engine/matchers/BetweenSemverMatcher.java | 58 +++++++++++++++++++ .../matchers/BetweenSemverMatcherTest.java | 22 +++++++ 6 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 client/src/main/java/io/split/client/dtos/BetweenStringMatcherData.java create mode 100644 client/src/main/java/io/split/engine/matchers/BetweenSemverMatcher.java create mode 100644 client/src/test/java/io/split/engine/matchers/BetweenSemverMatcherTest.java diff --git a/client/src/main/java/io/split/client/dtos/BetweenStringMatcherData.java b/client/src/main/java/io/split/client/dtos/BetweenStringMatcherData.java new file mode 100644 index 000000000..3af1cc0c1 --- /dev/null +++ b/client/src/main/java/io/split/client/dtos/BetweenStringMatcherData.java @@ -0,0 +1,11 @@ +package io.split.client.dtos; + +/** + * Metadata to support the between matcher. + * + * @author adil + */ +public class BetweenStringMatcherData { + public String start; + public String end; +} diff --git a/client/src/main/java/io/split/client/dtos/Matcher.java b/client/src/main/java/io/split/client/dtos/Matcher.java index 12c824d2c..fc2c65155 100644 --- a/client/src/main/java/io/split/client/dtos/Matcher.java +++ b/client/src/main/java/io/split/client/dtos/Matcher.java @@ -13,6 +13,7 @@ public class Matcher { public WhitelistMatcherData whitelistMatcherData; public UnaryNumericMatcherData unaryNumericMatcherData; public BetweenMatcherData betweenMatcherData; + public BetweenStringMatcherData betweenStringMatcherData; public DependencyMatcherData dependencyMatcherData; public Boolean booleanMatcherData; public String stringMatcherData; diff --git a/client/src/main/java/io/split/client/dtos/MatcherType.java b/client/src/main/java/io/split/client/dtos/MatcherType.java index 81a157566..b8c78a7bd 100644 --- a/client/src/main/java/io/split/client/dtos/MatcherType.java +++ b/client/src/main/java/io/split/client/dtos/MatcherType.java @@ -36,5 +36,6 @@ public enum MatcherType { EQUAL_TO_SEMVER, GREATER_THAN_OR_EQUAL_TO_SEMVER, LESS_THAN_OR_EQUAL_TO_SEMVER, - IN_LIST_SEMVER + IN_LIST_SEMVER, + BETWEEN_SEMVER } diff --git a/client/src/main/java/io/split/engine/experiments/SplitParser.java b/client/src/main/java/io/split/engine/experiments/SplitParser.java index 477d9db8f..b320dff66 100644 --- a/client/src/main/java/io/split/engine/experiments/SplitParser.java +++ b/client/src/main/java/io/split/engine/experiments/SplitParser.java @@ -32,6 +32,7 @@ import io.split.engine.matchers.GreaterThanOrEqualToSemverMatcher; import io.split.engine.matchers.LessThanOrEqualToSemverMatcher; import io.split.engine.matchers.InListSemverMatcher; +import io.split.engine.matchers.BetweenSemverMatcher; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -214,6 +215,10 @@ private AttributeMatcher toMatcher(Matcher matcher) { checkNotNull(matcher.whitelistMatcherData, "whitelistMatcherData is required for IN_LIST_SEMVER matcher type"); delegate = new InListSemverMatcher(matcher.whitelistMatcherData.whitelist); break; + case BETWEEN_SEMVER: + checkNotNull(matcher.betweenStringMatcherData, "betweenStringMatcherData is required for BETWEEN_SEMVER matcher type"); + delegate = new BetweenSemverMatcher(matcher.betweenStringMatcherData.start, matcher.betweenStringMatcherData.end); + break; default: throw new IllegalArgumentException("Unknown matcher type: " + matcher.matcherType); } diff --git a/client/src/main/java/io/split/engine/matchers/BetweenSemverMatcher.java b/client/src/main/java/io/split/engine/matchers/BetweenSemverMatcher.java new file mode 100644 index 000000000..cf51cbcb6 --- /dev/null +++ b/client/src/main/java/io/split/engine/matchers/BetweenSemverMatcher.java @@ -0,0 +1,58 @@ +package io.split.engine.matchers; + +import io.split.engine.evaluator.EvaluationContext; + +import java.util.Map; + +public class BetweenSemverMatcher implements Matcher { + + private final Semver _semverStart; + private final Semver _semverEnd; + + public BetweenSemverMatcher(String semverStart, String semverEnd) { + _semverStart = Semver.build(semverStart); + _semverEnd = Semver.build(semverEnd); + } + + @Override + public boolean match(Object matchValue, String bucketingKey, Map attributes, EvaluationContext evaluationContext) { + if (matchValue == null) { + return false; + } + Semver matchSemver = Semver.build(matchValue.toString()); + if (matchSemver == null || _semverStart == null || _semverStart == null) { + return false; + } + + return matchSemver.Compare(_semverStart) >= 0 && matchSemver.Compare(_semverEnd) <= 0; + } + + @Override + public String toString() { + StringBuilder bldr = new StringBuilder(); + bldr.append("between semver "); + bldr.append(_semverStart.Version()); + bldr.append(" and "); + bldr.append(_semverEnd.Version()); + return bldr.toString(); + } + + @Override + public int hashCode() { + int result = 17; + result = 31 * result + _semverStart.hashCode() + _semverEnd.hashCode(); + return result; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) return false; + if (this == obj) return true; + if (!(obj instanceof BetweenSemverMatcher)) return false; + + BetweenSemverMatcher other = (BetweenSemverMatcher) obj; + + return _semverStart == other._semverStart && _semverEnd == other._semverEnd; + } + +} diff --git a/client/src/test/java/io/split/engine/matchers/BetweenSemverMatcherTest.java b/client/src/test/java/io/split/engine/matchers/BetweenSemverMatcherTest.java new file mode 100644 index 000000000..87f6bf57c --- /dev/null +++ b/client/src/test/java/io/split/engine/matchers/BetweenSemverMatcherTest.java @@ -0,0 +1,22 @@ +package io.split.engine.matchers; + +import org.junit.Test; + +import static org.junit.Assert.assertTrue; + +/** + * Tests for EqualToSemverMatcher + */ + +public class BetweenSemverMatcherTest { + + @Test + public void works() { + BetweenSemverMatcher betweenSemverMatcher = new BetweenSemverMatcher("2.1.8", "3.0.0"); + + assertTrue( betweenSemverMatcher.match("2.1.8", null, null, null) == true); + assertTrue( betweenSemverMatcher.match("2.1.9", null, null, null) == true); + assertTrue( betweenSemverMatcher.match("2.1.8-rc", null, null, null) == false); + assertTrue( betweenSemverMatcher.match("3.0.0+build", null, null, null) == true); + } +} From 110c038f1f062387d6ea81c7609e031dbf43fa3a Mon Sep 17 00:00:00 2001 From: Bilal Al Date: Mon, 29 Apr 2024 11:07:39 -0700 Subject: [PATCH 2/4] polish --- .../java/io/split/engine/matchers/BetweenSemverMatcher.java | 2 +- .../java/io/split/engine/matchers/BetweenSemverMatcherTest.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/client/src/main/java/io/split/engine/matchers/BetweenSemverMatcher.java b/client/src/main/java/io/split/engine/matchers/BetweenSemverMatcher.java index cf51cbcb6..5d79a2c5a 100644 --- a/client/src/main/java/io/split/engine/matchers/BetweenSemverMatcher.java +++ b/client/src/main/java/io/split/engine/matchers/BetweenSemverMatcher.java @@ -20,7 +20,7 @@ public boolean match(Object matchValue, String bucketingKey, Map return false; } Semver matchSemver = Semver.build(matchValue.toString()); - if (matchSemver == null || _semverStart == null || _semverStart == null) { + if (matchSemver == null || _semverStart == null || _semverEnd == null) { return false; } diff --git a/client/src/test/java/io/split/engine/matchers/BetweenSemverMatcherTest.java b/client/src/test/java/io/split/engine/matchers/BetweenSemverMatcherTest.java index 87f6bf57c..8c0ce665d 100644 --- a/client/src/test/java/io/split/engine/matchers/BetweenSemverMatcherTest.java +++ b/client/src/test/java/io/split/engine/matchers/BetweenSemverMatcherTest.java @@ -18,5 +18,7 @@ public void works() { assertTrue( betweenSemverMatcher.match("2.1.9", null, null, null) == true); assertTrue( betweenSemverMatcher.match("2.1.8-rc", null, null, null) == false); assertTrue( betweenSemverMatcher.match("3.0.0+build", null, null, null) == true); + assertTrue( betweenSemverMatcher.match("4.5.8", null, null, null) == false); + assertTrue( betweenSemverMatcher.match("1.0.4", null, null, null) == false); } } From 5d0cf8a8f667b43ad61ba6e6336e84d0ce92ec42 Mon Sep 17 00:00:00 2001 From: Bilal Al Date: Mon, 29 Apr 2024 13:51:03 -0700 Subject: [PATCH 3/4] updated unsupported matcher label --- client/src/main/java/io/split/engine/evaluator/Labels.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/main/java/io/split/engine/evaluator/Labels.java b/client/src/main/java/io/split/engine/evaluator/Labels.java index 59cfceefb..ac5a465a9 100644 --- a/client/src/main/java/io/split/engine/evaluator/Labels.java +++ b/client/src/main/java/io/split/engine/evaluator/Labels.java @@ -6,5 +6,5 @@ public class Labels { public static final String KILLED = "killed"; public static final String DEFINITION_NOT_FOUND = "definition not found"; public static final String EXCEPTION = "exception"; - public static final String UNSUPPORTED_MATCHER = "unsupported matcher type"; + public static final String UNSUPPORTED_MATCHER = "targeting rule type unsupported by sdk"; } \ No newline at end of file From 780ceeeb673facbfe6f57626be7c56551c685e71 Mon Sep 17 00:00:00 2001 From: Bilal Al Date: Thu, 2 May 2024 16:07:34 -0700 Subject: [PATCH 4/4] polish --- .../split/engine/matchers/BetweenSemverMatcher.java | 4 ++-- .../engine/matchers/BetweenSemverMatcherTest.java | 13 +++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/client/src/main/java/io/split/engine/matchers/BetweenSemverMatcher.java b/client/src/main/java/io/split/engine/matchers/BetweenSemverMatcher.java index 5d79a2c5a..a36d9c6d8 100644 --- a/client/src/main/java/io/split/engine/matchers/BetweenSemverMatcher.java +++ b/client/src/main/java/io/split/engine/matchers/BetweenSemverMatcher.java @@ -16,11 +16,11 @@ public BetweenSemverMatcher(String semverStart, String semverEnd) { @Override public boolean match(Object matchValue, String bucketingKey, Map attributes, EvaluationContext evaluationContext) { - if (matchValue == null) { + if (matchValue == null || _semverStart == null || _semverEnd == null) { return false; } Semver matchSemver = Semver.build(matchValue.toString()); - if (matchSemver == null || _semverStart == null || _semverEnd == null) { + if (matchSemver == null) { return false; } diff --git a/client/src/test/java/io/split/engine/matchers/BetweenSemverMatcherTest.java b/client/src/test/java/io/split/engine/matchers/BetweenSemverMatcherTest.java index 8c0ce665d..cb979b8ed 100644 --- a/client/src/test/java/io/split/engine/matchers/BetweenSemverMatcherTest.java +++ b/client/src/test/java/io/split/engine/matchers/BetweenSemverMatcherTest.java @@ -3,6 +3,7 @@ import org.junit.Test; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertFalse; /** * Tests for EqualToSemverMatcher @@ -14,11 +15,11 @@ public class BetweenSemverMatcherTest { public void works() { BetweenSemverMatcher betweenSemverMatcher = new BetweenSemverMatcher("2.1.8", "3.0.0"); - assertTrue( betweenSemverMatcher.match("2.1.8", null, null, null) == true); - assertTrue( betweenSemverMatcher.match("2.1.9", null, null, null) == true); - assertTrue( betweenSemverMatcher.match("2.1.8-rc", null, null, null) == false); - assertTrue( betweenSemverMatcher.match("3.0.0+build", null, null, null) == true); - assertTrue( betweenSemverMatcher.match("4.5.8", null, null, null) == false); - assertTrue( betweenSemverMatcher.match("1.0.4", null, null, null) == false); + assertTrue( betweenSemverMatcher.match("2.1.8", null, null, null)); + assertTrue( betweenSemverMatcher.match("2.1.9", null, null, null)); + assertFalse( betweenSemverMatcher.match("2.1.8-rc", null, null, null)); + assertTrue( betweenSemverMatcher.match("3.0.0+build", null, null, null)); + assertFalse( betweenSemverMatcher.match("4.5.8", null, null, null)); + assertFalse( betweenSemverMatcher.match("1.0.4", null, null, null)); } }