Skip to content

Commit 6ecdb38

Browse files
authored
Separate column type constants (#279)
1 parent 40bb07d commit 6ecdb38

File tree

9 files changed

+87
-81
lines changed

9 files changed

+87
-81
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
- Enh #275: Refactor PHP type of `ColumnSchemaInterface` instances (@Tigrov)
1313
- Enh #277: Raise minimum PHP version to `^8.1` with minor refactoring (@Tigrov)
1414
- Enh #276: Implement `ColumnFactory` class (@Tigrov)
15+
- Enh #279: Separate column type constants (@Tigrov)
1516

1617
## 1.3.0 March 21, 2024
1718

src/Column.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* For example, the following code creates a column schema for an integer column:
1616
*
1717
* ```php
18-
* $column = (new Column(SchemaInterface::TYPE_INTEGER))->notNull()->defaultValue(0);
18+
* $column = (new Column(ColumnType::INTEGER))->notNull()->defaultValue(0);
1919
* ```
2020
*
2121
* Provides a fluent interface, which means that the methods can be chained together to create a column schema with

src/Column/ColumnFactory.php

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44

55
namespace Yiisoft\Db\Oracle\Column;
66

7+
use Yiisoft\Db\Constant\ColumnType;
78
use Yiisoft\Db\Schema\Column\AbstractColumnFactory;
89
use Yiisoft\Db\Schema\Column\ColumnSchemaInterface;
9-
use Yiisoft\Db\Schema\SchemaInterface;
1010

1111
use function preg_replace;
1212
use function strtolower;
@@ -23,28 +23,28 @@ final class ColumnFactory extends AbstractColumnFactory
2323
* @psalm-suppress MissingClassConstType
2424
*/
2525
private const TYPE_MAP = [
26-
'char' => SchemaInterface::TYPE_CHAR,
27-
'nchar' => SchemaInterface::TYPE_CHAR,
28-
'varchar2' => SchemaInterface::TYPE_STRING,
29-
'nvarchar2' => SchemaInterface::TYPE_STRING,
30-
'clob' => SchemaInterface::TYPE_TEXT,
31-
'nclob' => SchemaInterface::TYPE_TEXT,
32-
'blob' => SchemaInterface::TYPE_BINARY,
33-
'bfile' => SchemaInterface::TYPE_BINARY,
34-
'long raw' => SchemaInterface::TYPE_BINARY,
35-
'raw' => SchemaInterface::TYPE_BINARY,
36-
'number' => SchemaInterface::TYPE_DECIMAL,
37-
'binary_float' => SchemaInterface::TYPE_FLOAT, // 32 bit
38-
'binary_double' => SchemaInterface::TYPE_DOUBLE, // 64 bit
39-
'float' => SchemaInterface::TYPE_DOUBLE, // 126 bit
40-
'date' => SchemaInterface::TYPE_DATE,
41-
'interval day to second' => SchemaInterface::TYPE_TIME,
42-
'timestamp' => SchemaInterface::TYPE_TIMESTAMP,
43-
'timestamp with time zone' => SchemaInterface::TYPE_TIMESTAMP,
44-
'timestamp with local time zone' => SchemaInterface::TYPE_TIMESTAMP,
26+
'char' => ColumnType::CHAR,
27+
'nchar' => ColumnType::CHAR,
28+
'varchar2' => ColumnType::STRING,
29+
'nvarchar2' => ColumnType::STRING,
30+
'clob' => ColumnType::TEXT,
31+
'nclob' => ColumnType::TEXT,
32+
'blob' => ColumnType::BINARY,
33+
'bfile' => ColumnType::BINARY,
34+
'long raw' => ColumnType::BINARY,
35+
'raw' => ColumnType::BINARY,
36+
'number' => ColumnType::DECIMAL,
37+
'binary_float' => ColumnType::FLOAT, // 32 bit
38+
'binary_double' => ColumnType::DOUBLE, // 64 bit
39+
'float' => ColumnType::DOUBLE, // 126 bit
40+
'date' => ColumnType::DATE,
41+
'interval day to second' => ColumnType::TIME,
42+
'timestamp' => ColumnType::TIMESTAMP,
43+
'timestamp with time zone' => ColumnType::TIMESTAMP,
44+
'timestamp with local time zone' => ColumnType::TIMESTAMP,
4545

4646
/** Deprecated */
47-
'long' => SchemaInterface::TYPE_TEXT,
47+
'long' => ColumnType::TEXT,
4848
];
4949

5050
protected function getType(string $dbType, array $info = []): string
@@ -55,24 +55,24 @@ protected function getType(string $dbType, array $info = []): string
5555
$scale = isset($info['scale']) ? (int) $info['scale'] : null;
5656

5757
return match ($scale) {
58-
null => SchemaInterface::TYPE_DOUBLE,
59-
0 => SchemaInterface::TYPE_INTEGER,
60-
default => SchemaInterface::TYPE_DECIMAL,
58+
null => ColumnType::DOUBLE,
59+
0 => ColumnType::INTEGER,
60+
default => ColumnType::DECIMAL,
6161
};
6262
}
6363

