getAssignment method
Implementation
Assignment getAssignment(final String experimentName) {
Assignment? assignment = assignmentCache_[experimentName];
final int? custom = cassignments_[experimentName];
final int? override = overrides_[experimentName];
final ExperimentVariables? experiment = getExperiment(experimentName);
if (assignment != null) {
if (override != null) {
if (assignment.overridden && assignment.variant == override) {
// override up-to-date
return assignment;
}
} else if (experiment == null) {
if (!assignment.assigned) {
// previously not-running experiment
return assignment;
}
} else if ((custom == null) || custom == assignment.variant) {
if (experimentMatches(experiment.data, assignment)) {
// assignment up-to-date
return assignment;
}
}
}
// cache miss or out-dated
assignment = Assignment();
assignment.name = experimentName;
assignment.eligible = true;
if (override != null) {
if (experiment != null) {
assignment.id = experiment.data.id;
assignment.unitType = experiment.data.unitType;
}
assignment.overridden = true;
assignment.variant = override;
} else {
if (experiment != null) {
final String unitType = experiment.data.unitType;
if (experiment.data.audience != null &&
experiment.data.audience!.isNotEmpty) {
final Map<String, dynamic> attrs = {};
for (final Attribute attr in attributes_) {
attrs[attr.name] = attr.value;
}
final Result? match =
audienceMatcher_.evaluate(experiment.data.audience!, attrs);
if (match != null) {
assignment.audienceMismatch = !match.get();
}
}
if (experiment.data.audienceStrict && assignment.audienceMismatch) {
assignment.variant = 0;
} else if (experiment.data.fullOnVariant == 0) {
final String? uid = units_[experiment.data.unitType];
if (uid != null) {
final Uint8List unitHash = getUnitHash(unitType, uid);
final VariantAssigner assigner =
getVariantAssigner(unitType, unitHash);
final bool eligible = assigner.assign(
experiment.data.trafficSplit,
experiment.data.trafficSeedHi,
experiment.data.trafficSeedLo) ==
1;
if (eligible) {
if (custom != null) {
assignment.variant = custom;
assignment.custom = true;
} else {
assignment.variant = assigner.assign(experiment.data.split,
experiment.data.seedHi, experiment.data.seedLo);
}
} else {
assignment.eligible = false;
assignment.variant = 0;
}
assignment.assigned = true;
}
} else {
assignment.assigned = true;
assignment.variant = experiment.data.fullOnVariant;
assignment.fullOn = true;
}
assignment.unitType = unitType;
assignment.id = experiment.data.id;
assignment.iteration = experiment.data.iteration;
assignment.trafficSplit = experiment.data.trafficSplit;
assignment.fullOnVariant = experiment.data.fullOnVariant;
}
}
if ((experiment != null) &&
(assignment.variant < experiment.data.variants.length)) {
assignment.variables = experiment.variables[assignment.variant] ?? {};
}
assignmentCache_[experimentName] = assignment;
return assignment;
}