*/ private array $columnNames = []; private bool $isClustered = false; /** @internal Use {@link UniqueConstraint::editor()} or {@link UniqueConstraint::edit()} to create an instance */ public function __construct() { } public function setName(?UnqualifiedName $name): self { $this->name = $name; return $this; } /** @param non-empty-string $name */ public function setUnquotedName(string $name): self { $this->name = UnqualifiedName::unquoted($name); return $this; } /** @param non-empty-string $name */ public function setQuotedName(string $name): self { $this->name = UnqualifiedName::quoted($name); return $this; } public function setColumnNames(UnqualifiedName $firstColumnName, UnqualifiedName ...$otherColumnNames): self { $this->columnNames = array_merge([$firstColumnName], array_values($otherColumnNames)); return $this; } /** * @param non-empty-string $firstColumnName * @param non-empty-string ...$otherColumnNames */ public function setUnquotedColumnNames( string $firstColumnName, string ...$otherColumnNames, ): self { $this->columnNames = array_map( static fn (string $name): UnqualifiedName => UnqualifiedName::unquoted($name), array_merge([$firstColumnName], array_values($otherColumnNames)), ); return $this; } /** * @param non-empty-string $firstColumnName * @param non-empty-string ...$otherColumnNames */ public function setQuotedColumnNames( string $firstColumnName, string ...$otherColumnNames, ): self { $this->columnNames = array_map( static fn (string $name): UnqualifiedName => UnqualifiedName::quoted($name), array_merge([$firstColumnName], array_values($otherColumnNames)), ); return $this; } public function setIsClustered(bool $isClustered): self { $this->isClustered = $isClustered; return $this; } public function create(): UniqueConstraint { if (count($this->columnNames) < 1) { throw InvalidUniqueConstraintDefinition::columnNamesAreNotSet($this->name); } return new UniqueConstraint( $this->name?->toString() ?? '', array_map(static fn (UnqualifiedName $columnName) => $columnName->toString(), $this->columnNames), $this->isClustered ? ['clustered'] : [], ); } }