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 +4 -4
- data/lib/search_engine/postgres_outbox/repository.rb +53 -6
- data/lib/search_engine/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 77958fc8a7cb84effc7e3a4ca73b2f01e88eacc9ddead6e888c746e17b7e28d5
|
|
4
|
+
data.tar.gz: 74a046ef9f7cbdddeeed1c9fb7d9749d501b71300adc30bd0d2d771088aae189
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|