diff --git a/README.md b/README.md index 59d6b82..ff3041c 100644 --- a/README.md +++ b/README.md @@ -41,41 +41,6 @@ Elasticsearch migration for laravel. The package is registered through the package discovery of laravel and Composer. >https://laravel.com/docs/5.6/packages -## Configuration -| Key | ENV | Value | Description | -|:-------------:|-------------:|:-------------:|:-----:| -| host | ELASTICSEARCH_HOST | STRING | Host | -| port | ELASTICSEARCH_PORT | INTEGER | Default: 9200 | -| scheme | ELASTICSEARCH_SCHEME | STRING | https or http | -| user | ELASTICSEARCH_USER | STRING | Username | -| pass | ELASTICSEARCH_PASS | STRING | Password | -| migration.filePath | --- | STRING | File path for migration scripts | - -## Usage - -### Build migration ->Triadev\EsMigration\Business\Factory\MigrationBuilder::TYPE() - -- createIndex -- updateIndex -- deleteIndex -- alias -- reindex -- deleteByQuery -- updateByQuery - -### Commands - -#### Start migration -Orchestra migrations ->php artisan triadev:elasticsearch:migrate:start VERSIONS - -Example: ->php artisan triadev:elasticsearch:migrate:start migration1,migration2,migration3 - -#### Show migrations ->php artisan triadev:elasticsearch:migration:show - ### Events [Documentation: Laravel Events](https://laravel.com/docs/5.7/events) diff --git a/examples/addAndRemoveAlias/migrations.php b/examples/addAndRemoveAlias/migrations.php deleted file mode 100644 index ad244d9..0000000 --- a/examples/addAndRemoveAlias/migrations.php +++ /dev/null @@ -1,13 +0,0 @@ - [ - 'properties' => [ - 'title' => [ - 'type' => 'text' - ] - ] - ] - ], - [ - 'refresh_interval' => "30s" - ] - ), - \Triadev\EsMigration\Business\Factory\MigrationBuilder::updateIndex( - 'examples', - [ - 'example' => [ - 'properties' => [ - 'title' => [ - 'type' => 'keyword' - ] - ] - ] - ], - [ - 'index' => [ - 'refresh_interval' => "60s" - ] - ] - ) -]; diff --git a/examples/createIndex/migrations.php b/examples/createIndex/migrations.php deleted file mode 100644 index 151833a..0000000 --- a/examples/createIndex/migrations.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'properties' => [ - 'title' => [ - 'type' => 'text' - ] - ] - ] - ], - [ - 'refresh_interval' => "30s" - ] - ) -]; diff --git a/examples/deleteByQuery/migrations.php b/examples/deleteByQuery/migrations.php deleted file mode 100644 index 1c44a3b..0000000 --- a/examples/deleteByQuery/migrations.php +++ /dev/null @@ -1,16 +0,0 @@ - [ - 'title' => 'Title' - ] - ], - 'example', - [ - 'conflicts' => 'proceed' - ] - ) -]; diff --git a/examples/deleteIndex/migrations.php b/examples/deleteIndex/migrations.php deleted file mode 100644 index cf384dd..0000000 --- a/examples/deleteIndex/migrations.php +++ /dev/null @@ -1,5 +0,0 @@ - [ - 'title' => 'Title' - ] - ], - 'example', - [ - 'source' => 'ctx._source.count++', - 'lang' => 'painless' - ], - [ - 'conflicts' => 'proceed' - ] - ) -]; diff --git a/examples/updateIndex/migrations.php b/examples/updateIndex/migrations.php deleted file mode 100644 index 6c4ab1a..0000000 --- a/examples/updateIndex/migrations.php +++ /dev/null @@ -1,21 +0,0 @@ - [ - 'properties' => [ - 'title' => [ - 'type' => 'keyword' - ] - ] - ] - ], - [ - 'index' => [ - 'refresh_interval' => "60s" - ] - ] - ) -]; diff --git a/phpunit.xml b/phpunit.xml index 7087fcb..ae35c9f 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -26,5 +26,6 @@ + diff --git a/src/Business/Mapper/MigrationStatus.php b/src/Business/Mapper/MigrationStatus.php new file mode 100644 index 0000000..b1e81b7 --- /dev/null +++ b/src/Business/Mapper/MigrationStatus.php @@ -0,0 +1,32 @@ +getSettings()) { $body['settings'] = $migration->getSettings(); } - + $esClient->indices()->create([ 'index' => $migration->getIndex(), 'body' => $body diff --git a/src/Business/Repository/ElasticsearchClients.php b/src/Business/Repository/ElasticsearchClients.php new file mode 100644 index 0000000..fa810f6 --- /dev/null +++ b/src/Business/Repository/ElasticsearchClients.php @@ -0,0 +1,74 @@ +clientBuilder = ClientBuilder::create(); + } + + /** + * Add + * + * @param string $esClientKey + * @param string $host + * @param int $port + * @param string $scheme + * @param null|string $user + * @param null|string $password + */ + public function add( + string $esClientKey, + string $host, + int $port, + string $scheme, + ?string $user = null, + ?string $password = null + ) { + $this->elasticsearchClients[$esClientKey] = $this->clientBuilder->setHosts([ + [ + 'host' => $host, + 'port' => $port, + 'scheme' => $scheme, + 'user' => $user, + 'pass' => $password + ] + ])->build(); + } + + /** + * Get + * + * @param string $esClientKey + * @return Client|null + */ + public function get(string $esClientKey) : ?Client + { + return array_get($this->elasticsearchClients, $esClientKey); + } + + /** + * All + * + * @return Client[] + */ + public function all() : array + { + return $this->elasticsearchClients; + } +} diff --git a/src/Business/Repository/ElasticsearchMigration.php b/src/Business/Repository/ElasticsearchMigration.php index 640f669..a071598 100644 --- a/src/Business/Repository/ElasticsearchMigration.php +++ b/src/Business/Repository/ElasticsearchMigration.php @@ -5,6 +5,7 @@ use Triadev\EsMigration\Business\Events\MigrationDone; use Triadev\EsMigration\Business\Events\MigrationError; use Triadev\EsMigration\Business\Events\MigrationRunning; +use Triadev\EsMigration\Business\Mapper\MigrationStatus; use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract; class ElasticsearchMigration implements ElasticsearchMigrationContract @@ -14,7 +15,7 @@ class ElasticsearchMigration implements ElasticsearchMigrationContract */ public function createOrUpdate( string $migration, - int $status = self::ELASTICSEARCH_MIGRATION_STATUS_WAIT, + int $status = MigrationStatus::MIGRATION_STATUS_WAIT, ?string $error = null ): \Triadev\EsMigration\Models\Entity\ElasticsearchMigration { $dbMigration = $this->find($migration); @@ -24,7 +25,7 @@ public function createOrUpdate( $dbMigration->migration = $migration; } - if ($this->isStatusValid($status)) { + if ((new MigrationStatus())->isMigrationStatusValid($status)) { $dbMigration->status = $status; $dbMigration->error = $error; } @@ -64,32 +65,16 @@ public function all(array $columns = ['*']): Collection return \Triadev\EsMigration\Models\Entity\ElasticsearchMigration::all($columns); } - private function isStatusValid(int $status) : bool - { - $valid = [ - self::ELASTICSEARCH_MIGRATION_STATUS_WAIT, - self::ELASTICSEARCH_MIGRATION_STATUS_RUNNING, - self::ELASTICSEARCH_MIGRATION_STATUS_DONE, - self::ELASTICSEARCH_MIGRATION_STATUS_ERROR - ]; - - if (in_array($status, $valid)) { - return true; - } - - return false; - } - private function dispatchStatus(\Triadev\EsMigration\Models\Entity\ElasticsearchMigration $migration) { switch ($migration->status) { - case self::ELASTICSEARCH_MIGRATION_STATUS_RUNNING: + case MigrationStatus::MIGRATION_STATUS_RUNNING: $event = new MigrationRunning($migration); break; - case self::ELASTICSEARCH_MIGRATION_STATUS_DONE: + case MigrationStatus::MIGRATION_STATUS_DONE: $event = new MigrationDone($migration); break; - case self::ELASTICSEARCH_MIGRATION_STATUS_ERROR: + case MigrationStatus::MIGRATION_STATUS_ERROR: $event = new MigrationError($migration); break; default: diff --git a/src/Business/Repository/ElasticsearchMigrationStep.php b/src/Business/Repository/ElasticsearchMigrationStep.php index afb60c4..19974ac 100644 --- a/src/Business/Repository/ElasticsearchMigrationStep.php +++ b/src/Business/Repository/ElasticsearchMigrationStep.php @@ -4,6 +4,7 @@ use Triadev\EsMigration\Business\Events\MigrationStepDone; use Triadev\EsMigration\Business\Events\MigrationStepError; use Triadev\EsMigration\Business\Events\MigrationStepRunning; +use Triadev\EsMigration\Business\Mapper\MigrationStatus; use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationStepContract; use Triadev\EsMigration\Exception\MigrationsNotExist; @@ -22,7 +23,7 @@ public function create( $dbMigration->migration_id = $migrationId; $dbMigration->type = $type; $dbMigration->index = $index; - $dbMigration->status = self::ELASTICSEARCH_MIGRATION_STEP_STATUS_WAIT; + $dbMigration->status = MigrationStatus::MIGRATION_STATUS_WAIT; $dbMigration->saveOrFail(); @@ -42,7 +43,7 @@ public function update( throw new MigrationsNotExist(); } - if ($this->isStatusValid($status)) { + if ((new MigrationStatus())->isMigrationStatusValid($status)) { $entity->status = $status; $entity->error = $error; } @@ -63,32 +64,16 @@ public function find(int $migrationStepId): ?\Triadev\EsMigration\Models\Entity\ ->first(); } - private function isStatusValid(int $status) : bool - { - $valid = [ - self::ELASTICSEARCH_MIGRATION_STEP_STATUS_WAIT, - self::ELASTICSEARCH_MIGRATION_STEP_STATUS_RUNNING, - self::ELASTICSEARCH_MIGRATION_STEP_STATUS_DONE, - self::ELASTICSEARCH_MIGRATION_STEP_STATUS_ERROR - ]; - - if (in_array($status, $valid)) { - return true; - } - - return false; - } - private function dispatchStatus(\Triadev\EsMigration\Models\Entity\ElasticsearchMigrationStep $migration) { switch ($migration->status) { - case self::ELASTICSEARCH_MIGRATION_STEP_STATUS_RUNNING: + case MigrationStatus::MIGRATION_STATUS_RUNNING: $event = new MigrationStepRunning($migration); break; - case self::ELASTICSEARCH_MIGRATION_STEP_STATUS_DONE: + case MigrationStatus::MIGRATION_STATUS_DONE: $event = new MigrationStepDone($migration); break; - case self::ELASTICSEARCH_MIGRATION_STEP_STATUS_ERROR: + case MigrationStatus::MIGRATION_STATUS_ERROR: $event = new MigrationStepError($migration); break; default: diff --git a/src/Config/config.php b/src/Config/config.php deleted file mode 100644 index fd29f63..0000000 --- a/src/Config/config.php +++ /dev/null @@ -1,12 +0,0 @@ - env('ELASTICSEARCH_HOST', 'localhost'), - 'port' => env('ELASTICSEARCH_PORT', 9200), - 'scheme' => env('ELASTICSEARCH_SCHEME', 'https'), - 'user' => env('ELASTICSEARCH_USER', ''), - 'pass' => env('ELASTICSEARCH_PASS', ''), - 'migration' => [ - 'filePath' => null - ] -]; diff --git a/src/Console/Commands/ShowMigration.php b/src/Console/Commands/ShowMigration.php deleted file mode 100644 index 4c5df1c..0000000 --- a/src/Console/Commands/ShowMigration.php +++ /dev/null @@ -1,57 +0,0 @@ -argument('sortField'); - - $migrations = $elasticsearchMigrationStatusRepository->all([ - 'migration', - 'status', - 'created_at', - 'updated_at' - ]); - - switch ($this->argument('sortOrder')) { - case 'asc': - $migrations = $migrations->sortBy($sortField); - break; - case 'desc': - $migrations = $migrations->sortByDesc($sortField); - break; - default: - break; - } - - $this->table( - ['Migration', 'Status', 'Created', 'Updated'], - $migrations->toArray() - ); - } -} diff --git a/src/Console/Commands/StartMigration.php b/src/Console/Commands/StartMigration.php deleted file mode 100644 index 598fc43..0000000 --- a/src/Console/Commands/StartMigration.php +++ /dev/null @@ -1,42 +0,0 @@ -argument('versions')); - $source = $this->option('source'); - - foreach ($versions as $version) { - $elasticsearchMigration->migrate(trim($version), $source); - } - } -} diff --git a/src/Contract/ElasticsearchMigrationContract.php b/src/Contract/ElasticsearchMigrationContract.php index 4f840c4..707ae66 100644 --- a/src/Contract/ElasticsearchMigrationContract.php +++ b/src/Contract/ElasticsearchMigrationContract.php @@ -1,23 +1,59 @@ STRING, + * 'status' => STRING, + * 'steps' => [ + * 'type' => STRING, + * 'index' => STRING, + * 'status' => INTEGER, + * 'error' => STRING|NULL, + * 'created_at' => DATETIME, + * 'updated_at' => DATETIME + * ] + * ] + */ + public function getMigrationStatus(string $migration) : array; /** - * Migrate + * Start migration * - * @param string $version - * @param string $source + * @param string $migration + * @param ElasticsearchClients $elasticsearchClients * * @throws MigrationAlreadyDone * @throws FieldDatatypeMigrationFailed * @throws \Throwable */ - public function migrate(string $version, string $source = self::MIGRATION_SOURCE_TYPE_FILE); + public function startMigration(string $migration, ElasticsearchClients $elasticsearchClients); } diff --git a/src/Contract/ElasticsearchMigrationDatabaseContract.php b/src/Contract/ElasticsearchMigrationDatabaseContract.php deleted file mode 100644 index 4e3e100..0000000 --- a/src/Contract/ElasticsearchMigrationDatabaseContract.php +++ /dev/null @@ -1,48 +0,0 @@ -esClient = $this->buildElasticsearchClient(); - - $this->filePathMigrations = config('triadev-elasticsearch-migration.migration.filePath'); - $this->migrationRepository = app(EsMigrationRepositoryInterface::class); $this->migrationStepRepository = app(EsMigrationStepRepositoryInterface::class); } - private function buildElasticsearchClient() : Client + /** + * @inheritdoc + */ + public function createMigration(string $migration): bool { - $config = config('triadev-elasticsearch-migration'); - - $clientBuilder = ClientBuilder::create(); - $clientBuilder->setHosts([ - [ - 'host' => $config['host'], - 'port' => $config['port'], - 'scheme' => $config['scheme'], - 'user' => $config['user'], - 'pass' => $config['pass'] - ] - ]); - - return $clientBuilder->build(); + try { + $this->migrationRepository->createOrUpdate($migration); + } catch (\Throwable $e) { + return false; + } + + return true; } /** * @inheritdoc */ - public function migrate(string $version, string $source = 'file') + public function addMigrationStep(string $migration, string $type, string $index, array $params = []) : bool { - $this->checkIfMigrationAlreadyRunning($version); + if (!(new MigrationTypes())->isMigrationTypeValid($type)) { + return false; + } try { - $updateMigrationStepStatus = $source == self::MIGRATION_SOURCE_TYPE_DATABASE ? true : false; + if ($migration = $this->migrationRepository->find($migration)) { + $migrationStep = $this->migrationStepRepository->create($migration->id, $type, $index); + + switch ($type) { + case MigrationTypes::MIGRATION_TYPE_CREATE_INDEX: + $this->createIndexMigration($migrationStep->id, $params); + break; + case MigrationTypes::MIGRATION_TYPE_UPDATE_INDEX: + $this->updateIndexMigration($migrationStep->id, $params); + break; + case MigrationTypes::MIGRATION_TYPE_DELETE_INDEX: + break; + case MigrationTypes::MIGRATION_TYPE_ALIAS: + $this->aliasMigration($migrationStep->id, $params); + break; + case MigrationTypes::MIGRATION_TYPE_DELETE_BY_QUERY: + $this->deleteByQueryMigration($migrationStep->id, $params); + break; + case MigrationTypes::MIGRATION_TYPE_UPDATE_BY_QUERY: + $this->updateByQueryMigration($migrationStep->id, $params); + break; + case MigrationTypes::MIGRATION_TYPE_REINDEX: + $this->reindexMigration($migrationStep->id, $params); + break; + default: + break; + } + + return true; + } + } catch (\Throwable $e) { + return false; + } + + return false; + } + + /** + * @inheritdoc + */ + public function getMigrationStatus(string $migration) : array + { + $migrationSteps = []; + + $status = null; + + if ($migrationEntity = $this->migrationRepository->find($migration)) { + $status = $migrationEntity->status; - if (!empty($migrations = $this->getMigrations($version, $source))) { - foreach ($migrations as $migrationStepId => $migration) { - $this->startMigrationStep( - $migration, - $updateMigrationStepStatus ? $migrationStepId : null - ); + foreach ($migrationEntity->migrationSteps()->cursor() as $migrationStep) { + /** @var ElasticsearchMigrationStep $migrationStep */ + $migrationSteps[] = array_except($migrationStep->toArray(), [ + 'id', + 'migration_id' + ]); + } + } + + return [ + 'migration' => $migration, + 'status' => $status, + 'steps' => $migrationSteps + ]; + } + + /** + * @inheritdoc + */ + public function startMigration(string $migration, ElasticsearchClients $elasticsearchClients) + { + $this->checkIfMigrationAlreadyRunning($migration); + + try { + if (!empty($migrationSteps = $this->getMigrationSteps($migration))) { + $this->migrationRepository->createOrUpdate($migration, MigrationStatus::MIGRATION_STATUS_RUNNING); + + foreach ($migrationSteps as $migrationStepId => $migrationStep) { + $this->startMigrationStep($migrationStep, $elasticsearchClients, $migrationStepId); } - $this->migrationRepository->createOrUpdate( - $version, - EsMigrationRepositoryInterface::ELASTICSEARCH_MIGRATION_STATUS_DONE - ); + $this->migrationRepository->createOrUpdate($migration, MigrationStatus::MIGRATION_STATUS_DONE); } } catch (\Exception $e) { $this->migrationRepository->createOrUpdate( - $version, - EsMigrationRepositoryInterface::ELASTICSEARCH_MIGRATION_STATUS_ERROR + $migration, + MigrationStatus::MIGRATION_STATUS_ERROR, + $e->getMessage() ); - + throw $e; } } - /** - * @param string $version - * @throws MigrationAlreadyDone - */ - private function checkIfMigrationAlreadyRunning(string $version) + private function checkIfMigrationAlreadyRunning(string $migration) { - $migration = $this->migrationRepository->find($version); + $migrationEntity = $this->migrationRepository->find($migration); - if ($migration instanceof ElasticsearchMigrationEntity && - $migration->status == EsMigrationRepositoryInterface::ELASTICSEARCH_MIGRATION_STATUS_DONE) { + if ($migrationEntity instanceof ElasticsearchMigrationEntity && + $migrationEntity->status == MigrationStatus::MIGRATION_STATUS_DONE) { throw new MigrationAlreadyDone(); } } + private function getMigrationSteps(string $migration) : array + { + $migrations = []; + + if ($dbMigration = $this->migrationRepository->find($migration)) { + foreach ($dbMigration->migrationSteps()->getResults() as $dbMigrationStep) { + /** @var ElasticsearchMigrationStep $dbMigrationStep */ + if ($dbMigrationStep->status == MigrationStatus::MIGRATION_STATUS_DONE) { + continue; + } + + if ($migrationByType = $dbMigrationStep->migrationByType()) { + $migrationByType = is_object($migrationByType) ? $migrationByType->first() : $migrationByType; + + $index = $dbMigrationStep->index; + + switch ($dbMigrationStep->type) { + case MigrationTypes::MIGRATION_TYPE_CREATE_INDEX: + if ($migrationByType instanceof ElasticsearchMigrationStepCreateIndex) { + $settings = $migrationByType->settings; + + $migrations[$dbMigrationStep->id] = MigrationBuilder::createIndex( + $index, + json_decode($migrationByType->mappings, true), + $settings != null ? json_decode($settings, true) : null + ); + } + break; + case MigrationTypes::MIGRATION_TYPE_UPDATE_INDEX: + if ($migrationByType instanceof ElasticsearchMigrationStepUpdateIndex) { + $mappings = $migrationByType->mappings; + $settings = $migrationByType->settings; + + $migrations[$dbMigrationStep->id] = MigrationBuilder::updateIndex( + $index, + $mappings != null ? json_decode($mappings, true) : null, + $settings != null ? json_decode($settings, true) : null, + (bool)$migrationByType->getAttribute('close_index') + ); + } + break; + case MigrationTypes::MIGRATION_TYPE_DELETE_INDEX: + $migrations[$dbMigrationStep->id] = MigrationBuilder::deleteIndex($index); + break; + case MigrationTypes::MIGRATION_TYPE_ALIAS: + if ($migrationByType instanceof ElasticsearchMigrationStepAlias) { + $add = $migrationByType->add; + $remove = $migrationByType->remove; + $removeIndices = $migrationByType->remove_indices; + + $migrations[$dbMigrationStep->id] = MigrationBuilder::alias( + $index, + $add != null ? json_decode($add, true) : null, + $remove != null ? json_decode($remove, true) : null, + $removeIndices != null ? json_decode($removeIndices, true) : null + ); + } + break; + case MigrationTypes::MIGRATION_TYPE_DELETE_BY_QUERY: + if ($migrationByType instanceof ElasticsearchMigrationStepDeleteByQuery) { + $migrations[$dbMigrationStep->id] = MigrationBuilder::deleteByQuery( + $index, + json_decode($migrationByType->query, true), + $migrationByType->type, + json_decode($migrationByType->options, true) + ); + } + break; + case MigrationTypes::MIGRATION_TYPE_UPDATE_BY_QUERY: + if ($migrationByType instanceof ElasticsearchMigrationStepUpdateByQuery) { + $script = $migrationByType->script; + + $migrations[$dbMigrationStep->id] = MigrationBuilder::updateByQuery( + $index, + json_decode($migrationByType->query, true), + $migrationByType->type, + $script != null ? json_decode($script, true) : null, + json_decode($migrationByType->options, true) + ); + } + break; + case MigrationTypes::MIGRATION_TYPE_REINDEX: + if ($migrationByType instanceof ElasticsearchMigrationStepReindex) { + $migrations[$dbMigrationStep->id] = MigrationBuilder::reindex( + $index, + $migrationByType->dest_index, + (bool)$migrationByType->refresh_source_index, + json_decode($migrationByType->global, true), + json_decode($migrationByType->source, true), + json_decode($migrationByType->dest, true) + ); + } + break; + default: + break; + } + } + } + } + + return $migrations; + } + + private function startMigrationStep( + $migration, + ElasticsearchClients $elasticsearchClients, + int $migrationStepId + ) { + try { + $this->migrationStepRepository->update($migrationStepId, MigrationStatus::MIGRATION_STATUS_RUNNING); + + foreach ($elasticsearchClients->all() as $elasticsearchClient) { + switch (get_class($migration)) { + case CreateIndexModel::class: + (new CreateIndex())->migrate($elasticsearchClient, $migration); + break; + case UpdateIndexModel::class: + (new UpdateIndex())->migrate($elasticsearchClient, $migration); + break; + case DeleteIndexModel::class: + (new DeleteIndex())->migrate($elasticsearchClient, $migration); + break; + case AliasModel::class: + (new Alias())->migrate($elasticsearchClient, $migration); + break; + case DeleteByQueryModel::class: + (new DeleteByQuery())->migrate($elasticsearchClient, $migration); + break; + case UpdateByQueryModel::class: + (new UpdateByQuery())->migrate($elasticsearchClient, $migration); + break; + case ReindexModel::class: + (new Reindex())->migrate($elasticsearchClient, $migration); + break; + default: + break; + } + } + + $this->migrationStepRepository->update($migrationStepId, MigrationStatus::MIGRATION_STATUS_DONE); + } catch (\Exception $e) { + $this->migrationStepRepository->update($migrationStepId, MigrationStatus::MIGRATION_STATUS_ERROR); + } + } + /** - * @param string $version - * @param string $source - * @return array + * @param int $migrationStepId + * @param array $params + * @throws \Throwable */ - private function getMigrations(string $version, string $source) : array + private function createIndexMigration(int $migrationStepId, array $params) { - if ($source == self::MIGRATION_SOURCE_TYPE_FILE) { - return require sprintf("%s/%s/migrations.php", $this->filePathMigrations, $version); - } elseif ($source == self::MIGRATION_SOURCE_TYPE_DATABASE) { - /** @var ElasticsearchMigrationDatabaseContract $elasticsearchDatabaseService */ - $elasticsearchDatabaseService = app(ElasticsearchMigrationDatabaseContract::class); - return $elasticsearchDatabaseService->getMigration($version); - } + /** @var ElasticsearchMigrationStepCreateIndexContract $repository */ + $repository = app(ElasticsearchMigrationStepCreateIndexContract::class); - return []; + $repository->create( + $migrationStepId, + array_get($params, 'mappings'), + array_get($params, 'settings') + ); } /** - * @param $migration - * @param int|null $migrationStepId - * @throws Exception\MigrationsNotExist + * @param int $migrationStepId + * @param array $params * @throws \Throwable */ - private function startMigrationStep($migration, ?int $migrationStepId = null) + private function updateIndexMigration(int $migrationStepId, array $params) { - try { - if ($migrationStepId) { - $this->migrationStepRepository->update( - $migrationStepId, - ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_RUNNING - ); - } - - switch (get_class($migration)) { - case CreateIndexModel::class: - (new CreateIndex())->migrate($this->esClient, $migration); - break; - case UpdateIndexModel::class: - (new UpdateIndex())->migrate($this->esClient, $migration); - break; - case DeleteIndexModel::class: - (new DeleteIndex())->migrate($this->esClient, $migration); - break; - case AliasModel::class: - (new Alias())->migrate($this->esClient, $migration); - break; - case DeleteByQueryModel::class: - (new DeleteByQuery())->migrate($this->esClient, $migration); - break; - case UpdateByQueryModel::class: - (new UpdateByQuery())->migrate($this->esClient, $migration); - break; - case ReindexModel::class: - (new Reindex())->migrate($this->esClient, $migration); - break; - default: - break; - } - } catch (\Exception $e) { - if ($migrationStepId) { - $this->migrationStepRepository->update( - $migrationStepId, - ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_ERROR - ); - } else { - throw $e; - } + /** @var ElasticsearchMigrationStepUpdateIndexContract $repository */ + $repository = app(ElasticsearchMigrationStepUpdateIndexContract::class); + + $closeIndex = array_get($params, 'closeIndex'); + if (!$closeIndex) { + $closeIndex = false; } - if ($migrationStepId) { - $this->migrationStepRepository->update( - $migrationStepId, - ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_DONE - ); + $repository->create( + $migrationStepId, + array_get($params, 'mappings'), + array_get($params, 'settings'), + $closeIndex + ); + } + + /** + * @param int $migrationStepId + * @param array $params + * @throws \Throwable + */ + private function aliasMigration(int $migrationStepId, array $params) + { + /** @var ElasticsearchMigrationStepAliasContract $repository */ + $repository = app(ElasticsearchMigrationStepAliasContract::class); + + $repository->create( + $migrationStepId, + array_has($params, 'add') ? array_get($params, 'add') : [], + array_has($params, 'remove') ? array_get($params, 'remove') : [], + array_has($params, 'removeIndices') ? array_get($params, 'removeIndices') : [] + ); + } + + /** + * @param int $migrationStepId + * @param array $params + * @throws \Throwable + */ + private function deleteByQueryMigration(int $migrationStepId, array $params) + { + /** @var ElasticsearchMigrationStepDeleteByQueryContract $repository */ + $repository = app(ElasticsearchMigrationStepDeleteByQueryContract::class); + + $repository->create( + $migrationStepId, + array_get($params, 'query'), + array_get($params, 'type'), + array_has($params, 'options') ? array_get($params, 'options') : [] + ); + } + + /** + * @param int $migrationStepId + * @param array $params + * @throws \Throwable + */ + private function updateByQueryMigration(int $migrationStepId, array $params) + { + /** @var ElasticsearchMigrationStepUpdateByQueryContract $repository */ + $repository = app(ElasticsearchMigrationStepUpdateByQueryContract::class); + + $repository->create( + $migrationStepId, + array_get($params, 'query'), + array_get($params, 'type'), + array_get($params, 'script'), + array_has($params, 'options') ? array_get($params, 'options') : [] + ); + } + + /** + * @param int $migrationStepId + * @param array $params + * @throws \Throwable + */ + private function reindexMigration(int $migrationStepId, array $params) + { + /** @var ElasticsearchMigrationStepReindexContract $repository */ + $repository = app(ElasticsearchMigrationStepReindexContract::class); + + $refreshSourceIndex = array_get($params, 'refreshSourceIndex'); + if (!$refreshSourceIndex) { + $refreshSourceIndex = false; } + + $repository->create( + $migrationStepId, + array_get($params, 'destIndex'), + $refreshSourceIndex, + array_has($params, 'global') ? array_get($params, 'global') : [], + array_has($params, 'source') ? array_get($params, 'source') : [], + array_has($params, 'dest') ? array_get($params, 'dest') : [] + ); } } diff --git a/src/ElasticsearchMigrationDatabase.php b/src/ElasticsearchMigrationDatabase.php deleted file mode 100644 index 354d8d2..0000000 --- a/src/ElasticsearchMigrationDatabase.php +++ /dev/null @@ -1,384 +0,0 @@ -elasticsearchMigrationRepository = $elasticsearchMigrationRepository; - $this->elasticsearchMigrationStepRepository = $elasticsearchMigrationStepRepository; - } - - /** - * @inheritdoc - */ - public function createMigration(string $migration): bool - { - try { - $this->elasticsearchMigrationRepository->createOrUpdate($migration); - } catch (\Throwable $e) { - return false; - } - - return true; - } - - /** - * @inheritdoc - */ - public function addMigration(string $migration, string $type, string $index, array $params = []) : bool - { - if (!$this->isMigrationTypeIsValid($type)) { - return false; - } - - try { - if ($dbMigration = $this->elasticsearchMigrationRepository->find($migration)) { - $migrationStep = $this->elasticsearchMigrationStepRepository->create( - $dbMigration->id, - $type, - $index - ); - - switch ($type) { - case self::MIGRATION_TYPE_CREATE_INDEX: - $this->createIndexMigration($migrationStep->id, $params); - break; - case self::MIGRATION_TYPE_UPDATE_INDEX: - $this->updateIndexMigration($migrationStep->id, $params); - break; - case self::MIGRATION_TYPE_DELETE_INDEX: - break; - case self::MIGRATION_TYPE_ALIAS: - $this->aliasMigration($migrationStep->id, $params); - break; - case self::MIGRATION_TYPE_DELETE_BY_QUERY: - $this->deleteByQueryMigration($migrationStep->id, $params); - break; - case self::MIGRATION_TYPE_UPDATE_BY_QUERY: - $this->updateByQueryMigration($migrationStep->id, $params); - break; - case self::MIGRATION_TYPE_REINDEX: - $this->reindexMigration($migrationStep->id, $params); - break; - default: - break; - } - - return true; - } - } catch (\Throwable $e) { - return false; - } - - return false; - } - - /** - * Get migration - * - * @param string $migration - * @return array - */ - public function getMigration(string $migration) : array - { - $migrations = []; - - if ($dbMigration = $this->elasticsearchMigrationRepository->find($migration)) { - foreach ($dbMigration->migrationSteps()->getResults() as $dbMigrationStep) { - /** @var ElasticsearchMigrationStep $dbMigrationStep */ - - if ($dbMigrationStep->status == ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE) { - continue; - } - - if ($migrationByType = $dbMigrationStep->migrationByType()) { - $migrationByType = is_object($migrationByType) ? $migrationByType->first() : $migrationByType; - - $index = $dbMigrationStep->index; - - switch ($dbMigrationStep->type) { - case self::MIGRATION_TYPE_CREATE_INDEX: - if ($migrationByType instanceof ElasticsearchMigrationStepCreateIndex) { - $settings = $migrationByType->settings; - - $migrations[$dbMigrationStep->id] = MigrationBuilder::createIndex( - $index, - json_decode($migrationByType->mappings, true), - $settings != null ? json_decode($settings, true) : null - ); - } - break; - case self::MIGRATION_TYPE_UPDATE_INDEX: - if ($migrationByType instanceof ElasticsearchMigrationStepUpdateIndex) { - $mappings = $migrationByType->mappings; - $settings = $migrationByType->settings; - - $migrations[$dbMigrationStep->id] = MigrationBuilder::updateIndex( - $index, - $mappings != null ? json_decode($mappings, true) : null, - $settings != null ? json_decode($settings, true) : null, - (bool)$migrationByType->getAttribute('close_index') - ); - } - break; - case self::MIGRATION_TYPE_DELETE_INDEX: - $migrations[$dbMigrationStep->id] = MigrationBuilder::deleteIndex($index); - break; - case self::MIGRATION_TYPE_ALIAS: - if ($migrationByType instanceof ElasticsearchMigrationStepAlias) { - $add = $migrationByType->add; - $remove = $migrationByType->remove; - $removeIndices = $migrationByType->remove_indices; - - $migrations[$dbMigrationStep->id] = MigrationBuilder::alias( - $index, - $add != null ? json_decode($add, true) : null, - $remove != null ? json_decode($remove, true) : null, - $removeIndices != null ? json_decode($removeIndices, true) : null - ); - } - break; - case self::MIGRATION_TYPE_DELETE_BY_QUERY: - if ($migrationByType instanceof ElasticsearchMigrationStepDeleteByQuery) { - $migrations[$dbMigrationStep->id] = MigrationBuilder::deleteByQuery( - $index, - json_decode($migrationByType->query, true), - $migrationByType->type, - json_decode($migrationByType->options, true) - ); - } - break; - case self::MIGRATION_TYPE_UPDATE_BY_QUERY: - if ($migrationByType instanceof ElasticsearchMigrationStepUpdateByQuery) { - $script = $migrationByType->script; - - $migrations[$dbMigrationStep->id] = MigrationBuilder::updateByQuery( - $index, - json_decode($migrationByType->query, true), - $migrationByType->type, - $script != null ? json_decode($script, true) : null, - json_decode($migrationByType->options, true) - ); - } - break; - case self::MIGRATION_TYPE_REINDEX: - if ($migrationByType instanceof ElasticsearchMigrationStepReindex) { - $migrations[$dbMigrationStep->id] = MigrationBuilder::reindex( - $index, - $migrationByType->dest_index, - (bool)$migrationByType->refresh_source_index, - json_decode($migrationByType->global, true), - json_decode($migrationByType->source, true), - json_decode($migrationByType->dest, true) - ); - } - break; - default: - break; - } - } - } - } - - return $migrations; - } - - /** - * Get migration steps - * - * @param string $migration - * @return array - */ - public function getMigrationSteps(string $migration) : array - { - $migrationSteps = []; - - if ($dbMigration = $this->elasticsearchMigrationRepository->find($migration)) { - $dbMigrationSteps = $dbMigration->migrationSteps(); - - foreach ($dbMigrationSteps->cursor() as $dbMigrationStep) { - /** @var ElasticsearchMigrationStep $dbMigrationStep */ - - if ($dbMigrationStep->status == ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE) { - continue; - } - - $migrationSteps[] = array_except($dbMigrationStep->toArray(), [ - 'id', - 'migration_id' - ]); - } - } - - return $migrationSteps; - } - - private function isMigrationTypeIsValid(string $type) : bool - { - if (in_array($type, [ - self::MIGRATION_TYPE_CREATE_INDEX, - self::MIGRATION_TYPE_UPDATE_INDEX, - self::MIGRATION_TYPE_DELETE_INDEX, - self::MIGRATION_TYPE_ALIAS, - self::MIGRATION_TYPE_DELETE_BY_QUERY, - self::MIGRATION_TYPE_UPDATE_BY_QUERY, - self::MIGRATION_TYPE_REINDEX, - ])) { - return true; - } - - return false; - } - - /** - * @param int $migrationStepId - * @param array $params - * @throws \Throwable - */ - private function createIndexMigration(int $migrationStepId, array $params) - { - /** @var ElasticsearchMigrationStepCreateIndexContract $repository */ - $repository = app(ElasticsearchMigrationStepCreateIndexContract::class); - - $repository->create( - $migrationStepId, - array_get($params, 'mappings'), - array_get($params, 'settings') - ); - } - - /** - * @param int $migrationStepId - * @param array $params - * @throws \Throwable - */ - private function updateIndexMigration(int $migrationStepId, array $params) - { - /** @var ElasticsearchMigrationStepUpdateIndexContract $repository */ - $repository = app(ElasticsearchMigrationStepUpdateIndexContract::class); - - $closeIndex = array_get($params, 'closeIndex'); - if (!$closeIndex) { - $closeIndex = false; - } - - $repository->create( - $migrationStepId, - array_get($params, 'mappings'), - array_get($params, 'settings'), - $closeIndex - ); - } - - /** - * @param int $migrationStepId - * @param array $params - * @throws \Throwable - */ - private function aliasMigration(int $migrationStepId, array $params) - { - /** @var ElasticsearchMigrationStepAliasContract $repository */ - $repository = app(ElasticsearchMigrationStepAliasContract::class); - - $repository->create( - $migrationStepId, - array_has($params, 'add') ? array_get($params, 'add') : [], - array_has($params, 'remove') ? array_get($params, 'remove') : [], - array_has($params, 'removeIndices') ? array_get($params, 'removeIndices') : [] - ); - } - - /** - * @param int $migrationStepId - * @param array $params - * @throws \Throwable - */ - private function deleteByQueryMigration(int $migrationStepId, array $params) - { - /** @var ElasticsearchMigrationStepDeleteByQueryContract $repository */ - $repository = app(ElasticsearchMigrationStepDeleteByQueryContract::class); - - $repository->create( - $migrationStepId, - array_get($params, 'query'), - array_get($params, 'type'), - array_has($params, 'options') ? array_get($params, 'options') : [] - ); - } - - /** - * @param int $migrationStepId - * @param array $params - * @throws \Throwable - */ - private function updateByQueryMigration(int $migrationStepId, array $params) - { - /** @var ElasticsearchMigrationStepUpdateByQueryContract $repository */ - $repository = app(ElasticsearchMigrationStepUpdateByQueryContract::class); - - $repository->create( - $migrationStepId, - array_get($params, 'query'), - array_get($params, 'type'), - array_get($params, 'script'), - array_has($params, 'options') ? array_get($params, 'options') : [] - ); - } - - /** - * @param int $migrationStepId - * @param array $params - * @throws \Throwable - */ - private function reindexMigration(int $migrationStepId, array $params) - { - /** @var ElasticsearchMigrationStepReindexContract $repository */ - $repository = app(ElasticsearchMigrationStepReindexContract::class); - - $refreshSourceIndex = array_get($params, 'refreshSourceIndex'); - if (!$refreshSourceIndex) { - $refreshSourceIndex = false; - } - - $repository->create( - $migrationStepId, - array_get($params, 'destIndex'), - $refreshSourceIndex, - array_has($params, 'global') ? array_get($params, 'global') : [], - array_has($params, 'source') ? array_get($params, 'source') : [], - array_has($params, 'dest') ? array_get($params, 'dest') : [] - ); - } -} diff --git a/src/Models/Entity/ElasticsearchMigrationStep.php b/src/Models/Entity/ElasticsearchMigrationStep.php index 9a78b29..3a00334 100644 --- a/src/Models/Entity/ElasticsearchMigrationStep.php +++ b/src/Models/Entity/ElasticsearchMigrationStep.php @@ -2,7 +2,7 @@ namespace Triadev\EsMigration\Models\Entity; use Illuminate\Database\Eloquent\Model; -use Triadev\EsMigration\Contract\ElasticsearchMigrationDatabaseContract; +use Triadev\EsMigration\Business\Mapper\MigrationTypes; /** * @property integer $id @@ -29,25 +29,25 @@ class ElasticsearchMigrationStep extends Model public function migrationByType() { switch ($this->getAttribute('type')) { - case ElasticsearchMigrationDatabaseContract::MIGRATION_TYPE_CREATE_INDEX: + case MigrationTypes::MIGRATION_TYPE_CREATE_INDEX: return $this->hasOne(ElasticsearchMigrationStepCreateIndex::class, 'migration_step_id'); break; - case ElasticsearchMigrationDatabaseContract::MIGRATION_TYPE_UPDATE_INDEX: + case MigrationTypes::MIGRATION_TYPE_UPDATE_INDEX: return $this->hasOne(ElasticsearchMigrationStepUpdateIndex::class, 'migration_step_id'); break; - case ElasticsearchMigrationDatabaseContract::MIGRATION_TYPE_DELETE_INDEX: - return ElasticsearchMigrationDatabaseContract::MIGRATION_TYPE_DELETE_INDEX; + case MigrationTypes::MIGRATION_TYPE_DELETE_INDEX: + return MigrationTypes::MIGRATION_TYPE_DELETE_INDEX; break; - case ElasticsearchMigrationDatabaseContract::MIGRATION_TYPE_ALIAS: + case MigrationTypes::MIGRATION_TYPE_ALIAS: return $this->hasOne(ElasticsearchMigrationStepAlias::class, 'migration_step_id'); break; - case ElasticsearchMigrationDatabaseContract::MIGRATION_TYPE_DELETE_BY_QUERY: + case MigrationTypes::MIGRATION_TYPE_DELETE_BY_QUERY: return $this->hasOne(ElasticsearchMigrationStepDeleteByQuery::class, 'migration_step_id'); break; - case ElasticsearchMigrationDatabaseContract::MIGRATION_TYPE_UPDATE_BY_QUERY: + case MigrationTypes::MIGRATION_TYPE_UPDATE_BY_QUERY: return $this->hasOne(ElasticsearchMigrationStepUpdateByQuery::class, 'migration_step_id'); break; - case ElasticsearchMigrationDatabaseContract::MIGRATION_TYPE_REINDEX: + case MigrationTypes::MIGRATION_TYPE_REINDEX: return $this->hasOne(ElasticsearchMigrationStepReindex::class, 'migration_step_id'); break; default: diff --git a/src/Provider/ElasticsearchMigrationServiceProvider.php b/src/Provider/ElasticsearchMigrationServiceProvider.php index cf9c7bf..9a4f95e 100644 --- a/src/Provider/ElasticsearchMigrationServiceProvider.php +++ b/src/Provider/ElasticsearchMigrationServiceProvider.php @@ -2,12 +2,8 @@ namespace Triadev\EsMigration\Provider; use Illuminate\Support\ServiceProvider; -use Triadev\EsMigration\Console\Commands\ShowMigration; -use Triadev\EsMigration\Console\Commands\StartMigration; use Triadev\EsMigration\Contract\ElasticsearchMigrationContract; -use Triadev\EsMigration\Contract\ElasticsearchMigrationDatabaseContract; use Triadev\EsMigration\ElasticsearchMigration; -use Triadev\EsMigration\ElasticsearchMigrationDatabase; class ElasticsearchMigrationServiceProvider extends ServiceProvider { @@ -18,23 +14,8 @@ class ElasticsearchMigrationServiceProvider extends ServiceProvider */ public function boot() { - $source = realpath(__DIR__ . '/../Config/config.php'); - - $this->publishes([ - __DIR__ . '/../Config/config.php' => config_path('triadev-elasticsearch-migration.php'), - ], 'config'); - - $this->mergeConfigFrom($source, 'triadev-elasticsearch-migration'); - $this->loadMigrationsFrom(__DIR__ . '/../Database/Migrations'); - if ($this->app->runningInConsole()) { - $this->commands([ - StartMigration::class, - ShowMigration::class - ]); - } - $this->app->bind( \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::class, function () { @@ -118,9 +99,5 @@ public function register() $this->app->singleton(ElasticsearchMigrationContract::class, function () { return app()->make(ElasticsearchMigration::class); }); - - $this->app->singleton(ElasticsearchMigrationDatabaseContract::class, function () { - return app()->make(ElasticsearchMigrationDatabase::class); - }); } } diff --git a/tests/Resources/Migrations/1.0.0/migrations.php b/tests/Resources/Migrations/1.0.0/migrations.php deleted file mode 100644 index d7d93e0..0000000 --- a/tests/Resources/Migrations/1.0.0/migrations.php +++ /dev/null @@ -1,55 +0,0 @@ - [ - 'dynamic' => 'strict', - 'properties' => [ - 'title' => [ - 'type' => 'text' - ], - 'count' => [ - 'type' => 'integer' - ] - ] - ] - ], - [ - 'refresh_interval' => "30s" - ] - ), - \Triadev\EsMigration\Business\Factory\MigrationBuilder::updateIndex( - 'phpunit', - [ - 'phpunit' => [ - 'properties' => [ - 'description' => [ - 'type' => 'text' - ] - ] - ] - ], - [ - 'index' => [ - 'refresh_interval' => "60s" - ] - ] - ), - \Triadev\EsMigration\Business\Factory\MigrationBuilder::updateIndex( - 'phpunit', - null, - [ - 'analysis' => [ - 'analyzer' => [ - 'content' => [ - 'type' => 'custom', - 'tokenizer' => 'whitespace' - ] - ] - ] - ], - true - ) -]; diff --git a/tests/Resources/Migrations/1.0.1/migrations.php b/tests/Resources/Migrations/1.0.1/migrations.php deleted file mode 100644 index c1eaee3..0000000 --- a/tests/Resources/Migrations/1.0.1/migrations.php +++ /dev/null @@ -1,20 +0,0 @@ - [ - 'dynamic' => 'strict', - 'properties' => [ - 'title' => [ - 'type' => 'text' - ] - ] - ] - ], - [ - 'refresh_interval' => "30s" - ] - ) -]; diff --git a/tests/Resources/Migrations/add_alias/migrations.php b/tests/Resources/Migrations/add_alias/migrations.php deleted file mode 100644 index f15d418..0000000 --- a/tests/Resources/Migrations/add_alias/migrations.php +++ /dev/null @@ -1,10 +0,0 @@ - [ - 'title' => 'Title' - ] - ], - 'phpunit', - [ - 'conflicts' => 'proceed' - ] - ) -]; diff --git a/tests/Resources/Migrations/delete_index/migrations.php b/tests/Resources/Migrations/delete_index/migrations.php deleted file mode 100644 index 7dce442..0000000 --- a/tests/Resources/Migrations/delete_index/migrations.php +++ /dev/null @@ -1,5 +0,0 @@ - [ - 'properties' => [ - 'title' => [ - 'type' => 'integer' - ], - 'count' => [ - 'type' => 'text' - ], - 'description' => [ - 'type' => 'integer' - ] - ] - ] - ] - ) -]; diff --git a/tests/Resources/Migrations/reindex/migrations.php b/tests/Resources/Migrations/reindex/migrations.php deleted file mode 100644 index 5c6c7bf..0000000 --- a/tests/Resources/Migrations/reindex/migrations.php +++ /dev/null @@ -1,9 +0,0 @@ - [ - 'title' => 'Title' - ] - ], - 'phpunit', - [ - 'source' => 'ctx._source.count++', - 'lang' => 'painless' - ], - [ - 'conflicts' => 'proceed' - ] - ) -]; diff --git a/tests/TestCase.php b/tests/TestCase.php index 0521cc3..dda80c6 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -44,17 +44,6 @@ protected function getEnvironmentSetUp($app) 'database' => ':memory:', 'prefix' => '', ]); - - $app['config']->set('triadev-elasticsearch-migration', [ - 'host' => 'localhost', - 'port' => env('ELASTICSEARCH_PORT', 9222), - 'scheme' => 'http', - 'user' => '', - 'pass' => '', - 'migration' => [ - 'filePath' => __DIR__ . '/Resources/Migrations' - ] - ]); } /** diff --git a/tests/integration/Business/Repository/ElasticsearchMigrationStepTest.php b/tests/integration/Business/Repository/ElasticsearchMigrationStepTest.php index 3af4a8b..12053b3 100644 --- a/tests/integration/Business/Repository/ElasticsearchMigrationStepTest.php +++ b/tests/integration/Business/Repository/ElasticsearchMigrationStepTest.php @@ -5,6 +5,7 @@ use Triadev\EsMigration\Business\Events\MigrationStepDone; use Triadev\EsMigration\Business\Events\MigrationStepError; use Triadev\EsMigration\Business\Events\MigrationStepRunning; +use Triadev\EsMigration\Business\Mapper\MigrationStatus; use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationStepAliasContract; use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationStepContract; use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationStepCreateIndexContract; @@ -88,24 +89,24 @@ public function it_updates_a_migration() $this->assertNull($this->repository->find(1)); $this->repository->create(2, 'createIndex', 'phpunit'); - $this->assertEquals(ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_WAIT, $this->repository->find(1)->status); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_WAIT, $this->repository->find(1)->status); // Running - $this->repository->update(1, ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_RUNNING); - $this->assertEquals(ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_RUNNING, $this->repository->find(1)->status); + $this->repository->update(1, MigrationStatus::MIGRATION_STATUS_RUNNING); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_RUNNING, $this->repository->find(1)->status); // Error - $this->repository->update(1, ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_ERROR, 'error'); - $this->assertEquals(ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_ERROR, $this->repository->find(1)->status); + $this->repository->update(1, MigrationStatus::MIGRATION_STATUS_ERROR, 'error'); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_ERROR, $this->repository->find(1)->status); $this->assertEquals('error', $this->repository->find(1)->error); // Done - $this->repository->update(1, ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_DONE); - $this->assertEquals(ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_DONE, $this->repository->find(1)->status); + $this->repository->update(1, MigrationStatus::MIGRATION_STATUS_DONE); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_DONE, $this->repository->find(1)->status); // Done => invalid status id $this->repository->update(1, 999); - $this->assertEquals(ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_DONE, $this->repository->find(1)->status); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_DONE, $this->repository->find(1)->status); } /** @@ -114,7 +115,7 @@ public function it_updates_a_migration() */ public function it_throws_an_exception_when_migrations_not_exist_at_update() { - $this->repository->update(1, ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_DONE); + $this->repository->update(1, MigrationStatus::MIGRATION_STATUS_DONE); } /** diff --git a/tests/integration/Business/Repository/ElasticsearchMigrationTest.php b/tests/integration/Business/Repository/ElasticsearchMigrationTest.php index 5ff33fd..39a01f8 100644 --- a/tests/integration/Business/Repository/ElasticsearchMigrationTest.php +++ b/tests/integration/Business/Repository/ElasticsearchMigrationTest.php @@ -5,6 +5,7 @@ use Triadev\EsMigration\Business\Events\MigrationDone; use Triadev\EsMigration\Business\Events\MigrationError; use Triadev\EsMigration\Business\Events\MigrationRunning; +use Triadev\EsMigration\Business\Mapper\MigrationStatus; use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract; use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationStepContract; use Triadev\EsMigration\Models\Entity\ElasticsearchMigration; @@ -53,24 +54,24 @@ public function it_updates_a_migration() // WAIT $this->repository->createOrUpdate('1.0.0'); - $this->assertEquals(ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_WAIT, $this->repository->find('1.0.0')->status); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_WAIT, $this->repository->find('1.0.0')->status); // ERROR - $this->repository->createOrUpdate('1.0.0', ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_ERROR, 'error'); - $this->assertEquals(ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_ERROR, $this->repository->find('1.0.0')->status); + $this->repository->createOrUpdate('1.0.0', MigrationStatus::MIGRATION_STATUS_ERROR, 'error'); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_ERROR, $this->repository->find('1.0.0')->status); $this->assertEquals('error', $this->repository->find('1.0.0')->error); // RUNNING - $this->repository->createOrUpdate('1.0.0', ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_RUNNING); - $this->assertEquals(ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_RUNNING, $this->repository->find('1.0.0')->status); + $this->repository->createOrUpdate('1.0.0', MigrationStatus::MIGRATION_STATUS_RUNNING); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_RUNNING, $this->repository->find('1.0.0')->status); // DONE - $this->repository->createOrUpdate('1.0.0', ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE); - $this->assertEquals(ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, $this->repository->find('1.0.0')->status); + $this->repository->createOrUpdate('1.0.0', MigrationStatus::MIGRATION_STATUS_DONE); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_DONE, $this->repository->find('1.0.0')->status); // DONE => invalid status id $this->repository->createOrUpdate('1.0.0', 999); - $this->assertEquals(ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, $this->repository->find('1.0.0')->status); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_DONE, $this->repository->find('1.0.0')->status); } /** @@ -136,9 +137,9 @@ public function it_gets_all_migrations() $migrations = $this->repository->all(['id', 'migration', 'status']); $this->assertEquals('1.0.0', $migrations[0]->migration); - $this->assertEquals(ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_WAIT, $migrations[0]->status); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_WAIT, $migrations[0]->status); $this->assertEquals('1.0.1', $migrations[1]->migration); - $this->assertEquals(ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_WAIT, $migrations[1]->status); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_WAIT, $migrations[1]->status); } } diff --git a/tests/integration/Console/Commands/ShowMigrationTest.php b/tests/integration/Console/Commands/ShowMigrationTest.php deleted file mode 100644 index 09b14db..0000000 --- a/tests/integration/Console/Commands/ShowMigrationTest.php +++ /dev/null @@ -1,58 +0,0 @@ -migrationRepository = app( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::class - ); - } - - /** - * @test - */ - public function it_shows_migrations_with_status() - { - $now = Carbon::now()->subSeconds(1); - - Carbon::setTestNow($now); - - $this->migrationRepository->createOrUpdate( - '1.0.0', - ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE - ); - - $now->addSeconds(1); - - Carbon::setTestNow($now); - - $this->migrationRepository->createOrUpdate( - '1.0.1', - ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_ERROR - ); - - $this->artisan('triadev:elasticsearch:migration:show') - ->assertExitCode(0); - - $this->artisan('triadev:elasticsearch:migration:show', [ - 'sortField' => 'createdAt', - 'sortOrder' => 'desc' - ])->assertExitCode(0); - - $this->artisan('triadev:elasticsearch:migration:show', [ - 'sortField' => 'updatedAt', - 'sortOrder' => 'asc' - ])->assertExitCode(0); - } -} diff --git a/tests/integration/Console/Commands/StartMigrationTest.php b/tests/integration/Console/Commands/StartMigrationTest.php deleted file mode 100644 index 13843aa..0000000 --- a/tests/integration/Console/Commands/StartMigrationTest.php +++ /dev/null @@ -1,307 +0,0 @@ -service = app(ElasticsearchMigrationContract::class); - $this->elasticsearchMigrationDatabaseService = app(ElasticsearchMigrationDatabaseContract::class); - $this->esClient = $this->buildElasticsearchClient(); - - if ($this->esClient->indices()->exists(['index' => 'phpunit'])) { - $this->esClient->indices()->delete([ - 'index' => 'phpunit' - ]); - } - - if ($this->esClient->indices()->exists(['index' => 'phpunit_1.0.1'])) { - $this->esClient->indices()->delete([ - 'index' => 'phpunit_1.0.1' - ]); - } - - $this->migrationRepository = app( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::class - ); - } - - private function buildElasticsearchClient() : Client - { - $config = config('triadev-elasticsearch-migration'); - - $clientBuilder = ClientBuilder::create(); - $clientBuilder->setHosts([ - [ - 'host' => $config['host'], - 'port' => $config['port'], - 'scheme' => $config['scheme'], - 'user' => $config['user'], - 'pass' => $config['pass'] - ] - ]); - - return $clientBuilder->build(); - } - - /** - * @test - */ - public function it_creates_and_updates_mappings_and_settings_with_command() - { - $this->assertNull($this->migrationRepository->find('1.0.0')); - - $this->assertFalse($this->esClient->indices()->exists([ - 'index' => 'phpunit' - ])); - - $this->artisan('triadev:elasticsearch:migration:start', [ - 'versions' => '1.0.0' - ])->assertExitCode(0); - - $this->assertTrue($this->esClient->indices()->exists(['index' => 'phpunit'])); - - $mapping = $this->esClient->indices()->getMapping([ - 'index' => 'phpunit', - 'type' => 'phpunit' - ]); - - $this->assertTrue(array_has($mapping, 'phpunit.mappings.phpunit.properties.title')); - $this->assertTrue(array_has($mapping, 'phpunit.mappings.phpunit.properties.description')); - - $settings = $this->esClient->indices()->getSettings([ - 'index' => 'phpunit' - ]); - - $this->assertEquals('60s', array_get($settings, 'phpunit.settings.index.refresh_interval')); - $this->assertEquals('custom', array_get($settings, 'phpunit.settings.index.analysis.analyzer.content.type')); - $this->assertEquals('whitespace', array_get($settings, 'phpunit.settings.index.analysis.analyzer.content.tokenizer')); - - $migration = $this->migrationRepository->find('1.0.0'); - - $this->assertEquals('1.0.0', $migration->migration); - $this->assertEquals( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, - $migration->status - ); - } - - /** - * @test - */ - public function it_creates_and_updates_mappings_and_settings_with_command_with_database() - { - $this->assertNull($this->migrationRepository->find('1.0.0')); - - $this->assertFalse($this->esClient->indices()->exists([ - 'index' => 'phpunit' - ])); - - $this->assertTrue($this->elasticsearchMigrationDatabaseService->createMigration('1.0.0')); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - '1.0.0', - 'createIndex', - 'phpunit', - [ - 'mappings' => [ - 'phpunit' => [ - 'dynamic' => 'strict', - 'properties' => [ - 'title' => [ - 'type' => 'text' - ], - 'count' => [ - 'type' => 'integer' - ] - ] - ] - ], - 'settings' => [ - 'refresh_interval' => "30s" - ] - ] - )); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - '1.0.0', - 'updateIndex', - 'phpunit', - [ - 'mappings' => [ - 'phpunit' => [ - 'properties' => [ - 'description' => [ - 'type' => 'text' - ] - ] - ] - ], - 'settings' => [ - 'index' => [ - 'refresh_interval' => "60s" - ] - ] - ] - )); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - '1.0.0', - 'updateIndex', - 'phpunit', - [ - 'settings' => [ - 'analysis' => [ - 'analyzer' => [ - 'content' => [ - 'type' => 'custom', - 'tokenizer' => 'whitespace' - ] - ] - ] - ], - 'closeIndex' => true - ] - )); - - $this->artisan('triadev:elasticsearch:migration:start', [ - 'versions' => '1.0.0', - '--source' => 'database' - ])->assertExitCode(0); - - $this->assertTrue($this->esClient->indices()->exists(['index' => 'phpunit'])); - - $mapping = $this->esClient->indices()->getMapping([ - 'index' => 'phpunit', - 'type' => 'phpunit' - ]); - - $this->assertTrue(array_has($mapping, 'phpunit.mappings.phpunit.properties.title')); - $this->assertTrue(array_has($mapping, 'phpunit.mappings.phpunit.properties.description')); - - $settings = $this->esClient->indices()->getSettings([ - 'index' => 'phpunit' - ]); - - $this->assertEquals('60s', array_get($settings, 'phpunit.settings.index.refresh_interval')); - $this->assertEquals('custom', array_get($settings, 'phpunit.settings.index.analysis.analyzer.content.type')); - $this->assertEquals('whitespace', array_get($settings, 'phpunit.settings.index.analysis.analyzer.content.tokenizer')); - - $migration = $this->migrationRepository->find('1.0.0'); - - $this->assertEquals('1.0.0', $migration->migration); - $this->assertEquals( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, - $migration->status - ); - } - - /** - * @test - */ - public function it_starts_to_orchestra_migrations() - { - $this->assertNull($this->migrationRepository->find('1.0.0')); - $this->assertNull($this->migrationRepository->find('1.0.1')); - - $this->assertFalse($this->esClient->indices()->exists([ - 'index' => 'phpunit,phpunit_1.0.1' - ])); - - $this->artisan('triadev:elasticsearch:migration:start', [ - 'versions' => '1.0.0, 1.0.1' - ])->assertExitCode(0); - - $this->assertTrue($this->esClient->indices()->exists(['index' => 'phpunit,phpunit_1.0.1'])); - - $migrationResult = $this->migrationRepository->find('1.0.0'); - $this->assertEquals(\Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, $migrationResult->status); - - $migrationResult = $this->migrationRepository->find('1.0.1'); - $this->assertEquals(\Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, $migrationResult->status); - } - - /** - * @test - */ - public function it_starts_to_orchestra_migrations_with_database() - { - $this->assertNull($this->migrationRepository->find('1.0.0')); - $this->assertNull($this->migrationRepository->find('1.0.1')); - - $this->assertFalse($this->esClient->indices()->exists([ - 'index' => 'phpunit,phpunit_1.0.1' - ])); - - $this->assertTrue($this->elasticsearchMigrationDatabaseService->createMigration('1.0.0')); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - '1.0.0', - 'createIndex', - 'phpunit', - [ - 'mappings' => [ - 'phpunit' => [ - 'dynamic' => 'strict', - 'properties' => [ - 'title' => [ - 'type' => 'text' - ], - 'count' => [ - 'type' => 'integer' - ] - ] - ] - ] - ] - )); - - $this->assertTrue($this->elasticsearchMigrationDatabaseService->createMigration('1.0.1')); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - '1.0.1', - 'createIndex', - 'phpunit_1.0.1', - [ - 'mappings' => [ - 'phpunit' => [ - 'dynamic' => 'strict', - 'properties' => [ - 'title' => [ - 'type' => 'text' - ], - 'count' => [ - 'type' => 'integer' - ] - ] - ] - ] - ] - )); - - $this->artisan('triadev:elasticsearch:migration:start', [ - 'versions' => '1.0.0, 1.0.1', - '--source' => 'database' - ])->assertExitCode(0); - - $this->assertTrue($this->esClient->indices()->exists(['index' => 'phpunit,phpunit_1.0.1'])); - - $this->assertEquals(\Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, $this->migrationRepository->find('1.0.0')->status); - $this->assertEquals(\Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, $this->migrationRepository->find('1.0.1')->status); - } -} diff --git a/tests/integration/ElasticsearchMigrationDatabaseTest.php b/tests/integration/ElasticsearchMigrationDatabaseTest.php deleted file mode 100644 index 06cab35..0000000 --- a/tests/integration/ElasticsearchMigrationDatabaseTest.php +++ /dev/null @@ -1,395 +0,0 @@ -service = app(ElasticsearchMigrationDatabaseContract::class); - - $this->elasticsearchMigrationRepository = app(ElasticsearchMigrationContract::class); - $this->elasticsearchMigrationStepRepository = app(ElasticsearchMigrationStepContract::class); - } - - /** - * @test - */ - public function it_creates_migration() - { - $this->assertNull($this->elasticsearchMigrationRepository->find('1.0.0')); - - $this->assertTrue($this->service->createMigration('1.0.0')); - - $this->assertEquals(1, $this->elasticsearchMigrationRepository->find('1.0.0')->getAttribute('id')); - } - - /** - * @test - */ - public function it_adds_migration() - { - $this->assertFalse($this->service->addMigration('1.0.0', 'default', 'phpunit')); - $this->assertNull($this->elasticsearchMigrationStepRepository->find(1)); - - $this->assertTrue($this->service->createMigration('1.0.0')); - - $this->assertTrue($this->service->addMigration('1.0.0', 'createIndex', 'phpunit', [ - 'mappings' => [ - 'example' => [ - 'properties' => [ - 'title' => [ - 'type' => 'text' - ] - ] - ] - ] - ])); - - $this->assertEquals( - 1, - $this->elasticsearchMigrationStepRepository->find(1)->getAttribute('id') - ); - } - - /** - * @test - */ - public function it_adds_create_index_migration() - { - /** @var ElasticsearchMigrationStepCreateIndexContract $repository */ - $repository = app(ElasticsearchMigrationStepCreateIndexContract::class); - - $this->assertFalse($this->service->addMigration('1.0.0', 'createIndex', 'phpunit')); - $this->assertNull($this->elasticsearchMigrationStepRepository->find(1)); - $this->assertNull($repository->find(1)); - - $this->assertTrue($this->service->createMigration('1.0.0')); - - $this->assertTrue($this->service->addMigration('1.0.0', 'createIndex', 'phpunit', [ - 'mappings' => [] - ])); - - $this->assertEquals(1, $this->elasticsearchMigrationStepRepository->find(1)->getAttribute('id')); - - $migration = $repository->find(1); - $this->assertInstanceOf(ElasticsearchMigrationStepCreateIndex::class, $migration); - $this->assertEquals(1, $migration->getAttribute('id')); - } - - /** - * @test - */ - public function it_adds_update_index_migration() - { - /** @var ElasticsearchMigrationStepUpdateIndexContract $repository */ - $repository = app(ElasticsearchMigrationStepUpdateIndexContract::class); - - $this->assertFalse($this->service->addMigration('1.0.0', 'updateIndex', 'phpunit')); - $this->assertNull($this->elasticsearchMigrationStepRepository->find(1)); - $this->assertNull($repository->find(1)); - - $this->assertTrue($this->service->createMigration('1.0.0')); - - $this->assertTrue($this->service->addMigration('1.0.0', 'updateIndex', 'phpunit', [])); - - $this->assertEquals(1, $this->elasticsearchMigrationStepRepository->find(1)->getAttribute('id')); - - $migration = $repository->find(1); - $this->assertInstanceOf(ElasticsearchMigrationStepUpdateIndex::class, $migration); - $this->assertEquals(1, $migration->getAttribute('id')); - } - - /** - * @test - */ - public function it_adds_delete_index_migration() - { - $this->assertFalse($this->service->addMigration('1.0.0', 'deleteIndex', 'phpunit')); - $this->assertNull($this->elasticsearchMigrationStepRepository->find(1)); - - $this->assertTrue($this->service->createMigration('1.0.0')); - - $this->assertTrue($this->service->addMigration('1.0.0', 'deleteIndex', 'phpunit', [])); - - $this->assertEquals(1, $this->elasticsearchMigrationStepRepository->find(1)->getAttribute('id')); - } - - /** - * @test - */ - public function it_adds_alias_migration() - { - /** @var ElasticsearchMigrationStepAliasContract $repository */ - $repository = app(ElasticsearchMigrationStepAliasContract::class); - - $this->assertFalse($this->service->addMigration('1.0.0', 'alias', 'phpunit')); - $this->assertNull($this->elasticsearchMigrationStepRepository->find(1)); - $this->assertNull($repository->find(1)); - - $this->assertTrue($this->service->createMigration('1.0.0')); - - $this->assertTrue($this->service->addMigration('1.0.0', 'alias', 'phpunit', [])); - - $this->assertEquals(1, $this->elasticsearchMigrationStepRepository->find(1)->getAttribute('id')); - - $migration = $repository->find(1); - $this->assertInstanceOf(ElasticsearchMigrationStepAlias::class, $migration); - $this->assertEquals(1, $migration->getAttribute('id')); - } - - /** - * @test - */ - public function it_adds_delete_by_query_migration() - { - /** @var ElasticsearchMigrationStepDeleteByQueryContract $repository */ - $repository = app(ElasticsearchMigrationStepDeleteByQueryContract::class); - - $this->assertFalse($this->service->addMigration('1.0.0', 'deleteByQuery', 'phpunit')); - $this->assertNull($this->elasticsearchMigrationStepRepository->find(1)); - $this->assertNull($repository->find(1)); - - $this->assertTrue($this->service->createMigration('1.0.0')); - - $this->assertTrue($this->service->addMigration('1.0.0', 'deleteByQuery', 'phpunit', [ - 'query' => [] - ])); - - $this->assertEquals(1, $this->elasticsearchMigrationStepRepository->find(1)->getAttribute('id')); - - $migration = $repository->find(1); - $this->assertInstanceOf(ElasticsearchMigrationStepDeleteByQuery::class, $migration); - $this->assertEquals(1, $migration->getAttribute('id')); - } - - /** - * @test - */ - public function it_adds_update_by_query_migration() - { - /** @var ElasticsearchMigrationStepUpdateByQueryContract $repository */ - $repository = app(ElasticsearchMigrationStepUpdateByQueryContract::class); - - $this->assertFalse($this->service->addMigration('1.0.0', 'updateByQuery', 'phpunit')); - $this->assertNull($this->elasticsearchMigrationStepRepository->find(1)); - $this->assertNull($repository->find(1)); - - $this->assertTrue($this->service->createMigration('1.0.0')); - - $this->assertTrue($this->service->addMigration('1.0.0', 'updateByQuery', 'phpunit', [ - 'query' => [] - ])); - - $this->assertEquals(1, $this->elasticsearchMigrationStepRepository->find(1)->getAttribute('id')); - - $migration = $repository->find(1); - $this->assertInstanceOf(ElasticsearchMigrationStepUpdateByQuery::class, $migration); - $this->assertEquals(1, $migration->getAttribute('id')); - } - - /** - * @test - */ - public function it_adds_reindex_migration() - { - /** @var ElasticsearchMigrationStepReindexContract $repository */ - $repository = app(ElasticsearchMigrationStepReindexContract::class); - - $this->assertFalse($this->service->addMigration('1.0.0', 'reindex', 'phpunit')); - $this->assertNull($this->elasticsearchMigrationStepRepository->find(1)); - $this->assertNull($repository->find(1)); - - $this->assertTrue($this->service->createMigration('1.0.0')); - - $this->assertTrue($this->service->addMigration('1.0.0', 'reindex', 'phpunit', [ - 'destIndex' => 'phpunit' - ])); - - $this->assertEquals(1, $this->elasticsearchMigrationStepRepository->find(1)->getAttribute('id')); - - $migration = $repository->find(1); - $this->assertInstanceOf(ElasticsearchMigrationStepReindex::class, $migration); - $this->assertEquals(1, $migration->getAttribute('id')); - $this->assertEquals('phpunit', $migration->getAttribute('dest_index')); - } - - /** - * @test - */ - public function it_gets_migration() - { - $this->assertEquals([], $this->service->getMigration('1.0.0')); - - $this->assertTrue($this->service->createMigration('1.0.0')); - $this->assertFalse($this->service->addMigration('1.0.0', 'default', 'phpunit')); - $this->assertTrue($this->service->addMigration('1.0.0', 'createIndex', 'phpunit', [ - 'mappings' => [ - 'example' => [ - 'properties' => [ - 'title' => [ - 'type' => 'text' - ] - ] - ] - ] - ])); - $this->assertTrue($this->service->addMigration('1.0.0', 'updateIndex', 'phpunit', [])); - $this->assertTrue($this->service->addMigration('1.0.0', 'deleteIndex', 'phpunit', [])); - $this->assertTrue($this->service->addMigration('1.0.0', 'alias', 'phpunit', [])); - $this->assertTrue($this->service->addMigration('1.0.0', 'deleteByQuery', 'phpunit', [ - 'query' => [] - ])); - $this->assertTrue($this->service->addMigration('1.0.0', 'updateByQuery', 'phpunit', [ - 'query' => [] - ])); - $this->assertTrue($this->service->addMigration('1.0.0', 'reindex', 'phpunit', [ - 'destIndex' => 'phpunit' - ])); - - $migrations = $this->service->getMigration('1.0.0'); - - $this->assertCount(7, $migrations); - - $this->assertInstanceOf(CreateIndex::class, $migrations[1]); - $this->assertInstanceOf(UpdateIndex::class, $migrations[2]); - $this->assertInstanceOf(DeleteIndex::class, $migrations[3]); - $this->assertInstanceOf(Alias::class, $migrations[4]); - $this->assertInstanceOf(DeleteByQuery::class, $migrations[5]); - $this->assertInstanceOf(UpdateByQuery::class, $migrations[6]); - $this->assertInstanceOf(Reindex::class, $migrations[7]); - } - - /** - * @test - */ - public function it_gets_migration_without_status_done_steps() - { - $this->assertEquals([], $this->service->getMigration('1.0.0')); - - $this->assertTrue($this->service->createMigration('1.0.0')); - $this->assertFalse($this->service->addMigration('1.0.0', 'default', 'phpunit')); - $this->assertTrue($this->service->addMigration('1.0.0', 'updateIndex', 'phpunit', [])); - $this->assertTrue($this->service->addMigration('1.0.0', 'deleteIndex', 'phpunit', [])); - $this->assertTrue($this->service->addMigration('1.0.0', 'alias', 'phpunit', [])); - - $this->assertCount(3, $this->service->getMigration('1.0.0')); - - $this->elasticsearchMigrationStepRepository->update( - 1, - ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, - null - ); - - $this->assertCount(2, $this->service->getMigration('1.0.0')); - } - - /** - * @test - */ - public function it_gets_migration_steps() - { - $this->assertEquals([], $this->service->getMigration('1.0.0')); - - $this->assertTrue($this->service->createMigration('1.0.0')); - $this->assertFalse($this->service->addMigration('1.0.0', 'default', 'phpunit')); - $this->assertTrue($this->service->addMigration('1.0.0', 'createIndex', 'phpunit', [ - 'mappings' => [ - 'example' => [ - 'properties' => [ - 'title' => [ - 'type' => 'text' - ] - ] - ] - ] - ])); - $this->assertTrue($this->service->addMigration('1.0.0', 'updateIndex', 'phpunit', [])); - $this->assertTrue($this->service->addMigration('1.0.0', 'deleteIndex', 'phpunit', [])); - $this->assertTrue($this->service->addMigration('1.0.0', 'alias', 'phpunit', [])); - $this->assertTrue($this->service->addMigration('1.0.0', 'deleteByQuery', 'phpunit', [ - 'query' => [] - ])); - $this->assertTrue($this->service->addMigration('1.0.0', 'updateByQuery', 'phpunit', [ - 'query' => [] - ])); - $this->assertTrue($this->service->addMigration('1.0.0', 'reindex', 'phpunit', [ - 'destIndex' => 'phpunit' - ])); - - $migrationSteps = $this->service->getMigrationSteps('1.0.0'); - $this->assertCount(7, $migrationSteps); - - foreach ($migrationSteps as $migrationStep) { - $this->assertTrue(array_has( - $migrationStep, - [ - 'type', - 'index', - 'status', - 'error', - 'created_at', - 'updated_at' - ] - )); - } - } - - /** - * @test - */ - public function it_gets_migration_steps_without_status_done_steps() - { - $this->assertEquals([], $this->service->getMigration('1.0.0')); - - $this->assertTrue($this->service->createMigration('1.0.0')); - $this->assertFalse($this->service->addMigration('1.0.0', 'default', 'phpunit')); - $this->assertTrue($this->service->addMigration('1.0.0', 'updateIndex', 'phpunit', [])); - $this->assertTrue($this->service->addMigration('1.0.0', 'deleteIndex', 'phpunit', [])); - $this->assertTrue($this->service->addMigration('1.0.0', 'alias', 'phpunit', [])); - - $this->assertCount(3, $this->service->getMigrationSteps('1.0.0')); - - $this->elasticsearchMigrationStepRepository->update( - 1, - ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, - null - ); - - $this->assertCount(2, $this->service->getMigrationSteps('1.0.0')); - } -} diff --git a/tests/integration/ElasticsearchMigrationTest.php b/tests/integration/ElasticsearchMigrationTest.php index 1ed1571..6ee9e14 100644 --- a/tests/integration/ElasticsearchMigrationTest.php +++ b/tests/integration/ElasticsearchMigrationTest.php @@ -2,439 +2,186 @@ namespace Tests\Integration; use Elasticsearch\Client; -use Elasticsearch\ClientBuilder; use Tests\TestCase; +use Triadev\EsMigration\Business\Events\MigrationDone; +use Triadev\EsMigration\Business\Events\MigrationRunning; +use Triadev\EsMigration\Business\Events\MigrationStepDone; +use Triadev\EsMigration\Business\Events\MigrationStepRunning; +use Triadev\EsMigration\Business\Mapper\MigrationStatus; +use Triadev\EsMigration\Business\Mapper\MigrationTypes; +use Triadev\EsMigration\Business\Repository\ElasticsearchClients; use Triadev\EsMigration\Contract\ElasticsearchMigrationContract; -use Triadev\EsMigration\Contract\ElasticsearchMigrationDatabaseContract; -use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationStepContract; -use Triadev\EsMigration\Exception\FieldDatatypeMigrationFailed; +use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract as ElasticsearchMigrationRepository; +use Triadev\EsMigration\Models\Entity\ElasticsearchMigration; class ElasticsearchMigrationTest extends TestCase { /** @var ElasticsearchMigrationContract */ - private $service; + private $migrationService; - /** @var Client */ - private $esClient; - - /** @var \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract */ + /** @var ElasticsearchMigrationRepository */ private $migrationRepository; - /** @var ElasticsearchMigrationDatabaseContract */ - private $elasticsearchMigrationDatabaseService; + /** @var ElasticsearchClients */ + private $elasticsearchClients; + /** + * SetUp + */ public function setUp() { parent::setUp(); - $this->service = app(ElasticsearchMigrationContract::class); - $this->elasticsearchMigrationDatabaseService = app(ElasticsearchMigrationDatabaseContract::class); - $this->esClient = $this->buildElasticsearchClient(); + $this->migrationService = app(ElasticsearchMigrationContract::class); + $this->migrationRepository = app(ElasticsearchMigrationRepository::class); - if ($this->esClient->indices()->exists(['index' => 'phpunit'])) { - $this->esClient->indices()->delete([ - 'index' => 'phpunit' - ]); - } - - if ($this->esClient->indices()->exists(['index' => 'phpunit_1.0.1'])) { - $this->esClient->indices()->delete([ - 'index' => 'phpunit_1.0.1' - ]); - } - - $this->migrationRepository = app( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::class + $this->elasticsearchClients = new ElasticsearchClients(); + $this->elasticsearchClients->add( + 'phpunit', + 'localhost', + env('ELASTICSEARCH_PORT'), + 'http', + '', + '' ); - - $this->buildDatabaseTestData(); - } - - private function buildElasticsearchClient() : Client - { - $config = config('triadev-elasticsearch-migration'); - - $clientBuilder = ClientBuilder::create(); - $clientBuilder->setHosts([ - [ - 'host' => $config['host'], - 'port' => $config['port'], - 'scheme' => $config['scheme'], - 'user' => $config['user'], - 'pass' => $config['pass'] - ] - ]); - - return $clientBuilder->build(); - } - private function buildDatabaseTestData() - { - $this->assertTrue($this->elasticsearchMigrationDatabaseService->createMigration('1.0.0')); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - '1.0.0', - 'createIndex', - 'phpunit', - [ - 'mappings' => [ - 'phpunit' => [ - 'dynamic' => 'strict', - 'properties' => [ - 'title' => [ - 'type' => 'text' - ], - 'count' => [ - 'type' => 'integer' - ] - ] - ] - ], - 'settings' => [ - 'refresh_interval' => "30s" - ] - ] - )); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - '1.0.0', - 'updateIndex', - 'phpunit', - [ - 'mappings' => [ - 'phpunit' => [ - 'properties' => [ - 'description' => [ - 'type' => 'text' - ] - ] - ] - ], - 'settings' => [ - 'index' => [ - 'refresh_interval' => "60s" - ] - ] - ] - )); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - '1.0.0', - 'updateIndex', - 'phpunit', - [ - 'settings' => [ - 'analysis' => [ - 'analyzer' => [ - 'content' => [ - 'type' => 'custom', - 'tokenizer' => 'whitespace' - ] - ] - ] - ], - 'closeIndex' => true - ] - )); + /** @var Client $esClient */ + $esClient = $this->elasticsearchClients->get('phpunit'); + if ($esClient->indices()->exists(['index' => 'index'])) { + $esClient->indices()->delete(['index' => 'index']); + } } /** * @test */ - public function it_creates_and_updates_mappings_and_settings() + public function it_creates_a_migration() { - $this->assertEquals( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_WAIT, - $this->migrationRepository->find('1.0.0')->status - ); + $this->assertNull($this->migrationRepository->find('phpunit')); - $this->assertFalse($this->esClient->indices()->exists([ - 'index' => 'phpunit' - ])); - - $this->service->migrate('1.0.0'); - - $this->assertTrue($this->esClient->indices()->exists([ - 'index' => 'phpunit' - ])); - - $mapping = $this->esClient->indices()->getMapping([ - 'index' => 'phpunit', - 'type' => 'phpunit' - ]); - - $this->assertTrue(array_has($mapping, 'phpunit.mappings.phpunit.properties.title')); - $this->assertTrue(array_has($mapping, 'phpunit.mappings.phpunit.properties.description')); - - $settings = $this->esClient->indices()->getSettings([ - 'index' => 'phpunit' - ]); - - $this->assertEquals('60s', array_get($settings, 'phpunit.settings.index.refresh_interval')); - $this->assertEquals('custom', array_get($settings, 'phpunit.settings.index.analysis.analyzer.content.type')); - $this->assertEquals('whitespace', array_get($settings, 'phpunit.settings.index.analysis.analyzer.content.tokenizer')); + $this->assertTrue( + $this->migrationService->createMigration( + 'phpunit' + ) + ); - $migration = $this->migrationRepository->find('1.0.0'); - - $this->assertEquals('1.0.0', $migration->migration); - $this->assertEquals( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, - $migration->status + $this->assertInstanceOf( + ElasticsearchMigration::class, + $this->migrationRepository->find('phpunit') ); } /** * @test */ - public function it_creates_and_updates_mappings_and_settings_with_database() + public function it_adds_migration_steps() { - $this->assertEquals(\Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_WAIT, $this->migrationRepository->find('1.0.0')->status); - - $this->assertFalse($this->esClient->indices()->exists(['index' => 'phpunit'])); - - $this->service->migrate('1.0.0', 'database'); + $this->assertTrue($this->migrationService->createMigration('phpunit')); - $this->assertTrue($this->esClient->indices()->exists(['index' => 'phpunit'])); - - $mapping = $this->esClient->indices()->getMapping(['index' => 'phpunit', 'type' => 'phpunit']); - $this->assertTrue(array_has($mapping, 'phpunit.mappings.phpunit.properties.title')); - $this->assertTrue(array_has($mapping, 'phpunit.mappings.phpunit.properties.description')); - - $settings = $this->esClient->indices()->getSettings(['index' => 'phpunit']); - $this->assertEquals('60s', array_get($settings, 'phpunit.settings.index.refresh_interval')); - $this->assertEquals('custom', array_get($settings, 'phpunit.settings.index.analysis.analyzer.content.type')); - $this->assertEquals('whitespace', array_get($settings, 'phpunit.settings.index.analysis.analyzer.content.tokenizer')); - - $migration = $this->migrationRepository->find('1.0.0'); - - $this->assertEquals('1.0.0', $migration->migration); - $this->assertEquals(\Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, $migration->status); + $this->assertEquals( + 0, + $this->migrationRepository->find('phpunit')->migrationSteps()->count() + ); - $migrationSteps = $migration->migrationSteps(); - $this->assertEquals(3, $migrationSteps->count()); + $this->addMigrationSteps(); - foreach ($migrationSteps->cursor() as $migrationStep) { - $this->assertEquals(ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_DONE, $migrationStep->status); - } + $this->assertEquals(7, $this->migrationRepository->find('phpunit')->migrationSteps()->count()); } /** * @test */ - public function it_deletes_an_index() + public function it_gets_migration_status() { - $this->service->migrate('1.0.0'); - - $this->assertTrue($this->esClient->indices()->exists(['index' => 'phpunit'])); - - $this->service->migrate('delete_index'); + $this->assertEquals([ + 'migration' => 'phpunit', + 'status' => null, + 'steps' => [] + ], $this->migrationService->getMigrationStatus('phpunit')); - $this->assertFalse($this->esClient->indices()->exists(['index' => 'phpunit'])); - } - - /** - * @test - */ - public function it_deletes_an_index_with_database() - { - $this->assertFalse($this->esClient->indices()->exists(['index' => 'phpunit'])); + $this->assertTrue($this->migrationService->createMigration('phpunit')); - $this->service->migrate('1.0.0', 'database'); + $this->addMigrationSteps(); - $this->assertTrue($this->esClient->indices()->exists(['index' => 'phpunit'])); - - $this->assertTrue($this->elasticsearchMigrationDatabaseService->createMigration('delete_index')); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - 'delete_index', - 'deleteIndex', - 'phpunit' - )); + $result = $this->migrationService->getMigrationStatus('phpunit'); - $this->service->migrate('delete_index', 'database'); + $this->assertEquals('phpunit', $result['migration']); + $this->assertEquals( MigrationStatus::MIGRATION_STATUS_WAIT, $result['status']); - $this->assertFalse($this->esClient->indices()->exists(['index' => 'phpunit'])); - } - - /** - * @test - */ - public function it_adds_and_deletes_an_alias() - { - $this->service->migrate('1.0.0'); - - $this->assertFalse($this->esClient->indices()->existsAlias([ - 'name' => 'alias', - 'index' => 'phpunit' - ])); + $this->assertCount(7, $result['steps']); - $this->service->migrate('add_alias'); - - $this->assertTrue($this->esClient->indices()->existsAlias([ - 'name' => 'alias', - 'index' => 'phpunit' - ])); - - $this->service->migrate('delete_alias'); - - $this->assertFalse($this->esClient->indices()->existsAlias([ - 'name' => 'alias', - 'index' => 'phpunit' - ])); + foreach ($result['steps'] as $step) { + $this->assertEquals('index', $step['index']); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_WAIT, $step['status']); + $this->assertEquals(null, $step['error']); + } } /** * @test */ - public function it_adds_and_deletes_an_alias_with_database() + public function it_starts_migration() { - $this->service->migrate('1.0.0', 'database'); - - $this->assertFalse($this->esClient->indices()->existsAlias([ - 'name' => 'alias', - 'index' => 'phpunit' - ])); - - $this->assertTrue($this->elasticsearchMigrationDatabaseService->createMigration('add_alias')); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - 'add_alias', - 'alias', - 'phpunit', - [ - 'add' => [ - 'alias' - ] - ] - )); - - $this->service->migrate('add_alias', 'database'); + $this->expectsEvents([ + MigrationRunning::class, + MigrationDone::class, + MigrationStepRunning::class, + MigrationStepDone::class + ]); - $this->assertTrue($this->esClient->indices()->existsAlias([ - 'name' => 'alias', - 'index' => 'phpunit' - ])); - - $this->assertTrue($this->elasticsearchMigrationDatabaseService->createMigration('delete_alias')); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - 'delete_alias', - 'alias', + $this->assertTrue($this->migrationService->createMigration('phpunit')); + $this->assertTrue($this->migrationService->addMigrationStep( 'phpunit', + MigrationTypes::MIGRATION_TYPE_CREATE_INDEX, + 'index', [ - 'remove' => [ - 'alias' + 'mappings' => [ + 'phpunit' => [ + 'dynamic' => 'strict', + 'properties' => [ + 'title' => [ + 'type' => 'text' + ], + 'count' => [ + 'type' => 'integer' + ] + ] + ] + ], + 'settings' => [ + 'refresh_interval' => "30s" ] ] )); - - $this->service->migrate('delete_alias', 'database'); - - $this->assertFalse($this->esClient->indices()->existsAlias([ - 'name' => 'alias', - 'index' => 'phpunit' - ])); - } - - /** - * @test - * @expectedException \Triadev\EsMigration\Exception\IndexNotExist - */ - public function it_throws_an_exception_if_reindex_dest_index_not_exist() - { - $this->service->migrate('1.0.0'); - $this->service->migrate('reindex'); - } - /** - * @test - */ - public function it_reindex_an_index() - { - $this->assertFalse($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])); - - $this->assertFalse($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit_1.0.1', - 'type' => 'phpunit' - ])); + $result = $this->migrationService->getMigrationStatus('phpunit'); + $this->assertEquals('phpunit', $result['migration']); + $this->assertEquals( MigrationStatus::MIGRATION_STATUS_WAIT, $result['status']); - $this->service->migrate('1.0.0'); - - $this->esClient->index([ - 'index' => 'phpunit', - 'type' => 'phpunit', - 'id' => 'reindex_test', - 'body' => [ - 'title' => 'Title' - ] - ]); + $this->migrationService->startMigration('phpunit', $this->elasticsearchClients); - $this->assertTrue($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])); + $result = $this->migrationService->getMigrationStatus('phpunit'); + $this->assertEquals('phpunit', $result['migration']); + $this->assertEquals( MigrationStatus::MIGRATION_STATUS_DONE, $result['status']); - $this->assertFalse($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit_1.0.1', - 'type' => 'phpunit' - ])); - - $this->service->migrate('1.0.1'); - $this->service->migrate('reindex'); - - $this->assertTrue($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit_1.0.1', - 'type' => 'phpunit' - ])); + foreach ($result['steps'] as $step) { + $this->assertEquals('index', $step['index']); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_DONE, $step['status']); + $this->assertEquals(null, $step['error']); + } } /** * @test + * @expectedException \Triadev\EsMigration\Exception\MigrationAlreadyDone */ - public function it_reindex_an_index_with_database() + public function it_throws_an_exception_if_a_migration_already_done() { - $this->assertFalse($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])); - - $this->assertFalse($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit_1.0.1', - 'type' => 'phpunit' - ])); - - $this->service->migrate('1.0.0', 'database'); - - $this->esClient->index([ - 'index' => 'phpunit', - 'type' => 'phpunit', - 'id' => 'reindex_test', - 'body' => [ - 'title' => 'Title' - ] - ]); - - $this->assertTrue($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])); - - $this->assertFalse($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit_1.0.1', - 'type' => 'phpunit' - ])); - - $this->assertTrue($this->elasticsearchMigrationDatabaseService->createMigration('1.0.1')); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - '1.0.1', - 'createIndex', - 'phpunit_1.0.1', + $this->assertTrue($this->migrationService->createMigration('phpunit')); + $this->assertTrue($this->migrationService->addMigrationStep( + 'phpunit', + MigrationTypes::MIGRATION_TYPE_CREATE_INDEX, + 'index', [ 'mappings' => [ 'phpunit' => [ @@ -455,286 +202,71 @@ public function it_reindex_an_index_with_database() ] )); - $this->service->migrate('1.0.1', 'database'); + $this->migrationService->startMigration('phpunit', $this->elasticsearchClients); + $this->migrationService->startMigration('phpunit', $this->elasticsearchClients); + } - $this->assertTrue($this->elasticsearchMigrationDatabaseService->createMigration('reindex')); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - 'reindex', - 'reindex', + private function addMigrationSteps() + { + // Create index + $this->assertTrue($this->migrationService->addMigrationStep( 'phpunit', + MigrationTypes::MIGRATION_TYPE_CREATE_INDEX, + 'index', [ - 'destIndex' => 'phpunit_1.0.1', - 'refreshSourceIndex' => true + 'mappings' => [] ] )); - - $this->service->migrate('reindex', 'database'); - - $this->assertTrue($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit_1.0.1', - 'type' => 'phpunit' - ])); - } - - /** - * @test - */ - public function it_deletes_documents_by_query() - { - $this->service->migrate('1.0.0'); - - $this->esClient->index([ - 'index' => 'phpunit', - 'type' => 'phpunit', - 'id' => 'reindex_test', - 'body' => [ - 'title' => 'Title' - ] - ]); - - $this->esClient->indices()->refresh([ - 'index' => 'phpunit' - ]); - $this->assertTrue($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])); - - $this->service->migrate('delete_by_query'); + // Update index + $this->assertTrue($this->migrationService->addMigrationStep( + 'phpunit', + MigrationTypes::MIGRATION_TYPE_UPDATE_INDEX, + 'index' + )); - $this->assertFalse($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])); - } + // Delete index + $this->assertTrue($this->migrationService->addMigrationStep( + 'phpunit', + MigrationTypes::MIGRATION_TYPE_DELETE_INDEX, + 'index' + )); - /** - * @test - */ - public function it_deletes_documents_by_query_with_database() - { - $this->service->migrate('1.0.0', 'database'); - - $this->esClient->index([ - 'index' => 'phpunit', - 'type' => 'phpunit', - 'id' => 'reindex_test', - 'body' => [ - 'title' => 'Title' - ] - ]); - - $this->esClient->indices()->refresh([ - 'index' => 'phpunit' - ]); - - $this->assertTrue($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])); + // Alias + $this->assertTrue($this->migrationService->addMigrationStep( + 'phpunit', + MigrationTypes::MIGRATION_TYPE_ALIAS, + 'index' + )); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->createMigration('delete_by_query')); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - 'delete_by_query', - 'deleteByQuery', + // Delete by query + $this->assertTrue($this->migrationService->addMigrationStep( 'phpunit', + MigrationTypes::MIGRATION_TYPE_DELETE_BY_QUERY, + 'index', [ - 'query' => [ - 'match' => [ - 'title' => 'Title' - ] - ], - 'type' => 'phpunit', - 'options' => [ - 'conflicts' => 'proceed' - ] + 'query' => [] ] )); - - $this->service->migrate('delete_by_query', 'database'); - - $this->assertFalse($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])); - } - /** - * @test - */ - public function it_updates_documents_by_query() - { - $this->service->migrate('1.0.0'); - - $this->esClient->index([ - 'index' => 'phpunit', - 'type' => 'phpunit', - 'id' => 'reindex_test', - 'body' => [ - 'title' => 'Title', - 'count' => 1 - ] - ]); - - $this->esClient->indices()->refresh([ - 'index' => 'phpunit' - ]); - - $this->assertEquals( - 1, - $this->esClient->get([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])['_source']['count'] - ); - - $this->service->migrate('update_by_query'); - - $this->assertEquals( - 2, - $this->esClient->get([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])['_source']['count'] - ); - } - - /** - * @test - */ - public function it_updates_documents_by_query_with_database() - { - $this->service->migrate('1.0.0', 'database'); - - $this->esClient->index([ - 'index' => 'phpunit', - 'type' => 'phpunit', - 'id' => 'reindex_test', - 'body' => [ - 'title' => 'Title', - 'count' => 1 + // Update by query + $this->assertTrue($this->migrationService->addMigrationStep( + 'phpunit', + MigrationTypes::MIGRATION_TYPE_UPDATE_BY_QUERY, + 'index', + [ + 'query' => [] ] - ]); - - $this->esClient->indices()->refresh([ - 'index' => 'phpunit' - ]); - - $this->assertEquals( - 1, - $this->esClient->get([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])['_source']['count'] - ); + )); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->createMigration('update_by_query')); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - 'update_by_query', - 'updateByQuery', + // Reindex + $this->assertTrue($this->migrationService->addMigrationStep( 'phpunit', + MigrationTypes::MIGRATION_TYPE_REINDEX, + 'index', [ - 'query' => [ - 'match' => [ - 'title' => 'Title' - ] - ], - 'type' => 'phpunit', - 'script' => [ - 'source' => 'ctx._source.count++', - 'lang' => 'painless' - ], - 'options' => [ - 'conflicts' => 'proceed' - ] + 'destIndex' => 'phpunit' ] )); - - $this->service->migrate('update_by_query', 'database'); - - $this->assertEquals( - 2, - $this->esClient->get([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])['_source']['count'] - ); - } - - /** - * @test - * @expectedException \Triadev\EsMigration\Exception\MigrationAlreadyDone - */ - public function it_throws_an_exception_if_migration_already_done() - { - $this->migrationRepository->createOrUpdate( - '1.0.0', - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE - ); - - $this->service->migrate('1.0.0'); - } - - /** - * @test - */ - public function it_updates_migration_status_from_error_to_done() - { - $this->migrationRepository->createOrUpdate( - '1.0.0', - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_ERROR - ); - - $this->assertEquals( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_ERROR, - $this->migrationRepository->find('1.0.0')->status - ); - - $this->service->migrate('1.0.0'); - - $this->assertEquals( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, - $this->migrationRepository->find('1.0.0')->status - ); - } - - /** - * @test - * @expectedException \Triadev\EsMigration\Exception\FieldDatatypeMigrationFailed - */ - public function it_throws_exception_if_field_migration_not_allowed() - { - $this->assertEquals( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_WAIT, - $this->migrationRepository->find('1.0.0')->status - ); - - $this->assertFalse($this->esClient->indices()->exists([ - 'index' => 'phpunit' - ])); - - $this->service->migrate('1.0.0'); - - $this->assertTrue($this->esClient->indices()->exists([ - 'index' => 'phpunit' - ])); - - try { - $this->service->migrate('field_datatype_migration_failed'); - } catch (FieldDatatypeMigrationFailed $e) { - $this->assertCount(2, json_decode($e->getMessage())); - - throw $e; - } } }