Class: JobBoard::JobsQuery

Inherits:
Object
  • Object
show all
Defined in:
app/models/job_board/jobs_query.rb

Overview

Status-scoped job finder. Each status is driven by its execution table so a row's status is known without calling Job#status (which needs 5 preloads).

Constant Summary collapse

STATUSES =
%w[ready scheduled in_progress blocked failed finished].freeze
ROW_STATUS =
{
  "ready" => :ready, "scheduled" => :scheduled, "in_progress" => :claimed,
  "blocked" => :blocked, "failed" => :failed, "finished" => :finished
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(status:, queue_name: nil, class_name: nil) ⇒ JobsQuery

Returns a new instance of JobsQuery.



14
15
16
17
18
# File 'app/models/job_board/jobs_query.rb', line 14

def initialize(status:, queue_name: nil, class_name: nil)
  @status = status.to_s
  @queue_name = queue_name
  @class_name = class_name
end

Instance Attribute Details

#class_nameObject (readonly)

Returns the value of attribute class_name.



12
13
14
# File 'app/models/job_board/jobs_query.rb', line 12

def class_name
  @class_name
end

#queue_nameObject (readonly)

Returns the value of attribute queue_name.



12
13
14
# File 'app/models/job_board/jobs_query.rb', line 12

def queue_name
  @queue_name
end

#statusObject (readonly)

Returns the value of attribute status.



12
13
14
# File 'app/models/job_board/jobs_query.rb', line 12

def status
  @status
end

Instance Method Details

#countObject



38
39
40
# File 'app/models/job_board/jobs_query.rb', line 38

def count
  relation.count(:all)
end

#countsObject

One COUNT per status, with the current filters applied — for tab badges.



32
33
34
35
36
# File 'app/models/job_board/jobs_query.rb', line 32

def counts
  STATUSES.index_with do |s|
    self.class.new(status: s, queue_name: queue_name, class_name: class_name).count
  end
end

#failed_jobs_relationObject

Job relation backing bulk retry/discard. Only meaningful for the failed set, so it is always scoped to jobs with a failed execution.



44
45
46
47
48
49
# File 'app/models/job_board/jobs_query.rb', line 44

def failed_jobs_relation
  scope = SolidQueue::Job.joins(:failed_execution)
  scope = scope.where(queue_name: queue_name) if queue_name
  scope = scope.where(class_name: class_name) if class_name
  scope
end

#page(before: nil, limit: 25) ⇒ Object



20
21
22
23
24
25
26
27
28
29
# File 'app/models/job_board/jobs_query.rb', line 20

def page(before: nil, limit: 25)
  row_status = ROW_STATUS.fetch(status)
  builder =
    if status == "finished"
      ->(job) { JobRow.from_job(job) }
    else
      ->(execution) { JobRow.from_execution(execution, status: row_status) }
    end
  Page.new(relation.order(id: :desc), before: before, limit: limit, &builder)
end