/** * @param Field $field * @param UniqueArrayObject $data * @param Builder $builder * @return mixed * @throws SampleException */ private function sampleUniqueField(Field $field, UniqueArrayObject $data, Builder $builder) { // create a generation store for unique values if ($field->isType(Field::TYPE_LINK)) { // For links we only want uniqueness within the current object // For unique relations with other objects across all samples a relation should be used. $id = spl_object_hash($field) . $data->getId(); } else { $id = spl_object_hash($field); } if (!isset($this->sampled[$id])) { $this->sampled[$id] = []; } // try to iteratively generate a unique value $rounds = 0; do { if ($rounds === $this->unique_tries) { $name = $field->getName(); $type = $builder->getType(); throw new SampleException("Tried to get unique value for field {$name} in {$type}, but none could be generated"); } $value = $this->sampleField($field, $data); $rounds += 1; } while (in_array($value, $this->sampled[$id], true)); // store the generated value for later testing $this->sampled[$id][] = $value; return $value; }