Skip to content

Commit 66bcb27

Browse files
authored
Refactor ColumnDefinitionBuilder (#291)
1 parent 9110d15 commit 66bcb27

6 files changed

+27
-48
lines changed

CHANGELOG.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
- Enh #277: Raise minimum PHP version to `^8.1` with minor refactoring (@Tigrov)
1414
- New #276, #288: Implement `ColumnFactory` class (@Tigrov)
1515
- Enh #279: Separate column type constants (@Tigrov)
16-
- New #280: Realize `ColumnBuilder` class (@Tigrov)
16+
- New #280, #291: Realize `ColumnBuilder` class (@Tigrov)
1717
- Enh #281: Update according changes in `ColumnSchemaInterface` (@Tigrov)
18-
- New #282: Add `ColumnDefinitionBuilder` class (@Tigrov)
18+
- New #282, #291: Add `ColumnDefinitionBuilder` class (@Tigrov)
1919
- Bug #285: Fix `DMLQueryBuilder::insertBatch()` method (@Tigrov)
2020
- Enh #283: Refactor `Dsn` class (@Tigrov)
2121
- Enh #286: Use constructor to create columns and initialize properties (@Tigrov)

src/Column/ColumnBuilder.php

-20
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,6 @@
99

1010
final class ColumnBuilder extends \Yiisoft\Db\Schema\Column\ColumnBuilder
1111
{
12-
public static function tinyint(int|null $size = 3): ColumnSchemaInterface
13-
{
14-
return parent::tinyint($size);
15-
}
16-
17-
public static function smallint(int|null $size = 5): ColumnSchemaInterface
18-
{
19-
return parent::smallint($size);
20-
}
21-
22-
public static function integer(int|null $size = 10): ColumnSchemaInterface
23-
{
24-
return parent::integer($size);
25-
}
26-
27-
public static function bigint(int|null $size = 20): ColumnSchemaInterface
28-
{
29-
return parent::bigint($size);
30-
}
31-
3212
public static function binary(int|null $size = null): ColumnSchemaInterface
3313
{
3414
return new BinaryColumnSchema(ColumnType::BINARY, size: $size);

src/Column/ColumnDefinitionBuilder.php

+9-7
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ final class ColumnDefinitionBuilder extends AbstractColumnDefinitionBuilder
1919
protected const GENERATE_UUID_EXPRESSION = 'sys_guid()';
2020

2121
protected const TYPES_WITH_SIZE = [
22+
'char',
23+
'nchar',
24+
'character',
25+
'varchar',
2226
'varchar2',
2327
'nvarchar2',
2428
'number',
@@ -27,8 +31,6 @@ final class ColumnDefinitionBuilder extends AbstractColumnDefinitionBuilder
2731
'interval day(0) to second',
2832
'raw',
2933
'urowid',
30-
'char',
31-
'nchar',
3234
];
3335

3436
protected const TYPES_WITH_SCALE = [
@@ -67,7 +69,7 @@ protected function getDbType(ColumnSchemaInterface $column): string
6769
$size = $column->getSize();
6870

6971
/** @psalm-suppress DocblockTypeContradiction */
70-
return match ($column->getType()) {
72+
return $column->getDbType() ?? match ($column->getType()) {
7173
ColumnType::BOOLEAN => 'number(1)',
7274
ColumnType::BIT => match (true) {
7375
$size === null => 'number(38)',
@@ -83,17 +85,17 @@ protected function getDbType(ColumnSchemaInterface $column): string
8385
ColumnType::DECIMAL => 'number(' . ($size ?? 10) . ',' . ($column->getScale() ?? 0) . ')',
8486
ColumnType::MONEY => 'number(' . ($size ?? 19) . ',' . ($column->getScale() ?? 4) . ')',
8587
ColumnType::CHAR => 'char',
86-
ColumnType::STRING => 'varchar2',
88+
ColumnType::STRING => 'varchar2(' . ($size ?? 255) . ')',
8789
ColumnType::TEXT => 'clob',
8890
ColumnType::BINARY => 'blob',
8991
ColumnType::UUID => 'raw(16)',
9092
ColumnType::DATETIME => 'timestamp',
9193
ColumnType::TIMESTAMP => 'timestamp',
9294
ColumnType::DATE => 'date',
9395
ColumnType::TIME => 'interval day(0) to second',
94-
ColumnType::ARRAY => 'json',
95-
ColumnType::STRUCTURED => 'json',
96-
ColumnType::JSON => 'json',
96+
ColumnType::ARRAY => 'clob',
97+
ColumnType::STRUCTURED => 'clob',
98+
ColumnType::JSON => 'clob',
9799
default => 'varchar2',
98100
};
99101
}

src/Column/ColumnFactory.php

+2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ final class ColumnFactory extends AbstractColumnFactory
2525
protected const TYPE_MAP = [
2626
'char' => ColumnType::CHAR,
2727
'nchar' => ColumnType::CHAR,
28+
'character' => ColumnType::CHAR,
29+
'varchar' => ColumnType::STRING,
2830
'varchar2' => ColumnType::STRING,
2931
'nvarchar2' => ColumnType::STRING,
3032
'clob' => ColumnType::TEXT,

tests/Provider/ColumnBuilderProvider.php

-10
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,6 @@ public static function buildingMethods(): array
1212
{
1313
$values = parent::buildingMethods();
1414

15-
$values['primaryKey()'][4]['getSize'] = 10;
16-
$values['primaryKey(false)'][4]['getSize'] = 10;
17-
$values['smallPrimaryKey()'][4]['getSize'] = 5;
18-
$values['smallPrimaryKey(false)'][4]['getSize'] = 5;
19-
$values['bigPrimaryKey()'][4]['getSize'] = 20;
20-
$values['bigPrimaryKey(false)'][4]['getSize'] = 20;
21-
$values['tinyint()'][4]['getSize'] = 3;
22-
$values['smallint()'][4]['getSize'] = 5;
23-
$values['integer()'][4]['getSize'] = 10;
24-
$values['bigint()'][4]['getSize'] = 20;
2515
$values['binary()'][2] = BinaryColumnSchema::class;
2616
$values['binary(8)'][2] = BinaryColumnSchema::class;
2717

tests/Provider/QueryBuilderProvider.php

+14-9
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ public static function buildColumnDefinition(): array
248248
$values[PseudoType::UBIGPK][0] = 'number(20) GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY';
249249
$values[PseudoType::UUID_PK][0] = 'raw(16) DEFAULT sys_guid() PRIMARY KEY';
250250
$values[PseudoType::UUID_PK_SEQ][0] = 'raw(16) DEFAULT sys_guid() PRIMARY KEY';
251-
$values['STRING'][0] = 'varchar2';
251+
$values['STRING'][0] = 'varchar2(255)';
252252
$values['STRING(100)'][0] = 'varchar2(100)';
253253
$values['primaryKey()'][0] = 'number(10) GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY';
254254
$values['primaryKey(false)'][0] = 'number(10) PRIMARY KEY';
@@ -263,7 +263,7 @@ public static function buildColumnDefinition(): array
263263
$values['bit()'][0] = 'number(38)';
264264
$values['bit(1)'][0] = 'number(1)';
265265
$values['bit(8)'][0] = 'number(3)';
266-
$values['bit(1000)'][0] = 'raw(125)';
266+
$values['bit(64)'][0] = 'number(20)';
267267
$values['tinyint()'][0] = 'number(3)';
268268
$values['tinyint(2)'][0] = 'number(2)';
269269
$values['smallint()'][0] = 'number(5)';
@@ -288,7 +288,7 @@ public static function buildColumnDefinition(): array
288288
$values['money(null)'][0] = 'number(19,4)';
289289
$values['string()'][0] = 'varchar2(255)';
290290
$values['string(100)'][0] = 'varchar2(100)';
291-
$values['string(null)'][0] = 'varchar2';
291+
$values['string(null)'][0] = 'varchar2(255)';
292292
$values['text()'][0] = 'clob';
293293
$values['text(1000)'][0] = 'clob';
294294
$values['binary()'][0] = 'blob';
@@ -300,18 +300,23 @@ public static function buildColumnDefinition(): array
300300
$values['time()'][0] = 'interval day(0) to second(0)';
301301
$values['time(6)'][0] = 'interval day(0) to second(6)';
302302
$values['time(null)'][0] = 'interval day(0) to second';
303+
$values['array()'][0] = 'clob';
304+
$values['structured()'][0] = 'clob';
305+
$values["structured('json')"] = ['blob', ColumnBuilder::structured('blob')];
306+
$values['json()'][0] = 'clob';
307+
$values['json(100)'][0] = 'clob';
308+
$values["extra('NOT NULL')"][0] = 'varchar2(255) NOT NULL';
309+
$values["extra('')"][0] = 'varchar2(255)';
310+
$values["check('value > 5')"][0] = 'number(10) CHECK ("col_59" > 5)';
311+
$values["check('')"][0] = 'number(10)';
312+
$values['check(null)'][0] = 'number(10)';
303313
$values["comment('comment')"][0] = 'varchar2(255)';
304314
$values["comment('')"][0] = 'varchar2(255)';
305315
$values['comment(null)'][0] = 'varchar2(255)';
306-
$values["extra('bar')"][0] = 'varchar2(255) bar';
307-
$values["extra('')"][0] = 'varchar2(255)';
308-
$values["check('value > 5')"][0] = 'varchar2(255) CHECK (value > 5)';
309-
$values["check('')"][0] = 'varchar2(255)';
310-
$values['check(null)'][0] = 'varchar2(255)';
311316
$values["defaultValue('value')"][0] = "varchar2(255) DEFAULT 'value'";
312317
$values["defaultValue('')"][0] = "varchar2(255) DEFAULT ''";
313318
$values['defaultValue(null)'][0] = 'varchar2(255) DEFAULT NULL';
314-
$values['defaultValue($expression)'][0] = 'varchar2(255) DEFAULT expression';
319+
$values['defaultValue($expression)'][0] = 'number(10) DEFAULT (1 + 2)';
315320
$values['notNull()->defaultValue(null)'][0] = 'varchar2(255) NOT NULL';
316321
$values['notNull()'][0] = 'varchar2(255) NOT NULL';
317322
$values['null()'][0] = 'varchar2(255) NULL';

0 commit comments

Comments
 (0)