Skip to content

Commit b8ae5ab

Browse files
committed
support variant priority
1 parent de0362b commit b8ae5ab

File tree

2 files changed

+26
-6
lines changed

2 files changed

+26
-6
lines changed

src/main/java/com/flagsmith/flagengine/Engine.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,13 @@ private static FlagResult getFlagResultFromFeatureContext(
132132

133133
Float startPercentage = 0.0f;
134134

135-
for (FeatureValue variant : variants) {
135+
ArrayList<FeatureValue> sortedVariants = new ArrayList<>(variants);
136+
sortedVariants.sort((a, b) -> {
137+
Double priority = a.getPriority();
138+
Double comparedPriority = b.getPriority();
139+
return priority.compareTo(comparedPriority);
140+
});
141+
for (FeatureValue variant : sortedVariants) {
136142
Double weight = variant.getWeight();
137143
Float limit = startPercentage + weight.floatValue();
138144
if (startPercentage <= percentageValue && percentageValue < limit) {

src/main/java/com/flagsmith/mappers/EngineMappers.java

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.HashMap;
2121
import java.util.List;
2222
import java.util.Map;
23+
import java.util.UUID;
2324

2425
/**
2526
* EngineMappers
@@ -305,6 +306,21 @@ private static String getFeatureStateKey(JsonNode featureState) {
305306
// identify features uniquely, so if both fields are missing,
306307
// we don't need to care about collisions.
307308
return "";
309+
310+
private static double getMultivariateFeatureValuePriority(JsonNode multivariateValue) {
311+
JsonNode idNode = multivariateValue.get("id");
312+
if (idNode != null && !idNode.isNull()) {
313+
return idNode.asDouble();
314+
}
315+
// Fallback to mv_fs_value_uuid if id is not present
316+
JsonNode mvFsValueUuidNode = multivariateValue.get("mv_fs_value_uuid");
317+
if (mvFsValueUuidNode != null && !mvFsValueUuidNode.isNull()) {
318+
UUID mvFsValueUuid = UUID.fromString(mvFsValueUuidNode.asText());
319+
return mvFsValueUuid.getMostSignificantBits() & Long.MAX_VALUE;
320+
}
321+
322+
throw new IllegalArgumentException(
323+
"Multivariate feature value must have either 'id' or 'mv_fs_value_uuid'");
308324
}
309325

310326
private static Object getFeatureStateValue(JsonNode featureState, String fieldName) {
@@ -345,14 +361,12 @@ private static FeatureContext mapFeatureStateToFeatureContext(JsonNode featureSt
345361
JsonNode multivariateValues = featureState.get("multivariate_feature_state_values");
346362
if (multivariateValues != null && multivariateValues.isArray()) {
347363
List<FeatureValue> variants = new ArrayList<>();
348-
List<JsonNode> sortedMultivariate = new ArrayList<>();
349-
multivariateValues.forEach(sortedMultivariate::add);
350-
sortedMultivariate.sort((a, b) -> a.get("id").asText().compareTo(b.get("id").asText()));
351-
for (JsonNode multivariateValue : sortedMultivariate) {
364+
for (JsonNode multivariateValue : multivariateValues) {
352365
FeatureValue variant = new FeatureValue()
353366
.withValue(getFeatureStateValue(
354367
multivariateValue.get("multivariate_feature_option"), "value"))
355-
.withWeight(multivariateValue.get("percentage_allocation").asDouble());
368+
.withWeight(multivariateValue.get("percentage_allocation").asDouble())
369+
.withPriority(getMultivariateFeatureValuePriority(multivariateValue));
356370
variants.add(variant);
357371
}
358372
featureContext.withVariants(variants);

0 commit comments

Comments
 (0)