Merge branch 'stats-race' into 'main'

Update stats before storing event

See merge request soapbox-pub/ditto!253
This commit is contained in:
Alex Gleason 2024-05-14 20:29:18 +00:00
commit 0a79ecb0a3
2 changed files with 18 additions and 18 deletions

View file

@ -107,10 +107,8 @@ async function storeEvent(event: DittoEvent, signal?: AbortSignal): Promise<void
if (deletion) { if (deletion) {
return Promise.reject(new RelayError('blocked', 'event was deleted')); return Promise.reject(new RelayError('blocked', 'event was deleted'));
} else { } else {
await Promise.all([ await updateStats(event).catch(debug);
Storages.db.event(event, { signal }).catch(debug), await Storages.db.event(event, { signal }).catch(debug);
updateStats(event).catch(debug),
]);
} }
} }

View file

@ -1,4 +1,4 @@
import { NostrEvent } from '@nostrify/nostrify'; import { NKinds, NostrEvent } from '@nostrify/nostrify';
import Debug from '@soapbox/stickynotes/debug'; import Debug from '@soapbox/stickynotes/debug';
import { InsertQueryBuilder } from 'kysely'; import { InsertQueryBuilder } from 'kysely';
@ -16,14 +16,14 @@ type StatDiff = AuthorStatDiff | EventStatDiff;
const debug = Debug('ditto:stats'); const debug = Debug('ditto:stats');
/** Store stats for the event in LMDB. */ /** Store stats for the event. */
async function updateStats(event: NostrEvent) { async function updateStats(event: NostrEvent) {
let prev: NostrEvent | undefined; let prev: NostrEvent | undefined;
const queries: InsertQueryBuilder<DittoTables, any, unknown>[] = []; const queries: InsertQueryBuilder<DittoTables, any, unknown>[] = [];
// Kind 3 is a special case - replace the count with the new list. // Kind 3 is a special case - replace the count with the new list.
if (event.kind === 3) { if (event.kind === 3) {
prev = await maybeGetPrev(event); prev = await getPrevEvent(event);
if (!prev || event.created_at >= prev.created_at) { if (!prev || event.created_at >= prev.created_at) {
queries.push(updateFollowingCountQuery(event)); queries.push(updateFollowingCountQuery(event));
} }
@ -119,9 +119,9 @@ function authorStatsQuery(diffs: AuthorStatDiff[]) {
oc oc
.column('pubkey') .column('pubkey')
.doUpdateSet((eb) => ({ .doUpdateSet((eb) => ({
followers_count: eb('followers_count', '+', eb.ref('excluded.followers_count')), followers_count: eb('author_stats.followers_count', '+', eb.ref('excluded.followers_count')),
following_count: eb('following_count', '+', eb.ref('excluded.following_count')), following_count: eb('author_stats.following_count', '+', eb.ref('excluded.following_count')),
notes_count: eb('notes_count', '+', eb.ref('excluded.notes_count')), notes_count: eb('author_stats.notes_count', '+', eb.ref('excluded.notes_count')),
})) }))
); );
} }
@ -145,20 +145,22 @@ function eventStatsQuery(diffs: EventStatDiff[]) {
oc oc
.column('event_id') .column('event_id')
.doUpdateSet((eb) => ({ .doUpdateSet((eb) => ({
replies_count: eb('replies_count', '+', eb.ref('excluded.replies_count')), replies_count: eb('event_stats.replies_count', '+', eb.ref('excluded.replies_count')),
reposts_count: eb('reposts_count', '+', eb.ref('excluded.reposts_count')), reposts_count: eb('event_stats.reposts_count', '+', eb.ref('excluded.reposts_count')),
reactions_count: eb('reactions_count', '+', eb.ref('excluded.reactions_count')), reactions_count: eb('event_stats.reactions_count', '+', eb.ref('excluded.reactions_count')),
})) }))
); );
} }
/** Get the last version of the event, if any. */ /** Get the last version of the event, if any. */
async function maybeGetPrev(event: NostrEvent): Promise<NostrEvent> { async function getPrevEvent(event: NostrEvent): Promise<NostrEvent | undefined> {
const [prev] = await Storages.db.query([ if (NKinds.replaceable(event.kind) || NKinds.parameterizedReplaceable(event.kind)) {
{ kinds: [event.kind], authors: [event.pubkey], limit: 1 }, const [prev] = await Storages.db.query([
]); { kinds: [event.kind], authors: [event.pubkey], limit: 1 },
]);
return prev; return prev;
}
} }
/** Set the following count to the total number of unique "p" tags in the follow list. */ /** Set the following count to the total number of unique "p" tags in the follow list. */