diff --git a/CHANGELOG.md b/CHANGELOG.md index 79972752e..2fea1abb2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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) diff --git a/src/Schema.php b/src/Schema.php index f858a224e..585dcf23a 100644 --- a/src/Schema.php +++ b/src/Schema.php @@ -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; @@ -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); } @@ -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" @@ -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'], ); } @@ -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); } @@ -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 = << $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'], diff --git a/tests/Provider/SchemaProvider.php b/tests/Provider/SchemaProvider.php index 76b8f9a41..a663369f1 100644 --- a/tests/Provider/SchemaProvider.php +++ b/tests/Provider/SchemaProvider.php @@ -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 { @@ -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; diff --git a/tests/SchemaTest.php b/tests/SchemaTest.php index 132fe9521..2ac1934b9 100644 --- a/tests/SchemaTest.php +++ b/tests/SchemaTest.php @@ -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; @@ -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(); }