Hunno this isn't all the case search fixes required...

Manual fixes for a lot of case places..

-Dx
This commit is contained in:
2026-01-10 23:34:02 +00:00
parent 9bb0a18695
commit 48d02adbed

View File

@@ -1,4 +1,4 @@
import { and, desc, eq, like, sql, asc } from "drizzle-orm"; import { and, desc, eq, sql, asc } from "drizzle-orm";
import { cache } from "react"; import { cache } from "react";
// import { alias } from "drizzle-orm/mysql-core"; // import { alias } from "drizzle-orm/mysql-core";
import { db } from "@/server/db"; import { db } from "@/server/db";
@@ -107,13 +107,13 @@ export interface EntryFacets {
function buildEntrySearchUnion(pattern: string, scope: EntrySearchScope) { function buildEntrySearchUnion(pattern: string, scope: EntrySearchScope) {
const parts: Array<ReturnType<typeof sql>> = [ const parts: Array<ReturnType<typeof sql>> = [
sql`select ${searchByTitles.entryId} as entry_id from ${searchByTitles} where ${searchByTitles.entryTitle} like ${pattern}`, sql`select ${searchByTitles.entryId} as entry_id from ${searchByTitles} where lower(${searchByTitles.entryTitle}) like ${pattern}`,
]; ];
if (scope !== "title") { if (scope !== "title") {
parts.push(sql`select ${searchByAliases.entryId} as entry_id from ${searchByAliases} where ${searchByAliases.libraryTitle} like ${pattern}`); parts.push(sql`select ${searchByAliases.entryId} as entry_id from ${searchByAliases} where lower(${searchByAliases.libraryTitle}) like ${pattern}`);
} }
if (scope === "title_aliases_origins") { if (scope === "title_aliases_origins") {
parts.push(sql`select ${searchByOrigins.entryId} as entry_id from ${searchByOrigins} where ${searchByOrigins.libraryTitle} like ${pattern}`); parts.push(sql`select ${searchByOrigins.entryId} as entry_id from ${searchByOrigins} where lower(${searchByOrigins.libraryTitle}) like ${pattern}`);
} }
return sql.join(parts, sql` union `); return sql.join(parts, sql` union `);
} }
@@ -271,7 +271,7 @@ export async function searchEntries(params: SearchParams): Promise<PagedResult<S
const countRows = await db const countRows = await db
.select({ total: sql<number>`count(distinct ${searchByTitles.entryId})` }) .select({ total: sql<number>`count(distinct ${searchByTitles.entryId})` })
.from(searchByTitles) .from(searchByTitles)
.where(like(searchByTitles.entryTitle, pattern)); .where(sql`lower(${searchByTitles.entryTitle}) like ${pattern}`);
const total = Number(countRows[0]?.total ?? 0); const total = Number(countRows[0]?.total ?? 0);
@@ -293,7 +293,7 @@ export async function searchEntries(params: SearchParams): Promise<PagedResult<S
.leftJoin(genretypes, eq(genretypes.id, entries.genretypeId)) .leftJoin(genretypes, eq(genretypes.id, entries.genretypeId))
.leftJoin(machinetypes, eq(machinetypes.id, entries.machinetypeId)) .leftJoin(machinetypes, eq(machinetypes.id, entries.machinetypeId))
.leftJoin(languages, eq(languages.id, entries.languageId)) .leftJoin(languages, eq(languages.id, entries.languageId))
.where(like(searchByTitles.entryTitle, pattern)) .where(sql`lower(${searchByTitles.entryTitle}) like ${pattern}`)
.groupBy(entries.id) .groupBy(entries.id)
.orderBy(sort === "id_desc" ? desc(entries.id) : entries.title) .orderBy(sort === "id_desc" ? desc(entries.id) : entries.title)
.limit(pageSize) .limit(pageSize)
@@ -1207,7 +1207,7 @@ export async function getLabelAuthoredEntries(labelId: number, params: LabelCont
.select({ total: sql<number>`count(distinct ${entries.id})` }) .select({ total: sql<number>`count(distinct ${entries.id})` })
.from(authors) .from(authors)
.innerJoin(entries, eq(entries.id, authors.entryId)) .innerJoin(entries, eq(entries.id, authors.entryId))
.where(and(eq(authors.labelId, labelId), sql`${entries.id} in (select entry_id from ${searchByTitles} where ${searchByTitles.entryTitle} like ${pattern})`)); .where(and(eq(authors.labelId, labelId), sql`${entries.id} in (select entry_id from ${searchByTitles} where lower(${searchByTitles.entryTitle}) like ${pattern})`));
const total = Number((countRows)[0]?.total ?? 0); const total = Number((countRows)[0]?.total ?? 0);
const items = await db const items = await db
.select({ .select({
@@ -1226,7 +1226,7 @@ export async function getLabelAuthoredEntries(labelId: number, params: LabelCont
.leftJoin(genretypes, eq(genretypes.id, entries.genretypeId)) .leftJoin(genretypes, eq(genretypes.id, entries.genretypeId))
.leftJoin(machinetypes, eq(machinetypes.id, entries.machinetypeId)) .leftJoin(machinetypes, eq(machinetypes.id, entries.machinetypeId))
.leftJoin(languages, eq(languages.id, entries.languageId)) .leftJoin(languages, eq(languages.id, entries.languageId))
.where(and(eq(authors.labelId, labelId), sql`${entries.id} in (select entry_id from ${searchByTitles} where ${searchByTitles.entryTitle} like ${pattern})`)) .where(and(eq(authors.labelId, labelId), sql`${entries.id} in (select entry_id from ${searchByTitles} where lower(${searchByTitles.entryTitle}) like ${pattern})`))
.groupBy(entries.id) .groupBy(entries.id)
.orderBy(entries.title) .orderBy(entries.title)
.limit(pageSize) .limit(pageSize)
@@ -1279,7 +1279,7 @@ export async function getLabelPublishedEntries(labelId: number, params: LabelCon
.select({ total: sql<number>`count(distinct ${entries.id})` }) .select({ total: sql<number>`count(distinct ${entries.id})` })
.from(publishers) .from(publishers)
.innerJoin(entries, eq(entries.id, publishers.entryId)) .innerJoin(entries, eq(entries.id, publishers.entryId))
.where(and(eq(publishers.labelId, labelId), sql`${entries.id} in (select entry_id from ${searchByTitles} where ${searchByTitles.entryTitle} like ${pattern})`)); .where(and(eq(publishers.labelId, labelId), sql`${entries.id} in (select entry_id from ${searchByTitles} where lower(${searchByTitles.entryTitle}) like ${pattern})`));
const total = Number((countRows)[0]?.total ?? 0); const total = Number((countRows)[0]?.total ?? 0);
const items = await db const items = await db
.select({ .select({
@@ -1298,7 +1298,7 @@ export async function getLabelPublishedEntries(labelId: number, params: LabelCon
.leftJoin(genretypes, eq(genretypes.id, entries.genretypeId)) .leftJoin(genretypes, eq(genretypes.id, entries.genretypeId))
.leftJoin(machinetypes, eq(machinetypes.id, entries.machinetypeId)) .leftJoin(machinetypes, eq(machinetypes.id, entries.machinetypeId))
.leftJoin(languages, eq(languages.id, entries.languageId)) .leftJoin(languages, eq(languages.id, entries.languageId))
.where(and(eq(publishers.labelId, labelId), sql`${entries.id} in (select entry_id from ${searchByTitles} where ${searchByTitles.entryTitle} like ${pattern})`)) .where(and(eq(publishers.labelId, labelId), sql`${entries.id} in (select entry_id from ${searchByTitles} where lower(${searchByTitles.entryTitle}) like ${pattern})`))
.groupBy(entries.id) .groupBy(entries.id)
.orderBy(entries.title) .orderBy(entries.title)
.limit(pageSize) .limit(pageSize)
@@ -1338,16 +1338,16 @@ export async function searchLanguages(params: SimpleSearchParams) {
return { items, page, pageSize, total }; return { items, page, pageSize, total };
} }
const pattern = `%${q}%`; const pattern = `%${q.toLowerCase()}%`;
const [items, countRows] = await Promise.all([ const [items, countRows] = await Promise.all([
db db
.select() .select()
.from(languages) .from(languages)
.where(like(languages.name, pattern)) .where(sql`lower(${languages.name}) like ${pattern}`)
.orderBy(languages.name) .orderBy(languages.name)
.limit(pageSize) .limit(pageSize)
.offset(offset), .offset(offset),
db.select({ total: sql<number>`count(*)` }).from(languages).where(like(languages.name, pattern)), db.select({ total: sql<number>`count(*)` }).from(languages).where(sql`lower(${languages.name}) like ${pattern}`),
]); ]);
const total = Number(countRows?.[0]?.total ?? 0); const total = Number(countRows?.[0]?.total ?? 0);
return { items, page, pageSize, total }; return { items, page, pageSize, total };
@@ -1368,16 +1368,16 @@ export async function searchGenres(params: SimpleSearchParams) {
return { items, page, pageSize, total }; return { items, page, pageSize, total };
} }
const pattern = `%${q}%`; const pattern = `%${q.toLowerCase()}%`;
const [items, countRows] = await Promise.all([ const [items, countRows] = await Promise.all([
db db
.select() .select()
.from(genretypes) .from(genretypes)
.where(like(genretypes.name, pattern)) .where(sql`lower(${genretypes.name}) like ${pattern}`)
.orderBy(genretypes.name) .orderBy(genretypes.name)
.limit(pageSize) .limit(pageSize)
.offset(offset), .offset(offset),
db.select({ total: sql<number>`count(*)` }).from(genretypes).where(like(genretypes.name, pattern)), db.select({ total: sql<number>`count(*)` }).from(genretypes).where(sql`lower(${genretypes.name}) like ${pattern}`),
]); ]);
const total = Number(countRows?.[0]?.total ?? 0); const total = Number(countRows?.[0]?.total ?? 0);
return { items, page, pageSize, total }; return { items, page, pageSize, total };
@@ -1398,16 +1398,16 @@ export async function searchMachinetypes(params: SimpleSearchParams) {
return { items, page, pageSize, total }; return { items, page, pageSize, total };
} }
const pattern = `%${q}%`; const pattern = `%${q.toLowerCase()}%`;
const [items, countRows] = await Promise.all([ const [items, countRows] = await Promise.all([
db db
.select() .select()
.from(machinetypes) .from(machinetypes)
.where(like(machinetypes.name, pattern)) .where(sql`lower(${machinetypes.name}) like ${pattern}`)
.orderBy(machinetypes.name) .orderBy(machinetypes.name)
.limit(pageSize) .limit(pageSize)
.offset(offset), .offset(offset),
db.select({ total: sql<number>`count(*)` }).from(machinetypes).where(like(machinetypes.name, pattern)), db.select({ total: sql<number>`count(*)` }).from(machinetypes).where(sql`lower(${machinetypes.name}) like ${pattern}`),
]); ]);
const total = Number((countRows as { total: number }[])[0]?.total ?? 0); const total = Number((countRows as { total: number }[])[0]?.total ?? 0);
return { items, page, pageSize, total }; return { items, page, pageSize, total };
@@ -1454,7 +1454,7 @@ export async function entriesByGenre(
const countRows = await db const countRows = await db
.select({ total: sql<number>`count(distinct ${entries.id})` }) .select({ total: sql<number>`count(distinct ${entries.id})` })
.from(entries) .from(entries)
.where(and(eq(entries.genretypeId, genreId), sql`${entries.id} in (select entry_id from ${searchByTitles} where ${searchByTitles.entryTitle} like ${pattern})`)); .where(and(eq(entries.genretypeId, genreId), sql`${entries.id} in (select entry_id from ${searchByTitles} where lower(${searchByTitles.entryTitle}) like ${pattern})`));
const total = Number(countRows[0]?.total ?? 0); const total = Number(countRows[0]?.total ?? 0);
const items = await db const items = await db
.select({ .select({
@@ -1472,7 +1472,7 @@ export async function entriesByGenre(
.leftJoin(genretypes, eq(genretypes.id, entries.genretypeId)) .leftJoin(genretypes, eq(genretypes.id, entries.genretypeId))
.leftJoin(machinetypes, eq(machinetypes.id, entries.machinetypeId)) .leftJoin(machinetypes, eq(machinetypes.id, entries.machinetypeId))
.leftJoin(languages, eq(languages.id, entries.languageId)) .leftJoin(languages, eq(languages.id, entries.languageId))
.where(and(eq(entries.genretypeId, genreId), sql`${entries.id} in (select entry_id from ${searchByTitles} where ${searchByTitles.entryTitle} like ${pattern})`)) .where(and(eq(entries.genretypeId, genreId), sql`${entries.id} in (select entry_id from ${searchByTitles} where lower(${searchByTitles.entryTitle}) like ${pattern})`))
.groupBy(entries.id) .groupBy(entries.id)
.orderBy(entries.title) .orderBy(entries.title)
.limit(pageSize) .limit(pageSize)
@@ -1521,7 +1521,7 @@ export async function entriesByLanguage(
const countRows = await db const countRows = await db
.select({ total: sql<number>`count(distinct ${entries.id})` }) .select({ total: sql<number>`count(distinct ${entries.id})` })
.from(entries) .from(entries)
.where(and(eq(entries.languageId, langId), sql`${entries.id} in (select entry_id from ${searchByTitles} where ${searchByTitles.entryTitle} like ${pattern})`)); .where(and(eq(entries.languageId, langId), sql`${entries.id} in (select entry_id from ${searchByTitles} where lower(${searchByTitles.entryTitle}) like ${pattern})`));
const total = Number(countRows[0]?.total ?? 0); const total = Number(countRows[0]?.total ?? 0);
const items = await db const items = await db
.select({ .select({
@@ -1539,7 +1539,7 @@ export async function entriesByLanguage(
.leftJoin(genretypes, eq(genretypes.id, entries.genretypeId)) .leftJoin(genretypes, eq(genretypes.id, entries.genretypeId))
.leftJoin(machinetypes, eq(machinetypes.id, entries.machinetypeId)) .leftJoin(machinetypes, eq(machinetypes.id, entries.machinetypeId))
.leftJoin(languages, eq(languages.id, entries.languageId)) .leftJoin(languages, eq(languages.id, entries.languageId))
.where(and(eq(entries.languageId, langId), sql`${entries.id} in (select entry_id from ${searchByTitles} where ${searchByTitles.entryTitle} like ${pattern})`)) .where(and(eq(entries.languageId, langId), sql`${entries.id} in (select entry_id from ${searchByTitles} where lower(${searchByTitles.entryTitle}) like ${pattern})`))
.groupBy(entries.id) .groupBy(entries.id)
.orderBy(entries.title) .orderBy(entries.title)
.limit(pageSize) .limit(pageSize)
@@ -1588,7 +1588,7 @@ export async function entriesByMachinetype(
const countRows = await db const countRows = await db
.select({ total: sql<number>`count(distinct ${entries.id})` }) .select({ total: sql<number>`count(distinct ${entries.id})` })
.from(entries) .from(entries)
.where(and(eq(entries.machinetypeId, mtId), sql`${entries.id} in (select entry_id from ${searchByTitles} where ${searchByTitles.entryTitle} like ${pattern})`)); .where(and(eq(entries.machinetypeId, mtId), sql`${entries.id} in (select entry_id from ${searchByTitles} where lower(${searchByTitles.entryTitle}) like ${pattern})`));
const total = Number(countRows[0]?.total ?? 0); const total = Number(countRows[0]?.total ?? 0);
const items = await db const items = await db
.select({ .select({
@@ -1606,7 +1606,7 @@ export async function entriesByMachinetype(
.leftJoin(genretypes, eq(genretypes.id, entries.genretypeId)) .leftJoin(genretypes, eq(genretypes.id, entries.genretypeId))
.leftJoin(machinetypes, eq(machinetypes.id, entries.machinetypeId)) .leftJoin(machinetypes, eq(machinetypes.id, entries.machinetypeId))
.leftJoin(languages, eq(languages.id, entries.languageId)) .leftJoin(languages, eq(languages.id, entries.languageId))
.where(and(eq(entries.machinetypeId, mtId), sql`${entries.id} in (select entry_id from ${searchByTitles} where ${searchByTitles.entryTitle} like ${pattern})`)) .where(and(eq(entries.machinetypeId, mtId), sql`${entries.id} in (select entry_id from ${searchByTitles} where lower(${searchByTitles.entryTitle}) like ${pattern})`))
.groupBy(entries.id) .groupBy(entries.id)
.orderBy(entries.title) .orderBy(entries.title)
.limit(pageSize) .limit(pageSize)
@@ -1629,10 +1629,10 @@ export async function getEntryFacets(params: SearchParams): Promise<EntryFacets>
const union = buildEntrySearchUnion(pattern, scope); const union = buildEntrySearchUnion(pattern, scope);
whereParts.push(sql`e.id in (select entry_id from (${union}) as matches)`); whereParts.push(sql`e.id in (select entry_id from (${union}) as matches)`);
} catch { } catch {
whereParts.push(sql`e.id in (select entry_id from ${searchByTitles} where ${searchByTitles.entryTitle} like ${pattern})`); whereParts.push(sql`e.id in (select entry_id from ${searchByTitles} where lower(${searchByTitles.entryTitle}) like ${pattern})`);
} }
} else { } else {
whereParts.push(sql`e.id in (select entry_id from ${searchByTitles} where ${searchByTitles.entryTitle} like ${pattern})`); whereParts.push(sql`e.id in (select entry_id from ${searchByTitles} where lower(${searchByTitles.entryTitle}) like ${pattern})`);
} }
} }
if (params.genreId) whereParts.push(sql`${entries.genretypeId} = ${params.genreId}`); if (params.genreId) whereParts.push(sql`${entries.genretypeId} = ${params.genreId}`);
@@ -1741,7 +1741,7 @@ export async function searchReleases(params: ReleaseSearchParams): Promise<Paged
const wherePartsQB: Array<ReturnType<typeof sql>> = []; const wherePartsQB: Array<ReturnType<typeof sql>> = [];
if (q) { if (q) {
const pattern = `%${q.toLowerCase().replace(/[^a-z0-9]+/g, "")}%`; const pattern = `%${q.toLowerCase().replace(/[^a-z0-9]+/g, "")}%`;
wherePartsQB.push(sql`${releases.entryId} in (select ${searchByTitles.entryId} from ${searchByTitles} where ${searchByTitles.entryTitle} like ${pattern})`); wherePartsQB.push(sql`${releases.entryId} in (select ${searchByTitles.entryId} from ${searchByTitles} where lower(${searchByTitles.entryTitle}) like ${pattern})`);
} }
if (params.year != null) { if (params.year != null) {
wherePartsQB.push(eq(releases.releaseYear, params.year)); wherePartsQB.push(eq(releases.releaseYear, params.year));
@@ -2228,7 +2228,7 @@ export async function listMagazines(params: { q?: string; page?: number; pageSiz
const page = Math.max(1, params.page ?? 1); const page = Math.max(1, params.page ?? 1);
const offset = (page - 1) * pageSize; const offset = (page - 1) * pageSize;
const whereExpr = q ? like(magazines.name, `%${q}%`) : sql`true`; const whereExpr = q ? sql`lower(${magazines.name}) like ${`%${q.toLowerCase()}%`}` : sql`true`;
const [items, totalRows] = await Promise.all([ const [items, totalRows] = await Promise.all([
db db