diff --git a/migrations/2023_07_08_000000_rename_polls_discussion_id_column.php b/migrations/2023_07_08_000000_rename_polls_discussion_id_column.php index e48c3b91..6f59dffa 100644 --- a/migrations/2023_07_08_000000_rename_polls_discussion_id_column.php +++ b/migrations/2023_07_08_000000_rename_polls_discussion_id_column.php @@ -12,16 +12,15 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Builder; +// Split 1/2 of 2023_07_08_000000_rename_polls_discussion_id_column.php return [ 'up' => function (Builder $schema) { $schema->table('polls', function (Blueprint $table) { $table->dropForeign(['discussion_id']); - $table->renameColumn('discussion_id', 'post_id'); }); }, 'down' => function (Builder $schema) { $schema->table('polls', function (Blueprint $table) { - $table->renameColumn('post_id', 'discussion_id'); $table->foreign('discussion_id')->references('id')->on('discussions')->onDelete('cascade'); }); }, diff --git a/migrations/2023_07_08_000000_rename_polls_discussion_id_column_1.php b/migrations/2023_07_08_000000_rename_polls_discussion_id_column_1.php new file mode 100644 index 00000000..5dd87eb4 --- /dev/null +++ b/migrations/2023_07_08_000000_rename_polls_discussion_id_column_1.php @@ -0,0 +1,32 @@ + function (Builder $schema) { + // Do not run this migration if the column was already renamed before the split + if ($schema->hasColumn('polls', 'post_id')) { + return; + } + + $schema->table('polls', function (Blueprint $table) { + $table->renameColumn('discussion_id', 'post_id'); + }); + }, + 'down' => function (Builder $schema) { + $schema->table('polls', function (Blueprint $table) { + $table->renameColumn('post_id', 'discussion_id'); + }); + }, +]; diff --git a/migrations/2023_07_08_000000_update_polls_discussion_id_to_post_id_values.php b/migrations/2023_07_08_000000_update_polls_discussion_id_to_post_id_values.php new file mode 100644 index 00000000..fe776fd2 --- /dev/null +++ b/migrations/2023_07_08_000000_update_polls_discussion_id_to_post_id_values.php @@ -0,0 +1,87 @@ + function (Builder $schema) { + $db = $schema->getConnection(); + + // Do not run this migration if the values were already updated before the split + if ($db->table('migrations')->where('migration', '2023_07_08_000001_update_polls_discussion_relation_to_first_post')->exists()) { + return; + } + + $db->transaction(function () use ($db) { + $prefix = $db->getTablePrefix(); + + // Don't run through this step if no rows exist in the polls table + if (!$db->table('polls')->exists()) { + return; + } + + // Update polls whose discussions have a clear first post ID associated + $db->table('polls') + ->join('discussions', function (JoinClause $join) { + $join->on('polls.post_id', '=', 'discussions.id') + ->where('discussions.first_post_id', '!=', null); + }) + ->update(['polls.post_id' => $db->raw("{$prefix}discussions.first_post_id")]); + + // Update polls whose discussions have a null first post ID associated + $firstPosts = $db->table('posts') + ->where('number', '=', 1); + + $db->table('polls') + ->join('discussions', function (JoinClause $join) { + $join->on('polls.post_id', '=', 'discussions.id') + ->where('discussions.first_post_id', '=', null); + }) + ->leftJoinSub($firstPosts, 'first_posts', function (JoinClause $join) { + $join->on('first_posts.discussion_id', '=', 'discussions.id'); + }) + ->update(['polls.post_id' => $db->raw("{$prefix}first_posts.id")]); + + // Delete polls that don't have an associated post + $deletingPolls = $db->table('polls') + ->where('post_id', 0); + $count = $deletingPolls->count(); + + if ($count > 0) { + resolve('log')->warning("[fof/polls] deleting {$deletingPolls->count()} polls with no associated post"); + resolve('log')->warning("[fof/polls] |> #{$deletingPolls->pluck('id')->join(', #')}"); + } else { + resolve('log')->info('[fof/polls] no polls to delete in v2 migration'); + } + + $deletingPolls->delete(); + }); + }, + 'down' => function (Builder $schema) { + $db = $schema->getConnection(); + + $db->transaction(function () use ($db) { + $prefix = $db->getTablePrefix(); + + // Don't run through this step if no rows exist in the polls table + if (!$db->table('polls')->exists()) { + return; + } + + // Go back to using discussion IDs. The discussion ID will always exist since the posts' foreign key cascades on delete. + $db->table('polls') + ->join('posts', 'polls.post_id', '=', 'posts.id') + ->update(['polls.post_id' => $db->raw("{$prefix}posts.discussion_id")]); + }); + }, +]; diff --git a/migrations/2023_07_08_000001_update_polls_discussion_relation_to_first_post.php b/migrations/2023_07_08_000001_update_polls_discussion_relation_to_first_post.php index 36d6b4f4..b003a39f 100644 --- a/migrations/2023_07_08_000001_update_polls_discussion_relation_to_first_post.php +++ b/migrations/2023_07_08_000001_update_polls_discussion_relation_to_first_post.php @@ -9,80 +9,17 @@ * file that was distributed with this source code. */ -use Illuminate\Database\Query\JoinClause; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Builder; +// Split 2/2 of 2023_07_08_000001_update_polls_discussion_relation_to_first_post.php return [ 'up' => function (Builder $schema) { - $db = $schema->getConnection(); - - $db->transaction(function () use ($db) { - $prefix = $db->getTablePrefix(); - - // Don't run through this step if no rows exist in the polls table - if (!$db->table('polls')->exists()) { - return; - } - - // Update polls whose discussions have a clear first post ID associated - $db->table('polls') - ->join('discussions', function (JoinClause $join) { - $join->on('polls.post_id', '=', 'discussions.id') - ->where('discussions.first_post_id', '!=', null); - }) - ->update(['polls.post_id' => $db->raw("{$prefix}discussions.first_post_id")]); - - // Update polls whose discussions have a null first post ID associated - $firstPosts = $db->table('posts') - ->where('number', '=', 1); - - $db->table('polls') - ->join('discussions', function (JoinClause $join) { - $join->on('polls.post_id', '=', 'discussions.id') - ->where('discussions.first_post_id', '=', null); - }) - ->leftJoinSub($firstPosts, 'first_posts', function (JoinClause $join) { - $join->on('first_posts.discussion_id', '=', 'discussions.id'); - }) - ->update(['polls.post_id' => $db->raw("{$prefix}first_posts.id")]); - - // Delete polls that don't have an associated post - $deletingPolls = $db->table('polls') - ->where('post_id', 0); - $count = $deletingPolls->count(); - - if ($count > 0) { - resolve('log')->warning("[fof/polls] deleting {$deletingPolls->count()} polls with no associated post"); - resolve('log')->warning("[fof/polls] |> #{$deletingPolls->pluck('id')->join(', #')}"); - } else { - resolve('log')->info('[fof/polls] no polls to delete in v2 migration'); - } - - $deletingPolls->delete(); - }); - $schema->table('polls', function (Blueprint $table) { $table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade'); }); }, 'down' => function (Builder $schema) { - $db = $schema->getConnection(); - - $db->transaction(function () use ($db) { - $prefix = $db->getTablePrefix(); - - // Don't run through this step if no rows exist in the polls table - if (!$db->table('polls')->exists()) { - return; - } - - // Go back to using discussion IDs. The discussion ID will always exist since the posts' foreign key cascades on delete. - $db->table('polls') - ->join('posts', 'polls.post_id', '=', 'posts.id') - ->update(['polls.post_id' => $db->raw("{$prefix}posts.discussion_id")]); - }); - $schema->table('polls', function (Blueprint $table) { $table->dropForeign(['post_id']); });