Skip to content
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
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
- Enh #403, #404: Use `DbArrayHelper::arrange()` instead of `DbArrayHelper::index()` method (@Tigrov)
- New #397: Realize `Schema::loadResultColumn()` method (@Tigrov)
- New #407: Use `DateTimeColumn` class for datetime column types (@Tigrov)
- Enh #411: Refactor constraints (@Tigrov)
- Enh #411, #426: Refactor constraints (@Tigrov)
- New #408, #410: Implement `DMLQueryBuilder::upsertReturning()` method (@Tigrov)
- Enh #412: Reduce binding parameters (@Tigrov)
- Chg #414: Rename `DMLQueryBuilder::insertWithReturningPks()` to `DMLQueryBuilder::insertReturningPks()` (@Tigrov)
Expand Down
47 changes: 24 additions & 23 deletions src/Schema.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@

use Yiisoft\Db\Constant\ColumnType;
use Yiisoft\Db\Constant\ReferentialAction;
use Yiisoft\Db\Constraint\CheckConstraint;
use Yiisoft\Db\Constraint\ForeignKeyConstraint;
use Yiisoft\Db\Constraint\IndexConstraint;
use Yiisoft\Db\Constraint\Check;
use Yiisoft\Db\Constraint\ForeignKey;
use Yiisoft\Db\Constraint\Index;
use Yiisoft\Db\Driver\Pdo\AbstractPdoSchema;
use Yiisoft\Db\Exception\NotSupportedException;
use Yiisoft\Db\Helper\DbArrayHelper;
Expand Down Expand Up @@ -165,15 +165,15 @@ protected function loadTableSchema(string $name): TableSchemaInterface|null
return null;
}

protected function loadTablePrimaryKey(string $tableName): IndexConstraint|null
protected function loadTablePrimaryKey(string $tableName): Index|null
{
/** @var IndexConstraint|null */
/** @var Index|null */
return $this->loadTableConstraints($tableName, self::PRIMARY_KEY);
}

protected function loadTableForeignKeys(string $tableName): array
{
/** @var ForeignKeyConstraint[] */
/** @var ForeignKey[] */
return $this->loadTableConstraints($tableName, self::FOREIGN_KEYS);
}

