@@ -23,9 +23,9 @@ class ActiveJob::JobsRelation
23
23
include Enumerable
24
24
25
25
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 ]
27
27
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 ]
29
29
attr_reader *PROPERTIES , :default_page_size
30
30
31
31
delegate :last , :[] , :reverse , to : :to_a
@@ -51,12 +51,15 @@ def initialize(queue_adapter: ActiveJob::Base.queue_adapter, default_page_size:
51
51
# * <tt>:queue_name</tt> - To only include the jobs in the provided queue.
52
52
# * <tt>:worker_id</tt> - To only include the jobs processed by the provided worker.
53
53
# * <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 )
55
55
# Remove nil arguments to avoid overriding parameters when concatenating +where+ clauses
56
56
arguments = { job_class_name : job_class_name ,
57
57
queue_name : queue_name ,
58
58
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
60
63
} . compact . collect { |key , value | [ key , value . to_s ] } . to_h
61
64
62
65
clone_with **arguments
@@ -259,13 +262,37 @@ def loaded?
259
262
!@loaded_jobs . nil?
260
263
end
261
264
262
- # Filtering for not natively supported filters is performed in memory
263
265
def filter ( jobs )
264
266
jobs . filter { |job | satisfy_filter? ( job ) }
265
267
end
266
268
269
+ def satisfy_date_filter? ( filter_value , job_value )
270
+ return false if job_value . nil?
271
+
272
+ # Treat date ranges
273
+ if filter_value . include? ( ".." )
274
+ start_date , end_date = filter_value . split ( ".." ) . map { |date | Time . zone . parse ( date ) }
275
+ filter_range = ( start_date ..end_date )
276
+ return filter_range . cover? ( job_value )
277
+ end
278
+
279
+ filter = Time . zone . parse ( filter_value )
280
+ job_value >= filter
281
+ end
282
+
267
283
def satisfy_filter? ( job )
268
- filters . all? { |property | public_send ( property ) == job . public_send ( property ) }
284
+ filters . all? do |property |
285
+ filter_value = public_send ( property )
286
+ job_value = job . public_send ( property )
287
+
288
+ return satisfy_date_filter? ( filter_value , job_value ) if is_date_filter? ( property )
289
+
290
+ filter_value == job_value
291
+ end
292
+ end
293
+
294
+ def is_date_filter? ( property )
295
+ [ :finished_at , :scheduled_at , :enqueued_at ] . include? ( property )
269
296
end
270
297
271
298
def filters
0 commit comments