@@ -31,36 +31,18 @@ def errors = {}
3131 end
3232 end
3333
34- def advisory_lock ( key )
35- ::ActiveRecord ::Base . connection . execute ( "SELECT pg_advisory_xact_lock(#{ key } )" )
36- nil
37- end
38-
39- def advisory_lock_try ( key )
40- ::ActiveRecord ::Base . connection . execute ( "SELECT pg_try_advisory_xact_lock(123)" ) . first [ "pg_try_advisory_xact_lock" ]
41- end
42-
4334 def job_get_by_id ( id )
4435 data_set = RiverJob . where ( id : id )
4536 data_set . first ? to_job_row_from_model ( data_set . first ) : nil
4637 end
4738
48- def job_get_by_kind_and_unique_properties ( get_params )
49- data_set = RiverJob . where ( kind : get_params . kind )
50- data_set = data_set . where ( "tstzrange(?, ?, '[)') @> created_at" , get_params . created_at [ 0 ] , get_params . created_at [ 1 ] ) if get_params . created_at
51- data_set = data_set . where ( args : get_params . encoded_args ) if get_params . encoded_args
52- data_set = data_set . where ( queue : get_params . queue ) if get_params . queue
53- data_set = data_set . where ( state : get_params . state ) if get_params . state
54- data_set . first ? to_job_row_from_model ( data_set . first ) : nil
55- end
56-
5739 def job_insert ( insert_params )
58- to_job_row_from_model ( RiverJob . create ( insert_params_to_hash ( insert_params ) ) )
40+ job_insert_many ( [ insert_params ] ) . first
5941 end
6042
61- def job_insert_unique ( insert_params , unique_key )
62- res = RiverJob . upsert (
63- insert_params_to_hash ( insert_params ) . merge ( unique_key : unique_key ) ,
43+ def job_insert_many ( insert_params_many )
44+ res = RiverJob . upsert_all (
45+ insert_params_many . map { | param | insert_params_to_hash ( param ) } ,
6446 on_duplicate : Arel . sql ( "kind = EXCLUDED.kind" ) ,
6547 returning : Arel . sql ( "*, (xmax != 0) AS unique_skipped_as_duplicate" ) ,
6648
@@ -69,15 +51,9 @@ def job_insert_unique(insert_params, unique_key)
6951 # ActiveRecord tries to look up a unique index instead of letting
7052 # Postgres handle that, and of course it doesn't support a `WHERE`
7153 # clause. The workaround is to target the index name instead of columns.
72- unique_by : "river_job_kind_unique_key_idx "
54+ unique_by : "river_job_unique_idx "
7355 )
74-
75- [ to_job_row_from_raw ( res ) , res . send ( :hash_rows ) [ 0 ] [ "unique_skipped_as_duplicate" ] ]
76- end
77-
78- def job_insert_many ( insert_params_many )
79- RiverJob . insert_all ( insert_params_many . map { |p | insert_params_to_hash ( p ) } )
80- insert_params_many . count
56+ to_insert_results ( res )
8157 end
8258
8359 def job_list
@@ -94,8 +70,6 @@ def transaction(&)
9470 end
9571
9672 private def insert_params_to_hash ( insert_params )
97- # the call to `#compact` is important so that we remove nils and table
98- # default values get picked up instead
9973 {
10074 args : insert_params . encoded_args ,
10175 kind : insert_params . kind ,
@@ -104,8 +78,10 @@ def transaction(&)
10478 queue : insert_params . queue ,
10579 state : insert_params . state ,
10680 scheduled_at : insert_params . scheduled_at ,
107- tags : insert_params . tags
108- } . compact
81+ tags : insert_params . tags || [ ] ,
82+ unique_key : insert_params . unique_key ,
83+ unique_states : insert_params . unique_states
84+ }
10985 end
11086
11187 private def to_job_row_from_model ( river_job )
@@ -139,51 +115,62 @@ def transaction(&)
139115 scheduled_at : river_job . scheduled_at . getutc ,
140116 state : river_job . state ,
141117 tags : river_job . tags ,
142- unique_key : river_job . unique_key
118+ unique_key : river_job . unique_key ,
119+ unique_states : river_job . unique_states
143120 )
144121 end
145122
123+ private def to_insert_results ( res )
124+ res . rows . map do |row |
125+ to_job_row_from_raw ( row , res . columns , res . column_types )
126+ end
127+ end
128+
146129 # This is really awful, but some of ActiveRecord's methods (e.g. `.create`)
147130 # return a model, and others (e.g. `.upsert`) return raw values, and
148131 # therefore this second version from unmarshaling a job row exists. I
149132 # searched long and hard for a way to have the former type of method return
150133 # raw or the latter type of method return a model, but was unable to find
151134 # anything.
152- private def to_job_row_from_raw ( res )
135+ private def to_job_row_from_raw ( row , columns , column_types )
153136 river_job = { }
154137
155- res . rows [ 0 ] . each_with_index do |val , i |
156- river_job [ res . columns [ i ] ] = res . column_types [ i ] . deserialize ( val )
138+ row . each_with_index do |val , i |
139+ river_job [ columns [ i ] ] = column_types [ i ] . deserialize ( val )
157140 end
158141
159- River ::JobRow . new (
160- id : river_job [ "id" ] ,
161- args : JSON . parse ( river_job [ "args" ] ) ,
162- attempt : river_job [ "attempt" ] ,
163- attempted_at : river_job [ "attempted_at" ] &.getutc ,
164- attempted_by : river_job [ "attempted_by" ] ,
165- created_at : river_job [ "created_at" ] . getutc ,
166- errors : river_job [ "errors" ] &.map { |e |
167- deserialized_error = JSON . parse ( e )
168-
169- River ::AttemptError . new (
170- at : Time . parse ( deserialized_error [ "at" ] ) ,
171- attempt : deserialized_error [ "attempt" ] ,
172- error : deserialized_error [ "error" ] ,
173- trace : deserialized_error [ "trace" ]
174- )
175- } ,
176- finalized_at : river_job [ "finalized_at" ] &.getutc ,
177- kind : river_job [ "kind" ] ,
178- max_attempts : river_job [ "max_attempts" ] ,
179- metadata : river_job [ "metadata" ] ,
180- priority : river_job [ "priority" ] ,
181- queue : river_job [ "queue" ] ,
182- scheduled_at : river_job [ "scheduled_at" ] . getutc ,
183- state : river_job [ "state" ] ,
184- tags : river_job [ "tags" ] ,
185- unique_key : river_job [ "unique_key" ]
186- )
142+ [
143+ River ::JobRow . new (
144+ id : river_job [ "id" ] ,
145+ args : JSON . parse ( river_job [ "args" ] ) ,
146+ attempt : river_job [ "attempt" ] ,
147+ attempted_at : river_job [ "attempted_at" ] &.getutc ,
148+ attempted_by : river_job [ "attempted_by" ] ,
149+ created_at : river_job [ "created_at" ] . getutc ,
150+ errors : river_job [ "errors" ] &.map { |e |
151+ deserialized_error = JSON . parse ( e )
152+
153+ River ::AttemptError . new (
154+ at : Time . parse ( deserialized_error [ "at" ] ) ,
155+ attempt : deserialized_error [ "attempt" ] ,
156+ error : deserialized_error [ "error" ] ,
157+ trace : deserialized_error [ "trace" ]
158+ )
159+ } ,
160+ finalized_at : river_job [ "finalized_at" ] &.getutc ,
161+ kind : river_job [ "kind" ] ,
162+ max_attempts : river_job [ "max_attempts" ] ,
163+ metadata : river_job [ "metadata" ] ,
164+ priority : river_job [ "priority" ] ,
165+ queue : river_job [ "queue" ] ,
166+ scheduled_at : river_job [ "scheduled_at" ] . getutc ,
167+ state : river_job [ "state" ] ,
168+ tags : river_job [ "tags" ] ,
169+ unique_key : river_job [ "unique_key" ] ,
170+ unique_states : ::River ::UniqueBitmask . to_states ( river_job [ "unique_states" ] &.to_i ( 2 ) )
171+ ) ,
172+ river_job [ "unique_skipped_as_duplicate" ]
173+ ]
187174 end
188175 end
189176end
0 commit comments