12
12
import com .launchdarkly .sdk .server .interfaces .LDClientInterface ;
13
13
14
14
import java .io .IOException ;
15
+ import java .util .ArrayList ;
15
16
import java .util .HashMap ;
17
+ import java .util .List ;
16
18
import java .util .Map ;
17
19
import java .util .Objects ;
20
+ import java .util .stream .Collectors ;
18
21
19
22
import static com .launchdarkly .sdk .server .JsonHelpers .gsonInstanceWithNullsAllowed ;
20
23
@@ -48,18 +51,20 @@ static class FlagMetadata {
48
51
final boolean trackEvents ;
49
52
final boolean trackReason ;
50
53
final Long debugEventsUntilDate ;
54
+ final List <String > prerequisites ;
51
55
52
56
FlagMetadata (LDValue value , Integer variation , EvaluationReason reason , Integer version ,
53
- boolean trackEvents , boolean trackReason , Long debugEventsUntilDate ) {
57
+ boolean trackEvents , boolean trackReason , Long debugEventsUntilDate , List < String > prerequisites ) {
54
58
this .value = LDValue .normalize (value );
55
59
this .variation = variation ;
56
60
this .reason = reason ;
57
61
this .version = version ;
58
62
this .trackEvents = trackEvents ;
59
63
this .trackReason = trackReason ;
60
64
this .debugEventsUntilDate = debugEventsUntilDate ;
65
+ this .prerequisites = prerequisites ;
61
66
}
62
-
67
+
63
68
@ Override
64
69
public boolean equals (Object other ) {
65
70
if (other instanceof FlagMetadata ) {
@@ -70,14 +75,15 @@ public boolean equals(Object other) {
70
75
Objects .equals (version , o .version ) &&
71
76
trackEvents == o .trackEvents &&
72
77
trackReason == o .trackReason &&
73
- Objects .equals (debugEventsUntilDate , o .debugEventsUntilDate );
78
+ Objects .equals (debugEventsUntilDate , o .debugEventsUntilDate ) &&
79
+ Objects .equals (prerequisites , o .prerequisites );
74
80
}
75
81
return false ;
76
82
}
77
-
83
+
78
84
@ Override
79
85
public int hashCode () {
80
- return Objects .hash (variation , version , trackEvents , trackReason , debugEventsUntilDate );
86
+ return Objects .hash (value , variation , reason , version , trackEvents , trackReason , debugEventsUntilDate , prerequisites );
81
87
}
82
88
}
83
89
@@ -206,7 +212,8 @@ public Builder valid(boolean valid) {
206
212
* @param reason the evaluation reason
207
213
* @param flagVersion the current flag version
208
214
* @param trackEvents true if full event tracking is turned on for this flag
209
- * @param debugEventsUntilDate if set, event debugging is turned until this time (millisecond timestamp)
215
+ * @param debugEventsUntilDate if set, event debugging is turned until this time (millisecond timestamp)
216
+ * @param prerequisites list of flag keys of the top level prerequisite flags evaluated as part of this evaluation
210
217
* @return the builder
211
218
*/
212
219
public Builder add (
@@ -216,9 +223,10 @@ public Builder add(
216
223
EvaluationReason reason ,
217
224
int flagVersion ,
218
225
boolean trackEvents ,
219
- Long debugEventsUntilDate
226
+ Long debugEventsUntilDate ,
227
+ List <String > prerequisites
220
228
) {
221
- return add (flagKey , value , variationIndex , reason , flagVersion , trackEvents , false , debugEventsUntilDate );
229
+ return add (flagKey , value , variationIndex , reason , flagVersion , trackEvents , false , debugEventsUntilDate , prerequisites );
222
230
}
223
231
224
232
/**
@@ -236,7 +244,8 @@ public Builder add(
236
244
* @param flagVersion the current flag version
237
245
* @param trackEvents true if full event tracking is turned on for this flag
238
246
* @param trackReason true if evaluation reasons must be included due to experimentation
239
- * @param debugEventsUntilDate if set, event debugging is turned until this time (millisecond timestamp)
247
+ * @param debugEventsUntilDate if set, event debugging is turned until this time (millisecond timestamp)
248
+ * @param prerequisites list of flag keys of the top level prerequisite flags evaluated as part of this evaluation
240
249
* @return the builder
241
250
*/
242
251
public Builder add (
@@ -247,7 +256,8 @@ public Builder add(
247
256
int flagVersion ,
248
257
boolean trackEvents ,
249
258
boolean trackReason ,
250
- Long debugEventsUntilDate
259
+ Long debugEventsUntilDate ,
260
+ List <String > prerequisites
251
261
) {
252
262
final boolean flagIsTracked = trackEvents ||
253
263
(debugEventsUntilDate != null && debugEventsUntilDate > System .currentTimeMillis ());
@@ -259,8 +269,8 @@ public Builder add(
259
269
wantDetails ? Integer .valueOf (flagVersion ) : null ,
260
270
trackEvents ,
261
271
trackReason ,
262
- debugEventsUntilDate
263
- );
272
+ debugEventsUntilDate ,
273
+ prerequisites );
264
274
flagMetadata .put (flagKey , data );
265
275
return this ;
266
276
}
@@ -274,7 +284,11 @@ Builder addFlag(DataModel.FeatureFlag flag, EvalResult eval) {
274
284
flag .getVersion (),
275
285
flag .isTrackEvents () || eval .isForceReasonTracking (),
276
286
eval .isForceReasonTracking (),
277
- flag .getDebugEventsUntilDate ()
287
+ flag .getDebugEventsUntilDate (),
288
+ eval .getPrerequisiteEvalRecords ().stream ()
289
+ .filter (record -> record .prereqOfFlag .getKey () == flag .getKey ()) // only include top level prereqs
290
+ .map (record -> record .flag .getKey ()) // map from prereq record to prereq key
291
+ .collect (Collectors .toList ())
278
292
);
279
293
}
280
294
@@ -331,6 +345,14 @@ public void write(JsonWriter out, FeatureFlagsState state) throws IOException {
331
345
out .name ("debugEventsUntilDate" );
332
346
out .value (meta .debugEventsUntilDate .longValue ());
333
347
}
348
+ if (meta .prerequisites != null && !meta .prerequisites .isEmpty ()) {
349
+ out .name ("prerequisites" );
350
+ out .beginArray ();
351
+ for (String s : meta .prerequisites ) {
352
+ out .value (s );
353
+ }
354
+ out .endArray ();
355
+ }
334
356
out .endObject ();
335
357
}
336
358
out .endObject ();
@@ -377,8 +399,8 @@ public FeatureFlagsState read(JsonReader in) throws IOException {
377
399
m0 .version ,
378
400
m0 .trackEvents ,
379
401
m0 .trackReason ,
380
- m0 .debugEventsUntilDate
381
- );
402
+ m0 .debugEventsUntilDate ,
403
+ m0 . prerequisites != null ? m0 . prerequisites : new ArrayList <>( 0 ) );
382
404
allFlagMetadata .put (e .getKey (), m1 );
383
405
}
384
406
}
0 commit comments