@@ -23,9 +23,9 @@ class ActiveJob::JobsRelation
2323 include Enumerable
2424
2525 STATUSES = %i[ pending failed in_progress blocked scheduled finished ]
26- FILTERS = %i[ queue_name job_class_name ]
26+ FILTERS = %i[ queue_name job_class_name finished_at scheduled_at enqueued_at ]
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 scheduled_at enqueued_at ]
2929 attr_reader *PROPERTIES , :default_page_size
3030
3131 delegate :last , :[] , :reverse , to : :to_a
@@ -51,12 +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+ def where ( job_class_name : nil , queue_name : nil , worker_id : nil , recurring_task_id : nil , finished_at : nil , scheduled_at : nil , enqueued_at : nil )
5555 # Remove nil arguments to avoid overriding parameters when concatenating +where+ clauses
5656 arguments = { job_class_name : job_class_name ,
5757 queue_name : queue_name ,
5858 worker_id : worker_id ,
59- recurring_task_id : recurring_task_id
59+ recurring_task_id : recurring_task_id ,
60+ finished_at : finished_at ,
61+ scheduled_at : scheduled_at ,
62+ enqueued_at : enqueued_at
6063 } . compact . collect { |key , value | [ key , value . to_s ] } . to_h
6164
6265 clone_with **arguments
@@ -264,8 +267,31 @@ def filter(jobs)
264267 jobs . filter { |job | satisfy_filter? ( job ) }
265268 end
266269
270+ def satisfy_date_filter? ( filter_value , job_value )
271+ return false if job_value . nil?
272+
273+ # Treat date ranges
274+ if filter_value . include? ( ".." )
275+ start_date , end_date = filter_value . split ( ".." ) . map { |date | Time . zone . parse ( date ) }
276+ filter_range = ( start_date ..end_date )
277+ return filter_range . cover? ( job_value )
278+ end
279+
280+ filter = Time . zone . parse ( filter_value )
281+ job_value >= filter
282+ end
283+
267284 def satisfy_filter? ( job )
268- filters . all? { |property | public_send ( property ) == job . public_send ( property ) }
285+ filters . all? do |property |
286+ filter_value = public_send ( property )
287+ job_value = job . public_send ( property )
288+
289+ is_date_filter? ( property ) ? satisfy_date_filter? ( filter_value , job_value ) : filter_value == job_value
290+ end
291+ end
292+
293+ def is_date_filter? ( property )
294+ [ :finished_at , :scheduled_at , :enqueued_at ] . include? ( property )
269295 end
270296
271297 def filters
0 commit comments