Try hydrating timelines in a separate query instead of using relations

This commit is contained in:
Alex Gleason 2024-03-05 14:26:38 -06:00
parent 07d7b3868d
commit 1499f9b417
No known key found for this signature in database
GPG Key ID: 7211D1F99744FBB7
3 changed files with 18 additions and 9 deletions

View File

@ -4,6 +4,7 @@ import { type DittoFilter } from '@/interfaces/DittoFilter.ts';
import { getFeedPubkeys } from '@/queries.ts'; import { getFeedPubkeys } from '@/queries.ts';
import { booleanParamSchema } from '@/schema.ts'; import { booleanParamSchema } from '@/schema.ts';
import { eventsDB } from '@/storages.ts'; import { eventsDB } from '@/storages.ts';
import { hydrateEvents } from '@/storages/hydrate.ts';
import { paginated, paginationSchema } from '@/utils/api.ts'; import { paginated, paginationSchema } from '@/utils/api.ts';
import { renderStatus } from '@/views/mastodon/statuses.ts'; import { renderStatus } from '@/views/mastodon/statuses.ts';
@ -34,10 +35,9 @@ const hashtagTimelineController: AppController = (c) => {
async function renderStatuses(c: AppContext, filters: DittoFilter[]) { async function renderStatuses(c: AppContext, filters: DittoFilter[]) {
const { signal } = c.req.raw; const { signal } = c.req.raw;
const events = await eventsDB.query( const events = await eventsDB
filters.map((filter) => ({ ...filter, relations: ['author', 'event_stats', 'author_stats'] })), .query(filters, { signal })
{ signal }, .then((events) => hydrateEvents({ events, relations: ['author'], storage: eventsDB, signal }));
);
if (!events.length) { if (!events.length) {
return c.json([]); return c.json([]);

View File

@ -1,19 +1,23 @@
import { type NostrEvent, type NStore } from '@/deps.ts'; import { type NostrEvent, type NStore } from '@/deps.ts';
import { type DittoEvent } from '@/interfaces/DittoEvent.ts'; import { type DittoEvent } from '@/interfaces/DittoEvent.ts';
import { type DittoFilter } from '@/interfaces/DittoFilter.ts'; import { type DittoRelation } from '@/interfaces/DittoFilter.ts';
interface HydrateEventOpts { interface HydrateEventOpts {
events: DittoEvent[]; events: DittoEvent[];
filters: DittoFilter[]; relations: DittoRelation[];
storage: NStore; storage: NStore;
signal?: AbortSignal; signal?: AbortSignal;
} }
/** Hydrate event relationships using the provided storage. */ /** Hydrate event relationships using the provided storage. */
async function hydrateEvents(opts: HydrateEventOpts): Promise<DittoEvent[]> { async function hydrateEvents(opts: HydrateEventOpts): Promise<DittoEvent[]> {
const { events, filters, storage, signal } = opts; const { events, relations, storage, signal } = opts;
if (filters.some((filter) => filter.relations?.includes('author'))) { if (events.length === 0) {
return events;
}
if (relations.includes('author')) {
const pubkeys = new Set([...events].map((event) => event.pubkey)); const pubkeys = new Set([...events].map((event) => event.pubkey));
const authors = await storage.query([{ kinds: [0], authors: [...pubkeys] }], { signal }); const authors = await storage.query([{ kinds: [0], authors: [...pubkeys] }], { signal });

View File

@ -62,7 +62,12 @@ class SearchStore implements NStore {
events.add(event); events.add(event);
} }
return hydrateEvents({ events: [...events], filters, storage: this.#hydrator, signal: opts?.signal }); return hydrateEvents({
events: [...events],
relations: ['author', 'event_stats', 'author_stats'],
storage: this.#hydrator,
signal: opts?.signal,
});
} else { } else {
this.#debug(`Searching for "${query}" locally...`); this.#debug(`Searching for "${query}" locally...`);
return this.#fallback.query(filters, opts); return this.#fallback.query(filters, opts);