add migration to cleanup participations
* remove author_signature column * delete all self-participating participations * delete all participations where author and post-author are remote * delete all duplicate participations * delete all participations without post * create unique index
This commit is contained in:
parent
70f378a1c1
commit
b3a9bf3925
2 changed files with 53 additions and 10 deletions
44
db/migrate/20160618033455_cleanup_participations.rb
Normal file
44
db/migrate/20160618033455_cleanup_participations.rb
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
class CleanupParticipations < ActiveRecord::Migration
|
||||||
|
class Participation < ActiveRecord::Base
|
||||||
|
end
|
||||||
|
|
||||||
|
def up
|
||||||
|
remove_column :participations, :author_signature
|
||||||
|
|
||||||
|
cleanup
|
||||||
|
|
||||||
|
remove_index :participations, name: :index_participations_on_target_id_and_target_type_and_author_id
|
||||||
|
add_index :participations, %i(target_id target_type author_id), unique: true
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
remove_index :participations, name: :index_participations_on_target_id_and_target_type_and_author_id
|
||||||
|
add_index :participations, %i(target_id target_type author_id)
|
||||||
|
add_column :participations, :author_signature, :text
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def cleanup
|
||||||
|
self_where = "WHERE participations.target_type = 'Post' AND participations.target_id = posts.id AND " \
|
||||||
|
"posts.author_id = participations.author_id"
|
||||||
|
remote_where = "WHERE participations.target_type = 'Post' AND participations.target_id = posts.id AND " \
|
||||||
|
"posts.author_id = post_author.id AND participations.author_id = author.id AND " \
|
||||||
|
"author.owner_id is NULL AND post_author.owner_id is NULL"
|
||||||
|
duplicate_where = "WHERE p1.author_id = p2.author_id AND p1.target_id = p2.target_id " \
|
||||||
|
"AND p1.target_type = p2.target_type AND p1.id > p2.id"
|
||||||
|
|
||||||
|
if AppConfig.postgres?
|
||||||
|
execute "DELETE FROM participations USING posts #{self_where}"
|
||||||
|
execute "DELETE FROM participations USING posts, people AS author, people AS post_author #{remote_where}"
|
||||||
|
execute "DELETE FROM participations AS p1 USING participations AS p2 #{duplicate_where}"
|
||||||
|
else
|
||||||
|
execute "DELETE participations FROM participations, posts #{self_where}"
|
||||||
|
execute "DELETE participations FROM participations, posts, people author, people post_author #{remote_where}"
|
||||||
|
execute "DELETE p1 FROM participations p1, participations p2 #{duplicate_where}"
|
||||||
|
end
|
||||||
|
|
||||||
|
Participation.joins("LEFT OUTER JOIN posts ON posts.id = participations.target_id")
|
||||||
|
.where(target_type: "Post").delete_all("posts.id is NULL")
|
||||||
|
end
|
||||||
|
end
|
||||||
19
db/schema.rb
19
db/schema.rb
|
|
@ -11,7 +11,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(version: 20160531170531) do
|
ActiveRecord::Schema.define(version: 20160618033455) do
|
||||||
|
|
||||||
create_table "account_deletions", force: :cascade do |t|
|
create_table "account_deletions", force: :cascade do |t|
|
||||||
t.string "diaspora_handle", limit: 255
|
t.string "diaspora_handle", limit: 255
|
||||||
|
|
@ -312,19 +312,18 @@ ActiveRecord::Schema.define(version: 20160531170531) do
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "participations", force: :cascade do |t|
|
create_table "participations", force: :cascade do |t|
|
||||||
t.string "guid", limit: 255
|
t.string "guid", limit: 255
|
||||||
t.integer "target_id", limit: 4
|
t.integer "target_id", limit: 4
|
||||||
t.string "target_type", limit: 60, null: false
|
t.string "target_type", limit: 60, null: false
|
||||||
t.integer "author_id", limit: 4
|
t.integer "author_id", limit: 4
|
||||||
t.text "author_signature", limit: 65535
|
t.datetime "created_at", null: false
|
||||||
t.datetime "created_at", null: false
|
t.datetime "updated_at", null: false
|
||||||
t.datetime "updated_at", null: false
|
t.integer "count", limit: 4, default: 1, null: false
|
||||||
t.integer "count", limit: 4, default: 1, null: false
|
|
||||||
end
|
end
|
||||||
|
|
||||||
add_index "participations", ["author_id"], name: "index_participations_on_author_id", using: :btree
|
add_index "participations", ["author_id"], name: "index_participations_on_author_id", using: :btree
|
||||||
add_index "participations", ["guid"], name: "index_participations_on_guid", length: {"guid"=>191}, using: :btree
|
add_index "participations", ["guid"], name: "index_participations_on_guid", length: {"guid"=>191}, using: :btree
|
||||||
add_index "participations", ["target_id", "target_type", "author_id"], name: "index_participations_on_target_id_and_target_type_and_author_id", using: :btree
|
add_index "participations", ["target_id", "target_type", "author_id"], name: "index_participations_on_target_id_and_target_type_and_author_id", unique: true, using: :btree
|
||||||
|
|
||||||
create_table "people", force: :cascade do |t|
|
create_table "people", force: :cascade do |t|
|
||||||
t.string "guid", limit: 255, null: false
|
t.string "guid", limit: 255, null: false
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue