From 1943eca52ba343798f6d471ce094b89311024473 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Wed, 12 Mar 2025 09:49:58 +0100 Subject: [PATCH] Use the same subquery (videos/progress) for entries & firstEntry --- api/src/controllers/entries.ts | 70 +++++++++++++++--------------- api/src/controllers/shows/logic.ts | 36 ++------------- 2 files changed, 40 insertions(+), 66 deletions(-) diff --git a/api/src/controllers/entries.ts b/api/src/controllers/entries.ts index 22f0d25e..7d2e5eb7 100644 --- a/api/src/controllers/entries.ts +++ b/api/src/controllers/entries.ts @@ -106,6 +106,37 @@ const newsSort: Sort = { }, ], }; +const { guess, createdAt, updatedAt, ...videosCol } = getColumns(videos); +export const entryVideosQ = db + .select({ + videos: coalesce( + jsonbAgg( + jsonbBuildObject({ + slug: entryVideoJoin.slug, + ...videosCol, + }), + ), + sql`'[]'::jsonb`, + ).as("videos"), + }) + .from(entryVideoJoin) + .where(eq(entryVideoJoin.entryPk, entries.pk)) + .leftJoin(videos, eq(videos.pk, entryVideoJoin.videoPk)) + .as("videos"); + +export const getEntryProgressQ = (userId: number) => + db + .selectDistinctOn([history.entryPk], { + percent: history.percent, + time: history.time, + entryPk: history.entryPk, + videoId: videos.id, + }) + .from(history) + .where(eq(history.profilePk, userId)) + .leftJoin(videos, eq(history.videoPk, videos.pk)) + .orderBy(history.entryPk, desc(history.playedDate)) + .as("progress"); async function getEntries({ after, @@ -134,36 +165,7 @@ async function getEntries({ .as("t"); const { pk, name, ...transCol } = getColumns(transQ); - const { guess, createdAt, updatedAt, ...videosCol } = getColumns(videos); - const videosQ = db - .select({ - videos: coalesce( - jsonbAgg( - jsonbBuildObject({ - slug: entryVideoJoin.slug, - ...videosCol, - }), - ), - sql`'[]'::jsonb`, - ).as("videos"), - }) - .from(entryVideoJoin) - .where(eq(entryVideoJoin.entryPk, entries.pk)) - .leftJoin(videos, eq(videos.pk, entryVideoJoin.videoPk)) - .as("videos"); - - const progressQ = db - .selectDistinctOn([history.entryPk], { - percent: history.percent, - time: history.time, - entryPk: history.entryPk, - videoId: videos.id, - }) - .from(history) - .where(eq(history.profilePk, userId)) - .leftJoin(videos, eq(history.videoPk, videos.pk)) - .orderBy(history.entryPk, desc(history.playedDate)) - .as("progress"); + const entryProgressQ = getEntryProgressQ(userId); const { kind, @@ -178,8 +180,8 @@ async function getEntries({ .select({ ...entryCol, ...transCol, - videos: videosQ.videos, - progress: getColumns(progressQ), + videos: entryVideosQ.videos, + progress: getColumns(entryProgressQ), // specials don't have an `episodeNumber` but a `number` field. number: episodeNumber, @@ -197,8 +199,8 @@ async function getEntries({ }) .from(entries) .innerJoin(transQ, eq(entries.pk, transQ.pk)) - .leftJoinLateral(videosQ, sql`true`) - .leftJoin(progressQ, eq(entries.pk, progressQ.entryPk)) + .leftJoinLateral(entryVideosQ, sql`true`) + .leftJoin(entryProgressQ, eq(entries.pk, entryProgressQ.entryPk)) .where( and( filter, diff --git a/api/src/controllers/shows/logic.ts b/api/src/controllers/shows/logic.ts index b3ae221b..c9932a09 100644 --- a/api/src/controllers/shows/logic.ts +++ b/api/src/controllers/shows/logic.ts @@ -35,6 +35,7 @@ import { sortToSql, } from "~/models/utils"; import type { EmbeddedVideo } from "~/models/video"; +import { entryVideosQ, getEntryProgressQ } from "../entries"; export const showFilters: FilterDef = { genres: { @@ -160,36 +161,7 @@ const showRelations = { .as("t"); const { pk, ...transCol } = getColumns(transQ); - const { guess, createdAt, updatedAt, ...videosCol } = getColumns(videos); - const videosQ = db - .select({ - videos: coalesce( - jsonbAgg( - jsonbBuildObject({ - slug: entryVideoJoin.slug, - ...videosCol, - }), - ), - sql`'[]'::jsonb`, - ).as("videos"), - }) - .from(entryVideoJoin) - .where(eq(entryVideoJoin.entryPk, entries.pk)) - .leftJoin(videos, eq(videos.pk, entryVideoJoin.videoPk)) - .as("videos"); - - const progressQ = db - .selectDistinctOn([history.entryPk], { - percent: history.percent, - time: history.time, - entryPk: history.entryPk, - videoId: videos.id, - }) - .from(history) - .where(eq(history.profilePk, userId)) - .leftJoin(videos, eq(history.videoPk, videos.pk)) - .orderBy(history.entryPk, desc(history.playedDate)) - .as("progress"); + const progressQ = getEntryProgressQ(userId); return db .select({ @@ -197,14 +169,14 @@ const showRelations = { ...getColumns(entries), ...transCol, number: entries.episodeNumber, - videos: videosQ.videos, + videos: entryVideosQ.videos, progress: getColumns(progressQ), }).as("firstEntry"), }) .from(entries) .innerJoin(transQ, eq(entries.pk, transQ.pk)) .leftJoin(progressQ, eq(entries.pk, progressQ.entryPk)) - .leftJoinLateral(videosQ, sql`true`) + .leftJoinLateral(entryVideosQ, sql`true`) .where(and(eq(entries.showPk, shows.pk), ne(entries.kind, "extra"))) .orderBy(entries.order) .limit(1)