From 8a114abb55413a54aa33f0fb404aec2c9469f85e Mon Sep 17 00:00:00 2001 From: undefined Date: Wed, 7 Apr 2021 19:40:57 +0800 Subject: [PATCH] core: problemStat: also calc psdoc --- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/problem.ts | 1 + packages/hydrooj/src/model/problem.ts | 7 +++++++ packages/hydrooj/src/script/problemStat.ts | 21 +++++++++++++++++++-- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 52d2708f0..dcd8e37fa 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.21.18", + "version": "2.21.19", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/handler/problem.ts b/packages/hydrooj/src/handler/problem.ts index ccfba532e..de62c4bad 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -240,6 +240,7 @@ export class ProblemSubmitHandler extends ProblemDetailHandler { const [rdoc] = await Promise.all([ record.get(domainId, rid), problem.inc(domainId, this.pdoc.docId, 'nSubmit', 1), + problem.incStatus(domainId, this.pdoc.docId, this.user._id, 'nSubmit', 1), domain.incUserInDomain(domainId, this.user._id, 'nSubmit'), ]); bus.boardcast('record/change', rdoc); diff --git a/packages/hydrooj/src/model/problem.ts b/packages/hydrooj/src/model/problem.ts index 223ea7d75..07f3d52d5 100644 --- a/packages/hydrooj/src/model/problem.ts +++ b/packages/hydrooj/src/model/problem.ts @@ -223,6 +223,13 @@ export class ProblemModel { return !!res; } + static async incStatus( + domainId: string, pid: number, uid: number, + key: NumberKeys, count: number, + ) { + return await document.incStatus(domainId, document.TYPE_PROBLEM, pid, uid, key, count); + } + static setStar(domainId: string, pid: number, uid: number, star: boolean) { return document.setStatus(domainId, document.TYPE_PROBLEM, pid, uid, { star }); } diff --git a/packages/hydrooj/src/script/problemStat.ts b/packages/hydrooj/src/script/problemStat.ts index ceaa7aacf..216d7aae3 100644 --- a/packages/hydrooj/src/script/problemStat.ts +++ b/packages/hydrooj/src/script/problemStat.ts @@ -48,9 +48,26 @@ export async function udoc() { if (bulk.length) await bulk.execute(); } +export async function psdoc() { + const pipeline = [ + { $match: { hidden: false, type: { $ne: 'run' } } }, + { + $group: { + _id: { domainId: '$domainId', pid: '$pid', uid: '$uid' }, + nSubmit: { $sum: 1 }, + }, + }, + ]; + const data = db.collection('record').aggregate(pipeline); + while (await data.hasNext()) { + const adoc = await data.next() as any; + await document.setStatus(adoc._id.domainId, document.TYPE_PROBLEM, adoc._id.pid, adoc._id.uid, { nSubmit: adoc.nSubmit }); + } +} + export async function pdoc() { const pipeline = [ - { $match: { hidden: false, type: { $ne: 'run' } }, effective: true }, + { $match: { hidden: false, type: { $ne: 'run' }, effective: true } }, { $group: { _id: { domainId: '$domainId', pid: '$pid', uid: '$uid' }, @@ -93,7 +110,7 @@ export async function pdoc() { } export async function run() { - return await Promise.all([udoc(), pdoc()]); + return await Promise.all([udoc(), pdoc(), psdoc()]); } export const validate = {};