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 { alias } from "drizzle-orm/mysql-core";
import { db } from "@/server/db";
@@ -107,13 +107,13 @@ export interface EntryFacets {
function buildEntrySearchUnion(pattern: string, scope: EntrySearchScope) {
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") {
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") {
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 `);
}
@@ -271,7 +271,7 @@ export async function searchEntries(params: SearchParams): Promise<PagedResult<S
const countRows = await db
.select({ total: sql<number>`count(distinct ${searchByTitles.entryId})` })
.from(searchByTitles)
.where(like(searchByTitles.entryTitle, pattern));
.where(sql`lower(${searchByTitles.entryTitle}) like ${pattern}`);
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(machinetypes, eq(machinetypes.id, entries.machinetypeId))
.leftJoin(languages, eq(languages.id, entries.languageId))
.where(like(searchByTitles.entryTitle, pattern))
.where(sql`lower(${searchByTitles.entryTitle}) like ${pattern}`)
.groupBy(entries.id)
.orderBy(sort === "id_desc" ? desc(entries.id) : entries.title)
.limit(pageSize)
@@ -1207,7 +1207,7 @@ export async function getLabelAuthoredEntries(labelId: number, params: LabelCont
.select({ total: sql<number>`count(distinct ${entries.id})` })
.from(authors)
.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 items = await db
.select({
@@ -1226,7 +1226,7 @@ export async function getLabelAuthoredEntries(labelId: number, params: LabelCont
.leftJoin(genretypes, eq(genretypes.id, entries.genretypeId))
.leftJoin(machinetypes, eq(machinetypes.id, entries.machinetypeId))
.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)
.orderBy(entries.title)
.limit(pageSize)
@@ -1279,7 +1279,7 @@ export async function getLabelPublishedEntries(labelId: number, params: LabelCon
.select({ total: sql<number>`count(distinct ${entries.id})` })
.from(publishers)
.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 items = await db
.select({
@@ -1298,7 +1298,7 @@ export async function getLabelPublishedEntries(labelId: number, params: LabelCon
.leftJoin(genretypes, eq(genretypes.id, entries.genretypeId))
.leftJoin(machinetypes, eq(machinetypes.id, entries.machinetypeId))
.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)
.orderBy(entries.title)
.limit(pageSize)
@@ -1338,16 +1338,16 @@ export async function searchLanguages(params: SimpleSearchParams) {
return { items, page, pageSize, total };
}
const pattern = `%${q}%`;
const pattern = `%${q.toLowerCase()}%`;
const [items, countRows] = await Promise.all([
db
.select()
.from(languages)
.where(like(languages.name, pattern))
.where(sql`lower(${languages.name}) like ${pattern}`)
.orderBy(languages.name)
.limit(pageSize)
.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);
return { items, page, pageSize, total };
@@ -1368,16 +1368,16 @@ export async function searchGenres(params: SimpleSearchParams) {
return { items, page, pageSize, total };
}
const pattern = `%${q}%`;
const pattern = `%${q.toLowerCase()}%`;
const [items, countRows] = await Promise.all([
db
.select()
.from(genretypes)
.where(like(genretypes.name, pattern))
.where(sql`lower(${genretypes.name}) like ${pattern}`)
.orderBy(genretypes.name)
.limit(pageSize)
.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);
return { items, page, pageSize, total };
@@ -1398,16 +1398,16 @@ export async function searchMachinetypes(params: SimpleSearchParams) {
return { items, page, pageSize, total };
}
const pattern = `%${q}%`;
const pattern = `%${q.toLowerCase()}%`;
const [items, countRows] = await Promise.all([
db
.select()
.from(machinetypes)
.where(like(machinetypes.name, pattern))
.where(sql`lower(${machinetypes.name}) like ${pattern}`)
.orderBy(machinetypes.name)
.limit(pageSize)
.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);
return { items, page, pageSize, total };
@@ -1454,7 +1454,7 @@ export async function entriesByGenre(
const countRows = await db
.select({ total: sql<number>`count(distinct ${entries.id})` })
.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 items = await db
.select({
@@ -1472,7 +1472,7 @@ export async function entriesByGenre(
.leftJoin(genretypes, eq(genretypes.id, entries.genretypeId))
.leftJoin(machinetypes, eq(machinetypes.id, entries.machinetypeId))
.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)
.orderBy(entries.title)
.limit(pageSize)
@@ -1521,7 +1521,7 @@ export async function entriesByLanguage(
const countRows = await db
.select({ total: sql<number>`count(distinct ${entries.id})` })
.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 items = await db
.select({
@@ -1539,7 +1539,7 @@ export async function entriesByLanguage(
.leftJoin(genretypes, eq(genretypes.id, entries.genretypeId))
.leftJoin(machinetypes, eq(machinetypes.id, entries.machinetypeId))
.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)
.orderBy(entries.title)
.limit(pageSize)
@@ -1588,7 +1588,7 @@ export async function entriesByMachinetype(
const countRows = await db
.select({ total: sql<number>`count(distinct ${entries.id})` })
.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 items = await db
.select({
@@ -1606,7 +1606,7 @@ export async function entriesByMachinetype(
.leftJoin(genretypes, eq(genretypes.id, entries.genretypeId))
.leftJoin(machinetypes, eq(machinetypes.id, entries.machinetypeId))
.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)
.orderBy(entries.title)
.limit(pageSize)
@@ -1629,10 +1629,10 @@ export async function getEntryFacets(params: SearchParams): Promise<EntryFacets>
const union = buildEntrySearchUnion(pattern, scope);
whereParts.push(sql`e.id in (select entry_id from (${union}) as matches)`);
} 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 {
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}`);
@@ -1741,7 +1741,7 @@ export async function searchReleases(params: ReleaseSearchParams): Promise<Paged
const wherePartsQB: Array<ReturnType<typeof sql>> = [];
if (q) {
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) {
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 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([
db