From eca600bdb6b6272f7e873290208b0f562adad3d5 Mon Sep 17 00:00:00 2001 From: Nathaniel Catchpole Date: Fri, 8 Dec 2017 13:31:20 +0000 Subject: [PATCH] Issue #2500521 by Jo Fitzgerald, RytoEX, quietone, gaurav.kapoor, hussainweb, phenaproxima: Upgrade path for Statistics 7.x and 6.x --- .../migrate_drupal/tests/fixtures/drupal6.php | 30 ++++++ .../migrations/statistics_node_counter.yml | 25 +++++ .../migrate/destination/NodeCounter.php | 96 +++++++++++++++++++ .../src/Plugin/migrate/source/NodeCounter.php | 44 +++++++++ .../Migrate/d6/MigrateNodeCounterTest.php | 77 +++++++++++++++ .../Migrate/d7/MigrateNodeCounterTest.php | 73 ++++++++++++++ .../Plugin/migrate/source/NodeCounterTest.php | 67 +++++++++++++ 7 files changed, 412 insertions(+) create mode 100644 core/modules/statistics/migrations/statistics_node_counter.yml create mode 100644 core/modules/statistics/src/Plugin/migrate/destination/NodeCounter.php create mode 100644 core/modules/statistics/src/Plugin/migrate/source/NodeCounter.php create mode 100644 core/modules/statistics/tests/src/Kernel/Migrate/d6/MigrateNodeCounterTest.php create mode 100644 core/modules/statistics/tests/src/Kernel/Migrate/d7/MigrateNodeCounterTest.php create mode 100644 core/modules/statistics/tests/src/Kernel/Plugin/migrate/source/NodeCounterTest.php diff --git a/core/modules/migrate_drupal/tests/fixtures/drupal6.php b/core/modules/migrate_drupal/tests/fixtures/drupal6.php index 4ca588b9c7d5..9334ac01423e 100644 --- a/core/modules/migrate_drupal/tests/fixtures/drupal6.php +++ b/core/modules/migrate_drupal/tests/fixtures/drupal6.php @@ -43534,6 +43534,36 @@ $connection->insert('node_counter') 'daycount', 'timestamp', )) +->values(array( + 'nid' => '1', + 'totalcount' => '2', + 'daycount' => '0', + 'timestamp' => '1421727536', +)) +->values(array( + 'nid' => '2', + 'totalcount' => '1', + 'daycount' => '0', + 'timestamp' => '1471428059', +)) +->values(array( + 'nid' => '3', + 'totalcount' => '1', + 'daycount' => '0', + 'timestamp' => '1471428153', +)) +->values(array( + 'nid' => '4', + 'totalcount' => '1', + 'daycount' => '1', + 'timestamp' => '1478755275', +)) +->values(array( + 'nid' => '5', + 'totalcount' => '1', + 'daycount' => '1', + 'timestamp' => '1478755314', +)) ->values(array( 'nid' => '14', 'totalcount' => '1', diff --git a/core/modules/statistics/migrations/statistics_node_counter.yml b/core/modules/statistics/migrations/statistics_node_counter.yml new file mode 100644 index 000000000000..f0f16851b3ba --- /dev/null +++ b/core/modules/statistics/migrations/statistics_node_counter.yml @@ -0,0 +1,25 @@ +id: statistics_node_counter +label: Node counter +migration_tags: + - Drupal 6 + - Drupal 7 +source: + plugin: node_counter +process: + nid: + - + plugin: migration_lookup + migration: [d6_node, d7_node] + source: nid + - + plugin: skip_on_empty + method: row + totalcount: totalcount + daycount: daycount + timestamp: timestamp +destination: + plugin: node_counter +migration_dependencies: + optional: + - d6_node + - d7_node diff --git a/core/modules/statistics/src/Plugin/migrate/destination/NodeCounter.php b/core/modules/statistics/src/Plugin/migrate/destination/NodeCounter.php new file mode 100644 index 000000000000..e9771f3d988c --- /dev/null +++ b/core/modules/statistics/src/Plugin/migrate/destination/NodeCounter.php @@ -0,0 +1,96 @@ +connection = $connection; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration = NULL) { + return new static( + $configuration, + $plugin_id, + $plugin_definition, + $migration, + $container->get('database') + ); + } + + /** + * {@inheritdoc} + */ + public function getIds() { + return ['nid' => ['type' => 'integer']]; + } + + /** + * {@inheritdoc} + */ + public function fields(MigrationInterface $migration = NULL) { + return [ + 'nid' => $this->t('The ID of the node to which these statistics apply.'), + 'totalcount' => $this->t('The total number of times the node has been viewed.'), + 'daycount' => $this->t('The total number of times the node has been viewed today.'), + 'timestamp' => $this->t('The most recent time the node has been viewed.'), + ]; + } + + /** + * {@inheritdoc} + */ + public function import(Row $row, array $old_destination_id_values = []) { + $this->connection + ->insert('node_counter') + ->fields([ + 'nid' => $row->getDestinationProperty('nid'), + 'daycount' => $row->getDestinationProperty('daycount'), + 'totalcount' => $row->getDestinationProperty('totalcount'), + 'timestamp' => $row->getDestinationProperty('timestamp'), + ]) + ->execute(); + return [$row->getDestinationProperty('nid')]; + } + +} diff --git a/core/modules/statistics/src/Plugin/migrate/source/NodeCounter.php b/core/modules/statistics/src/Plugin/migrate/source/NodeCounter.php new file mode 100644 index 000000000000..0877d3fbd5f3 --- /dev/null +++ b/core/modules/statistics/src/Plugin/migrate/source/NodeCounter.php @@ -0,0 +1,44 @@ +select('node_counter', 'nc')->fields('nc'); + } + + /** + * {@inheritdoc} + */ + public function fields() { + return [ + 'nid' => $this->t('The node ID.'), + 'totalcount' => $this->t('The total number of times the node has been viewed.'), + 'daycount' => $this->t('The total number of times the node has been viewed today.'), + 'timestamp' => $this->t('The most recent time the node has been viewed.'), + ]; + } + + /** + * {@inheritdoc} + */ + public function getIds() { + $ids['nid']['type'] = 'integer'; + return $ids; + } + +} diff --git a/core/modules/statistics/tests/src/Kernel/Migrate/d6/MigrateNodeCounterTest.php b/core/modules/statistics/tests/src/Kernel/Migrate/d6/MigrateNodeCounterTest.php new file mode 100644 index 000000000000..ebd776638625 --- /dev/null +++ b/core/modules/statistics/tests/src/Kernel/Migrate/d6/MigrateNodeCounterTest.php @@ -0,0 +1,77 @@ +installEntitySchema('node'); + $this->installConfig('node'); + $this->installSchema('statistics', ['node_counter']); + + $this->executeMigrations([ + 'd6_filter_format', + 'd6_user_role', + 'd6_node_settings', + 'd6_user', + 'd6_node_type', + 'd6_node', + 'statistics_node_counter' + ]); + } + + /** + * Tests migration of node counter. + */ + public function testStatisticsSettings() { + $this->assertNodeCounter(1, 2, 0, 1421727536); + $this->assertNodeCounter(2, 1, 0, 1471428059); + $this->assertNodeCounter(3, 1, 0, 1471428153); + $this->assertNodeCounter(4, 1, 1, 1478755275); + $this->assertNodeCounter(5, 1, 1, 1478755314); + } + + /** + * Asserts various aspects of a node counter. + * + * @param int $nid + * The node ID. + * @param int $total_count + * The expected total count. + * @param int $day_count + * The expected day count. + * @param int $timestamp + * The expected timestamp. + */ + protected function assertNodeCounter($nid, $total_count, $day_count, $timestamp) { + /** @var \Drupal\statistics\StatisticsViewsResult $statistics */ + $statistics = $this->container->get('statistics.storage.node')->fetchView($nid); + // @todo Remove casting after https://www.drupal.org/node/2926069 lands. + $this->assertSame($total_count, (int) $statistics->getTotalCount()); + $this->assertSame($day_count, (int) $statistics->getDayCount()); + $this->assertSame($timestamp, (int) $statistics->getTimestamp()); + } + +} diff --git a/core/modules/statistics/tests/src/Kernel/Migrate/d7/MigrateNodeCounterTest.php b/core/modules/statistics/tests/src/Kernel/Migrate/d7/MigrateNodeCounterTest.php new file mode 100644 index 000000000000..8cdb9e70731a --- /dev/null +++ b/core/modules/statistics/tests/src/Kernel/Migrate/d7/MigrateNodeCounterTest.php @@ -0,0 +1,73 @@ +installEntitySchema('node'); + $this->installConfig('node'); + $this->installSchema('statistics', ['node_counter']); + + $this->executeMigrations([ + 'd7_user_role', + 'd7_user', + 'd7_node_type', + 'd7_node', + 'statistics_node_counter' + ]); + } + + /** + * Tests migration of node counter. + */ + public function testStatisticsSettings() { + $this->assertNodeCounter(1, 2, 0, 1421727536); + $this->assertNodeCounter(2, 1, 0, 1471428059); + $this->assertNodeCounter(4, 1, 1, 1478755275); + } + + /** + * Asserts various aspects of a node counter. + * + * @param int $nid + * The node ID. + * @param int $total_count + * The expected total count. + * @param int $day_count + * The expected day count. + * @param int $timestamp + * The expected timestamp. + */ + protected function assertNodeCounter($nid, $total_count, $day_count, $timestamp) { + /** @var \Drupal\statistics\StatisticsViewsResult $statistics */ + $statistics = $this->container->get('statistics.storage.node')->fetchView($nid); + // @todo Remove casting after https://www.drupal.org/node/2926069 lands. + $this->assertSame($total_count, (int) $statistics->getTotalCount()); + $this->assertSame($day_count, (int) $statistics->getDayCount()); + $this->assertSame($timestamp, (int) $statistics->getTimestamp()); + } + +} diff --git a/core/modules/statistics/tests/src/Kernel/Plugin/migrate/source/NodeCounterTest.php b/core/modules/statistics/tests/src/Kernel/Plugin/migrate/source/NodeCounterTest.php new file mode 100644 index 000000000000..0cbc76afec33 --- /dev/null +++ b/core/modules/statistics/tests/src/Kernel/Plugin/migrate/source/NodeCounterTest.php @@ -0,0 +1,67 @@ + 1, + 'totalcount' => 2, + 'daycount' => 0, + 'timestamp' => 1421727536, + ], + [ + 'nid' => 2, + 'totalcount' => 1, + 'daycount' => 0, + 'timestamp' => 1471428059, + ], + [ + 'nid' => 3, + 'totalcount' => 1, + 'daycount' => 0, + 'timestamp' => 1471428153, + ], + [ + 'nid' => 4, + 'totalcount' => 1, + 'daycount' => 1, + 'timestamp' => 1478755275, + ], + [ + 'nid' => 5, + 'totalcount' => 1, + 'daycount' => 1, + 'timestamp' => 1478755314, + ], + ]; + + // The expected results. + $tests[0]['expected_data'] = $tests[0]['source_data']['node_counter']; + + return $tests; + } + +}