Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 4 additions & 36 deletions src/main/java/co/featbit/server/DataModel.java
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,6 @@ static class FeatureFlag implements DataStorageTypes.Item, JsonHelper.AfterJsonP
final Date updatedAt;
private Long timestamp;
private final boolean isArchived;
private final boolean exptIncludeAllTargets;
// Missing values from older servers keep evaluation event collection enabled.
private Boolean insightsEnabled;
private final boolean isEnabled;
Expand All @@ -276,11 +275,10 @@ static class FeatureFlag implements DataStorageTypes.Item, JsonHelper.AfterJsonP
private final String disabledVariationId;
private transient Map<String, Variation> variationMap;

FeatureFlag(String id, Date updatedAt, boolean isArchived, boolean exptIncludeAllTargets, boolean isEnabled, String name, String key, String variationType, List<Variation> variations, List<TargetUser> targetUsers, List<TargetRule> rules, Fallthrough fallthrough, String disabledVariationId) {
FeatureFlag(String id, Date updatedAt, boolean isArchived, boolean isEnabled, String name, String key, String variationType, List<Variation> variations, List<TargetUser> targetUsers, List<TargetRule> rules, Fallthrough fallthrough, String disabledVariationId) {
this.id = id;
this.updatedAt = updatedAt;
this.isArchived = isArchived;
this.exptIncludeAllTargets = exptIncludeAllTargets;
this.isEnabled = isEnabled;
this.name = name;
this.key = key;
Expand Down Expand Up @@ -316,10 +314,6 @@ public Integer getType() {
return FB_FEATURE_FLAG;
}

public boolean exptIncludeAllTargets() {
return exptIncludeAllTargets;
}

public boolean isInsightsEnabled() {
return !Boolean.FALSE.equals(insightsEnabled);
}
Expand Down Expand Up @@ -444,25 +438,18 @@ public void afterDeserialization() {
}

static final class TargetRule {
private final boolean includedInExpt;

private final String dispatchKey;

private final List<Condition> conditions;

private final List<RolloutVariation> variations;

TargetRule(boolean includedInExpt, String dispatchKey, List<Condition> conditions, List<RolloutVariation> variations) {
this.includedInExpt = includedInExpt;
TargetRule(String dispatchKey, List<Condition> conditions, List<RolloutVariation> variations) {
this.dispatchKey = dispatchKey;
this.conditions = conditions;
this.variations = variations;
}

public boolean includedInExpt() {
return includedInExpt;
}

public List<Condition> getConditions() {
return conditions == null ? Collections.emptyList() : conditions;
}
Expand Down Expand Up @@ -539,12 +526,9 @@ static final class RolloutVariation {

private final double[] rollout;

private final double exptRollout;

RolloutVariation(String id, double[] rollout, double exptRollout) {
RolloutVariation(String id, double[] rollout) {
this.id = id;
this.rollout = rollout;
this.exptRollout = exptRollout;
}

public String getId() {
Expand All @@ -554,34 +538,18 @@ public String getId() {
public double[] getRollout() {
return rollout;
}

public double getExptRollout() {
return exptRollout;
}

public double splittingPercentage() {
if (rollout != null) return rollout[1] - rollout[0];
return 0D;
}
}

static final class Fallthrough {
private final boolean includedInExpt;

private final String dispatchKey;

private final List<RolloutVariation> variations;

Fallthrough(boolean includedInExpt, String dispatchKey, List<RolloutVariation> variations) {
this.includedInExpt = includedInExpt;
Fallthrough(String dispatchKey, List<RolloutVariation> variations) {
this.dispatchKey = dispatchKey;
this.variations = variations;
}

public boolean includedInExpt() {
return includedInExpt;
}

public List<RolloutVariation> getVariations() {
return variations == null ? Collections.emptyList() : variations;
}
Expand Down
15 changes: 3 additions & 12 deletions src/main/java/co/featbit/server/Evaluator.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ abstract class Evaluator implements EvaluationReason {

protected static final Logger logger = Loggers.EVALUATION;

protected static final String EXPT_KEY_PREFIX = "expt";
protected static final String NO_EVAL_RES = "NE";
protected static final String DEFAULT_JSON_VALUE = "DJV";
protected static final String FLAG_KEY_UNKNOWN = "flag key unknown";
Expand Down Expand Up @@ -69,40 +68,36 @@ static class EvalResult {
private final String index;
private final String value;
private final String reason;
private final boolean sendToExperiment;
private final String keyName;
private final String name;


EvalResult(String flagType, String value, String index, String reason, boolean sendToExperiment, String keyName, String name) {
EvalResult(String flagType, String value, String index, String reason, String keyName, String name) {
this.flagType = flagType;
this.value = value;
this.index = index;
this.reason = reason;
this.sendToExperiment = sendToExperiment;
this.keyName = keyName;
this.name = name;
}

public static EvalResult error(String reason, String keyName, String name) {
return new EvalResult(null, null, NO_EVAL_RES, reason, false, keyName, name);
return new EvalResult(null, null, NO_EVAL_RES, reason, keyName, name);
}

public static EvalResult error(String defaultValue, String reason, String keyName, String name) {
return new EvalResult(null, defaultValue, NO_EVAL_RES, reason, false, keyName, name);
return new EvalResult(null, defaultValue, NO_EVAL_RES, reason, keyName, name);
}

public static EvalResult of(String flagType,
DataModel.Variation option,
String reason,
boolean sendToExperiment,
String keyName,
String name) {
return new EvalResult(flagType,
option.getValue(),
option.getId(),
reason,
sendToExperiment,
keyName,
name);
}
Expand All @@ -123,10 +118,6 @@ public String getReason() {
return reason;
}

public boolean isSendToExperiment() {
return sendToExperiment;
}

public String getKeyName() {
return keyName;
}
Expand Down
31 changes: 0 additions & 31 deletions src/main/java/co/featbit/server/EvaluatorImp.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ private EvalResult matchFeatureFlagDisabledUserVariation(DataModel.FeatureFlag f
return EvalResult.of(flag.getVariationType(),
flag.getVariation(flag.getDisabledVariationId()),
REASON_FLAG_OFF,
false,
flag.getKey(), flag.getName());
}
return null;
Expand All @@ -76,7 +75,6 @@ private EvalResult matchTargetedUserVariation(DataModel.FeatureFlag featureFlag,
.map(target -> EvalResult.of(featureFlag.getVariationType(),
featureFlag.getVariation(target.getVariationId()),
REASON_TARGET_MATCH,
featureFlag.exptIncludeAllTargets(),
featureFlag.getKey(),
featureFlag.getName()))
.orElse(null);
Expand All @@ -89,7 +87,6 @@ private EvalResult matchConditionedUserVariation(DataModel.FeatureFlag featureFl
targetRule.getVariations(),
user,
REASON_RULE_MATCH,
targetRule.includedInExpt(),
targetRule.getDispatchKey());
}

Expand Down Expand Up @@ -244,15 +241,13 @@ private EvalResult matchFallThroughUserVariation(DataModel.FeatureFlag featureFl
fallthrough.getVariations(),
user,
REASON_FALLTHROUGH,
fallthrough.includedInExpt(),
fallthrough.getDispatchKey());
}

private EvalResult getRollOutVariationOption(DataModel.FeatureFlag featureFlag,
Collection<DataModel.RolloutVariation> rollouts,
FBUser user,
String reason,
Boolean ruleIncludedInExperiment,
String dispatchKey) {
dispatchKey = StringUtils.isEmpty(dispatchKey) ? "keyid" : dispatchKey;
String userAttr = user.getProperty(dispatchKey);
Expand All @@ -264,34 +259,8 @@ private EvalResult getRollOutVariationOption(DataModel.FeatureFlag featureFlag,
.map(rollout -> EvalResult.of(featureFlag.getVariationType(),
featureFlag.getVariation(rollout.getId()),
reason,
isSendToExperiment(dispatchKeyValue, rollout, featureFlag.exptIncludeAllTargets(), ruleIncludedInExperiment),
featureFlag.getKey(),
featureFlag.getName()))
.orElse(null);
}

private boolean isSendToExperiment(String dispatchKeyValue,
DataModel.RolloutVariation rollout,
Boolean exptIncludeAllRules,
Boolean ruleIncludedInExperiment) {
if (exptIncludeAllRules) {
return true;
}
if (ruleIncludedInExperiment) {
double sendToExperimentPercentage = rollout.getExptRollout();
double splittingPercentage = rollout.splittingPercentage();
if (sendToExperimentPercentage == 0D || splittingPercentage == 0D) {
return false;
}
double upperBound = sendToExperimentPercentage / splittingPercentage;
if (upperBound > 1D) {
upperBound = 1D;
}
String newDispatchKeyValue = String.join("", EXPT_KEY_PREFIX, dispatchKeyValue);
return VariationSplittingAlgorithm.ifKeyBelongsPercentage(newDispatchKeyValue, new double[]{0D, upperBound});
}
return false;
}


}
1 change: 0 additions & 1 deletion src/main/java/co/featbit/server/InsightTypes.java
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,6 @@ public JsonElement serialize(FlagEvent flagEvent, Type type, JsonSerializationCo
for (FlagEventVariation variation : flagEvent.userVariations) {
JsonObject var = new JsonObject();
var.addProperty("featureFlagKey", variation.getFeatureFlagKeyName());
var.addProperty("sendToExperiment", variation.getVariation().isSendToExperiment());
var.addProperty("timestamp", variation.getTimestamp());
Comment thread
deleteLater marked this conversation as resolved.
Resolved
JsonObject v = new JsonObject();
v.addProperty("id", variation.getVariation().getIndex());
Expand Down
Loading