From 32db5a1ed5a9808a8ad9582855c317e210c2a111 Mon Sep 17 00:00:00 2001 From: Tigrov Date: Tue, 18 Mar 2025 17:35:05 +0700 Subject: [PATCH 1/5] Implement the ability for user-defined type casting --- src/Column/ColumnFactory.php | 13 +++++++------ tests/ColumnFactoryTest.php | 6 ++++++ tests/Support/TestTrait.php | 2 +- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/Column/ColumnFactory.php b/src/Column/ColumnFactory.php index 53a8d5e4..15ceef0f 100644 --- a/src/Column/ColumnFactory.php +++ b/src/Column/ColumnFactory.php @@ -55,13 +55,14 @@ final class ColumnFactory extends AbstractColumnFactory 'json' => ColumnType::JSON, ]; - protected function getType(string $dbType, array $info = []): string + protected function getType(string $dbType, array &$info = []): string { - if ($dbType === 'bit' && isset($info['size']) && $info['size'] === 1) { - return ColumnType::BOOLEAN; - } - - return parent::getType($dbType, $info); + /** @psalm-var ColumnType::* */ + return $this->mapType($this->typeMap, $dbType, $info) + ?? ($dbType === 'bit' && isset($info['size']) && $info['size'] === 1 + ? ColumnType::BOOLEAN + : parent::getType($dbType, $info) + ); } protected function normalizeDefaultValue(string|null $defaultValue, ColumnInterface $column): mixed diff --git a/tests/ColumnFactoryTest.php b/tests/ColumnFactoryTest.php index 7bc5d170..1621bd17 100644 --- a/tests/ColumnFactoryTest.php +++ b/tests/ColumnFactoryTest.php @@ -7,6 +7,7 @@ use PHPUnit\Framework\Attributes\DataProviderExternal; use Yiisoft\Db\Constant\ColumnType; use Yiisoft\Db\Expression\Expression; +use Yiisoft\Db\Mysql\Column\ColumnFactory; use Yiisoft\Db\Mysql\Tests\Provider\ColumnFactoryProvider; use Yiisoft\Db\Mysql\Tests\Support\TestTrait; use Yiisoft\Db\Schema\Column\ColumnInterface; @@ -19,6 +20,11 @@ final class ColumnFactoryTest extends AbstractColumnFactoryTest { use TestTrait; + protected function getColumnFactoryClass(): string + { + return ColumnFactory::class; + } + #[DataProviderExternal(ColumnFactoryProvider::class, 'dbTypes')] public function testFromDbType(string $dbType, string $expectedType, string $expectedInstanceOf): void { diff --git a/tests/Support/TestTrait.php b/tests/Support/TestTrait.php index 4d10de13..aec72d3a 100644 --- a/tests/Support/TestTrait.php +++ b/tests/Support/TestTrait.php @@ -71,7 +71,7 @@ public static function setUpBeforeClass(): void $db->close(); } - private function getDriver(): PdoDriverInterface + protected function getDriver(): PdoDriverInterface { return new Driver($this->getDsn(), self::getUsername(), self::getPassword()); } From 4dac8ac411de2e84455e95d8fc80fcc1116a2510 Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Tue, 18 Mar 2025 10:35:21 +0000 Subject: [PATCH 2/5] Apply fixes from StyleCI --- src/Column/ColumnFactory.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Column/ColumnFactory.php b/src/Column/ColumnFactory.php index 15ceef0f..6bddd8df 100644 --- a/src/Column/ColumnFactory.php +++ b/src/Column/ColumnFactory.php @@ -59,7 +59,8 @@ protected function getType(string $dbType, array &$info = []): string { /** @psalm-var ColumnType::* */ return $this->mapType($this->typeMap, $dbType, $info) - ?? ($dbType === 'bit' && isset($info['size']) && $info['size'] === 1 + ?? ( + $dbType === 'bit' && isset($info['size']) && $info['size'] === 1 ? ColumnType::BOOLEAN : parent::getType($dbType, $info) ); From db0ab3b8ff83bf3dca9a5d4d33bca9aff3504f9e Mon Sep 17 00:00:00 2001 From: Tigrov Date: Fri, 28 Mar 2025 13:25:49 +0700 Subject: [PATCH 3/5] Update --- src/Column/ColumnFactory.php | 14 ++++++-------- src/DQLQueryBuilder.php | 1 - 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/Column/ColumnFactory.php b/src/Column/ColumnFactory.php index 6bddd8df..53a8d5e4 100644 --- a/src/Column/ColumnFactory.php +++ b/src/Column/ColumnFactory.php @@ -55,15 +55,13 @@ final class ColumnFactory extends AbstractColumnFactory 'json' => ColumnType::JSON, ]; - protected function getType(string $dbType, array &$info = []): string + protected function getType(string $dbType, array $info = []): string { - /** @psalm-var ColumnType::* */ - return $this->mapType($this->typeMap, $dbType, $info) - ?? ( - $dbType === 'bit' && isset($info['size']) && $info['size'] === 1 - ? ColumnType::BOOLEAN - : parent::getType($dbType, $info) - ); + if ($dbType === 'bit' && isset($info['size']) && $info['size'] === 1) { + return ColumnType::BOOLEAN; + } + + return parent::getType($dbType, $info); } protected function normalizeDefaultValue(string|null $defaultValue, ColumnInterface $column): mixed diff --git a/src/DQLQueryBuilder.php b/src/DQLQueryBuilder.php index 47e07642..26aea00d 100644 --- a/src/DQLQueryBuilder.php +++ b/src/DQLQueryBuilder.php @@ -11,7 +11,6 @@ use Yiisoft\Db\Mysql\Builder\LikeConditionBuilder; use Yiisoft\Db\QueryBuilder\AbstractDQLQueryBuilder; use Yiisoft\Db\QueryBuilder\Condition\JsonOverlapsCondition; - use Yiisoft\Db\QueryBuilder\Condition\LikeCondition; use function ctype_digit; From 945489271da3439424b975e7be2e3ece6a6fa9f0 Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Fri, 28 Mar 2025 06:26:06 +0000 Subject: [PATCH 4/5] Apply fixes from StyleCI --- tests/DeadLockTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/DeadLockTest.php b/tests/DeadLockTest.php index 5392f71c..20c1ffe0 100644 --- a/tests/DeadLockTest.php +++ b/tests/DeadLockTest.php @@ -42,7 +42,7 @@ */ final class DeadLockTest extends TestCase { - use testTrait; + use TestTrait; private const CHILD_EXIT_CODE_DEADLOCK = 15; private string $logFile = ''; From 17a1674201edde4a8beb724eb03a63a1b0370754 Mon Sep 17 00:00:00 2001 From: Tigrov Date: Thu, 17 Apr 2025 14:49:41 +0700 Subject: [PATCH 5/5] Use `Connection::$columnFactory` property --- src/Connection.php | 2 +- tests/ConnectionTest.php | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/Connection.php b/src/Connection.php index df31886c..03c42512 100644 --- a/src/Connection.php +++ b/src/Connection.php @@ -67,7 +67,7 @@ public function createTransaction(): TransactionInterface public function getColumnFactory(): ColumnFactoryInterface { - return new ColumnFactory(); + return $this->columnFactory ??= new ColumnFactory(); } public function getQueryBuilder(): QueryBuilderInterface diff --git a/tests/ConnectionTest.php b/tests/ConnectionTest.php index f4cb4dd0..0ca0cbbf 100644 --- a/tests/ConnectionTest.php +++ b/tests/ConnectionTest.php @@ -12,8 +12,10 @@ use Yiisoft\Db\Exception\InvalidConfigException; use Yiisoft\Db\Exception\NotSupportedException; use Yiisoft\Db\Mysql\Column\ColumnFactory; +use Yiisoft\Db\Mysql\Connection; use Yiisoft\Db\Mysql\Tests\Support\TestTrait; use Yiisoft\Db\Tests\Common\CommonConnectionTest; +use Yiisoft\Db\Tests\Support\DbHelper; use Yiisoft\Db\Transaction\TransactionInterface; /** @@ -168,4 +170,15 @@ public function testGetColumnFactory(): void $db->close(); } + + public function testUserDefinedColumnFactory(): void + { + $columnFactory = new ColumnFactory(); + + $db = new Connection($this->getDriver(), DbHelper::getSchemaCache(), $columnFactory); + + $this->assertSame($columnFactory, $db->getColumnFactory()); + + $db->close(); + } }