From 70e52a9105599b5b4152950d284979bca85dec28 Mon Sep 17 00:00:00 2001 From: Tigrov Date: Mon, 21 Jul 2025 17:09:52 +0300 Subject: [PATCH 1/2] Update according changes in `db` package --- src/DMLQueryBuilder.php | 2 +- src/Schema.php | 41 +++++++++++++------------ tests/CommandTest.php | 17 +++++----- tests/Provider/QueryBuilderProvider.php | 19 ++++++------ tests/Provider/SchemaProvider.php | 11 +++---- 5 files changed, 44 insertions(+), 46 deletions(-) diff --git a/src/DMLQueryBuilder.php b/src/DMLQueryBuilder.php index 3108ccd0..a7d7ac08 100644 --- a/src/DMLQueryBuilder.php +++ b/src/DMLQueryBuilder.php @@ -209,7 +209,7 @@ private function prepareUpsertParts( foreach ($constraints as $constraint) { $constraintCondition = ['and']; - $columnNames = $constraint->getColumnNames(); + $columnNames = $constraint->columnNames; foreach ($columnNames as $name) { $quotedName = $this->quoter->quoteColumnName($name); diff --git a/src/Schema.php b/src/Schema.php index 83ee5b63..e5d07172 100644 --- a/src/Schema.php +++ b/src/Schema.php @@ -4,10 +4,10 @@ namespace Yiisoft\Db\Mssql; -use Yiisoft\Db\Constraint\CheckConstraint; -use Yiisoft\Db\Constraint\DefaultValueConstraint; -use Yiisoft\Db\Constraint\ForeignKeyConstraint; -use Yiisoft\Db\Constraint\IndexConstraint; +use Yiisoft\Db\Constraint\Check; +use Yiisoft\Db\Constraint\DefaultValue; +use Yiisoft\Db\Constraint\ForeignKey; +use Yiisoft\Db\Constraint\Index; use Yiisoft\Db\Driver\Pdo\AbstractPdoSchema; use Yiisoft\Db\Exception\Exception; use Yiisoft\Db\Helper\DbArrayHelper; @@ -197,15 +197,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); } @@ -241,7 +241,7 @@ protected function loadTableIndexes(string $tableName): array * > $indexes */ foreach ($indexes as $name => $index) { - $result[] = new IndexConstraint( + $result[] = new Index( $name, array_column($index, 'column_name'), (bool) $index[0]['is_unique'], @@ -254,19 +254,19 @@ 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); } protected function loadTableDefaultValues(string $tableName): array { - /** @var DefaultValueConstraint[] */ + /** @var DefaultValue[] */ return $this->loadTableConstraints($tableName, self::DEFAULTS); } @@ -537,10 +537,10 @@ public function findUniqueIndexes(TableSchemaInterface $table): array * - checks * - defaults * - * @return CheckConstraint[]|DefaultValueConstraint[]|ForeignKeyConstraint[]|IndexConstraint|IndexConstraint[]|null + * @return Check[]|DefaultValue[]|ForeignKey[]|Index|Index[]|null * Constraints of the specified type. */ - private function loadTableConstraints(string $tableName, string $returnType): array|IndexConstraint|null + private function loadTableConstraints(string $tableName, string $returnType): array|Index|null { $sql = << $constraint) { /** @psalm-suppress ArgumentTypeCoercion */ match ($type) { - 'PK' => $result[self::PRIMARY_KEY] = new IndexConstraint( + 'PK' => $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_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_column($constraint, 'foreign_column_name'), - str_replace('_', ' ', $constraint[0]['on_update']), str_replace('_', ' ', $constraint[0]['on_delete']), + str_replace('_', ' ', $constraint[0]['on_update']), ), - 'UQ' => $result[self::UNIQUES][] = new IndexConstraint( + 'UQ' => $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'], ), - 'D' => $result[self::DEFAULTS][] = new DefaultValueConstraint( + 'D' => $result[self::DEFAULTS][] = new DefaultValue( $name, array_column($constraint, 'column_name'), $constraint[0]['default_expr'], diff --git a/tests/CommandTest.php b/tests/CommandTest.php index f60623a9..7cb1ccc8 100644 --- a/tests/CommandTest.php +++ b/tests/CommandTest.php @@ -5,6 +5,7 @@ namespace Yiisoft\Db\Mssql\Tests; use PHPUnit\Framework\Attributes\DataProviderExternal; +use Yiisoft\Db\Constraint\Index; use Yiisoft\Db\Exception\IntegrityException; use Yiisoft\Db\Exception\NotSupportedException; use Yiisoft\Db\Expression\Expression; @@ -301,13 +302,10 @@ public function testCreateClusteredColumnstoreIndex(): void $command->createTable($tableName, ['col1' => ColumnBuilder::integer()])->execute(); $command->createIndex($tableName, $indexName, '', IndexType::CLUSTERED_COLUMNSTORE)->execute(); - $this->assertCount(1, $schema->getTableIndexes($tableName)); - - $index = $schema->getTableIndexes($tableName)[0]; - - $this->assertSame(['col1'], $index->getColumnNames()); - $this->assertFalse($index->isUnique()); - $this->assertFalse($index->isPrimaryKey()); + $this->assertEquals( + [new Index($indexName, ['col1'])], + $schema->getTableIndexes($tableName), + ); $db->close(); } @@ -333,10 +331,9 @@ public function testCreateXmlIndex(): void $this->assertCount(3, $schema->getTableIndexes($tableName)); - $index = array_filter($schema->getTableIndexes($tableName), static fn ($index) => !$index->isPrimaryKey())[1]; + $index = array_filter($schema->getTableIndexes($tableName), static fn ($index) => !$index->isPrimaryKey)[1]; - $this->assertSame($indexColumns, $index->getColumnNames()); - $this->assertFalse($index->isUnique()); + $this->assertEquals(new Index($xmlIndexName, $indexColumns), $index); $db->close(); } diff --git a/tests/Provider/QueryBuilderProvider.php b/tests/Provider/QueryBuilderProvider.php index 7ca0af11..e931fe80 100644 --- a/tests/Provider/QueryBuilderProvider.php +++ b/tests/Provider/QueryBuilderProvider.php @@ -8,7 +8,7 @@ use Yiisoft\Db\Constant\DataType; use Yiisoft\Db\Constant\PseudoType; use Yiisoft\Db\Constant\ReferentialAction; -use Yiisoft\Db\Constraint\ForeignKeyConstraint; +use Yiisoft\Db\Constraint\ForeignKey; use Yiisoft\Db\Expression\Expression; use Yiisoft\Db\Mssql\Column\ColumnBuilder; use Yiisoft\Db\Mssql\Tests\Support\TestTrait; @@ -774,14 +774,15 @@ public static function buildColumnDefinition(): array $values['unique()'][0] = 'nvarchar(255) UNIQUE'; $values['unsigned()'][0] = 'int'; $values['integer(8)->scale(2)'][0] = 'int'; - $values['reference($reference)'][0] = 'int REFERENCES [ref_table] ([id]) ON DELETE CASCADE ON UPDATE CASCADE'; - $values['reference($referenceWithSchema)'][0] = 'int REFERENCES [ref_schema].[ref_table] ([id]) ON DELETE CASCADE ON UPDATE CASCADE'; - - $referenceRestrict = new ForeignKeyConstraint(); - $referenceRestrict->foreignColumnNames(['id']); - $referenceRestrict->foreignTableName('ref_table'); - $referenceRestrict->onDelete(ReferentialAction::RESTRICT); - $referenceRestrict->onUpdate(ReferentialAction::RESTRICT); + $values['reference($reference)'][0] = 'int REFERENCES [ref_table] ([id]) ON DELETE SET NULL ON UPDATE CASCADE'; + $values['reference($referenceWithSchema)'][0] = 'int REFERENCES [ref_schema].[ref_table] ([id]) ON DELETE SET NULL ON UPDATE CASCADE'; + + $referenceRestrict = new ForeignKey( + foreignTableName: 'ref_table', + foreignColumnNames: ['id'], + onDelete: ReferentialAction::RESTRICT, + onUpdate: ReferentialAction::RESTRICT, + ); $values[] = ['int REFERENCES [ref_table] ([id])', ColumnBuilder::integer()->reference($referenceRestrict)]; diff --git a/tests/Provider/SchemaProvider.php b/tests/Provider/SchemaProvider.php index e4c1346d..1f35d054 100644 --- a/tests/Provider/SchemaProvider.php +++ b/tests/Provider/SchemaProvider.php @@ -7,7 +7,7 @@ use DateTimeImmutable; use DateTimeZone; use Yiisoft\Db\Constant\ColumnType; -use Yiisoft\Db\Constraint\DefaultValueConstraint; +use Yiisoft\Db\Constraint\DefaultValue; use Yiisoft\Db\Mssql\Column\BinaryColumn; use Yiisoft\Db\Mssql\Column\DateTimeColumn; use Yiisoft\Db\Schema\Column\BooleanColumn; @@ -15,6 +15,7 @@ use Yiisoft\Db\Schema\Column\IntegerColumn; 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 { @@ -136,12 +137,10 @@ public static function constraints(): array { $constraints = parent::constraints(); - $constraints['1: check'][2][0]->expression('([C_check]<>\'\')'); - $constraints['1: default'][2] = [new DefaultValueConstraint('', ['C_default'], '((0))')]; - + Assert::setPropertyValue($constraints['1: check'][2][0], 'expression', "([C_check]<>'')"); + $constraints['1: default'][2] = [new DefaultValue('', ['C_default'], '((0))')]; $constraints['2: default'][2] = []; - - $constraints['3: foreign key'][2][0]->foreignTableName('dbo.T_constraints_2'); + Assert::setPropertyValue($constraints['3: foreign key'][2][0], 'foreignSchemaName', 'dbo'); $constraints['3: index'][2] = []; $constraints['3: default'][2] = []; $constraints['4: default'][2] = []; From e6ceb44d43c7da3bc6d149d42fe1afb8f3c28ef1 Mon Sep 17 00:00:00 2001 From: Tigrov Date: Mon, 21 Jul 2025 18:15:53 +0300 Subject: [PATCH 2/2] Update CHANGELOG.md [skip ci] --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 71220211..26222980 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,7 +45,7 @@ - Enh #361, #362: Refactor `DMLQueryBuilder::insertWithReturningPks()` method (@Tigrov) - New #361, #362: Implement `DMLQueryBuilder::upsertReturning()` method (@Tigrov) - Chg #363: Add alias in `DQLQueryBuilder::selectExists()` method for consistency with other DBMS (@Tigrov) -- Enh #364: Refactor constraints (@Tigrov) +- Enh #364, #377: Refactor constraints (@Tigrov) - Chg #366: Rename `DMLQueryBuilder::insertWithReturningPks()` to `DMLQueryBuilder::insertReturningPks()` (@Tigrov) - Enh #372: Provide `yiisoft/db-implementation` virtual package (@vjik) - Enh #375: Adapt to `Param` refactoring in `yiisoft/db` package (@vjik)