mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-01-04 17:21:39 +09:00
Support generated columns #2596
This commit is contained in:
parent
5e4b48f19b
commit
40067c0b53
5 changed files with 73 additions and 16 deletions
|
|
@ -70,8 +70,21 @@ class DBTableParser extends BaseParser
|
|||
// Load columns.
|
||||
foreach ($xml->column as $column_info)
|
||||
{
|
||||
// Is this column generated?
|
||||
$is_generated = strval($column_info['generated'] ?? '') !== '';
|
||||
if ($is_generated)
|
||||
{
|
||||
$column = new DBTable\GeneratedColumn;
|
||||
$column->generated = strtolower($column_info['generated']);
|
||||
$column->is_stored = strtolower($column_info['stored'] ?? '');
|
||||
$column->is_stored = $column->is_stored !== 'virtual' && toBool($column->is_stored);
|
||||
}
|
||||
else
|
||||
{
|
||||
$column = new DBTable\Column;
|
||||
}
|
||||
|
||||
// Get the column name and type.
|
||||
$column = new DBTable\Column;
|
||||
$column->name = strval($column_info['name']);
|
||||
list($column->type, $column->xetype, $column->size) = self::getTypeAndSize(strval($column_info['type']), strval($column_info['size']));
|
||||
|
||||
|
|
|
|||
12
common/framework/parsers/dbtable/GeneratedColumn.php
Normal file
12
common/framework/parsers/dbtable/GeneratedColumn.php
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
<?php
|
||||
|
||||
namespace Rhymix\Framework\Parsers\DBTable;
|
||||
|
||||
/**
|
||||
* Generated column class.
|
||||
*/
|
||||
class GeneratedColumn extends Column
|
||||
{
|
||||
public $generated = 'always';
|
||||
public $is_stored = false;
|
||||
}
|
||||
|
|
@ -53,29 +53,42 @@ class Table
|
|||
$columndef .= ' CHARACTER SET ' . $column->charset . ' COLLATE ' . $column->charset . '_general_ci';
|
||||
}
|
||||
}
|
||||
if ($column instanceof GeneratedColumn)
|
||||
{
|
||||
$columndef .= ' GENERATED ' . strtoupper($column->generated ?: 'always');
|
||||
$columndef .= ' AS (' . $column->default_value . ')';
|
||||
if ($column->is_stored)
|
||||
{
|
||||
$columndef .= ' STORED';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($column->default_value !== null)
|
||||
{
|
||||
if (preg_match('/(?:int|float|double|decimal|number)/i', $column->type) && is_numeric($column->default_value))
|
||||
{
|
||||
$columndef .= ' DEFAULT ' . $column->default_value;
|
||||
}
|
||||
elseif (preg_match('/^\w+\(\)$/', $column->default_value))
|
||||
{
|
||||
$columndef .= ' DEFAULT ' . $column->default_value;
|
||||
}
|
||||
else
|
||||
{
|
||||
$columndef .= ' DEFAULT \'' . $column->default_value . '\'';
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($column->not_null)
|
||||
{
|
||||
$columndef .= ' NOT NULL';
|
||||
}
|
||||
if ($column->default_value !== null)
|
||||
{
|
||||
if (preg_match('/(?:int|float|double|decimal|number)/i', $column->type) && is_numeric($column->default_value))
|
||||
{
|
||||
$columndef .= ' DEFAULT ' . $column->default_value;
|
||||
}
|
||||
elseif (preg_match('/^\w+\(\)$/', $column->default_value))
|
||||
{
|
||||
$columndef .= ' DEFAULT ' . $column->default_value;
|
||||
}
|
||||
else
|
||||
{
|
||||
$columndef .= ' DEFAULT \'' . $column->default_value . '\'';
|
||||
}
|
||||
}
|
||||
if ($column->auto_increment)
|
||||
{
|
||||
$columndef .= ' AUTO_INCREMENT';
|
||||
}
|
||||
|
||||
$columns[] = $columndef;
|
||||
}
|
||||
|
||||
|
|
|
|||
9
tests/_data/dbtable/generated.xml
Normal file
9
tests/_data/dbtable/generated.xml
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
<table name="generated">
|
||||
<column name="id" type="bignumber" size="11" notnull="notnull" auto_increment="auto_increment" primary_key="primary_key" />
|
||||
<column name="module_srl" type="number" notnull="notnull" index="idx_module_srl" />
|
||||
<column name="document_srl" type="number" notnull="notnull" index="idx_document_srl" />
|
||||
<column name="member_srl" type="number" notnull="notnull" index="idx_member_srl" />
|
||||
<column name="gentest1" type="number" generated="always" default="document_srl + member_srl" stored="true" notnull="notnull" />
|
||||
<column name="gentest2" type="number" generated="always" default="MAX(module_srl, document_srl)" stored="false" />
|
||||
<column name="gentest3" type="varchar" size="40" notnull="notnull" generated="always" default="CONCAT(module_srl, '_', document_srl)" />
|
||||
</table>
|
||||
|
|
@ -63,4 +63,14 @@ class DBTableParserTest extends \Codeception\Test\Unit
|
|||
$this->assertStringContainsString('CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci', $sql);
|
||||
$this->assertStringContainsString('ENGINE = InnoDB', $sql);
|
||||
}
|
||||
|
||||
public function testGeneratedColumn()
|
||||
{
|
||||
$table = Rhymix\Framework\Parsers\DBTableParser::loadXML(\RX_BASEDIR . 'tests/_data/dbtable/generated.xml');
|
||||
$sql = $table->getCreateQuery('rx_');
|
||||
$this->assertStringContainsString('CREATE TABLE `rx_generated`', $sql);
|
||||
$this->assertStringContainsString('`gentest1` BIGINT GENERATED ALWAYS AS (document_srl + member_srl) STORED NOT NULL,', $sql);
|
||||
$this->assertStringContainsString('`gentest2` BIGINT GENERATED ALWAYS AS (MAX(module_srl, document_srl)),', $sql);
|
||||
$this->assertStringContainsString('`gentest3` VARCHAR(40) GENERATED ALWAYS AS (CONCAT(module_srl, \'_\', document_srl)) NOT NULL,', $sql);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue