Combine queries into batches
All checks were successful
Test, Build, Deploy / Test, Build, and Deploy (push) Successful in 45s
Test, Build, Deploy / Create Sentry Release (push) Successful in 6s

This commit is contained in:
2026-03-14 05:18:50 -04:00
parent 994a7a7a58
commit 47df3dc55f
2 changed files with 34 additions and 45 deletions

View File

@@ -35,29 +35,24 @@ export async function loader({ context }: { context: RequestContext }) {
month = 12; month = 12;
} }
const eventMemberQuery = await context.env.D1.prepare( const batchStatements: D1Result<Record<string, any>>[] =
"SELECT id, name, roblox_id FROM et_members;", await context.env.D1.batch([
).all(); context.env.D1.prepare("SELECT id, name, roblox_id FROM et_members;"),
const inactivityQuery: D1Result<Record<string, any>> = context.env.D1.prepare(
await context.env.D1.prepare(
"SELECT decisions, json_extract(user, '$.id') AS uid FROM inactivity_notices WHERE (end BETWEEN DATE('now', 'start of month', '-1 month') AND DATE('now', 'start of month', '-1 day')) OR (start BETWEEN DATE('now', 'start of month', '-1 month') AND DATE('now', 'start of month', '-1 day'));", "SELECT decisions, json_extract(user, '$.id') AS uid FROM inactivity_notices WHERE (end BETWEEN DATE('now', 'start of month', '-1 month') AND DATE('now', 'start of month', '-1 day')) OR (start BETWEEN DATE('now', 'start of month', '-1 month') AND DATE('now', 'start of month', '-1 day'));",
).all(); ),
context.env.D1.prepare(
const eventsQuery = await context.env.D1.prepare(
"SELECT approved, answered_at, created_by, performed_at, reached_minimum_player_count, type FROM events WHERE month = ? AND year = ?;", "SELECT approved, answered_at, created_by, performed_at, reached_minimum_player_count, type FROM events WHERE month = ? AND year = ?;",
) ).bind(month, year),
.bind(month, year) ]);
.all();
const memberMap = Object.fromEntries( const memberMap = Object.fromEntries(
eventMemberQuery.results.map((entry) => { batchStatements[0].results.map((e) => {
return [ return [e.id, { name: e.name, points: 0, roblox_id: e.roblox_id }];
entry.id,
{ name: entry.name, points: 0, roblox_id: entry.roblox_id },
];
}), }),
); );
for (const event of eventsQuery.results as { for (const event of batchStatements[2].results as {
approved: number; approved: number;
answered_at: number; answered_at: number;
created_by: string; created_by: string;
@@ -77,10 +72,10 @@ export async function loader({ context }: { context: RequestContext }) {
for (const member of Object.keys(memberMap)) for (const member of Object.keys(memberMap))
if ( if (
(memberMap[member].points < 50 || (memberMap[member].points < 50 ||
eventsQuery.results.filter( batchStatements[2].results.filter(
(e) => e.type === "gamenight" && e.created_by === member, (e) => e.type === "gamenight" && e.created_by === member,
).length === 0) && ).length === 0) &&
!inactivityQuery.results.find( !batchStatements[1].results.find(
(i) => i.uid === member && JSON.parse(i.decisions).et, (i) => i.uid === member && JSON.parse(i.decisions).et,
) )
) )

View File

@@ -33,37 +33,31 @@ export async function loader({ context }: { context: RequestContext }) {
if (!currentUser) throw new Response(null, { status: 401 }); if (!currentUser) throw new Response(null, { status: 401 });
const d1Promises = []; const batchStatements = [];
for (const itemType of ["appeals", "inactivity_notices", "reports"]) for (const itemType of ["appeals", "inactivity_notices", "reports"]) {
d1Promises.push( batchStatements.push(
context.env.D1.prepare( context.env.D1.prepare(
`SELECT * `SELECT * FROM ${itemType} WHERE json_extract(user, '$.id') = ? ORDER BY created_at DESC;`,
FROM ${itemType} ).bind(currentUser.id),
WHERE json_extract(user, '$.id') = ?
ORDER BY created_at DESC;`,
)
.bind(currentUser.id)
.all(),
); );
const settledPromises = await Promise.allSettled(d1Promises);
let etData: { [k: string]: any } | null = null;
if (currentUser.permissions & (1 << 3)) {
etData = await context.env.D1.prepare(
"SELECT name, points, roblox_id FROM et_members WHERE id = ?;",
)
.bind(currentUser.id)
.first();
} }
return { if (currentUser.permissions & (1 << 3))
etData, batchStatements.push(
items: settledPromises.map((p) => { context.env.D1.prepare(
if (p.status === "fulfilled") return p.value.results; "SELECT name, points, roblox_id FROM et_members WHERE id = ? LIMIT 1;",
).bind(currentUser.id),
);
return null; const batchResults = await context.env.D1.batch(batchStatements);
return {
etData: batchResults.at(3)?.results?.at(0) as { [k: string]: any } | null,
items: batchResults.map((r) => {
if (r.success) return r.results;
return [];
}) as any as ({ [k: string]: any }[] | null)[], }) as any as ({ [k: string]: any }[] | null)[],
permissions: currentUser.permissions as number, permissions: currentUser.permissions as number,
}; };