refactor propagate service to use batch inserts and subquery instead of left join

This commit is contained in:
James Lopez 2017-05-05 09:40:44 +02:00
parent cf002738e7
commit 1fe8b7f646
1 changed files with 26 additions and 6 deletions

View File

@ -26,7 +26,7 @@ module Projects
loop do
batch = project_ids_batch(offset)
batch.each { |project_id| create_from_template(project_id) }
bulk_create_from_template(batch)
break if batch.size < BATCH_SIZE
@ -34,14 +34,34 @@ module Projects
end
end
def create_from_template(project_id)
Service.build_from_template(project_id, @template).save!
def bulk_create_from_template(batch)
service_hash_list = batch.map do |project_id|
service_hash.merge('project_id' => project_id)
end
Project.transaction do
Service.create!(service_hash_list)
end
end
def project_ids_batch(offset)
Project.joins('LEFT JOIN services ON services.project_id = projects.id').
where('services.type != ? OR services.id IS NULL', @template.type).
limit(BATCH_SIZE).offset(offset).pluck(:id)
Project.connection.execute(
<<-SQL
SELECT id
FROM projects
WHERE NOT EXISTS (
SELECT true
FROM services
WHERE services.project_id = projects.id
AND services.type = '#{@template.type}'
)
LIMIT #{BATCH_SIZE} OFFSET #{offset}
SQL
).to_a.flatten
end
def service_hash
@service_hash ||= @template.as_json(methods: :type).except('id', 'template')
end
end
end