@@ -125,6 +125,20 @@ private Dictionary<string, Dictionary<string, Variation>> _VariationKeyMap
125
125
= new Dictionary < string , Dictionary < string , Variation > > ( ) ;
126
126
public Dictionary < string , Dictionary < string , Variation > > VariationKeyMap { get { return _VariationKeyMap ; } }
127
127
128
+ /// <summary>
129
+ /// Associative array of experiment ID to associative array of variation key to variations
130
+ /// </summary>
131
+ private Dictionary < string , Dictionary < string , Variation > > _VariationKeyMapByExperimentId
132
+ = new Dictionary < string , Dictionary < string , Variation > > ( ) ;
133
+ public Dictionary < string , Dictionary < string , Variation > > VariationKeyMapByExperimentId { get { return _VariationKeyMapByExperimentId ; } }
134
+
135
+ /// <summary>
136
+ /// Associative array of experiment ID to associative array of variation key to variations
137
+ /// </summary>
138
+ private Dictionary < string , Dictionary < string , Variation > > _VariationIdMapByExperimentId
139
+ = new Dictionary < string , Dictionary < string , Variation > > ( ) ;
140
+ public Dictionary < string , Dictionary < string , Variation > > VariationKeyIdByExperimentId { get { return _VariationIdMapByExperimentId ; } }
141
+
128
142
129
143
/// <summary>
130
144
/// Associative array of experiment key to associative array of variation ID to variations
@@ -244,9 +258,10 @@ private void Initialize()
244
258
TypedAudiences = TypedAudiences ?? new Audience [ 0 ] ;
245
259
FeatureFlags = FeatureFlags ?? new FeatureFlag [ 0 ] ;
246
260
Rollouts = Rollouts ?? new Rollout [ 0 ] ;
261
+ _ExperimentKeyMap = new Dictionary < string , Experiment > ( ) ;
247
262
248
263
_GroupIdMap = ConfigParser < Group > . GenerateMap ( entities : Groups , getKey : g => g . Id . ToString ( ) , clone : true ) ;
249
- _ExperimentKeyMap = ConfigParser < Experiment > . GenerateMap ( entities : Experiments , getKey : e => e . Key , clone : true ) ;
264
+ _ExperimentIdMap = ConfigParser < Experiment > . GenerateMap ( entities : Experiments , getKey : e => e . Id , clone : true ) ;
250
265
_EventKeyMap = ConfigParser < Entity . Event > . GenerateMap ( entities : Events , getKey : e => e . Key , clone : true ) ;
251
266
_AttributeKeyMap = ConfigParser < Attribute > . GenerateMap ( entities : Attributes , getKey : a => a . Key , clone : true ) ;
252
267
_AudienceIdMap = ConfigParser < Audience > . GenerateMap ( entities : Audiences , getKey : a => a . Id . ToString ( ) , clone : true ) ;
@@ -260,7 +275,7 @@ private void Initialize()
260
275
261
276
foreach ( Group group in Groups )
262
277
{
263
- var experimentsInGroup = ConfigParser < Experiment > . GenerateMap ( group . Experiments , getKey : e => e . Key , clone : true ) ;
278
+ var experimentsInGroup = ConfigParser < Experiment > . GenerateMap ( group . Experiments , getKey : e => e . Id , clone : true ) ;
264
279
foreach ( Experiment experiment in experimentsInGroup . Values )
265
280
{
266
281
experiment . GroupId = group . Id ;
@@ -269,22 +284,27 @@ private void Initialize()
269
284
270
285
// RJE: I believe that this is equivalent to this:
271
286
// $this->_experimentKeyMap = array_merge($this->_experimentKeyMap, $experimentsInGroup);
272
- foreach ( string key in experimentsInGroup . Keys )
273
- _ExperimentKeyMap [ key ] = experimentsInGroup [ key ] ;
287
+ foreach ( var experiment in experimentsInGroup . Values )
288
+ _ExperimentIdMap [ experiment . Id ] = experiment ;
274
289
}
275
290
276
- foreach ( Experiment experiment in _ExperimentKeyMap . Values )
291
+ foreach ( Experiment experiment in _ExperimentIdMap . Values )
277
292
{
278
293
_VariationKeyMap [ experiment . Key ] = new Dictionary < string , Variation > ( ) ;
279
294
_VariationIdMap [ experiment . Key ] = new Dictionary < string , Variation > ( ) ;
280
- _ExperimentIdMap [ experiment . Id ] = experiment ;
295
+ _VariationIdMapByExperimentId [ experiment . Id ] = new Dictionary < string , Variation > ( ) ;
296
+ _VariationKeyMapByExperimentId [ experiment . Id ] = new Dictionary < string , Variation > ( ) ;
281
297
298
+ _ExperimentKeyMap [ experiment . Key ] = experiment ;
299
+
282
300
if ( experiment . Variations != null )
283
301
{
284
302
foreach ( Variation variation in experiment . Variations )
285
303
{
286
304
_VariationKeyMap [ experiment . Key ] [ variation . Key ] = variation ;
287
305
_VariationIdMap [ experiment . Key ] [ variation . Id ] = variation ;
306
+ _VariationKeyMapByExperimentId [ experiment . Id ] [ variation . Key ] = variation ;
307
+ _VariationIdMapByExperimentId [ experiment . Id ] [ variation . Id ] = variation ;
288
308
}
289
309
}
290
310
}
@@ -296,13 +316,17 @@ private void Initialize()
296
316
{
297
317
_VariationKeyMap [ rolloutRule . Key ] = new Dictionary < string , Variation > ( ) ;
298
318
_VariationIdMap [ rolloutRule . Key ] = new Dictionary < string , Variation > ( ) ;
319
+ _VariationIdMapByExperimentId [ rolloutRule . Id ] = new Dictionary < string , Variation > ( ) ;
320
+ _VariationKeyMapByExperimentId [ rolloutRule . Id ] = new Dictionary < string , Variation > ( ) ;
299
321
300
322
if ( rolloutRule . Variations != null )
301
323
{
302
324
foreach ( var variation in rolloutRule . Variations )
303
325
{
304
326
_VariationKeyMap [ rolloutRule . Key ] [ variation . Key ] = variation ;
305
327
_VariationIdMap [ rolloutRule . Key ] [ variation . Id ] = variation ;
328
+ _VariationKeyMapByExperimentId [ rolloutRule . Id ] [ variation . Key ] = variation ;
329
+ _VariationIdMapByExperimentId [ rolloutRule . Id ] [ variation . Id ] = variation ;
306
330
}
307
331
}
308
332
}
@@ -474,8 +498,28 @@ public Variation GetVariationFromKey(string experimentKey, string variationKey)
474
498
return new Variation ( ) ;
475
499
}
476
500
501
+
477
502
/// <summary>
478
- /// Get the Variation from the Key/ID
503
+ /// Get the Variation from the keys
504
+ /// </summary>
505
+ /// <param name="experimentId">Id for Experiment</param>
506
+ /// <param name="variationKey">key for Variation</param>
507
+ /// <returns>Variation Entity corresponding to the provided experiment key and variation key or a dummy
508
+ /// entity if keys are invalid</returns>
509
+ public Variation GetVariationFromKeyByExperimentId ( string experimentId , string variationKey )
510
+ {
511
+ if ( _VariationKeyMapByExperimentId . ContainsKey ( experimentId ) &&
512
+ _VariationKeyMapByExperimentId [ experimentId ] . ContainsKey ( variationKey ) )
513
+ return _VariationKeyMapByExperimentId [ experimentId ] [ variationKey ] ;
514
+
515
+ string message = $@ "No variation key ""{ variationKey } "" defined in datafile for experiment ""{ experimentId } "".";
516
+ Logger . Log ( LogLevel . ERROR , message ) ;
517
+ ErrorHandler . HandleError ( new Exceptions . InvalidVariationException ( "Provided variation is not in datafile." ) ) ;
518
+ return new Variation ( ) ;
519
+ }
520
+
521
+ /// <summary>
522
+ /// Get the Variation from the Key/Id
479
523
/// </summary>
480
524
/// <param name="experimentKey">key for Experiment</param>
481
525
/// <param name="variationId">ID for Variation</param>
@@ -493,6 +537,25 @@ public Variation GetVariationFromId(string experimentKey, string variationId)
493
537
return new Variation ( ) ;
494
538
}
495
539
540
+ /// <summary>
541
+ /// Get the Variation from the expId/varId
542
+ /// </summary>
543
+ /// <param name="experimentId">ID for Experiment</param>
544
+ /// <param name="variationId">ID for Variation</param>
545
+ /// <returns>Variation Entity corresponding to the provided experiment key and variation ID or a dummy
546
+ /// entity if experiment ID or variation ID is invalid</returns>
547
+ public Variation GetVariationFromIdByExperimentId ( string experimentId , string variationId )
548
+ {
549
+ if ( _VariationIdMapByExperimentId . ContainsKey ( experimentId ) &&
550
+ _VariationIdMapByExperimentId [ experimentId ] . ContainsKey ( variationId ) )
551
+ return _VariationIdMapByExperimentId [ experimentId ] [ variationId ] ;
552
+
553
+ string message = $@ "No variation ID ""{ variationId } "" defined in datafile for experiment ""{ experimentId } "".";
554
+ Logger . Log ( LogLevel . ERROR , message ) ;
555
+ ErrorHandler . HandleError ( new Exceptions . InvalidVariationException ( "Provided variation is not in datafile." ) ) ;
556
+ return new Variation ( ) ;
557
+ }
558
+
496
559
/// <summary>
497
560
/// Get the feature from the key
498
561
/// </summary>
0 commit comments