hngfdhfgd
This commit is contained in:
@@ -270,7 +270,49 @@ export default {
|
|||||||
const act_page = Math.min(page || 1, pages);
|
const act_page = Math.min(page || 1, pages);
|
||||||
const offset = Math.max(0, (act_page - 1) * eps);
|
const offset = Math.max(0, (act_page - 1) * eps);
|
||||||
|
|
||||||
const rows = await db`
|
// ── Deferred-join pagination ──────────────────────────────────────────────
|
||||||
|
// Step 1: Get only item IDs with all filters + OFFSET applied on the bare
|
||||||
|
// items table. No expensive JOINs here, so Postgres can use the
|
||||||
|
// (is_pinned DESC, id DESC) index efficiently even at page 192.
|
||||||
|
// The fav case still needs the favorites join in step 1 for the WHERE clause.
|
||||||
|
const pageIdRows = await db`
|
||||||
|
select items.id, items.is_pinned
|
||||||
|
from items
|
||||||
|
${fav ? db`
|
||||||
|
inner join favorites on favorites.item_id = items.id
|
||||||
|
inner join "user" fav_u on fav_u.id = favorites.user_id
|
||||||
|
` : db``}
|
||||||
|
where
|
||||||
|
${db.unsafe(modequery)}
|
||||||
|
and items.active = true
|
||||||
|
${tagFilter}
|
||||||
|
${titleFilter}
|
||||||
|
${fav ? db`and fav_u.user ilike ${user}` : db``}
|
||||||
|
${!fav && user ? db`and items.username ilike ${user}` : db``}
|
||||||
|
${mimeSQL}
|
||||||
|
${hallFilter}
|
||||||
|
${userHallFilter}
|
||||||
|
${!session && globalfilter ? db`and not exists (select 1 from tags_assign where item_id = items.id and (${db.unsafe(globalfilter)}))` : db``}
|
||||||
|
${excludedTags.length > 0 ? db`and not exists (select 1 from tags_assign where item_id = items.id and tag_id = any(${excludedTags}::int[]))` : db``}
|
||||||
|
${newerThan ? db`and items.id > ${newerThan}` : db``}
|
||||||
|
${xdFilter}
|
||||||
|
${fav ? db`group by items.id, items.is_pinned` : db``}
|
||||||
|
order by ${random ? db`random()` : db`items.is_pinned desc, items.id desc`}
|
||||||
|
offset ${newerThan ? 0 : offset}
|
||||||
|
limit ${eps}
|
||||||
|
`;
|
||||||
|
|
||||||
|
if (pageIdRows.length === 0) {
|
||||||
|
// Off the end of the dataset (e.g. stale cached total sent user to a page that no longer exists)
|
||||||
|
return { success: false, message: "404 - no uploads found" };
|
||||||
|
}
|
||||||
|
|
||||||
|
const pageIds = pageIdRows.map(r => r.id);
|
||||||
|
// Preserve the page order returned by step 1 after the join scrambles it
|
||||||
|
const pageOrder = Object.fromEntries(pageIds.map((id, i) => [id, i]));
|
||||||
|
|
||||||
|
// Step 2: Enrich only those IDs — expensive JOINs on at most `eps` rows.
|
||||||
|
const rows = (await db`
|
||||||
select
|
select
|
||||||
items.id,
|
items.id,
|
||||||
items.mime,
|
items.mime,
|
||||||
@@ -293,32 +335,12 @@ export default {
|
|||||||
from items
|
from items
|
||||||
left join "user" author_u on author_u."user" = items.username or author_u.login = items.username
|
left join "user" author_u on author_u."user" = items.username or author_u.login = items.username
|
||||||
left join user_options uo on uo.user_id = author_u.id
|
left join user_options uo on uo.user_id = author_u.id
|
||||||
left join tags_assign on tags_assign.item_id = items.id
|
|
||||||
left join tags on tags.id = tags_assign.tag_id
|
|
||||||
left join favorites on favorites.item_id = items.id
|
|
||||||
left join "user" fav_u on fav_u.id = favorites.user_id
|
|
||||||
left join tags_assign ta on ta.item_id = items.id and (ta.tag_id = 1 or ta.tag_id = 2 ${cfg.enable_nsfl ? db`or ta.tag_id = ${cfg.nsfl_tag_id || 3}` : db``})
|
left join tags_assign ta on ta.item_id = items.id and (ta.tag_id = 1 or ta.tag_id = 2 ${cfg.enable_nsfl ? db`or ta.tag_id = ${cfg.nsfl_tag_id || 3}` : db``})
|
||||||
left join tags badge_t on badge_t.id = ta.tag_id
|
|
||||||
${user_id ? db`left join user_video_views uvv on uvv.video_id = items.id and uvv.user_id = ${user_id}` : db``}
|
${user_id ? db`left join user_video_views uvv on uvv.video_id = items.id and uvv.user_id = ${user_id}` : db``}
|
||||||
where
|
where items.id = any(${pageIds})
|
||||||
${db.unsafe(modequery)}
|
|
||||||
and items.active = true
|
|
||||||
${tagFilter}
|
|
||||||
${titleFilter}
|
|
||||||
${fav ? db`and fav_u.user ilike ${user}` : db``}
|
|
||||||
${!fav && user ? db`and items.username ilike ${user}` : db``}
|
|
||||||
${mimeSQL}
|
|
||||||
${hallFilter}
|
|
||||||
${userHallFilter}
|
|
||||||
${!session && globalfilter ? db`and not exists (select 1 from tags_assign where item_id = items.id and (${db.unsafe(globalfilter)}))` : db``}
|
|
||||||
${excludedTags.length > 0 ? db`and not exists (select 1 from tags_assign where item_id = items.id and tag_id = any(${excludedTags}::int[]))` : db``}
|
|
||||||
${newerThan ? db`and items.id > ${newerThan}` : db``}
|
|
||||||
${xdFilter}
|
|
||||||
group by items.id
|
group by items.id
|
||||||
order by ${random ? db`random()` : db`items.is_pinned desc, items.id desc`}
|
`).sort((a, b) => pageOrder[a.id] - pageOrder[b.id]);
|
||||||
offset ${newerThan ? 0 : offset}
|
// ─────────────────────────────────────────────────────────────────────────
|
||||||
limit ${eps}
|
|
||||||
`;
|
|
||||||
|
|
||||||
for (const row of rows) {
|
for (const row of rows) {
|
||||||
const meta = xdScoreMeta(row.xd_score);
|
const meta = xdScoreMeta(row.xd_score);
|
||||||
|
|||||||
Reference in New Issue
Block a user