diff --git a/src/server/repo/zxdb.ts b/src/server/repo/zxdb.ts index add4e48..2c4924a 100644 --- a/src/server/repo/zxdb.ts +++ b/src/server/repo/zxdb.ts @@ -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> = [ - 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`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`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`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`count(*)` }).from(languages).where(like(languages.name, pattern)), + db.select({ total: sql`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`count(*)` }).from(genretypes).where(like(genretypes.name, pattern)), + db.select({ total: sql`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`count(*)` }).from(machinetypes).where(like(machinetypes.name, pattern)), + db.select({ total: sql`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`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`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`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 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> = []; 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