1515 */
1616
1717using System . Collections . Generic ;
18- using Newtonsoft . Json ;
19- using Newtonsoft . Json . Linq ;
20- using OptimizelySDK . AudienceConditions ;
21- using OptimizelySDK . Utils ;
2218
2319namespace OptimizelySDK . Entity
2420{
25- public class Experiment : IdKeyEntity , IExperimentCore
21+ public class Experiment : ExperimentCore
2622 {
27- private const string STATUS_RUNNING = "Running" ;
28-
2923 private const string MUTEX_GROUP_POLICY = "random" ;
3024
31- /// <summary>
32- /// Experiment Status
33- /// </summary>
34- public string Status { get ; set ; }
35-
36- /// <summary>
37- /// Layer ID for the experiment
38- /// </summary>
39- public string LayerId { get ; set ; }
40-
4125 /// <summary>
4226 /// Group ID for the experiment
4327 /// </summary>
4428 public string GroupId { get ; set ; }
4529
4630 /// <summary>
47- /// Variations for the experiment
31+ /// Layer ID for the experiment
4832 /// </summary>
49- public Variation [ ] Variations { get ; set ; }
33+ public string LayerId { get ; set ; }
5034
5135 /// <summary>
5236 /// ForcedVariations for the experiment
@@ -63,203 +47,6 @@ public class Experiment : IdKeyEntity, IExperimentCore
6347 /// </summary>
6448 public string GroupPolicy { get ; set ; }
6549
66- /// <summary>
67- /// ID(s) of audience(s) the experiment is targeted to
68- /// </summary>
69- public string [ ] AudienceIds { get ; set ; }
70-
71- private ICondition _audienceIdsList = null ;
72-
73- /// <summary>
74- /// De-serialized audience conditions
75- /// </summary>
76- public ICondition AudienceIdsList
77- {
78- get
79- {
80- if ( AudienceIds == null || AudienceIds . Length == 0 )
81- {
82- return null ;
83- }
84-
85- if ( _audienceIdsList == null )
86- {
87- var conditions = new List < ICondition > ( ) ;
88- foreach ( var audienceId in AudienceIds )
89- {
90- conditions . Add (
91- new AudienceIdCondition ( ) { AudienceId = ( string ) audienceId } ) ;
92- }
93-
94- _audienceIdsList = new OrCondition ( ) { Conditions = conditions . ToArray ( ) } ;
95- }
96-
97- return _audienceIdsList ;
98- }
99- }
100-
101- private string _audienceIdsString = null ;
102-
103- /// <summary>
104- /// Stringified audience conditions
105- /// </summary>
106- public string AudienceIdsString
107- {
108- get
109- {
110- if ( AudienceIds == null )
111- {
112- return null ;
113- }
114-
115- if ( _audienceIdsString == null )
116- {
117- _audienceIdsString = JsonConvert . SerializeObject ( AudienceIds , Formatting . None ) ;
118- }
119-
120- return _audienceIdsString ;
121- }
122- }
123-
124- /// <summary>
125- /// Traffic allocation of variations in the experiment
126- /// </summary>
127- public TrafficAllocation [ ] TrafficAllocation { get ; set ; }
128-
129- /// <summary>
130- /// Audience Conditions
131- /// </summary>
132- public object AudienceConditions { get ; set ; }
133-
134- private ICondition _audienceConditionsList = null ;
135-
136- /// <summary>
137- /// De-serialized audience conditions
138- /// </summary>
139- public ICondition AudienceConditionsList
140- {
141- get
142- {
143- if ( AudienceConditions == null )
144- {
145- return null ;
146- }
147-
148- if ( _audienceConditionsList == null )
149- {
150- if ( AudienceConditions is string )
151- {
152- _audienceConditionsList =
153- ConditionParser . ParseAudienceConditions (
154- JToken . Parse ( ( string ) AudienceConditions ) ) ;
155- }
156- else
157- {
158- _audienceConditionsList =
159- ConditionParser . ParseAudienceConditions ( ( JToken ) AudienceConditions ) ;
160- }
161- }
162-
163- return _audienceConditionsList ;
164- }
165- }
166-
167- private string _audienceConditionsString = null ;
168-
169- /// <summary>
170- /// Stringified audience conditions
171- /// </summary>
172- public string AudienceConditionsString
173- {
174- get
175- {
176- if ( AudienceConditions == null )
177- {
178- return null ;
179- }
180-
181- if ( _audienceConditionsString == null )
182- {
183- if ( AudienceConditions is JToken token )
184- {
185- _audienceConditionsString = token . ToString ( Formatting . None ) ;
186- }
187- else
188- {
189- _audienceConditionsString = AudienceConditions . ToString ( ) ;
190- }
191- }
192-
193- return _audienceConditionsString ;
194- }
195- }
196-
197- private bool isGenerateKeyMapCalled = false ;
198-
199- private Dictionary < string , Variation > _VariationKeyToVariationMap ;
200-
201- public Dictionary < string , Variation > VariationKeyToVariationMap
202- {
203- get
204- {
205- if ( ! isGenerateKeyMapCalled )
206- {
207- GenerateVariationKeyMap ( ) ;
208- }
209-
210- return _VariationKeyToVariationMap ;
211- }
212- }
213-
214- private Dictionary < string , Variation > _VariationIdToVariationMap ;
215-
216- public Dictionary < string , Variation > VariationIdToVariationMap
217- {
218- get
219- {
220- if ( ! isGenerateKeyMapCalled )
221- {
222- GenerateVariationKeyMap ( ) ;
223- }
224-
225- return _VariationIdToVariationMap ;
226- }
227- }
228-
229- public void GenerateVariationKeyMap ( )
230- {
231- if ( Variations == null )
232- {
233- return ;
234- }
235-
236- _VariationIdToVariationMap =
237- ConfigParser < Variation > . GenerateMap ( Variations , a => a . Id , true ) ;
238- _VariationKeyToVariationMap =
239- ConfigParser < Variation > . GenerateMap ( Variations , a => a . Key , true ) ;
240- isGenerateKeyMapCalled = true ;
241- }
242-
243- // Code from PHP, need to build traffic and variations from config
244- #if false
245- /**
246- * @param $variations array Variations in experiment.
247- */
248- public function setVariations ( $variations )
249- {
250- $this ->_variations = ConfigParser ::generateMap ( $variations , null , Variation ::class ) ;
251- }
252-
253- /**
254- * @param $trafficAllocation array Traffic allocation of variations in experiment.
255- */
256- public function setTrafficAllocation ( $trafficAllocation )
257- {
258- $this ->_trafficAllocation =
259- ConfigParser ::generateMap ( $trafficAllocation , null , TrafficAllocation ::class ) ;
260- }
261- #endif
262-
26350 /// <summary>
26451 /// Determine if experiment is in a mutually exclusive group
26552 /// </summary>
@@ -283,8 +70,8 @@ public bool IsUserInForcedVariation(string userId)
28370 }
28471
28572 /// <summary>
286- /// Determine if experiment is currently activated/running (IExperimentCore implementation)
73+ /// Determine if experiment is currently activated/running (implementation of abstract property )
28774 /// </summary>
288- public bool IsActivated => IsExperimentRunning ;
75+ public override bool IsActivated => IsExperimentRunning ;
28976 }
29077}
0 commit comments