@@ -314,30 +314,34 @@ type Exp struct {
314
314
ShouldDelete bool
315
315
}
316
316
317
- // DeleteExpiredLogs removes any logs which either:
318
- // - don't match any currently registered filters, or
319
- // - have a timestamp older than any matching filter's retention, UNLESS there is at
320
- // least one matching filter with retention=0
321
317
func (o * DSORM ) DeleteExpiredLogs (ctx context.Context , limit int64 ) (int64 , error ) {
322
318
var err error
323
319
var result sql.Result
324
- query := `DELETE FROM evm.logs
320
+ if limit > 0 {
321
+ result , err = o .ds .ExecContext (ctx , `
322
+ DELETE FROM evm.logs
325
323
WHERE (evm_chain_id, address, event_sig, block_number) IN (
326
324
SELECT l.evm_chain_id, l.address, l.event_sig, l.block_number
327
325
FROM evm.logs l
328
- LEFT JOIN (
329
- SELECT address, event, CASE WHEN MIN(retention) = 0 THEN 0 ELSE MAX(retention) END AS retention
326
+ INNER JOIN (
327
+ SELECT address, event, MAX(retention) AS retention
330
328
FROM evm.log_poller_filters
331
329
WHERE evm_chain_id = $1
332
330
GROUP BY evm_chain_id, address, event
333
- ) r ON l.address = r.address AND l.event_sig = r.event
334
- WHERE l.evm_chain_id = $1 AND -- Must be WHERE rather than ON due to LEFT JOIN
335
- r.retention IS NULL OR (r.retention != 0 AND l.block_timestamp <= STATEMENT_TIMESTAMP() - (r.retention / 10^9 * interval '1 second')) %s)`
336
-
337
- if limit > 0 {
338
- result , err = o .ds .ExecContext (ctx , fmt .Sprintf (query , "LIMIT $2" ), ubig .New (o .chainID ), limit )
331
+ HAVING NOT 0 = ANY(ARRAY_AGG(retention))
332
+ ) r ON l.evm_chain_id = $1 AND l.address = r.address AND l.event_sig = r.event
333
+ AND l.block_timestamp <= STATEMENT_TIMESTAMP() - (r.retention / 10^9 * interval '1 second')
334
+ LIMIT $2
335
+ )` , ubig .New (o .chainID ), limit )
339
336
} else {
340
- result , err = o .ds .ExecContext (ctx , fmt .Sprintf (query , "" ), ubig .New (o .chainID ))
337
+ result , err = o .ds .ExecContext (ctx , `WITH r AS
338
+ ( SELECT address, event, MAX(retention) AS retention
339
+ FROM evm.log_poller_filters WHERE evm_chain_id=$1
340
+ GROUP BY evm_chain_id,address, event HAVING NOT 0 = ANY(ARRAY_AGG(retention))
341
+ ) DELETE FROM evm.logs l USING r
342
+ WHERE l.evm_chain_id = $1 AND l.address=r.address AND l.event_sig=r.event
343
+ AND l.block_timestamp <= STATEMENT_TIMESTAMP() - (r.retention / 10^9 * interval '1 second')` , // retention is in nanoseconds (time.Duration aka BIGINT)
344
+ ubig .New (o .chainID ))
341
345
}
342
346
343
347
if err != nil {
0 commit comments