|
20 | 20 | import java.util.HashMap; |
21 | 21 | import java.util.List; |
22 | 22 | import java.util.Map; |
| 23 | +import java.util.UUID; |
23 | 24 |
|
24 | 25 | /** |
25 | 26 | * EngineMappers |
@@ -305,6 +306,21 @@ private static String getFeatureStateKey(JsonNode featureState) { |
305 | 306 | // identify features uniquely, so if both fields are missing, |
306 | 307 | // we don't need to care about collisions. |
307 | 308 | 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'"); |
308 | 324 | } |
309 | 325 |
|
310 | 326 | private static Object getFeatureStateValue(JsonNode featureState, String fieldName) { |
@@ -345,14 +361,12 @@ private static FeatureContext mapFeatureStateToFeatureContext(JsonNode featureSt |
345 | 361 | JsonNode multivariateValues = featureState.get("multivariate_feature_state_values"); |
346 | 362 | if (multivariateValues != null && multivariateValues.isArray()) { |
347 | 363 | 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) { |
352 | 365 | FeatureValue variant = new FeatureValue() |
353 | 366 | .withValue(getFeatureStateValue( |
354 | 367 | multivariateValue.get("multivariate_feature_option"), "value")) |
355 | | - .withWeight(multivariateValue.get("percentage_allocation").asDouble()); |
| 368 | + .withWeight(multivariateValue.get("percentage_allocation").asDouble()) |
| 369 | + .withPriority(getMultivariateFeatureValuePriority(multivariateValue)); |
356 | 370 | variants.add(variant); |
357 | 371 | } |
358 | 372 | featureContext.withVariants(variants); |
|
0 commit comments