From 48a4e30e3811fb722e42802566da0c28f6a8ce1a Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Mon, 29 Jul 2024 15:33:16 -0500 Subject: [PATCH] trends: read directly from the tags table instead of doing an inner join on events --- src/db/migrations/029_tag_queries.ts | 6 ++++++ src/trends.ts | 11 +++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/db/migrations/029_tag_queries.ts b/src/db/migrations/029_tag_queries.ts index 3211f9d1..932b9599 100644 --- a/src/db/migrations/029_tag_queries.ts +++ b/src/db/migrations/029_tag_queries.ts @@ -54,6 +54,12 @@ export async function up(db: Kysely): Promise { .ifNotExists() .columns(['value', 'name', 'kind', 'pubkey', 'created_at desc', 'event_id asc']) .execute(); + await db.schema + .createIndex('nostr_tags_trends') + .on('nostr_tags') + .ifNotExists() + .columns(['created_at', 'name', 'kind']) + .execute(); } export async function down(db: Kysely): Promise { diff --git a/src/trends.ts b/src/trends.ts index 3f0ab625..c5165f33 100644 --- a/src/trends.ts +++ b/src/trends.ts @@ -22,24 +22,23 @@ export async function getTrendingTagValues( ): Promise<{ value: string; authors: number; uses: number }[]> { let query = kysely .selectFrom('nostr_tags') - .innerJoin('nostr_events', 'nostr_events.id', 'nostr_tags.event_id') .select(({ fn }) => [ 'nostr_tags.value', - fn.agg('count', ['nostr_events.pubkey']).distinct().as('authors'), + 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_events.pubkey']).distinct(), 'desc'); + .orderBy((c) => c.fn.agg('count', ['nostr_tags.pubkey']).distinct(), 'desc'); if (filter.kinds) { - query = query.where('nostr_events.kind', 'in', filter.kinds); + query = query.where('nostr_tags.kind', 'in', filter.kinds); } if (typeof filter.since === 'number') { - query = query.where('nostr_events.created_at', '>=', filter.since); + query = query.where('nostr_tags.created_at', '>=', filter.since); } if (typeof filter.until === 'number') { - query = query.where('nostr_events.created_at', '<=', filter.until); + query = query.where('nostr_tags.created_at', '<=', filter.until); } if (typeof filter.limit === 'number') { query = query.limit(filter.limit);