mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-06-03 13:44:33 -04:00
Cleanup video join in entries
This commit is contained in:
parent
c161d680e3
commit
fc60fcc7c4
@ -9,7 +9,13 @@ import {
|
|||||||
shows,
|
shows,
|
||||||
videos,
|
videos,
|
||||||
} from "~/db/schema";
|
} from "~/db/schema";
|
||||||
import { getColumns, sqlarr } from "~/db/utils";
|
import {
|
||||||
|
coalesce,
|
||||||
|
getColumns,
|
||||||
|
jsonbAgg,
|
||||||
|
jsonbBuildObject,
|
||||||
|
sqlarr,
|
||||||
|
} from "~/db/utils";
|
||||||
import {
|
import {
|
||||||
Entry,
|
Entry,
|
||||||
type EntryKind,
|
type EntryKind,
|
||||||
@ -107,17 +113,16 @@ async function getEntries({
|
|||||||
|
|
||||||
const { guess, createdAt, updatedAt, ...videosCol } = getColumns(videos);
|
const { guess, createdAt, updatedAt, ...videosCol } = getColumns(videos);
|
||||||
const videosQ = db
|
const videosQ = db
|
||||||
.select({ slug: entryVideoJoin.slug, ...videosCol })
|
.select({
|
||||||
|
videos: coalesce(
|
||||||
|
jsonbAgg(jsonbBuildObject({ slug: entryVideoJoin.slug, ...videosCol })),
|
||||||
|
sql`'[]'::jsonb`,
|
||||||
|
),
|
||||||
|
})
|
||||||
.from(entryVideoJoin)
|
.from(entryVideoJoin)
|
||||||
.where(eq(entryVideoJoin.entryPk, entries.pk))
|
.where(eq(entryVideoJoin.entryPk, entries.pk))
|
||||||
.leftJoin(videos, eq(videos.pk, entryVideoJoin.videoPk))
|
.leftJoin(videos, eq(videos.pk, entryVideoJoin.videoPk))
|
||||||
.as("videos");
|
.as("videos");
|
||||||
const videosJ = db
|
|
||||||
.select({
|
|
||||||
videos: sql`coalesce(json_agg("videos"), '[]'::json)`.as("videos"),
|
|
||||||
})
|
|
||||||
.from(videosQ)
|
|
||||||
.as("videos_json");
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
kind,
|
kind,
|
||||||
@ -132,7 +137,7 @@ async function getEntries({
|
|||||||
.select({
|
.select({
|
||||||
...entryCol,
|
...entryCol,
|
||||||
...transCol,
|
...transCol,
|
||||||
videos: videosJ.videos,
|
videos: videosQ.videos,
|
||||||
// specials don't have an `episodeNumber` but a `number` field.
|
// specials don't have an `episodeNumber` but a `number` field.
|
||||||
number: episodeNumber,
|
number: episodeNumber,
|
||||||
|
|
||||||
@ -150,7 +155,7 @@ async function getEntries({
|
|||||||
})
|
})
|
||||||
.from(entries)
|
.from(entries)
|
||||||
.innerJoin(transQ, eq(entries.pk, transQ.pk))
|
.innerJoin(transQ, eq(entries.pk, transQ.pk))
|
||||||
.leftJoinLateral(videosJ, sql`true`)
|
.leftJoinLateral(videosQ, sql`true`)
|
||||||
.where(
|
.where(
|
||||||
and(
|
and(
|
||||||
filter,
|
filter,
|
||||||
|
@ -94,10 +94,18 @@ export function values(items: Record<string, unknown>[]) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const coalesce = (val: SQLWrapper, def: SQLWrapper) => {
|
||||||
|
return sql`coalesce(${val}, ${def})`;
|
||||||
|
};
|
||||||
|
|
||||||
export const jsonbObjectAgg = (key: SQLWrapper, value: SQLWrapper) => {
|
export const jsonbObjectAgg = (key: SQLWrapper, value: SQLWrapper) => {
|
||||||
return sql`jsonb_object_agg(${sql.join([key, value], sql.raw(","))})`;
|
return sql`jsonb_object_agg(${sql.join([key, value], sql.raw(","))})`;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const jsonbAgg = (val: SQLWrapper) => {
|
||||||
|
return sql`jsonb_agg(${val})`;
|
||||||
|
};
|
||||||
|
|
||||||
export const jsonbBuildObject = (select: Record<string, SQLWrapper>) => {
|
export const jsonbBuildObject = (select: Record<string, SQLWrapper>) => {
|
||||||
const query = sql.join(
|
const query = sql.join(
|
||||||
Object.entries(select).flatMap(([k, v]) => {
|
Object.entries(select).flatMap(([k, v]) => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user