@@ -11,6 +11,7 @@ defmodule Oban.Web.CronQuery do
1111
1212 @ suggest_qualifier [
1313 { "workers:" , "cron worker name" , "workers:MyApp.Worker" } ,
14+ { "modes:" , "cron mode (static/dynamic)" , "modes:static" } ,
1415 { "states:" , "last execution state" , "states:completed" }
1516 ]
1617
@@ -25,11 +26,16 @@ defmodule Oban.Web.CronQuery do
2526 { "unknown" , "no previous jobs available" , "unknown" }
2627 ]
2728
29+ @ suggest_mode [
30+ { "static" , "regular cron job" , "static" } ,
31+ { "dynamic" , "dynamic cron job" , "dynamic" }
32+ ]
33+
2834 @ known_qualifiers MapSet . new ( @ suggest_qualifier , fn { qualifier , _ , _ } -> qualifier end )
2935
3036 # Searching
3137
32- def filterable , do: ~w( workers states) a
38+ def filterable , do: ~w( workers states modes ) a
3339
3440 def parse ( terms ) when is_binary ( terms ) do
3541 Search . parse ( terms , & parse_term / 1 )
@@ -47,6 +53,7 @@ defmodule Oban.Web.CronQuery do
4753 last ->
4854 case String . split ( last , ":" , parts: 2 ) do
4955 [ "workers" , frag ] -> suggest_workers ( frag , conf )
56+ [ "modes" , frag ] -> suggest_static ( frag , @ suggest_mode )
5057 [ "states" , frag ] -> suggest_static ( frag , @ suggest_state )
5158 [ frag ] -> suggest_static ( frag , @ suggest_qualifier )
5259 _ -> [ ]
@@ -98,6 +105,10 @@ defmodule Oban.Web.CronQuery do
98105 { :states , parsed }
99106 end
100107
108+ defp parse_term ( "modes:" <> modes ) do
109+ { :modes , String . split ( modes , "," ) }
110+ end
111+
101112 defp parse_term ( _term ) , do: { :none , "" }
102113
103114 # Querying
@@ -146,8 +157,8 @@ defmodule Oban.Web.CronQuery do
146157 opts: opts ,
147158 dynamic?: dynamic? ,
148159 next_at: next_at ( expr ) ,
149- last_at: last_at ( history , worker ) ,
150- last_state: get_in ( history , [ worker , :state ] )
160+ last_at: last_at ( history , name ) ,
161+ last_state: get_in ( history , [ name , :state ] )
151162 ]
152163
153164 struct! ( Cron , fields )
@@ -158,13 +169,13 @@ defmodule Oban.Web.CronQuery do
158169
159170 query =
160171 from (
161- f in fragment ( "jsonb_array_elements (?)" , ^ names ) ,
172+ f in fragment ( "jsonb_array_elements_text (?)" , ^ names ) ,
162173 as: :list ,
163174 inner_lateral_join:
164175 j in subquery (
165176 Job
166177 |> select ( ~w( state attempted_at cancelled_at completed_at discarded_at scheduled_at) a )
167- |> where ( [ j ] , j . meta [ " cron_name" ] == parent_as ( :list ) . value )
178+ |> where ( [ j ] , fragment ( "? @> jsonb_build_object(' cron_name', ?)" , j . meta , parent_as ( :list ) . value ) )
168179 |> order_by ( desc: :id )
169180 |> limit ( 1 )
170181 ) ,
@@ -235,4 +246,8 @@ defmodule Oban.Web.CronQuery do
235246
236247 defp filter ( cron , { :workers , workers } ) , do: cron . worker in workers
237248 defp filter ( cron , { :states , states } ) , do: cron . last_state in states
249+
250+ defp filter ( cron , { :modes , modes } ) do
251+ if ( cron . dynamic? , do: "dynamic" , else: "static" ) in modes
252+ end
238253end
0 commit comments