Class: Projects::BatchForksCountService

Inherits:
BatchCountService show all
Defined in:
app/services/projects/batch_forks_count_service.rb

Instance Method Summary collapse

Methods inherited from BatchCountService

#initialize, #project_ids, #refresh_cache

Constructor Details

This class inherits a constructor from Projects::BatchCountService

Instance Method Details

#count_serviceObject

rubocop: enable CodeReuse/ActiveRecord


33
34
35
# File 'app/services/projects/batch_forks_count_service.rb', line 33

def count_service
  ::Projects::ForksCountService
end

#global_countObject

rubocop: disable CodeReuse/ActiveRecord


24
25
26
27
28
29
30
# File 'app/services/projects/batch_forks_count_service.rb', line 24

def global_count
  @global_count ||= begin
    count_service.query(project_ids)
                 .group(:forked_from_project_id)
                 .count
  end
end

#recreate_cache(projects_to_refresh) ⇒ Object


37
38
39
40
41
42
43
# File 'app/services/projects/batch_forks_count_service.rb', line 37

def recreate_cache(projects_to_refresh)
  projects_to_refresh.each_with_object({}) do |(service, _v), hash|
    count = global_count[service.project.id].to_i
    service.refresh_cache { count }
    hash[service] = count
  end
end

#refresh_cache_and_retrieve_dataObject


8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'app/services/projects/batch_forks_count_service.rb', line 8

def refresh_cache_and_retrieve_data
  count_services = @projects.map { |project| count_service.new(project) }

  values = Gitlab::Instrumentation::RedisClusterValidator.allow_cross_slot_commands do
    Rails.cache.fetch_multi(*(count_services.map { |ser| ser.cache_key } )) { |key| nil }
  end

  results_per_service = Hash[count_services.zip(values.values)]
  projects_to_refresh = results_per_service.select { |_k, value| value.nil? }
  projects_to_refresh = recreate_cache(projects_to_refresh)

  results_per_service.update(projects_to_refresh)
  results_per_service.transform_keys { |k| k.project }
end