From 427dc7e11893745da0e0ad3cf9525d8646231e19 Mon Sep 17 00:00:00 2001 From: Menci Date: Sun, 28 Apr 2019 20:19:08 +0800 Subject: [PATCH] Add option to use the old flexible pagination for submissions page --- config-example.json | 3 ++- models/common.ts | 10 ++++---- modules/submission.js | 26 ++++++++++++++++----- utility.js | 2 +- views/{page_largedata.ejs => page_fast.ejs} | 0 views/submissions.ejs | 6 ++++- 6 files changed, 33 insertions(+), 14 deletions(-) rename views/{page_largedata.ejs => page_fast.ejs} (100%) diff --git a/config-example.json b/config-example.json index 3e92f90..10043a3 100644 --- a/config-example.json +++ b/config-example.json @@ -123,5 +123,6 @@ "type": "like-google-fonts", "url": "https://fonts.loli.net" }, - "no_cdn": false + "no_cdn": false, + "submissions_page_fast_pagination": false } diff --git a/models/common.ts b/models/common.ts index 610e2f2..9eaa15c 100644 --- a/models/common.ts +++ b/models/common.ts @@ -136,11 +136,11 @@ export default class Model extends TypeORM.BaseEntity { return queryBuilder.getMany(); } - static async queryPageWithLargeData(this: TypeORM.ObjectType, - queryBuilder: TypeORM.SelectQueryBuilder, - { currPageTop, currPageBottom, perPage }, - idOrder: PaginationIDOrder, - pageType: PaginationType) { + static async queryPageFast(this: TypeORM.ObjectType, + queryBuilder: TypeORM.SelectQueryBuilder, + { currPageTop, currPageBottom, perPage }, + idOrder: PaginationIDOrder, + pageType: PaginationType) { const queryBuilderBak = queryBuilder.clone(); const result = { diff --git a/modules/submission.js b/modules/submission.js index 954cb58..15f061b 100644 --- a/modules/submission.js +++ b/modules/submission.js @@ -103,11 +103,24 @@ app.get('/submissions', async (req, res) => { isFiltered = true; } - const queryResult = await JudgeState.queryPageWithLargeData(query, syzoj.utils.paginateLargeData( - req.query.currPageTop, req.query.currPageBottom, syzoj.config.page.judge_state - ), -1, parseInt(req.query.page)); + let judge_state, paginate; + + if (syzoj.config.submissions_page_fast_pagination) { + const queryResult = await JudgeState.queryPageFast(query, syzoj.utils.paginateFast( + req.query.currPageTop, req.query.currPageBottom, syzoj.config.page.judge_state + ), -1, parseInt(req.query.page)); + + judge_state = queryResult.data; + paginate = queryResult.meta; + } else { + paginate = syzoj.utils.paginate( + await JudgeState.countQuery(query), + req.query.page, + syzoj.config.page.judge_state + ); + judge_state = await JudgeState.queryPage(paginate, query, { id: "DESC" }, true); + } - const judge_state = queryResult.data; await judge_state.forEachAsync(async obj => { await obj.loadRelationships(); if (obj.problem.type !== 'submit-answer') obj.code_length = Buffer.from(obj.code).length; @@ -124,11 +137,12 @@ app.get('/submissions', async (req, res) => { result: getRoughResult(x, displayConfig, true), running: false, })), - paginate: queryResult.meta, + paginate: paginate, pushType: 'rough', form: req.query, displayConfig: displayConfig, - isFiltered: isFiltered + isFiltered: isFiltered, + fast_pagination: syzoj.config.submissions_page_fast_pagination }); } catch (e) { syzoj.log(e); diff --git a/utility.js b/utility.js index 68b04ad..5063cd8 100644 --- a/utility.js +++ b/utility.js @@ -245,7 +245,7 @@ module.exports = { } }; }, - paginateLargeData(currPageTop, currPageBottom, perPage) { + paginateFast(currPageTop, currPageBottom, perPage) { function parseIntOrNull(x) { if (typeof x === 'string') x = parseInt(x); if (typeof x !== 'number' || isNaN(x)) return null; diff --git a/views/page_largedata.ejs b/views/page_fast.ejs similarity index 100% rename from views/page_largedata.ejs rename to views/page_fast.ejs diff --git a/views/submissions.ejs b/views/submissions.ejs index 44ffa24..0de9650 100644 --- a/views/submissions.ejs +++ b/views/submissions.ejs @@ -116,7 +116,11 @@ <% } else { %>
- <% include page_largedata %> + <% if (fast_pagination) { %> + <% include page_fast %> + <% } else { %> + <% include page %> + <% } %> <% } %>