From 9e94ede71fbf2f5eaea1413ab86b025890ccca1b Mon Sep 17 00:00:00 2001 From: undefined Date: Thu, 6 May 2021 12:10:22 +0800 Subject: [PATCH] core: sync rdoc.score to psdoc.score --- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/judge.ts | 2 +- packages/hydrooj/src/model/problem.ts | 4 ++-- packages/hydrooj/src/pipelineUtils.ts | 12 ++++++++++++ packages/hydrooj/src/upgrade.ts | 12 +++++++++++- 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 50ee7f8c1..02a712673 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.24.12", + "version": "2.24.13", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/handler/judge.ts b/packages/hydrooj/src/handler/judge.ts index a7b52f297..7f15106a4 100644 --- a/packages/hydrooj/src/handler/judge.ts +++ b/packages/hydrooj/src/handler/judge.ts @@ -21,7 +21,7 @@ const logger = new Logger('judge'); async function _postJudge(rdoc: Rdoc) { if (typeof rdoc.input === 'string') return; const accept = rdoc.status === builtin.STATUS.STATUS_ACCEPTED; - const updated = await problem.updateStatus(rdoc.domainId, rdoc.pid, rdoc.uid, rdoc._id, rdoc.status); + const updated = await problem.updateStatus(rdoc.domainId, rdoc.pid, rdoc.uid, rdoc._id, rdoc.status, rdoc.score); if (rdoc.contest) { await contest.updateStatus( rdoc.domainId, rdoc.contest.tid, rdoc.uid, diff --git a/packages/hydrooj/src/model/problem.ts b/packages/hydrooj/src/model/problem.ts index 14c3e20a1..6eef718fb 100644 --- a/packages/hydrooj/src/model/problem.ts +++ b/packages/hydrooj/src/model/problem.ts @@ -228,11 +228,11 @@ export class ProblemModel { static async updateStatus( domainId: string, pid: number, uid: number, - rid: ObjectID, status: number, + rid: ObjectID, status: number, score: number, ) { const res = await document.setIfNotStatus( domainId, document.TYPE_PROBLEM, pid, uid, - 'status', status, STATUS.STATUS_ACCEPTED, { rid }, + 'status', status, STATUS.STATUS_ACCEPTED, { rid, score }, ); return !!res; } diff --git a/packages/hydrooj/src/pipelineUtils.ts b/packages/hydrooj/src/pipelineUtils.ts index ab73029c6..2159b2c5c 100644 --- a/packages/hydrooj/src/pipelineUtils.ts +++ b/packages/hydrooj/src/pipelineUtils.ts @@ -1,6 +1,8 @@ /* eslint-disable no-await-in-loop */ +import { FilterQuery } from 'mongodb'; import type { DomainDoc, Udoc } from './interface'; import domain from './model/domain'; +import * as document from './model/document'; import user from './model/user'; import problem, { Field, Pdoc } from './model/problem'; @@ -14,6 +16,16 @@ export async function iterateAllUser(cb: (udoc: Udoc, current?: number, total?: for (const i in udocs) await cb(udocs[i], +i, udocs.length); } +export async function iterateAllPsdoc(filter: FilterQuery, cb: (psdoc: any) => Promise) { + await iterateAllDomain(async ({ _id: domainId }) => { + const cursor = document.getMultiStatus(domainId, document.TYPE_PROBLEM, filter); + while (await cursor.hasNext()) { + const psdoc = await cursor.next(); + await cb(psdoc); + } + }); +} + interface PartialPdoc extends Pdoc { [key: string]: any, } diff --git a/packages/hydrooj/src/upgrade.ts b/packages/hydrooj/src/upgrade.ts index 5af15f988..610842f39 100644 --- a/packages/hydrooj/src/upgrade.ts +++ b/packages/hydrooj/src/upgrade.ts @@ -10,7 +10,9 @@ import { Progress } from './ui'; import { Rdoc } from './interface'; import { Logger } from './logger'; import { streamToBuffer } from './utils'; -import { iterateAllDomain, iterateAllProblem, iterateAllUser } from './pipelineUtils'; +import { + iterateAllDomain, iterateAllProblem, iterateAllPsdoc, iterateAllUser, +} from './pipelineUtils'; import gridfs from './service/gridfs'; import storage from './service/storage'; import db from './service/db'; @@ -21,6 +23,7 @@ import domain from './model/domain'; import * as document from './model/document'; import * as system from './model/system'; import { STATUS } from './model/builtin'; +import RecordModel from './model/record'; const logger = new Logger('upgrade'); type UpgradeScript = void | (() => Promise); @@ -317,6 +320,13 @@ const scripts: UpgradeScript[] = [ }); return true; }, + async function _25_26() { + await iterateAllPsdoc({ rid: { $exists: true } }, async (psdoc) => { + const rdoc = await RecordModel.get(psdoc.domainId, psdoc.rid); + await document.setStatus(psdoc.domainId, document.TYPE_PROBLEM, rdoc.pid, rdoc.uid, { score: rdoc.score }); + }); + return true; + }, ]; export default scripts;