From 4eb679f1b6b76508121509b044863ab9fb108fce Mon Sep 17 00:00:00 2001 From: jianggang Date: Thu, 25 Aug 2022 11:42:25 +0800 Subject: [PATCH 1/5] feat: add stable rollout function to FPUser --- .../sdk/example/FeatureProbeDemo.java | 5 ++-- .../com/featureprobe/sdk/server/FPUser.java | 23 +++++++++++++++++++ .../featureprobe/sdk/server/model/Split.java | 2 +- .../sdk/server/AccessRecorderSpec.groovy | 2 +- .../sdk/server/ConditionSpec.groovy | 2 +- .../sdk/server/FeatureProbeSpec.groovy | 2 +- .../featureprobe/sdk/server/SplitSpec.groovy | 2 +- 7 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/featureprobe/sdk/example/FeatureProbeDemo.java b/src/main/java/com/featureprobe/sdk/example/FeatureProbeDemo.java index 1e43a2c..61ceeda 100644 --- a/src/main/java/com/featureprobe/sdk/example/FeatureProbeDemo.java +++ b/src/main/java/com/featureprobe/sdk/example/FeatureProbeDemo.java @@ -32,8 +32,9 @@ public static void main(String[] args) throws MalformedURLException, Interrupted final FeatureProbe fpClient = new FeatureProbe(FEATURE_PROBE_SERVER_SDK_KEY, config); // Create one user. - FPUser user = new FPUser("00001") // key is for percentage rollout, normally use userId as key - .with("userId", "00001"); // "userId" is used in rules, should be filled in. + FPUser user = new FPUser() + .stableRollout("00001") // key is for percentage rollout, normally use userId as key + .with("userId", "00001"); // "userId" is used in rules, should be filled in. // Get toggle result for this user. final String YOUR_TOGGLE_KEY = "campaign_allow_list"; diff --git a/src/main/java/com/featureprobe/sdk/server/FPUser.java b/src/main/java/com/featureprobe/sdk/server/FPUser.java index 18c77a2..2ac8a5a 100644 --- a/src/main/java/com/featureprobe/sdk/server/FPUser.java +++ b/src/main/java/com/featureprobe/sdk/server/FPUser.java @@ -1,5 +1,8 @@ package com.featureprobe.sdk.server; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; + import java.util.HashMap; import java.util.Map; @@ -9,18 +12,38 @@ */ public class FPUser { + private static final Logger logger = Loggers.MAIN; + private String key; private Map attrs = new HashMap<>(); + /** + * Creates a new FPUser + */ + public FPUser() {} + /** * Creates a new FPUser * @param key user unique id for percentage rollout */ + @Deprecated public FPUser(String key) { this.key = key; } + /** + * Set user unique id for percentage rollout + * @param key user unique id for percentage rollout + */ + public FPUser stableRollout(String key) { + if (StringUtils.isBlank(key)) { + logger.warn("User unique id for percentage rollout is blank, FeatureProbe will Randomly generated。"); + } + this.key = key; + return this; + } + /** * Add an attribute to the user * @param name attribute name diff --git a/src/main/java/com/featureprobe/sdk/server/model/Split.java b/src/main/java/com/featureprobe/sdk/server/model/Split.java index ec22028..8cc5d81 100644 --- a/src/main/java/com/featureprobe/sdk/server/model/Split.java +++ b/src/main/java/com/featureprobe/sdk/server/model/Split.java @@ -35,7 +35,7 @@ public Split(List>> distribution) { } public HitResult findIndex(FPUser user, String toggleKey) { - String hashKey = user.getKey(); + String hashKey = StringUtils.isNotBlank(user.getKey()) ? user.getKey() : String.valueOf(System.nanoTime()); if (StringUtils.isNotBlank(bucketBy)) { if (user.containAttr(bucketBy)) { hashKey = user.getAttr(bucketBy); diff --git a/src/test/groovy/com/featureprobe/sdk/server/AccessRecorderSpec.groovy b/src/test/groovy/com/featureprobe/sdk/server/AccessRecorderSpec.groovy index 253666d..e99c235 100644 --- a/src/test/groovy/com/featureprobe/sdk/server/AccessRecorderSpec.groovy +++ b/src/test/groovy/com/featureprobe/sdk/server/AccessRecorderSpec.groovy @@ -9,7 +9,7 @@ class AccessRecorderSpec extends Specification { def setup() { accessRecorder = new AccessRecorder() - FPUser user = new FPUser("test_user") + FPUser user = new FPUser().stableRollout("test_user") event = new AccessEvent(System.currentTimeMillis(), user, "test_toggle", "true", 1, 0) } diff --git a/src/test/groovy/com/featureprobe/sdk/server/ConditionSpec.groovy b/src/test/groovy/com/featureprobe/sdk/server/ConditionSpec.groovy index 8bb38f8..bbedcb5 100644 --- a/src/test/groovy/com/featureprobe/sdk/server/ConditionSpec.groovy +++ b/src/test/groovy/com/featureprobe/sdk/server/ConditionSpec.groovy @@ -16,7 +16,7 @@ class ConditionSpec extends Specification { condition = new Condition() condition.setType(ConditionType.STRING) condition.setSubject("userId") - user = new FPUser("test_user") + user = new FPUser().stableRollout("test_user") segments = ["test_project\$test_segment": new Segment(uniqueId: "test_project\$test_segment", version: 1, rules: [new SegmentRule(conditions: [new Condition(type: ConditionType.STRING, subject: "userId", predicate: PredicateType.IS_ONE_OF, objects: ["1", "2"])])])] diff --git a/src/test/groovy/com/featureprobe/sdk/server/FeatureProbeSpec.groovy b/src/test/groovy/com/featureprobe/sdk/server/FeatureProbeSpec.groovy index 649d948..65ec0f9 100644 --- a/src/test/groovy/com/featureprobe/sdk/server/FeatureProbeSpec.groovy +++ b/src/test/groovy/com/featureprobe/sdk/server/FeatureProbeSpec.groovy @@ -63,7 +63,7 @@ class FeatureProbeSpec extends Specification { def caseName = testCase.get("name").asText() println("starting execute scenario : " + name + ",case : " + caseName) def userCase = testCase.get("user") - FPUser user = new FPUser(userCase.get("key").asText()) + FPUser user = new FPUser().stableRollout(userCase.get("key").asText()) def customValues = userCase.get("customValues").asList() for (int x = 0; x < customValues.size(); x++) { def customValue = customValues.get(x) diff --git a/src/test/groovy/com/featureprobe/sdk/server/SplitSpec.groovy b/src/test/groovy/com/featureprobe/sdk/server/SplitSpec.groovy index 20f4878..9b49e4b 100644 --- a/src/test/groovy/com/featureprobe/sdk/server/SplitSpec.groovy +++ b/src/test/groovy/com/featureprobe/sdk/server/SplitSpec.groovy @@ -10,7 +10,7 @@ class SplitSpec extends Specification { def setup() { split = new Split([[[0, 5000]], [[5000, 10000]]]) - user = new FPUser("test_user_key") + user = new FPUser().stableRollout("test_user_key") } def "Get user group"() { From 0490e743c69220dc7a41729d136e040a47960070 Mon Sep 17 00:00:00 2001 From: jianggang Date: Thu, 25 Aug 2022 12:03:16 +0800 Subject: [PATCH 2/5] feat: add stable rollout function for FPUser --- src/main/java/com/featureprobe/sdk/server/FPUser.java | 3 --- src/main/java/com/featureprobe/sdk/server/model/Split.java | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/com/featureprobe/sdk/server/FPUser.java b/src/main/java/com/featureprobe/sdk/server/FPUser.java index 2ac8a5a..6050db3 100644 --- a/src/main/java/com/featureprobe/sdk/server/FPUser.java +++ b/src/main/java/com/featureprobe/sdk/server/FPUser.java @@ -37,9 +37,6 @@ public FPUser(String key) { * @param key user unique id for percentage rollout */ public FPUser stableRollout(String key) { - if (StringUtils.isBlank(key)) { - logger.warn("User unique id for percentage rollout is blank, FeatureProbe will Randomly generated。"); - } this.key = key; return this; } diff --git a/src/main/java/com/featureprobe/sdk/server/model/Split.java b/src/main/java/com/featureprobe/sdk/server/model/Split.java index 8cc5d81..1ece40b 100644 --- a/src/main/java/com/featureprobe/sdk/server/model/Split.java +++ b/src/main/java/com/featureprobe/sdk/server/model/Split.java @@ -35,7 +35,7 @@ public Split(List>> distribution) { } public HitResult findIndex(FPUser user, String toggleKey) { - String hashKey = StringUtils.isNotBlank(user.getKey()) ? user.getKey() : String.valueOf(System.nanoTime()); + String hashKey = StringUtils.isNoneEmpty(user.getKey()) ? user.getKey() : String.valueOf(System.nanoTime()); if (StringUtils.isNotBlank(bucketBy)) { if (user.containAttr(bucketBy)) { hashKey = user.getAttr(bucketBy); From 7f11e8883376ab856f73eec53a1ec52c44d5a9a5 Mon Sep 17 00:00:00 2001 From: jianggang Date: Thu, 25 Aug 2022 12:10:09 +0800 Subject: [PATCH 3/5] feat: add stable rollout function for FPUser --- src/main/java/com/featureprobe/sdk/server/model/Split.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/featureprobe/sdk/server/model/Split.java b/src/main/java/com/featureprobe/sdk/server/model/Split.java index 1ece40b..163fbcb 100644 --- a/src/main/java/com/featureprobe/sdk/server/model/Split.java +++ b/src/main/java/com/featureprobe/sdk/server/model/Split.java @@ -35,7 +35,7 @@ public Split(List>> distribution) { } public HitResult findIndex(FPUser user, String toggleKey) { - String hashKey = StringUtils.isNoneEmpty(user.getKey()) ? user.getKey() : String.valueOf(System.nanoTime()); + String hashKey = user.getKey() != null ? user.getKey() : String.valueOf(System.nanoTime()); if (StringUtils.isNotBlank(bucketBy)) { if (user.containAttr(bucketBy)) { hashKey = user.getAttr(bucketBy); From 397c3745bf2cfcdbb3f5d80c05205cf0b862dde5 Mon Sep 17 00:00:00 2001 From: jianggang Date: Thu, 25 Aug 2022 12:19:34 +0800 Subject: [PATCH 4/5] feat: add stable rollout function for FPUser --- src/main/java/com/featureprobe/sdk/server/FPUser.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/com/featureprobe/sdk/server/FPUser.java b/src/main/java/com/featureprobe/sdk/server/FPUser.java index 6050db3..a21fdf3 100644 --- a/src/main/java/com/featureprobe/sdk/server/FPUser.java +++ b/src/main/java/com/featureprobe/sdk/server/FPUser.java @@ -1,8 +1,5 @@ package com.featureprobe.sdk.server; - -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; - import java.util.HashMap; import java.util.Map; @@ -12,8 +9,6 @@ */ public class FPUser { - private static final Logger logger = Loggers.MAIN; - private String key; private Map attrs = new HashMap<>(); From 6ce59b582d277f55bdca9df1f187b8c554c489b4 Mon Sep 17 00:00:00 2001 From: jianggang Date: Thu, 25 Aug 2022 12:24:06 +0800 Subject: [PATCH 5/5] feat: add stable rollout function for FPUser --- src/main/java/com/featureprobe/sdk/server/FPUser.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/featureprobe/sdk/server/FPUser.java b/src/main/java/com/featureprobe/sdk/server/FPUser.java index a21fdf3..8990c48 100644 --- a/src/main/java/com/featureprobe/sdk/server/FPUser.java +++ b/src/main/java/com/featureprobe/sdk/server/FPUser.java @@ -1,5 +1,4 @@ package com.featureprobe.sdk.server; -import org.slf4j.Logger; import java.util.HashMap; import java.util.Map;