6464
$dbType = preg_replace('/\([^)]+\)/', '', $dbType);
6565

6666
if ($dbType === 'interval day to second' && isset($info['precision']) && $info['precision'] > 0) {
67-
return SchemaInterface::TYPE_STRING;
67+
return ColumnType::STRING;
6868
}
6969

70-
return self::TYPE_MAP[$dbType] ?? SchemaInterface::TYPE_STRING;
70+
return self::TYPE_MAP[$dbType] ?? ColumnType::STRING;
7171
}
7272

7373
public function fromType(string $type, array $info = []): ColumnSchemaInterface
7474
{
75-
if ($type === SchemaInterface::TYPE_BINARY) {
75+
if ($type === ColumnType::BINARY) {
7676
return (new BinaryColumnSchema($type))->load($info);
7777
}
7878

src/QueryBuilder.php

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
namespace Yiisoft\Db\Oracle;
66

7+
use Yiisoft\Db\Constant\ColumnType;
8+
use Yiisoft\Db\Constant\PseudoType;
79
use Yiisoft\Db\QueryBuilder\AbstractQueryBuilder;
810
use Yiisoft\Db\Schema\QuoterInterface;
911
use Yiisoft\Db\Schema\SchemaInterface;
@@ -17,29 +19,29 @@ final class QueryBuilder extends AbstractQueryBuilder
1719
* @psalm-var string[] $typeMap Mapping from abstract column types (keys) to physical column types (values).
1820
*/
1921
protected array $typeMap = [
20-
SchemaInterface::TYPE_PK => 'NUMBER(10) GENERATED BY DEFAULT AS IDENTITY NOT NULL PRIMARY KEY',
21-
SchemaInterface::TYPE_UPK => 'NUMBER(10) GENERATED BY DEFAULT AS IDENTITY UNSIGNED NOT NULL PRIMARY KEY',
22-
SchemaInterface::TYPE_BIGPK => 'NUMBER(20) GENERATED BY DEFAULT AS IDENTITY NOT NULL PRIMARY KEY',
23-
SchemaInterface::TYPE_UBIGPK => 'NUMBER(20) GENERATED BY DEFAULT AS IDENTITY UNSIGNED NOT NULL PRIMARY KEY',
24-
SchemaInterface::TYPE_CHAR => 'CHAR(1)',
25-
SchemaInterface::TYPE_STRING => 'VARCHAR2(255)',
26-
SchemaInterface::TYPE_TEXT => 'CLOB',
27-
SchemaInterface::TYPE_TINYINT => 'NUMBER(3)',
28-
SchemaInterface::TYPE_SMALLINT => 'NUMBER(5)',
29-
SchemaInterface::TYPE_INTEGER => 'NUMBER(10)',
30-
SchemaInterface::TYPE_BIGINT => 'NUMBER(20)',
31-
SchemaInterface::TYPE_FLOAT => 'BINARY_FLOAT',
32-
SchemaInterface::TYPE_DOUBLE => 'BINARY_DOUBLE',
33-
SchemaInterface::TYPE_DECIMAL => 'NUMBER(10,0)',
34-
SchemaInterface::TYPE_DATETIME => 'TIMESTAMP(0)',
35-
SchemaInterface::TYPE_TIMESTAMP => 'TIMESTAMP(0)',
36-
SchemaInterface::TYPE_TIME => 'INTERVAL DAY(0) TO SECOND(0)',
37-
SchemaInterface::TYPE_DATE => 'DATE',
38-
SchemaInterface::TYPE_BINARY => 'BLOB',
39-
SchemaInterface::TYPE_BOOLEAN => 'NUMBER(1)',
40-
SchemaInterface::TYPE_MONEY => 'NUMBER(19,4)',
41-
SchemaInterface::TYPE_UUID => 'RAW(16)',
42-
SchemaInterface::TYPE_UUID_PK => 'RAW(16) DEFAULT SYS_GUID() PRIMARY KEY',
22+
PseudoType::PK => 'NUMBER(10) GENERATED BY DEFAULT AS IDENTITY NOT NULL PRIMARY KEY',
23+
PseudoType::UPK => 'NUMBER(10) GENERATED BY DEFAULT AS IDENTITY UNSIGNED NOT NULL PRIMARY KEY',
24+
PseudoType::BIGPK => 'NUMBER(20) GENERATED BY DEFAULT AS IDENTITY NOT NULL PRIMARY KEY',
25+
PseudoType::UBIGPK => 'NUMBER(20) GENERATED BY DEFAULT AS IDENTITY UNSIGNED NOT NULL PRIMARY KEY',
26+
ColumnType::CHAR => 'CHAR(1)',
27+
ColumnType::STRING => 'VARCHAR2(255)',
28+
ColumnType::TEXT => 'CLOB',
29+
ColumnType::TINYINT => 'NUMBER(3)',
30+
ColumnType::SMALLINT => 'NUMBER(5)',
31+
ColumnType::INTEGER => 'NUMBER(10)',
32+
ColumnType::BIGINT => 'NUMBER(20)',
33+
ColumnType::FLOAT => 'BINARY_FLOAT',
34+
ColumnType::DOUBLE => 'BINARY_DOUBLE',
35+
ColumnType::DECIMAL => 'NUMBER(10,0)',
36+
ColumnType::DATETIME => 'TIMESTAMP(0)',
37+
ColumnType::TIMESTAMP => 'TIMESTAMP(0)',
38+
ColumnType::TIME => 'INTERVAL DAY(0) TO SECOND(0)',
39+
ColumnType::DATE => 'DATE',
40+
ColumnType::BINARY => 'BLOB',
41+
ColumnType::BOOLEAN => 'NUMBER(1)',
42+
ColumnType::MONEY => 'NUMBER(19,4)',
43+
ColumnType::UUID => 'RAW(16)',
44+
PseudoType::UUID_PK => 'RAW(16) DEFAULT SYS_GUID() PRIMARY KEY',
4345
];
4446

4547
public function __construct(QuoterInterface $quoter, SchemaInterface $schema)

src/Schema.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Throwable;
88
use Yiisoft\Db\Cache\SchemaCache;
99
use Yiisoft\Db\Connection\ConnectionInterface;
10+
use Yiisoft\Db\Constant\ColumnType;
1011
use Yiisoft\Db\Constraint\CheckConstraint;
1112
use Yiisoft\Db\Constraint\Constraint;
1213
use Yiisoft\Db\Constraint\ForeignKeyConstraint;
@@ -467,7 +468,7 @@ private function normalizeDefaultValue(string|null $defaultValue, ColumnSchemaIn
467468
return null;
468469
}
469470

470-
if ($column->getType() === self::TYPE_TIMESTAMP && $defaultValue === 'CURRENT_TIMESTAMP') {
471+
if ($column->getType() === ColumnType::TIMESTAMP && $defaultValue === 'CURRENT_TIMESTAMP') {
471472
return new Expression($defaultValue);
472473
}
473474

tests/CommandTest.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
use ReflectionException;
88
use Throwable;
9+
use Yiisoft\Db\Constant\ColumnType;
10+
use Yiisoft\Db\Constant\PseudoType;
911
use Yiisoft\Db\Exception\Exception;
1012
use Yiisoft\Db\Exception\InvalidArgumentException;
1113
use Yiisoft\Db\Exception\InvalidCallException;
@@ -16,7 +18,6 @@
1618
use Yiisoft\Db\Oracle\Driver;
1719
use Yiisoft\Db\Oracle\Tests\Support\TestTrait;
1820
use Yiisoft\Db\Query\Query;
19-
use Yiisoft\Db\Schema\SchemaInterface;
2021
use Yiisoft\Db\Tests\Common\CommonCommandTest;
2122
use Yiisoft\Db\Tests\Support\Assert;
2223
use Yiisoft\Db\Tests\Support\DbHelper;
@@ -89,7 +90,7 @@ public function testCLOBStringInsertion(): void
8990
$command->dropTable('longstring')->execute();
9091
}
9192

92-
$command->createTable('longstring', ['message' => SchemaInterface::TYPE_TEXT])->execute();
93+
$command->createTable('longstring', ['message' => ColumnType::TEXT])->execute();
9394
$longData = str_pad('-', 4001, '-=', STR_PAD_LEFT);
9495
$command->insert('longstring', ['message' => $longData])->execute();
9596

@@ -130,7 +131,7 @@ public function testCreateTable(): void
130131

131132
$command->createTable(
132133
'{{testCreateTable}}',
133-
['id' => SchemaInterface::TYPE_PK, 'bar' => SchemaInterface::TYPE_INTEGER]
134+
['id' => PseudoType::PK, 'bar' => ColumnType::INTEGER]
134135
)->execute();
135136
$command->setSql(
136137
<<<SQL
@@ -182,8 +183,8 @@ public function testCreateView(): void
182183
$command->createTable(
183184
'{{testCreateViewTable}}',
184185
[
185-
'[[id]]' => SchemaInterface::TYPE_PK,
186-
'[[bar]]' => SchemaInterface::TYPE_INTEGER,
186+
'[[id]]' => PseudoType::PK,
187+
'[[bar]]' => ColumnType::INTEGER,
187188
],
188189
)->execute();
189190
$command->setSql(

tests/Provider/ColumnFactoryProvider.php

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Yiisoft\Db\Oracle\Tests\Provider;
66

7+
use Yiisoft\Db\Constant\ColumnType;
78
use Yiisoft\Db\Oracle\Column\BinaryColumnSchema;
89
use Yiisoft\Db\Schema\Column\DoubleColumnSchema;
910
use Yiisoft\Db\Schema\Column\StringColumnSchema;
@@ -14,26 +15,26 @@ public static function dbTypes(): array
1415
{
1516
return [
1617
// db type, expected abstract type, expected instance of
17-
['char', 'char', StringColumnSchema::class],
18-
['nchar', 'char', StringColumnSchema::class],
19-
['varchar2', 'string', StringColumnSchema::class],
20-
['nvarchar2', 'string', StringColumnSchema::class],
21-
['clob', 'text', StringColumnSchema::class],
22-
['nclob', 'text', StringColumnSchema::class],
23-
['long', 'text', StringColumnSchema::class],
24-
['blob', 'binary', BinaryColumnSchema::class],
25-
['bfile', 'binary', BinaryColumnSchema::class],
26-
['long raw', 'binary', BinaryColumnSchema::class],
27-
['raw', 'binary', BinaryColumnSchema::class],
28-
['number', 'double', DoubleColumnSchema::class],
29-
['binary_float', 'float', DoubleColumnSchema::class],
30-
['binary_double', 'double', DoubleColumnSchema::class],
31-
['float', 'double', DoubleColumnSchema::class],
32-
['date', 'date', StringColumnSchema::class],
33-
['interval day(0) to second', 'time', StringColumnSchema::class],
34-
['timestamp', 'timestamp', StringColumnSchema::class],
35-
['timestamp with time zone', 'timestamp', StringColumnSchema::class],
36-
['timestamp with local time zone', 'timestamp', StringColumnSchema::class],
18+
['char', ColumnType::CHAR, StringColumnSchema::class],
19+
['nchar', ColumnType::CHAR, StringColumnSchema::class],
20+
['varchar2', ColumnType::STRING, StringColumnSchema::class],
21+
['nvarchar2', ColumnType::STRING, StringColumnSchema::class],
22+
['clob', ColumnType::TEXT, StringColumnSchema::class],
23+
['nclob', ColumnType::TEXT, StringColumnSchema::class],
24+
['long', ColumnType::TEXT, StringColumnSchema::class],
25+
['blob', ColumnType::BINARY, BinaryColumnSchema::class],
26+
['bfile', ColumnType::BINARY, BinaryColumnSchema::class],
27+
['long raw', ColumnType::BINARY, BinaryColumnSchema::class],
28+
['raw', ColumnType::BINARY, BinaryColumnSchema::class],
29+
['number', ColumnType::DOUBLE, DoubleColumnSchema::class],
30+
['binary_float', ColumnType::FLOAT, DoubleColumnSchema::class],
31+
['binary_double', ColumnType::DOUBLE, DoubleColumnSchema::class],
32+
['float', ColumnType::DOUBLE, DoubleColumnSchema::class],
33+
['date', ColumnType::DATE, StringColumnSchema::class],
34+
['interval day(0) to second', ColumnType::TIME, StringColumnSchema::class],
35+
['timestamp', ColumnType::TIMESTAMP, StringColumnSchema::class],
36+
['timestamp with time zone', ColumnType::TIMESTAMP, StringColumnSchema::class],
37+
['timestamp with local time zone', ColumnType::TIMESTAMP, StringColumnSchema::class],
3738
];
3839
}
3940

tests/Provider/ColumnSchemaBuilderProvider.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace Yiisoft\Db\Oracle\Tests\Provider;
66

7-
use Yiisoft\Db\Schema\SchemaInterface;
7+
use Yiisoft\Db\Constant\ColumnType;
88

99
final class ColumnSchemaBuilderProvider extends \Yiisoft\Db\Tests\Provider\ColumnSchemaBuilderProvider
1010
{
@@ -19,7 +19,7 @@ public static function types(): array
1919

2020
return [
2121
...$types,
22-
['integer UNSIGNED', SchemaInterface::TYPE_INTEGER, null, [['unsigned']]],
22+
['integer UNSIGNED', ColumnType::INTEGER, null, [['unsigned']]],
2323
];
2424
}
2525

tests/QueryBuilderTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Yiisoft\Db\Oracle\Tests;
66

77
use Throwable;
8+
use Yiisoft\Db\Constant\ColumnType;
89
use Yiisoft\Db\Exception\Exception;
910
use Yiisoft\Db\Exception\InvalidArgumentException;
1011
use Yiisoft\Db\Exception\InvalidConfigException;
@@ -13,7 +14,6 @@
1314
use Yiisoft\Db\Oracle\Tests\Support\TestTrait;
1415
use Yiisoft\Db\Query\Query;
1516
use Yiisoft\Db\Query\QueryInterface;
16-
use Yiisoft\Db\Schema\SchemaInterface;
1717
use Yiisoft\Db\Tests\Common\CommonQueryBuilderTest;
1818

1919
/**
@@ -110,7 +110,7 @@ public function testAlterColumn(): void
110110
<<<SQL
111111
ALTER TABLE "customer" MODIFY "email" VARCHAR2(255)
112112
SQL,
113-
$qb->alterColumn('customer', 'email', SchemaInterface::TYPE_STRING),
113+
$qb->alterColumn('customer', 'email', ColumnType::STRING),
114114
);
115115

116116
$db->close();

0 commit comments

Comments
 (0)