mirror of
https://gitlab.com/soapbox-pub/ditto.git
synced 2025-12-06 11:29:46 +00:00
Merge branch 'stats-race' into 'main'
Update stats before storing event See merge request soapbox-pub/ditto!253
This commit is contained in:
commit
0a79ecb0a3
2 changed files with 18 additions and 18 deletions
|
|
@ -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),
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
30
src/stats.ts
30
src/stats.ts
|
|
@ -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. */
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue