From 5035a6567227284ab04ccfa41becb74840e70b09 Mon Sep 17 00:00:00 2001 From: Dave Mc Nicoll Date: Fri, 14 Jul 2023 19:14:50 -0400 Subject: [PATCH] - WIP on database migration --- src/Form/Storage/DatabaseMigration.php | 95 ++++++++++--------- src/Lib/Database/Definition.php | 20 ++++ src/Lib/Database/DefinitionCollection.php | 26 +++++ src/Lib/Database/Modifier.php | 11 +++ src/Lib/Database/ModifierTypeEnum.php | 11 +++ view/lean-console/page/storage/database.phtml | 20 ++-- 6 files changed, 131 insertions(+), 52 deletions(-) create mode 100644 src/Lib/Database/Definition.php create mode 100644 src/Lib/Database/DefinitionCollection.php create mode 100644 src/Lib/Database/Modifier.php create mode 100644 src/Lib/Database/ModifierTypeEnum.php diff --git a/src/Form/Storage/DatabaseMigration.php b/src/Form/Storage/DatabaseMigration.php index 1361100..255c84e 100644 --- a/src/Form/Storage/DatabaseMigration.php +++ b/src/Form/Storage/DatabaseMigration.php @@ -13,25 +13,21 @@ use \Ulmus\Entity\InformationSchema\Table; class DatabaseMigration implements FormInterface { - protected ? Lib\DatabaseMigrations $migration; - - protected array $alter = []; - - public function __construct(Lib\DatabaseMigrations $migration) + public function __construct( + protected ? Lib\DatabaseMigrations $migration, + protected null|Lib\Database\DefinitionCollection $definition = null, + ) { - $this->migration = $migration; + $this->definition ??= new Lib\Database\DefinitionCollection(); } public function initialize(FormContextInterface $context) : void { - $context->tableExist = []; - foreach($this->migration->entities as $entity => $table) { $previous = null; - $this->alter[$entity] = []; + $connection = $entity::resolveEntity()->sqlAdapter(); $adapter = $connection->adapter(); - $tableName = $table->tableName(); $databaseName = $table->databaseName(); @@ -42,51 +38,58 @@ class DatabaseMigration implements FormInterface # Query current table's columns $tableEntity = $adapter->schemaTable($connection, $databaseName, $tableName); + $this->definition[$entity]['table'] = $tableDefinition = new Lib\Database\Definition( + entity: $entity, + modifier: new Lib\Database\Modifier( type: Lib\Database\ModifierTypeEnum::None, ), + ); + if ( $tableEntity ) { + $this->definition[$entity]['columns'] = new Lib\Database\DefinitionCollection(); + foreach($table->fieldList(EntityResolver::KEY_COLUMN_NAME, true) as $field => $definition) { + $this->definition[$entity]['columns'][$field] = $def = new Lib\Database\Definition( + entity: $entity, + field: $field, + definition: $definition, + modifier: new Lib\Database\Modifier( type: Lib\Database\ModifierTypeEnum::None, ), + previous: $def ?? null, + ); + + # Column do not exists if ( $tableEntity->columns->filtersCollection(fn($e) => $e->name === $field)->count() === 0 ) { - $this->alter[$entity][$field] = [ - 'previous' => $previous, - 'action' => 'add', - 'definition' => $definition, - ]; + $def->action = "add"; + + $def->modifier = new Lib\Database\Modifier( + type: Lib\Database\ModifierTypeEnum::Alter, + query: $entity::repository() + ->alterSqlQuery([ $def->toArray() ]) + ->getSqlQuery(true) + ); } - - $previous = [ - 'field' => $field, - 'definition' => $definition - ]; } - if ( $this->alter[$entity] ) { - $context->status[$entity] = [ - 'msg' => "altering", - "query" => $entity::repository() - ->alterSqlQuery($this->alter[$entity]) + $alter = $this->definition[$entity]['columns']->filterAlter(); + + if ( $alter->count() ) { + $tableDefinition->modifier = new Lib\Database\Modifier( + type: Lib\Database\ModifierTypeEnum::Alter, + query: $entity::repository() + ->alterSqlQuery($alter->map(fn(Lib\Database\Definition $e) => $e->toArray())) ->getSqlQuery(true), - ]; - } - else { - # if columns are different - $context->status[$entity] = [ - 'msg' => "up-to-date", - 'query' => "", - ]; + ); } } else { - $context->status[$entity] = [ - 'msg' => "unexisting", - 'query' => $entity::repository() + $tableDefinition->modifier = new Lib\Database\Modifier( + type: Lib\Database\ModifierTypeEnum::Create, + query: $entity::repository() ->createSqlQuery() - ->getSqlQuery(true), - ]; + ->getSqlQuery(true) + ); } } - if ( $context->formSent() ) { - - } + $context->definition = $this->definition; } public function validate(FormContextInterface $context) : bool @@ -99,13 +102,19 @@ class DatabaseMigration implements FormInterface $create = $context->createAll ? explode(',', $context->createAll) : [ $context->create ]; foreach(array_filter($create) as $entity) { - $entity::repository()->createTable(); + if ($this->definition[$entity]['table']->modifier->type === Lib\Database\ModifierTypeEnum::Create) { + $entity::repository()->createTable(); + } } $alter = $context->alterAll ? explode(',', $context->alterAll) : [ $context->alter ]; foreach(array_filter($alter) as $entity) { - $entity::repository()->alterTable($this->alter[$entity]); + + + if ($this->definition[$entity]['table']->modifier->type === Lib\Database\ModifierTypeEnum::Alter) { + $entity::repository()->alterTable($this->definition[$entity]['columns']->filterAlter ()->map( fn($e) => $e->toArray() )); + } } $this->initialize($context); diff --git a/src/Lib/Database/Definition.php b/src/Lib/Database/Definition.php new file mode 100644 index 0000000..6622fa2 --- /dev/null +++ b/src/Lib/Database/Definition.php @@ -0,0 +1,20 @@ +filtersCollection(fn(Definition $e) => $e->modifier->type === $type); + } + + public function filterCreate() : self + { + return $this->filterType(ModifierTypeEnum::Create); + } + + public function filterAlter() : self + { + return $this->filterType(ModifierTypeEnum::Alter); + } + + public function filterDelete() : self + { + return $this->filterType(ModifierTypeEnum::Delete); + } +} \ No newline at end of file diff --git a/src/Lib/Database/Modifier.php b/src/Lib/Database/Modifier.php new file mode 100644 index 0000000..aaaaa2f --- /dev/null +++ b/src/Lib/Database/Modifier.php @@ -0,0 +1,11 @@ +📄 {{ $item->tableName() }}
{% _ "database.table.fields", [ 'count' => count( $item->fieldList() ) ] %}
- {% if $context->status[$entity]['query'] %} - {{ $context->status[$entity]['query'] }} + {% if $context->definition[$entity]['table']->modifier->query %} + {{ $context->definition[$entity]['table']->modifier->query }} {% else %}
🗸 This table is up-to-date
{% endif %}
- {% switch $context->status[$entity]['msg'] %} - {% case 'unexisting' %} + {% switch $context->definition[$entity]['table']->modifier->type %} + {% case ModifierTypeEnum::Create %} {% php $createAll[] = $entity %}
@@ -61,8 +63,8 @@
{% break %} - {% case 'altering' %} - {% php $alter[] = $entity %} + {% case ModifierTypeEnum::Alter %} + {% php $alterAll[] = $entity %}
@@ -80,9 +82,9 @@ {% endif %} {% if ($alterAll ?? 0) > 1 %} -
- -
+
+ +
{% endif %} {% ui.endform %}