Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Port the Db/Action code and tests from phinx #666

Merged
merged 2 commits into from
Dec 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions src/Db/Action/Action.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php
declare(strict_types=1);

/**
* MIT License
* For full license information, please view the LICENSE file that was distributed with this source code.
*/

namespace Migrations\Db\Action;

use Migrations\Db\Table\Table;

abstract class Action
{
/**
* @var \Migrations\Db\Table\Table
*/
protected Table $table;

/**
* Constructor
*
* @param \Migrations\Db\Table\Table $table the Table to apply the action to
*/
public function __construct(Table $table)
{
$this->table = $table;
}

/**
* The table this action will be applied to
*
* @return \Migrations\Db\Table\Table
*/
public function getTable(): Table
{
return $this->table;
}
}
64 changes: 64 additions & 0 deletions src/Db/Action/AddColumn.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<?php
declare(strict_types=1);

/**
* MIT License
* For full license information, please view the LICENSE file that was distributed with this source code.
*/

namespace Migrations\Db\Action;

use Migrations\Db\Literal;
use Migrations\Db\Table\Column;
use Migrations\Db\Table\Table;

class AddColumn extends Action
{
/**
* The column to add
*
* @var \Migrations\Db\Table\Column
*/
protected Column $column;

/**
* Constructor
*
* @param \Migrations\Db\Table\Table $table The table to add the column to
* @param \Migrations\Db\Table\Column $column The column to add
*/
public function __construct(Table $table, Column $column)
{
parent::__construct($table);
$this->column = $column;
}

/**
* Returns a new AddColumn object after assembling the given commands
*
* @param \Migrations\Db\Table\Table $table The table to add the column to
* @param string $columnName The column name
* @param string|\Migrations\Db\Literal $type The column type
* @param array<string, mixed> $options The column options
* @return self
*/
public static function build(Table $table, string $columnName, string|Literal $type, array $options = []): self
{
$column = new Column();
$column->setName($columnName);
$column->setType($type);
$column->setOptions($options); // map options to column methods

return new AddColumn($table, $column);
}

/**
* Returns the column to be added
*
* @return \Migrations\Db\Table\Column
*/
public function getColumn(): Column
{
return $this->column;
}
}
79 changes: 79 additions & 0 deletions src/Db/Action/AddForeignKey.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
<?php
declare(strict_types=1);

/**
* MIT License
* For full license information, please view the LICENSE file that was distributed with this source code.
*/

namespace Migrations\Db\Action;

use Migrations\Db\Table\ForeignKey;
use Migrations\Db\Table\Table;

class AddForeignKey extends Action
{
/**
* The foreign key to add
*
* @var \Migrations\Db\Table\ForeignKey
*/
protected ForeignKey $foreignKey;

/**
* Constructor
*
* @param \Migrations\Db\Table\Table $table The table to add the foreign key to
* @param \Migrations\Db\Table\ForeignKey $fk The foreign key to add
*/
public function __construct(Table $table, ForeignKey $fk)
{
parent::__construct($table);
$this->foreignKey = $fk;
}

/**
* Creates a new AddForeignKey object after building the foreign key with
* the passed attributes
*
* @param \Migrations\Db\Table\Table $table The table object to add the foreign key to
* @param string|string[] $columns The columns for the foreign key
* @param \Migrations\Db\Table\Table|string $referencedTable The table the foreign key references
* @param string|string[] $referencedColumns The columns in the referenced table
* @param array<string, mixed> $options Extra options for the foreign key
* @param string|null $name The name of the foreign key
* @return self
*/
public static function build(Table $table, string|array $columns, Table|string $referencedTable, string|array $referencedColumns = ['id'], array $options = [], ?string $name = null): self
{
if (is_string($referencedColumns)) {
$referencedColumns = [$referencedColumns]; // str to array
}

if (is_string($referencedTable)) {
$referencedTable = new Table($referencedTable);
}

$fk = new ForeignKey();
$fk->setReferencedTable($referencedTable)
->setColumns($columns)
->setReferencedColumns($referencedColumns)
->setOptions($options);

if ($name !== null) {
$fk->setConstraint($name);
}

return new AddForeignKey($table, $fk);
}

/**
* Returns the foreign key to be added
*
* @return \Migrations\Db\Table\ForeignKey
*/
public function getForeignKey(): ForeignKey
{
return $this->foreignKey;
}
}
68 changes: 68 additions & 0 deletions src/Db/Action/AddIndex.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
<?php
declare(strict_types=1);

