Skip to content

Commit c0573bc

Browse files
authored
Add ConnectionInterface::getColumnBuilderClass() (#1034)
1 parent 0326d09 commit c0573bc

8 files changed

Lines changed: 45 additions & 36 deletions

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@
131131
- New #1024: Add `ColumnName` and `Value` expressions (@vjik)
132132
- Chg #1025: Move expression builders to `Yiisoft\Db\Expression\Builder` namespace (@vjik)
133133
- Chg #1026: Remove `precision()`, `getPrecision()` and `getPhpType()` methods from `ColumnInterface` (@vjik)
134+
- New #1034: Add `ConnectionInterface::getColumnBuilderClass()` method (@Tigrov)
134135
- Enh #1031: Optimize SQL generation for `Not` condition (@vjik)
135136

136137
## 1.3.0 March 21, 2024

UPGRADE.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ Each table column has its own class in the `Yiisoft\Db\Schema\Column` namespace
136136
- `QueryPartsInterface::setFor()` - overwrites the `FOR` part of the query;
137137
- `QueryPartsInterface::setWhere()` - overwrites the `WHERE` part of the query;
138138
- `QueryPartsInterface::setHaving()` - overwrites the `HAVING` part of the query;
139+
- `ConnectionInterface::getColumnBuilderClass()` - returns the column builder class name for concrete DBMS;
139140
- `ConnectionInterface::getColumnFactory()` - returns the column factory object for concrete DBMS;
140141
- `ConnectionInterface::getServerInfo()` - returns `ServerInfoInterface` instance which provides server information;
141142
- `ConnectionInterface::createQuery()` - creates a `Query` object;

src/Connection/AbstractConnection.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Yiisoft\Db\Query\BatchQueryResultInterface;
1212
use Yiisoft\Db\Query\Query;
1313
use Yiisoft\Db\Query\QueryInterface;
14+
use Yiisoft\Db\Schema\Column\ColumnBuilder;
1415
use Yiisoft\Db\Schema\TableSchemaInterface;
1516
use Yiisoft\Db\Transaction\TransactionInterface;
1617

@@ -50,6 +51,11 @@ public function createQuery(): QueryInterface
5051
return new Query($this);
5152
}
5253

54+
public function getColumnBuilderClass(): string
55+
{
56+
return ColumnBuilder::class;
57+
}
58+
5359
public function getTablePrefix(): string
5460
{
5561
return $this->tablePrefix;

src/Connection/ConnectionInterface.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use Yiisoft\Db\Query\QueryInterface;
1717
use Yiisoft\Db\Query\QueryPartsInterface;
1818
use Yiisoft\Db\QueryBuilder\QueryBuilderInterface;
19+
use Yiisoft\Db\Schema\Column\ColumnBuilder;
1920
use Yiisoft\Db\Schema\Column\ColumnFactoryInterface;
2021
use Yiisoft\Db\Schema\QuoterInterface;
2122
use Yiisoft\Db\Schema\SchemaInterface;
@@ -95,6 +96,13 @@ public function createTransaction(): TransactionInterface;
9596
*/
9697
public function close(): void;
9798

99+
/**
100+
* Returns the column builder class name for the current DB connection.
101+
*
102+
* @psalm-return class-string<ColumnBuilder>
103+
*/
104+
public function getColumnBuilderClass(): string;
105+
98106
/**
99107
* Returns the column factory for creating column instances.
100108
*/

src/Debug/ConnectionInterfaceProxy.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ public function close(): void
7070
$this->connection->close();
7171
}
7272