Expand All @@ -183,8 +183,8 @@ protected function loadTableIndexes(string $tableName): array
SELECT
"ic"."relname" AS "name",
"ia"."attname" AS "column_name",
"i"."indisunique" AS "index_is_unique",
"i"."indisprimary" AS "index_is_primary"
"i"."indisunique" AS "is_unique",
"i"."indisprimary" AS "is_primary_key"
FROM "pg_class" AS "tc"
INNER JOIN "pg_namespace" AS "tcns"
ON "tcns"."oid" = "tc"."relnamespace"
Expand Down Expand Up @@ -218,17 +218,17 @@ protected function loadTableIndexes(string $tableName): array
* array{
* name: string,
* column_name: string,
* index_is_unique: bool,
* index_is_primary: bool
* is_unique: bool,
* is_primary_key: bool
* }
* > $index
*/
foreach ($indexes as $name => $index) {
$result[] = new IndexConstraint(
$result[] = new Index(
$name,
array_column($index, 'column_name'),
$index[0]['index_is_unique'],
$index[0]['index_is_primary'],
$index[0]['is_unique'],
$index[0]['is_primary_key'],
);
}

Expand All @@ -237,13 +237,13 @@ protected function loadTableIndexes(string $tableName): array

protected function loadTableUniques(string $tableName): array
{
/** @var IndexConstraint[] */
/** @var Index[] */
return $this->loadTableConstraints($tableName, self::UNIQUES);
}

protected function loadTableChecks(string $tableName): array
{
/** @var CheckConstraint[] */
/** @var Check[] */
return $this->loadTableConstraints($tableName, self::CHECKS);
}

Expand Down Expand Up @@ -717,9 +717,9 @@ private function loadColumn(array $info): ColumnInterface
* - uniques
* - checks
*
* @return CheckConstraint[]|ForeignKeyConstraint[]|IndexConstraint|IndexConstraint[]|null Constraints.
* @return Check[]|ForeignKey[]|Index|Index[]|null Constraints.
*/
private function loadTableConstraints(string $tableName, string $returnType): array|IndexConstraint|null
private function loadTableConstraints(string $tableName, string $returnType): array|Index|null
{
$sql = <<<SQL
SELECT
Expand Down Expand Up @@ -788,26 +788,27 @@ private function loadTableConstraints(string $tableName, string $returnType): ar
*/
foreach ($names as $name => $constraint) {
match ($type) {
'p' => $result[self::PRIMARY_KEY] = new IndexConstraint(
'p' => $result[self::PRIMARY_KEY] = new Index(
$name,
array_column($constraint, 'column_name'),
true,
true,
),
'f' => $result[self::FOREIGN_KEYS][] = new ForeignKeyConstraint(
'f' => $result[self::FOREIGN_KEYS][] = new ForeignKey(
$name,
array_values(array_unique(array_column($constraint, 'column_name'))),
$constraint[0]['foreign_table_schema'] . '.' . $constraint[0]['foreign_table_name'],
$constraint[0]['foreign_table_schema'],
$constraint[0]['foreign_table_name'],
array_values(array_unique(array_column($constraint, 'foreign_column_name'))),
$actionTypes[$constraint[0]['on_update']] ?? null,
$actionTypes[$constraint[0]['on_delete']] ?? null,
$actionTypes[$constraint[0]['on_update']] ?? null,
),
'u' => $result[self::UNIQUES][] = new IndexConstraint(
'u' => $result[self::UNIQUES][] = new Index(
$name,
array_column($constraint, 'column_name'),
true,
),
'c' => $result[self::CHECKS][] = new CheckConstraint(
'c' => $result[self::CHECKS][] = new Check(
$name,
array_column($constraint, 'column_name'),
$constraint[0]['check_expr'],
Expand Down
6 changes: 4 additions & 2 deletions tests/Provider/SchemaProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
use Yiisoft\Db\Schema\Column\DoubleColumn;
use Yiisoft\Db\Schema\Column\JsonColumn;
use Yiisoft\Db\Schema\Column\StringColumn;
use Yiisoft\Db\Tests\Support\Assert;

final class SchemaProvider extends \Yiisoft\Db\Tests\Provider\SchemaProvider
{
Expand Down Expand Up @@ -258,8 +259,9 @@ public static function constraints(): array
{
$constraints = parent::constraints();

$constraints['1: check'][2][0]->expression('CHECK ((("C_check")::text <> \'\'::text))');
$constraints['3: foreign key'][2][0]->foreignTableName('public.T_constraints_2');
Assert::setPropertyValue($constraints['1: check'][2][0], 'expression', 'CHECK ((("C_check")::text <> \'\'::text))');
Assert::setPropertyValue($constraints['3: foreign key'][2][0], 'foreignSchemaName', 'public');
Assert::setPropertyValue($constraints['3: foreign key'][2][0], 'foreignTableName', 'T_constraints_2');
$constraints['3: index'][2] = [];

return $constraints;
Expand Down
35 changes: 12 additions & 23 deletions tests/SchemaTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
use Throwable;
use Yiisoft\Db\Command\CommandInterface;
use Yiisoft\Db\Connection\ConnectionInterface;
use Yiisoft\Db\Constraint\IndexConstraint;
use Yiisoft\Db\Constraint\Index;
use Yiisoft\Db\Driver\Pdo\PdoConnectionInterface;
use Yiisoft\Db\Exception\Exception;
use Yiisoft\Db\Exception\InvalidConfigException;
Expand Down Expand Up @@ -591,30 +591,19 @@ public function testTableIndexes(): void
$db = $this->getConnection(true);
$schema = $db->getSchema();

/** @var IndexConstraint[] $tableIndexes */
/** @var Index[] $tableIndexes */
$tableIndexes = $schema->getTableIndexes('table_index');

$this->assertCount(5, $tableIndexes);

$this->assertSame(['id'], $tableIndexes[0]->getColumnNames());
$this->assertTrue($tableIndexes[0]->isPrimaryKey());
$this->assertTrue($tableIndexes[0]->isUnique());

$this->assertSame(['one_unique'], $tableIndexes[1]->getColumnNames());
$this->assertFalse($tableIndexes[1]->isPrimaryKey());
$this->assertTrue($tableIndexes[1]->isUnique());

$this->assertSame(['two_unique_1', 'two_unique_2'], $tableIndexes[2]->getColumnNames());
$this->assertFalse($tableIndexes[2]->isPrimaryKey());
$this->assertTrue($tableIndexes[2]->isUnique());

$this->assertSame(['unique_index'], $tableIndexes[3]->getColumnNames());
$this->assertFalse($tableIndexes[3]->isPrimaryKey());
$this->assertTrue($tableIndexes[3]->isUnique());

$this->assertSame(['non_unique_index'], $tableIndexes[4]->getColumnNames());
$this->assertFalse($tableIndexes[4]->isPrimaryKey());
$this->assertFalse($tableIndexes[4]->isUnique());
$this->assertEquals(
[
new Index('table_index_pkey', ['id'], true, true),
new Index('table_index_one_unique_key', ['one_unique'], true),
new Index('table_index_two_unique_1_two_unique_2_key', ['two_unique_1', 'two_unique_2'], true),
new Index('table_index_unique_index_non_unique_index_idx', ['unique_index'], true),
new Index('table_index_non_unique_index_unique_index_idx', ['non_unique_index']),
],
$tableIndexes
);

$db->close();
}
Expand Down