@@ -245,6 +245,13 @@ class DatafileProjectConfig implements ProjectConfigInterface
245245 */
246246 private $ _sendFlagDecisions ;
247247
248+ /**
249+ * Map indicating variations of flag decisions
250+ *
251+ * @return map
252+ */
253+ private $ _flagVariationsMap ;
254+
248255 /**
249256 * DatafileProjectConfig constructor to load and set project configuration data.
250257 *
@@ -376,7 +383,30 @@ public function __construct($datafile, $logger, $errorHandler)
376383 }
377384 }
378385 }
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+ }
379407
408+ $ this ->_flagVariationsMap [$ flag ->getKey ()] = $ flagVariations ;
409+ }
380410 // Add variations for rollout experiments to variationIdMap and variationKeyMap
381411 $ this ->_variationIdMap = $ this ->_variationIdMap + $ rolloutVariationIdMap ;
382412 $ this ->_variationKeyMap = $ this ->_variationKeyMap + $ rolloutVariationKeyMap ;
@@ -404,6 +434,18 @@ public function __construct($datafile, $logger, $errorHandler)
404434 }
405435 }
406436
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+ }
407449 /**
408450 * Create ProjectConfig based on datafile string.
409451 *
@@ -614,6 +656,26 @@ public function getExperimentFromId($experimentId)
614656 return new Experiment ();
615657 }
616658
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+
617679 /**
618680 * @param String $featureKey Key of the feature flag
619681 *
@@ -868,6 +930,16 @@ public function isFeatureExperiment($experimentId)
868930 return array_key_exists ($ experimentId , $ this ->_experimentFeatureMap );
869931 }
870932
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+
871943 /**
872944 * Returns if flag decisions should be sent to server or not
873945 *
0 commit comments