From 8db54893506237121e8c7e629555ff276d33fde4 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Sun, 11 Aug 2024 19:50:20 -0500 Subject: [PATCH] Implements trends for SQLite --- src/trends.ts | 57 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/src/trends.ts b/src/trends.ts index ff5f3d37..6b038d3f 100644 --- a/src/trends.ts +++ b/src/trends.ts @@ -12,7 +12,7 @@ const console = new Stickynotes('ditto:trends'); /** Get trending tag values for a given tag in the given time frame. */ export async function getTrendingTagValues( /** Kysely instance to execute queries on. */ - db: DittoDatabase, + { dialect, kysely }: DittoDatabase, /** Tag name to filter by, eg `t` or `r`. */ tagNames: string[], /** Filter of eligible events. */ @@ -39,28 +39,41 @@ export async function getTrendingTagValues( LIMIT 20; */ + if (dialect === 'sqlite') { + let query = kysely + .selectFrom('nostr_tags') + .select(({ fn }) => [ + 'nostr_tags.value', + fn.agg('count', ['nostr_tags.pubkey']).distinct().as('authors'), + fn.countAll().as('uses'), + ]) + .where('nostr_tags.name', 'in', tagNames) + .groupBy('nostr_tags.value') + .orderBy((c) => c.fn.agg('count', ['nostr_tags.pubkey']).distinct(), 'desc'); + + if (filter.kinds) { + query = query.where('nostr_tags.kind', 'in', filter.kinds); + } + if (typeof filter.since === 'number') { + query = query.where('nostr_tags.created_at', '>=', filter.since); + } + if (typeof filter.until === 'number') { + query = query.where('nostr_tags.created_at', '<=', filter.until); + } + if (typeof filter.limit === 'number') { + query = query.limit(filter.limit); + } + + const rows = await query.execute(); + + return rows.map((row) => ({ + value: row.value, + authors: Number(row.authors), + uses: Number(row.uses), + })); + } + return []; - - // if (filter.kinds) { - // query = query.where('kind', 'in', filter.kinds); - // } - // if (typeof filter.since === 'number') { - // query = query.where('created_at', '>=', filter.since); - // } - // if (typeof filter.until === 'number') { - // query = query.where('created_at', '<=', filter.until); - // } - // if (typeof filter.limit === 'number') { - // query = query.limit(filter.limit); - // } - - // const rows = await query.execute(); - - // return rows.map((row) => ({ - // value: row.value, - // authors: Number(row.authors), - // uses: Number(row.uses), - // })); } /** Get trending tags and publish an event with them. */