From bb59798066d814e6a68b5493343d098e2bd13fd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Wed, 15 Oct 2014 21:09:08 +0200 Subject: [PATCH] FEATURE: ensure consistency of post revisions --- app/jobs/scheduled/ensure_db_consistency.rb | 1 + app/models/post_revision.rb | 24 +++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/app/jobs/scheduled/ensure_db_consistency.rb b/app/jobs/scheduled/ensure_db_consistency.rb index bb1bb8e6b1616b..9dd2a162b8da1e 100644 --- a/app/jobs/scheduled/ensure_db_consistency.rb +++ b/app/jobs/scheduled/ensure_db_consistency.rb @@ -9,6 +9,7 @@ def execute(args) Notification.ensure_consistency! UserAction.ensure_consistency! TopicFeaturedUsers.ensure_consistency! + PostRevision.ensure_consistency! UserStat.update_view_counts(13.hours.ago) end end diff --git a/app/models/post_revision.rb b/app/models/post_revision.rb index 99ac5e3aa5e31a..b9099942b39d74 100644 --- a/app/models/post_revision.rb +++ b/app/models/post_revision.rb @@ -6,6 +6,30 @@ class PostRevision < ActiveRecord::Base serialize :modifications, Hash + def self.ensure_consistency! + # 1 - fix the numbers + sql = <<-SQL + UPDATE post_revisions + SET number = pr.rank + FROM (SELECT id, ROW_NUMBER() OVER (PARTITION BY post_id ORDER BY number, created_at, updated_at) AS rank FROM post_revisions) AS pr + WHERE post_revisions.id = pr.id + AND post_revisions.number <> pr.rank + SQL + + PostRevision.exec_sql(sql) + + # 2 - fix the versions on the posts + sql = <<-SQL + UPDATE posts + SET version = pv.version + FROM (SELECT post_id, MAX(number) AS version FROM post_revisions GROUP BY post_id) AS pv + WHERE posts.id = pv.post_id + AND posts.version <> pv.version + SQL + + PostRevision.exec_sql(sql) + end + def body_changes cooked_diff = DiscourseDiff.new(previous("cooked"), current("cooked")) raw_diff = DiscourseDiff.new(previous("raw"), current("raw"))