Skip to content

Commit de40350

Browse files
authored
Add finished_at_start/end job filters (#111)
* jobs_relation finished_at_start and finished_at_end filters * natively_supported finished_at_* filters for solid_queue * added filters to _filters partial and params * added timezone * show finished_at filters if jobs_status is 'finished' * added comments to jobs_relation where method * clean finished_at_* filter values when clear button clicked * double instead of single quoted strings (rubocop) * enhacements set filters * finished_at range enhacement * enhace date_with_time_zone method * back to @job_filters in _filters * god bye presence * bye collect arguments with to_s for values * fix tests * bringed back .to_s for queue_name parameters (JobsRelation#where) * queue_name back to symbol * bye finished_at from FILTERS * bye comment * added finished_at in supported_job_filters (SolidQueue) * Update app/views/mission_control/jobs/jobs/_filters.html.erb * Update lib/active_job/jobs_relation.rb * finished_at_range_params method * double quotes
1 parent 3d31bf7 commit de40350

File tree

5 files changed

+41
-10
lines changed

5 files changed

+41
-10
lines changed

app/controllers/concerns/mission_control/jobs/job_filters.rb

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,24 @@ module MissionControl::Jobs::JobFilters
99

1010
private
1111
def set_filters
12-
@job_filters = { job_class_name: params.dig(:filter, :job_class_name).presence, queue_name: params.dig(:filter, :queue_name).presence }.compact
12+
@job_filters = { job_class_name: params.dig(:filter, :job_class_name).presence, queue_name: params.dig(:filter, :queue_name).presence,
13+
finished_at: finished_at_range_params }.compact
1314
end
1415

1516
def active_filters?
1617
@job_filters.any?
1718
end
19+
20+
def finished_at_range_params
21+
range_start, range_end = params.dig(:filter, :finished_at_start), params.dig(:filter, :finished_at_end)
22+
if range_start || range_end
23+
(parse_with_time_zone(range_start)..parse_with_time_zone(range_end))
24+
end
25+
end
26+
27+
def date_with_time_zone(date)
28+
if date.present?
29+
DateTime.parse(date).in_time_zone
30+
end
31+
end
1832
end

app/views/mission_control/jobs/jobs/_filters.html.erb

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,16 @@
1212
<%= form.text_field :queue_name, value: @job_filters[:queue_name], class: "input", list: "queue-names", placeholder: "Filter by queue name..." %>
1313
</div>
1414

15+
<% if jobs_status == "finished" %>
16+
<div class="select is-rounded">
17+
<%= form.datetime_field :finished_at_start, value: @job_filters[:finished_at]&.begin, class: "input", placeholder: "Finished from" %>
18+
</div>
19+
20+
<div class="select is-rounded">
21+
<%= form.datetime_field :finished_at_end, value: @job_filters[:finished_at]&.end, class: "input", placeholder: "Finished to" %>
22+
</div>
23+
<% end %>
24+
1525
<%= hidden_field_tag :server_id, MissionControl::Jobs::Current.server.id %>
1626

1727
<datalist id="job-classes" class="is-hidden">
@@ -29,7 +39,7 @@
2939
</div>
3040

3141
<div class="control">
32-
<%= link_to "Clear", application_jobs_path(MissionControl::Jobs::Current.application, jobs_status, job_class_name: nil, queue_name: nil), class: "button" %>
42+
<%= link_to "Clear", application_jobs_path(MissionControl::Jobs::Current.application, jobs_status, job_class_name: nil, queue_name: nil, finished_at: nil..nil), class: "button" %>
3343
</div>
3444
</div>
3545
</div>

lib/active_job/jobs_relation.rb

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class ActiveJob::JobsRelation
2525
STATUSES = %i[ pending failed in_progress blocked scheduled finished ]
2626
FILTERS = %i[ queue_name job_class_name ]
2727

28-
PROPERTIES = %i[ queue_name status offset_value limit_value job_class_name worker_id recurring_task_id ]
28+
PROPERTIES = %i[ queue_name status offset_value limit_value job_class_name worker_id recurring_task_id finished_at ]
2929
attr_reader *PROPERTIES, :default_page_size
3030

3131
delegate :last, :[], :reverse, to: :to_a
@@ -51,13 +51,15 @@ def initialize(queue_adapter: ActiveJob::Base.queue_adapter, default_page_size:
5151
# * <tt>:queue_name</tt> - To only include the jobs in the provided queue.
5252
# * <tt>:worker_id</tt> - To only include the jobs processed by the provided worker.
5353
# * <tt>:recurring_task_id</tt> - To only include the jobs corresponding to runs of a recurring task.
54-
def where(job_class_name: nil, queue_name: nil, worker_id: nil, recurring_task_id: nil)
54+
# * <tt>:finished_at</tt> - (Range) To only include the jobs finished between the provided range
55+
def where(job_class_name: nil, queue_name: nil, worker_id: nil, recurring_task_id: nil, finished_at: nil)
5556
# Remove nil arguments to avoid overriding parameters when concatenating +where+ clauses
5657
arguments = { job_class_name: job_class_name,
57-
queue_name: queue_name,
58+
queue_name: queue_name&.to_s,
5859
worker_id: worker_id,
59-
recurring_task_id: recurring_task_id
60-
}.compact.collect { |key, value| [ key, value.to_s ] }.to_h
60+
recurring_task_id: recurring_task_id,
61+
finished_at: finished_at
62+
}.compact
6163

6264
clone_with **arguments
6365
end

lib/active_job/queue_adapters/solid_queue_ext.rb

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def supported_job_statuses
4040
end
4141

4242
def supported_job_filters(*)
43-
[ :queue_name, :job_class_name ]
43+
[ :queue_name, :job_class_name, :finished_at ]
4444
end
4545

4646
def jobs_count(jobs_relation)
@@ -173,7 +173,7 @@ def retry_all
173173
attr_reader :jobs_relation
174174

175175
delegate :queue_name, :limit_value, :limit_value_provided?, :offset_value, :job_class_name,
176-
:default_page_size, :worker_id, :recurring_task_id, to: :jobs_relation
176+
:default_page_size, :worker_id, :recurring_task_id, :finished_at, to: :jobs_relation
177177

178178
def executions
179179
execution_class_by_status
@@ -190,6 +190,7 @@ def finished_jobs
190190
SolidQueue::Job.finished
191191
.then { |jobs| filter_jobs_by_queue(jobs) }
192192
.then { |jobs| filter_jobs_by_class(jobs) }
193+
.then { |jobs| filter_jobs_by_finished_at(jobs) }
193194
.then { |jobs| limit(jobs) }
194195
.then { |jobs| offset(jobs) }
195196
end
@@ -271,6 +272,10 @@ def filter_jobs_by_class(jobs)
271272
job_class_name.present? ? jobs.where(class_name: job_class_name) : jobs
272273
end
273274

275+
def filter_jobs_by_finished_at(jobs)
276+
finished_at.present? ? jobs.where(finished_at: finished_at) : jobs
277+
end
278+
274279
def limit(executions_or_jobs)
275280
limit_value.present? ? executions_or_jobs.limit(limit_value) : executions_or_jobs
276281
end

test/active_job/queue_adapters/adapter_testing/query_jobs.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ module ActiveJob::QueueAdapters::AdapterTesting::QueryJobs
112112
10.times { |index| WithPaginationDummyJob.perform_later(index) }
113113
4.times { |index| WithPaginationFailingJob.perform_later(index) }
114114

115-
jobs = ActiveJob.jobs.pending.where(queue_name: :default, job_class_name: WithPaginationDummyJob).to_a
115+
jobs = ActiveJob.jobs.pending.where(queue_name: :default, job_class_name: "WithPaginationDummyJob").to_a
116116
assert_equal 10, jobs.size
117117
end
118118

0 commit comments

Comments
 (0)