search-engine-for-typesense 30.1.8.6 → 30.1.8.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b1c78ec682862c0d84b0e6a46d2e71fe0a34d195eb08f2c75885d6c9c5287333
4
- data.tar.gz: b74ec0baf763752d4b110c970ed782fe24d7b9c6819359f88a8c79064180d876
3
+ metadata.gz: 77958fc8a7cb84effc7e3a4ca73b2f01e88eacc9ddead6e888c746e17b7e28d5
4
+ data.tar.gz: 74a046ef9f7cbdddeeed1c9fb7d9749d501b71300adc30bd0d2d771088aae189
5
5
  SHA512:
6
- metadata.gz: e3b0de141dee645872757a533243779a50474183645f0f80ebe4e4434739baab3c838a9024c3c27f78db8a50b170001b88af2ac560ac92387496ac36b26482ab
7
- data.tar.gz: 753e1c206dac9590dfd8833d9b1f6a12d54752159f0e638472eab40f03655cca8fc14db2caac177a664f9627f3f778e269c5551613abb01ae72eb549b3f7033c
6
+ metadata.gz: 9e6bc4e2159d41cd66f0f4f9568d503c3b40ebbbe59be2cb6709ce008589d2e2caa3028f54f3de180a1dc9ff5c37c37cab5ba049780b4583a4974018eaf7ca39
7
+ data.tar.gz: a478abb0104cf415d31bcd069d93eb89039acff25c081423117e965fed6d6cd2ffbc859a88601988036246e4b343633e454fda25e27999013c5363e4f824d0c9
@@ -22,6 +22,7 @@ module SearchEngine
22
22
  connection.transaction do
23
23
  rows = select_rows(claim_select_sql(limit.to_i))
24
24
  ids = rows.map { |row| row_value(row, :id) }
25
+ execute(supersede_older_pending_sql(rows)) unless rows.empty?
25
26
  execute(claim_update_sql(ids, worker_id)) unless ids.empty?
26
27
  end
27
28
 
@@ -103,12 +104,30 @@ module SearchEngine
103
104
 
104
105
  def claim_select_sql(limit)
105
106
  <<~SQL
106
- SELECT *
107
- FROM #{quoted_table}
108
- WHERE status = 'pending'
109
- AND (next_attempt_at IS NULL OR next_attempt_at <= CURRENT_TIMESTAMP)
110
- ORDER BY id ASC
111
- LIMIT #{limit}
107
+ WITH ranked_pending AS (
108
+ SELECT id,
109
+ ROW_NUMBER() OVER (
110
+ PARTITION BY collection, document_id
111
+ ORDER BY id DESC
112
+ ) AS row_number
113
+ FROM #{quoted_table}
114
+ WHERE status = 'pending'
115
+ ),
116
+ latest_due AS (
117
+ SELECT outbox.id
118
+ FROM #{quoted_table} outbox
119
+ INNER JOIN ranked_pending
120
+ ON ranked_pending.id = outbox.id
121
+ WHERE ranked_pending.row_number = 1
122
+ AND (outbox.next_attempt_at IS NULL OR outbox.next_attempt_at <= CURRENT_TIMESTAMP)
123
+ ORDER BY outbox.id ASC
124
+ LIMIT #{limit}
125
+ )
126
+ SELECT outbox.*
127
+ FROM #{quoted_table} outbox
128
+ INNER JOIN latest_due
129
+ ON latest_due.id = outbox.id
130
+ ORDER BY outbox.id ASC
112
131
  FOR UPDATE SKIP LOCKED
113
132
  SQL
114
133
  end
@@ -124,6 +143,24 @@ module SearchEngine
124
143
  SQL
125
144
  end
126
145
 
146
+ def supersede_older_pending_sql(rows)
147
+ <<~SQL
148
+ UPDATE #{quoted_table} older
149
+ SET status = 'superseded',
150
+ processed_at = CURRENT_TIMESTAMP,
151
+ locked_at = NULL,
152
+ locked_by = NULL,
153
+ updated_at = CURRENT_TIMESTAMP
154
+ FROM (
155
+ VALUES #{coalesce_values_sql(rows)}
156
+ ) AS latest(collection, document_id, id)
157
+ WHERE older.status = 'pending'
158
+ AND older.collection = latest.collection
159
+ AND older.document_id = latest.document_id
160
+ AND older.id < latest.id
161
+ SQL
162
+ end
163
+
127
164
  def update_status!(event_ids, status, extra:)
128
165
  ids = Array(event_ids).compact
129
166
  return if ids.empty?
@@ -154,6 +191,16 @@ module SearchEngine
154
191
  ids.map { |id| quote(id) }.join(', ')
155
192
  end
156
193
 
194
+ def coalesce_values_sql(rows)
195
+ rows.map do |row|
196
+ collection = row_value(row, :collection)
197
+ document_id = row_value(row, :document_id)
198
+ id = row_value(row, :id)
199
+
200
+ "(#{quote(collection)}, #{quote(document_id)}, #{quote(id)})"
201
+ end.join(', ')
202
+ end
203
+
157
204
  def quoted_table
158
205
  connection.quote_table_name(SearchEngine.config.postgres_outbox.table_name)
159
206
  end
@@ -3,5 +3,5 @@
3
3
  module SearchEngine
4
4
  # Current gem version.
5
5
  # @return [String]
6
- VERSION = '30.1.8.6'
6
+ VERSION = '30.1.8.7'
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: search-engine-for-typesense
3
3
  version: !ruby/object:Gem::Version
4
- version: 30.1.8.6
4
+ version: 30.1.8.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nikita Shkoda