/**
* MIT License
* For full license information, please view the LICENSE file that was distributed with this source code.
*/

namespace Migrations\Db\Action;

use Migrations\Db\Table\Index;
use Migrations\Db\Table\Table;

class AddIndex extends Action
{
/**
* The index to add to the table
*
* @var \Migrations\Db\Table\Index
*/
protected Index $index;

/**
* Constructor
*
* @param \Migrations\Db\Table\Table $table The table to add the index to
* @param \Migrations\Db\Table\Index $index The index to be added
*/
public function __construct(Table $table, Index $index)
{
parent::__construct($table);
$this->index = $index;
}

/**
* Creates a new AddIndex object after building the index object with the
* provided arguments
*
* @param \Migrations\Db\Table\Table $table The table to add the index to
* @param string|string[]|\Migrations\Db\Table\Index $columns The columns to index
* @param array<string, mixed> $options Additional options for the index creation
* @return self
*/
public static function build(Table $table, string|array|Index $columns, array $options = []): self
{
// create a new index object if strings or an array of strings were supplied
if (!($columns instanceof Index)) {
$index = new Index();

$index->setColumns($columns);
$index->setOptions($options);
} else {
$index = $columns;
}

return new AddIndex($table, $index);
}

/**
* Returns the index to be added
*
* @return \Migrations\Db\Table\Index
*/
public function getIndex(): Index
{
return $this->index;
}
}
89 changes: 89 additions & 0 deletions src/Db/Action/ChangeColumn.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
<?php
declare(strict_types=1);

/**
* MIT License
* For full license information, please view the LICENSE file that was distributed with this source code.
*/

namespace Migrations\Db\Action;

use Migrations\Db\Literal;
use Migrations\Db\Table\Column;
use Migrations\Db\Table\Table;

class ChangeColumn extends Action
{
/**
* The column definition
*
* @var \Migrations\Db\Table\Column
*/
protected Column $column;

/**
* The name of the column to be changed
*
* @var string
*/
protected string $columnName;

/**
* Constructor
*
* @param \Migrations\Db\Table\Table $table The table to alter
* @param string $columnName The name of the column to change
* @param \Migrations\Db\Table\Column $column The column definition
*/
public function __construct(Table $table, string $columnName, Column $column)
{
parent::__construct($table);
$this->columnName = $columnName;
$this->column = $column;

// if the name was omitted use the existing column name
if ($column->getName() === null || strlen((string)$column->getName()) === 0) {
$column->setName($columnName);
}
}

/**
* Creates a new ChangeColumn object after building the column definition
* out of the provided arguments
*
* @param \Migrations\Db\Table\Table $table The table to alter
* @param string $columnName The name of the column to change
* @param string|\Migrations\Db\Literal $type The type of the column
* @param array<string, mixed> $options Additional options for the column
* @return self
*/
public static function build(Table $table, string $columnName, string|Literal $type, array $options = []): self
{
$column = new Column();
$column->setName($columnName);
$column->setType($type);
$column->setOptions($options); // map options to column methods

return new ChangeColumn($table, $columnName, $column);
}

/**
* Returns the name of the column to change
*
* @return string
*/
public function getColumnName(): string
{
return $this->columnName;
}

/**
* Returns the column definition
*
* @return \Migrations\Db\Table\Column
*/
public function getColumn(): Column
{
return $this->column;
}
}
43 changes: 43 additions & 0 deletions src/Db/Action/ChangeComment.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?php
declare(strict_types=1);

/**
* MIT License
* For full license information, please view the LICENSE file that was distributed with this source code.
*/

namespace Migrations\Db\Action;

use Migrations\Db\Table\Table;

class ChangeComment extends Action
{
/**
* The new comment for the table
*
* @var string|null
*/
protected ?string $newComment = null;

/**
* Constructor
*
* @param \Migrations\Db\Table\Table $table The table to be changed
* @param string|null $newComment The new comment for the table
*/
public function __construct(Table $table, ?string $newComment)
{
parent::__construct($table);
$this->newComment = $newComment;
}

/**
* Return the new comment for the table
*
* @return string|null
*/
public function getNewComment(): ?string
{
return $this->newComment;
}
}
Loading