Skip to content

Commit

Permalink
feat(ForcedDecisions): add forced-decisions APIs to OptimizelyUserCon…
Browse files Browse the repository at this point in the history
…text (#233)

Add a set of new APIs for forced-decisions to OptimizelyUserContext:

setForcedDecision
getForcedDecision
removeForcedDecision
removeAllForcedDecision
  • Loading branch information
mnoman09 committed Nov 4, 2021
1 parent e46fde5 commit 0e7cefc
Show file tree
Hide file tree
Showing 12 changed files with 1,459 additions and 152 deletions.
72 changes: 72 additions & 0 deletions src/Optimizely/Config/DatafileProjectConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,13 @@ class DatafileProjectConfig implements ProjectConfigInterface
*/
private $_sendFlagDecisions;

/**
* Map indicating variations of flag decisions
*
* @return map
*/
private $_flagVariationsMap;

/**
* DatafileProjectConfig constructor to load and set project configuration data.
*
Expand Down Expand Up @@ -376,7 +383,30 @@ public function __construct($datafile, $logger, $errorHandler)
}
}
}
$this->_flagVariationsMap = array();
foreach ($this->_featureFlags as $flag) {
$flagVariations = array();
$flagRules = $this->getAllRulesForFlag($flag);

foreach ($flagRules as $rule) {
$filtered_variations = [];
foreach (array_values($rule->getVariations()) as $variation) {
$exist = false;
foreach ($flagVariations as $flagVariation) {
if ($flagVariation->getId() == $variation->getId()) {
$exist = true;
break;
}
}
if (!$exist) {
array_push($filtered_variations, $variation);
}
}
$flagVariations = array_merge($flagVariations, $filtered_variations);
}

$this->_flagVariationsMap[$flag->getKey()] = $flagVariations;
}
// Add variations for rollout experiments to variationIdMap and variationKeyMap
$this->_variationIdMap = $this->_variationIdMap + $rolloutVariationIdMap;
$this->_variationKeyMap = $this->_variationKeyMap + $rolloutVariationKeyMap;
Expand Down Expand Up @@ -404,6 +434,18 @@ public function __construct($datafile, $logger, $errorHandler)
}
}

private function getAllRulesForFlag(FeatureFlag $flag)
{
$rules = array();
foreach ($flag->getExperimentIds() as $experimentId) {
array_push($rules, $this->_experimentIdMap[$experimentId]);
}
if ($this->_rolloutIdMap && key_exists($flag->getRolloutId(), $this->_rolloutIdMap)) {
$rollout = $this->_rolloutIdMap[$flag->getRolloutId()];
$rules = array_merge($rules, $rollout->getExperiments());
}
return $rules;
}
/**
* Create ProjectConfig based on datafile string.
*
Expand Down Expand Up @@ -614,6 +656,26 @@ public function getExperimentFromId($experimentId)
return new Experiment();
}

/**
* Gets the variation associated with experiment or rollout in instance of given feature flag key
*
* @param string Feature flag key
* @param string variation key
*
* @return Variation / null
*/
public function getFlagVariationByKey($flagKey, $variationKey)
{
if (array_key_exists($flagKey, $this->_flagVariationsMap)) {
foreach ($this->_flagVariationsMap[$flagKey] as $variation) {
if ($variation->getKey() == $variationKey) {
return $variation;
}
}
}
return null;
}

/**
* @param String $featureKey Key of the feature flag
*
Expand Down Expand Up @@ -868,6 +930,16 @@ public function isFeatureExperiment($experimentId)
return array_key_exists($experimentId, $this->_experimentFeatureMap);
}

/**
* Returns map array of Flag key as key and Variations as value
*
* @return array
*/
public function getFlagVariationsMap()
{
return $this->_flagVariationsMap;
}

/**
* Returns if flag decisions should be sent to server or not
*
Expand Down
18 changes: 17 additions & 1 deletion src/Optimizely/Config/ProjectConfigInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,23 @@ public function getVariationFromKeyByExperimentId($experimentId, $variationKey);
* @return FeatureVariable / null
*/
public function getFeatureVariableFromKey($featureFlagKey, $variableKey);


/**
* Gets the variation associated with experiment or rollout in instance of given feature flag key
*
* @param string Feature flag key
* @param string variation key
*
* @return Variation / null
*/
public function getFlagVariationByKey($flagKey, $variationKey);

/**
* Returns map array of Flag key as key and Variations as value
*
* @return array
*/
public function getFlagVariationsMap();
/**
* Determines if given experiment is a feature test.
*
Expand Down
Loading

0 comments on commit 0e7cefc

Please sign in to comment.