getAssignment method

Assignment getAssignment(
  1. String experimentName
)

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;
}