73+
public function getColumnBuilderClass(): string
74+
{
75+
return $this->connection->getColumnBuilderClass();
76+
}
77+
7378
public function getColumnFactory(): ColumnFactoryInterface
7479
{
7580
return $this->connection->getColumnFactory();

tests/AbstractColumnBuilderTest.php

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44

55
namespace Yiisoft\Db\Tests;
66

7+
use PHPUnit\Framework\Attributes\DataProviderExternal;
78
use PHPUnit\Framework\TestCase;
8-
use Yiisoft\Db\Schema\Column\ColumnBuilder;
99
use Yiisoft\Db\Tests\Provider\ColumnBuilderProvider;
1010
use Yiisoft\Db\Tests\Support\TestTrait;
1111

@@ -15,22 +15,15 @@ abstract class AbstractColumnBuilderTest extends TestCase
1515
{
1616
use TestTrait;
1717

18-
public function getColumnBuilderClass(): string
19-
{
20-
return ColumnBuilder::class;
21-
}
22-
23-
/**
24-
* @dataProvider \Yiisoft\Db\Tests\Provider\ColumnBuilderProvider::buildingMethods
25-
*/
18+
#[DataProviderExternal(ColumnBuilderProvider::class, 'buildingMethods')]
2619
public function testBuildingMethods(
2720
string $buildingMethod,
2821
array $args,
2922
string $expectedInstanceOf,
3023
string $expectedType,
3124
array $expectedMethodResults = [],
3225
): void {
33-
$columnBuilderClass = $this->getColumnBuilderClass();
26+
$columnBuilderClass = $this->getConnection()->getColumnBuilderClass();
3427

3528
$column = $columnBuilderClass::$buildingMethod(...$args);
3629

tests/AbstractConnectionTest.php

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,15 @@
44

55
namespace Yiisoft\Db\Tests;
66

7-
use Exception;
87
use PHPUnit\Framework\TestCase;
9-
use Throwable;
108
use Yiisoft\Db\Driver\Pdo\PdoConnectionInterface;
11-
use Yiisoft\Db\Exception\InvalidConfigException;
129
use Yiisoft\Db\Exception\NotSupportedException;
1310
use Yiisoft\Db\Profiler\Context\ConnectionContext;
1411
use Yiisoft\Db\Profiler\ContextInterface;
1512
use Yiisoft\Db\Profiler\ProfilerInterface;
1613
use Yiisoft\Db\Query\BatchQueryResult;
1714
use Yiisoft\Db\Query\Query;
15+
use Yiisoft\Db\Schema\Column\ColumnBuilder;
1816
use Yiisoft\Db\Tests\Support\Assert;
1917
use Yiisoft\Db\Tests\Support\DbHelper;
2018
use Yiisoft\Db\Tests\Support\Stub\ColumnFactory;
@@ -25,9 +23,6 @@ abstract class AbstractConnectionTest extends TestCase
2523
{
2624
use TestTrait;
2725

28-
/**
29-
* @throws Exception
30-
*/
3126
public function testConnection(): void
3227
{
3328
$this->assertInstanceOf(PdoConnectionInterface::class, $this->getConnection());
@@ -42,10 +37,6 @@ public function testCreateBatchQueryResult(): void
4237
$this->assertInstanceOf(BatchQueryResult::class, $db->createBatchQueryResult($query));
4338
}
4439

45-
/**
46-
* @throws InvalidConfigException
47-
* @throws \Yiisoft\Db\Exception\Exception
48-
*/
4940
public function testCreateCommand(): void
5041
{
5142
$db = $this->getConnection();
@@ -68,9 +59,6 @@ public function testGetDriverName(): void
6859
$this->assertSame($this->getDriverName(), $db->getDriverName());
6960
}
7061

71-
/**
72-
* @throws Throwable
73-
*/
7462
public function testNestedTransactionNotSupported(): void
7563
{
7664
$db = $this->getConnection();
@@ -161,6 +149,15 @@ private function getProfiler(): ProfilerInterface
161149
return $this->createMock(ProfilerInterface::class);
162150
}
163151

152+
public function getColumnBuilderClass(): void
153+
{
154+
$db = $this->getConnection();
155+
156+
$this->assertSame(ColumnBuilder::class, $db->getColumnBuilderClass());
157+
158+
$db->close();
159+
}
160+
164161
public function testGetColumnFactory(): void
165162
{
166163
$db = $this->getConnection();

tests/Common/CommonColumnTest.php

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
use PHPUnit\Framework\Attributes\DataProviderExternal;
1111
use Yiisoft\Db\Connection\ConnectionInterface;
1212
use Yiisoft\Db\Expression\Expression;
13-
use Yiisoft\Db\Schema\Column\ColumnBuilder;
1413
use Yiisoft\Db\Tests\AbstractColumnTest;
1514
use Yiisoft\Db\Tests\Provider\ColumnProvider;
1615
use Yiisoft\Db\Tests\Support\Stringable;
@@ -27,8 +26,6 @@ abstract class CommonColumnTest extends AbstractColumnTest
2726

2827
protected const DATETIME_COLUMN_TABLE = 'datetime_column_test';
2928

30-
protected const COLUMN_BUILDER = ColumnBuilder::class;
31-
3229
abstract protected function insertTypeValues(ConnectionInterface $db): void;
3330

3431
abstract protected function assertTypecastedValues(array $result, bool $allTypecasted = false): void;
@@ -119,22 +116,23 @@ public function createDateTimeColumnTable(ConnectionInterface $db): void
119116
{
120117
$schema = $db->getSchema();
121118
$command = $db->createCommand();
119+
$columnBuilder = $db->getColumnBuilderClass();
122120

123121
if ($schema->hasTable(static::DATETIME_COLUMN_TABLE)) {
124122
$command->dropTable(static::DATETIME_COLUMN_TABLE)->execute();
125123
}
126124

127125
$command->createTable(static::DATETIME_COLUMN_TABLE, [
128-
'timestamp' => static::COLUMN_BUILDER::timestamp()->defaultValue(new Expression('CURRENT_TIMESTAMP')),
129-
'datetime' => static::COLUMN_BUILDER::datetime()->defaultValue('2025-04-19 14:11:35'),
130-
'datetime3' => static::COLUMN_BUILDER::datetime(3)->defaultValue(new Stringable('2025-04-19 14:11:35.123')),
131-
'datetimetz' => static::COLUMN_BUILDER::datetimeWithTimezone()->defaultValue(new DateTime('2025-04-19 14:11:35 +02:00')),
132-
'datetimetz6' => static::COLUMN_BUILDER::datetimeWithTimezone(6)->defaultValue(new DateTimeImmutable('2025-04-19 14:11:35.123456 +02:00')),
133-
'time' => static::COLUMN_BUILDER::time()->defaultValue('14:11:35'),
134-
'time3' => static::COLUMN_BUILDER::time(3)->defaultValue(new Stringable('14:11:35.123')),
135-
'timetz' => static::COLUMN_BUILDER::timeWithTimezone()->defaultValue(new DateTime('14:11:35 +02:00')),
136-
'timetz6' => static::COLUMN_BUILDER::timeWithTimezone(6)->defaultValue(new DateTimeImmutable('14:11:35.123456 +02:00')),
137-
'date' => static::COLUMN_BUILDER::date()->defaultValue('2025-04-19'),
126+
'timestamp' => $columnBuilder::timestamp()->defaultValue(new Expression('CURRENT_TIMESTAMP')),
127+
'datetime' => $columnBuilder::datetime()->defaultValue('2025-04-19 14:11:35'),
128+
'datetime3' => $columnBuilder::datetime(3)->defaultValue(new Stringable('2025-04-19 14:11:35.123')),
129+
'datetimetz' => $columnBuilder::datetimeWithTimezone()->defaultValue(new DateTime('2025-04-19 14:11:35 +02:00')),
130+
'datetimetz6' => $columnBuilder::datetimeWithTimezone(6)->defaultValue(new DateTimeImmutable('2025-04-19 14:11:35.123456 +02:00')),
131+
'time' => $columnBuilder::time()->defaultValue('14:11:35'),
132+
'time3' => $columnBuilder::time(3)->defaultValue(new Stringable('14:11:35.123')),
133+
'timetz' => $columnBuilder::timeWithTimezone()->defaultValue(new DateTime('14:11:35 +02:00')),
134+
'timetz6' => $columnBuilder::timeWithTimezone(6)->defaultValue(new DateTimeImmutable('14:11:35.123456 +02:00')),
135+
'date' => $columnBuilder::date()->defaultValue('2025-04-19'),
138136
])->execute();
139137
}
140138

0 commit comments

Comments
 (0)