summaryrefslogtreecommitdiff
path: root/db/post_migrate/20170816102555_cleanup_nonexisting_namespace_pending_delete_projects.rb
blob: 27656fd926d0abe228916bad34434132a6abc83f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# Follow up of CleanupNamespacelessPendingDeleteProjects and it cleans
# all projects with `pending_delete = true` and for which the
# namespace no longer exists.
class CleanupNonexistingNamespacePendingDeleteProjects < ActiveRecord::Migration[4.2]
  include Gitlab::Database::MigrationHelpers

  DOWNTIME = false

  disable_ddl_transaction!

  class Project < ActiveRecord::Base
    self.table_name = 'projects'

    include ::EachBatch
  end

  class Namespace < ActiveRecord::Base
    self.table_name = 'namespaces'
  end

  def up
    find_projects.each_batch do |batch|
      args = batch.pluck(:id).map { |id| [id] }

      NamespacelessProjectDestroyWorker.bulk_perform_async(args)
    end
  end

  def down
    # NOOP
  end

  private

  def find_projects
    projects = Project.arel_table
    namespaces = Namespace.arel_table

    namespace_query = namespaces.project(1)
                        .where(namespaces[:id].eq(projects[:namespace_id]))
                        .exists.not

    # SELECT "projects"."id"
    # FROM "projects"
    # WHERE "projects"."pending_delete" = 't'
    #   AND (NOT (EXISTS
    #               (SELECT 1
    #                FROM "namespaces"
    #                WHERE "namespaces"."id" = "projects"."namespace_id")))
    Project.where(projects[:pending_delete].eq(true))
      .where(namespace_query)
      .select(:id)
  end
end