@@ -245,6 +245,13 @@ class DatafileProjectConfig implements ProjectConfigInterface
245
245
*/
246
246
private $ _sendFlagDecisions ;
247
247
248
+ /**
249
+ * Map indicating variations of flag decisions
250
+ *
251
+ * @return map
252
+ */
253
+ private $ _flagVariationsMap ;
254
+
248
255
/**
249
256
* DatafileProjectConfig constructor to load and set project configuration data.
250
257
*
@@ -376,7 +383,30 @@ public function __construct($datafile, $logger, $errorHandler)
376
383
}
377
384
}
378
385
}
386
+ $ this ->_flagVariationsMap = array ();
387
+ foreach ($ this ->_featureFlags as $ flag ) {
388
+ $ flagVariations = array ();
389
+ $ flagRules = $ this ->getAllRulesForFlag ($ flag );
390
+
391
+ foreach ($ flagRules as $ rule ) {
392
+ $ filtered_variations = [];
393
+ foreach (array_values ($ rule ->getVariations ()) as $ variation ) {
394
+ $ exist = false ;
395
+ foreach ($ flagVariations as $ flagVariation ) {
396
+ if ($ flagVariation ->getId () == $ variation ->getId ()) {
397
+ $ exist = true ;
398
+ break ;
399
+ }
400
+ }
401
+ if (!$ exist ) {
402
+ array_push ($ filtered_variations , $ variation );
403
+ }
404
+ }
405
+ $ flagVariations = array_merge ($ flagVariations , $ filtered_variations );
406
+ }
379
407
408
+ $ this ->_flagVariationsMap [$ flag ->getKey ()] = $ flagVariations ;
409
+ }
380
410
// Add variations for rollout experiments to variationIdMap and variationKeyMap
381
411
$ this ->_variationIdMap = $ this ->_variationIdMap + $ rolloutVariationIdMap ;
382
412
$ this ->_variationKeyMap = $ this ->_variationKeyMap + $ rolloutVariationKeyMap ;
@@ -404,6 +434,18 @@ public function __construct($datafile, $logger, $errorHandler)
404
434
}
405
435
}
406
436
437
+ private function getAllRulesForFlag (FeatureFlag $ flag )
438
+ {
439
+ $ rules = array ();
440
+ foreach ($ flag ->getExperimentIds () as $ experimentId ) {
441
+ array_push ($ rules , $ this ->_experimentIdMap [$ experimentId ]);
442
+ }
443
+ if ($ this ->_rolloutIdMap && key_exists ($ flag ->getRolloutId (), $ this ->_rolloutIdMap )) {
444
+ $ rollout = $ this ->_rolloutIdMap [$ flag ->getRolloutId ()];
445
+ $ rules = array_merge ($ rules , $ rollout ->getExperiments ());
446
+ }
447
+ return $ rules ;
448
+ }
407
449
/**
408
450
* Create ProjectConfig based on datafile string.
409
451
*
@@ -614,6 +656,26 @@ public function getExperimentFromId($experimentId)
614
656
return new Experiment ();
615
657
}
616
658
659
+ /**
660
+ * Gets the variation associated with experiment or rollout in instance of given feature flag key
661
+ *
662
+ * @param string Feature flag key
663
+ * @param string variation key
664
+ *
665
+ * @return Variation / null
666
+ */
667
+ public function getFlagVariationByKey ($ flagKey , $ variationKey )
668
+ {
669
+ if (array_key_exists ($ flagKey , $ this ->_flagVariationsMap )) {
670
+ foreach ($ this ->_flagVariationsMap [$ flagKey ] as $ variation ) {
671
+ if ($ variation ->getKey () == $ variationKey ) {
672
+ return $ variation ;
673
+ }
674
+ }
675
+ }
676
+ return null ;
677
+ }
678
+
617
679
/**
618
680
* @param String $featureKey Key of the feature flag
619
681
*
@@ -868,6 +930,16 @@ public function isFeatureExperiment($experimentId)
868
930
return array_key_exists ($ experimentId , $ this ->_experimentFeatureMap );
869
931
}
870
932
933
+ /**
934
+ * Returns map array of Flag key as key and Variations as value
935
+ *
936
+ * @return array
937
+ */
938
+ public function getFlagVariationsMap ()
939
+ {
940
+ return $ this ->_flagVariationsMap ;
941
+ }
942
+
871
943
/**
872
944
* Returns if flag decisions should be sent to server or not
873
945
*
0 commit comments