Rework sort to handle multiples tables

This commit is contained in:
Zoe Roux
2025-03-10 00:16:35 +01:00
parent 039880d812
commit 46833ac06f
8 changed files with 165 additions and 125 deletions
+23 -16
View File
@@ -67,25 +67,32 @@ const unknownFilters: FilterDef = {
};
const entrySort = Sort(
[
"order",
"seasonNumber",
"episodeNumber",
"number",
"airDate",
"nextRefresh",
],
{
order: entries.order,
seasonNumber: entries.seasonNumber,
episodeNumber: entries.episodeNumber,
number: entries.episodeNumber,
airDate: entries.airDate,
nextRefresh: entries.nextRefresh,
},
{
default: ["order"],
remap: {
number: "episodeNumber",
},
tablePk: entries.pk,
},
);
const extraSort = Sort(["slug", "name", "runtime", "createdAt"], {
default: ["slug"],
});
const extraSort = Sort(
{
slug: entries.slug,
name: entryTranslations.name,
runtime: entries.runtime,
createdAt: entries.createdAt,
},
{
default: ["slug"],
tablePk: entries.pk,
},
);
async function getEntries({
after,
@@ -166,13 +173,13 @@ async function getEntries({
and(
filter,
query ? sql`${transQ.name} %> ${query}::text` : undefined,
keysetPaginate({ table: entries, after, sort }),
keysetPaginate({ after, sort }),
),
)
.orderBy(
...(query
? [sql`word_similarity(${query}::text, ${transQ.name})`]
: sortToSql(sort, entries)),
: sortToSql(sort)),
entries.pk,
)
.limit(limit);
+16 -5
View File
@@ -26,6 +26,19 @@ const seasonFilters: FilterDef = {
endAir: { column: seasons.endAir, type: "date" },
};
const seasonSort = Sort(
{
seasonNumber: seasons.seasonNumber,
startAir: seasons.startAir,
endAir: seasons.endAir,
nextRefresh: seasons.nextRefresh,
},
{
default: ["seasonNumber"],
tablePk: seasons.pk,
},
);
export const seasonsH = new Elysia({ tags: ["series"] })
.model({
season: Season,
@@ -82,13 +95,13 @@ export const seasonsH = new Elysia({ tags: ["series"] })
eq(seasons.showPk, serie.pk),
filter,
query ? sql`${transQ.name} %> ${query}::text` : undefined,
keysetPaginate({ table: seasons, after, sort }),
keysetPaginate({ after, sort }),
),
)
.orderBy(
...(query
? [sql`word_similarity(${query}::text, ${transQ.name})`]
: sortToSql(sort, seasons)),
: sortToSql(sort)),
seasons.pk,
)
.limit(limit);
@@ -104,9 +117,7 @@ export const seasonsH = new Elysia({ tags: ["series"] })
}),
}),
query: t.Object({
sort: Sort(["seasonNumber", "startAir", "endAir", "nextRefresh"], {
default: ["seasonNumber"],
}),
sort: seasonSort,
filter: t.Optional(Filter({ def: seasonFilters })),
query: t.Optional(t.String({ description: desc.query })),
limit: t.Integer({
+12 -12
View File
@@ -57,18 +57,18 @@ export const showFilters: FilterDef = {
},
};
export const showSort = Sort(
[
"slug",
"rating",
"airDate",
"startAir",
"endAir",
"createdAt",
"nextRefresh",
],
{
remap: { airDate: "startAir" },
slug: shows.slug,
rating: shows.rating,
airDate: shows.startAir,
startAir: shows.startAir,
endAir: shows.endAir,
createdAt: shows.createdAt,
nextRefresh: shows.nextRefresh,
},
{
default: ["slug"],
tablePk: shows.pk,
},
);
@@ -209,13 +209,13 @@ export async function getShows({
and(
filter,
query ? sql`${transQ.name} %> ${query}::text` : undefined,
keysetPaginate({ table: shows, after, sort }),
keysetPaginate({ after, sort }),
),
)
.orderBy(
...(query
? [sql`word_similarity(${query}::text, ${transQ.name})`]
: sortToSql(sort, shows)),
: sortToSql(sort)),
shows.pk,
)
.limit(limit);
+32 -14
View File
@@ -23,18 +23,36 @@ import {
import { desc } from "~/models/utils/descriptions";
import { showFilters, showSort } from "./shows/logic";
const staffSort = Sort(["slug", "name", "latinName"], { default: ["slug"] });
const staffSort = Sort(
{
slug: staff.slug,
name: staff.name,
latinName: staff.latinName,
},
{
default: ["slug"],
tablePk: staff.pk,
},
);
const staffRoleSort = Sort(
[
"order",
// "slug",
// "name",
// "latinName",
// "characterName", "characterLatinName"
],
{
order: roles.order,
slug: { sql: staff.slug, accessor: (x) => x.staff.slug },
name: { sql: staff.name, accessor: (x) => x.staff.name },
latinName: { sql: staff.latinName, accessor: (x) => x.staff.latinName },
characterName: {
sql: sql`${roles.character}->'name'`,
accessor: (x) => x.character.name,
},
characterLatinName: {
sql: sql`${roles.character}->'latinName'`,
accessor: (x) => x.character.latinName,
},
},
{
default: ["order"],
tablePk: staff.pk,
},
);
@@ -75,13 +93,13 @@ async function getStaffRoles({
and(
filter,
query ? sql`${staff.name} %> ${query}::text` : undefined,
keysetPaginate({ table: roles, sort, after }),
keysetPaginate({ sort, after }),
),
)
.orderBy(
...(query
? [sql`word_similarity(${query}::text, ${staff.name})`]
: sortToSql(sort, roles)),
: sortToSql(sort)),
shows.pk,
)
.limit(limit);
@@ -217,13 +235,13 @@ export const staffH = new Elysia({ tags: ["staff"] })
eq(roles.staffPk, member.pk),
filter,
query ? sql`${transQ.name} %> ${query}::text` : undefined,
keysetPaginate({ table: shows, after, sort }),
keysetPaginate({ after, sort }),
),
)
.orderBy(
...(query
? [sql`word_similarity(${query}::text, ${transQ.name})`]
: sortToSql(sort, shows)),
: sortToSql(sort)),
roles.showPk,
)
.limit(limit);
@@ -275,13 +293,13 @@ export const staffH = new Elysia({ tags: ["staff"] })
.where(
and(
query ? sql`${staff.name} %> ${query}::text` : undefined,
keysetPaginate({ table: staff, after, sort }),
keysetPaginate({ after, sort }),
),
)
.orderBy(
...(query
? [sql`word_similarity(${query}::text, ${staff.name})`]
: sortToSql(sort, staff)),
: sortToSql(sort)),
staff.pk,
)
.limit(limit);
+12 -3
View File
@@ -34,7 +34,16 @@ import {
import { desc } from "~/models/utils/descriptions";
import { getShows, showFilters, showSort } from "./shows/logic";
const studioSort = Sort(["slug", "createdAt"], { default: ["slug"] });
const studioSort = Sort(
{
slug: studios.slug,
createdAt: studios.createdAt,
},
{
default: ["slug"],
tablePk: studios.pk,
},
);
const studioRelations = {
translations: () => {
@@ -101,13 +110,13 @@ export async function getStudios({
and(
filter,
query ? sql`${transQ.name} %> ${query}::text` : undefined,
keysetPaginate({ table: studios, after, sort }),
keysetPaginate({ after, sort }),
),
)
.orderBy(
...(query
? [sql`word_similarity(${query}::text, ${transQ.name})`]
: sortToSql(sort, studios)),
: sortToSql(sort)),
studios.pk,
)
.limit(limit);