2012-04-10 23:48:32 +08:00
module DataFixup::ReassociateConversationAttachments
def self . run
conn = ConversationMessage . connection
cmas = [ ]
ConversationMessage . transaction do
conn . execute <<-SQL
2016-04-19 01:10:10 +08:00
CREATE TEMPORARY TABLE _conversation_message_attachments AS
2012-04-10 23:48:32 +08:00
SELECT context_id AS conversation_message_id ,
2015-09-16 11:46:47 +08:00
( SELECT author_id FROM #{ConversationMessage.quoted_table_name} WHERE id = a.context_id) AS author_id,
2012-04-10 23:48:32 +08:00
id AS attachment_id
2015-07-17 02:31:37 +08:00
FROM #{Attachment.quoted_table_name} a
2012-04-10 23:48:32 +08:00
WHERE context_type = 'ConversationMessage'
SQL
2016-04-19 01:10:10 +08:00
conn . execute ( " CREATE INDEX _cma_cmid_index ON _conversation_message_attachments(conversation_message_id) " )
conn . execute ( " CREATE INDEX _cma_aid_index ON _conversation_message_attachments(attachment_id) " )
2014-01-22 07:19:07 +08:00
conn . execute " ANALYZE _conversation_message_attachments " if conn . adapter_name == 'PostgreSQL'
2012-04-10 23:48:32 +08:00
# make sure users w/ conversation attachments have root folders
conn . execute <<-SQL
2015-07-17 02:31:37 +08:00
INSERT INTO #{Folder.quoted_table_name}(context_id, context_type, name, full_name, workflow_state)
2012-04-10 23:48:32 +08:00
SELECT DISTINCT author_id , 'User' , 'my files' , 'my files' , 'visible'
FROM _conversation_message_attachments
2015-07-17 02:31:37 +08:00
WHERE NOT EXISTS ( SELECT 1 FROM #{Folder.quoted_table_name} WHERE context_id = author_id AND context_type = 'User' AND name = 'my files')
2012-04-10 23:48:32 +08:00
SQL
# and conversation attachment folders
conn . execute <<-SQL
2015-09-16 11:46:47 +08:00
INSERT INTO #{Folder.quoted_table_name}(context_id, context_type, name, full_name, workflow_state, parent_folder_id)
2012-04-10 23:48:32 +08:00
SELECT DISTINCT author_id , 'User' , 'conversation attachments' , 'conversation attachments' , 'visible' , folders . id
2015-07-17 02:31:37 +08:00
FROM _conversation_message_attachments , #{Folder.quoted_table_name}
2012-04-10 23:48:32 +08:00
WHERE folders . context_id = author_id AND folders . context_type = 'User'
2015-07-17 02:31:37 +08:00
AND NOT EXISTS ( SELECT 1 FROM #{Folder.quoted_table_name} WHERE context_id = author_id AND context_type = 'User' AND name = 'conversation attachments')
2012-04-10 23:48:32 +08:00
SQL
conn . execute <<-SQL
2015-07-17 02:31:37 +08:00
INSERT INTO #{AttachmentAssociation.quoted_table_name}(attachment_id, context_id, context_type)
2012-04-10 23:48:32 +08:00
SELECT attachment_id , conversation_message_id , 'ConversationMessage'
FROM _conversation_message_attachments
WHERE author_id IS NOT NULL
SQL
cmas = conn . select_all ( " SELECT * FROM _conversation_message_attachments WHERE author_id IS NOT NULL " )
2016-04-19 01:10:10 +08:00
conn . execute " DROP TABLE _conversation_message_attachments "
2012-04-10 23:48:32 +08:00
end
cmas . group_by { | r | r [ 'conversation_message_id' ] } . each_slice ( 1000 ) do | groups |
2015-07-17 02:31:37 +08:00
conn . update <<-SQL
UPDATE #{ConversationMessage.quoted_table_name}
2012-04-10 23:48:32 +08:00
SET attachment_ids = CASE id #{groups.map{ |id, rows| "WHEN #{id} THEN '#{rows.map{ |r| r['attachment_id'] }.join(",")}' "}.join} END
WHERE id IN ( #{groups.map(&:first).join(', ')})
SQL
end
cmas . each_slice ( 1000 ) do | rows |
attachment2user = " CASE attachments.id #{ rows . map { | r | " WHEN #{ r [ 'attachment_id' ] } THEN #{ r [ 'author_id' ] } " } . join } END "
2015-07-17 02:31:37 +08:00
conn . update <<-SQL
UPDATE #{Attachment.quoted_table_name}
2012-04-10 23:48:32 +08:00
SET context_type = 'User' ,
context_id = #{attachment2user},
2015-07-17 02:31:37 +08:00
folder_id = ( SELECT f . id FROM #{Folder.quoted_table_name} f WHERE f.name = 'conversation attachments' AND f.context_type = 'User' AND f.context_id = #{attachment2user} LIMIT 1)
2012-04-10 23:48:32 +08:00
WHERE attachments . id IN (
#{rows.map{ |r| r['attachment_id'] }.join(', ')}
)
SQL
end
end
end