| 79 | } |
| 80 | |
| 81 | export async function pdoc(report) { |
| 82 | report({ message: 'Pdoc' }); |
| 83 | const pipeline = [ |
| 84 | { |
| 85 | $match: { |
| 86 | contest: { $nin: [RecordModel.RECORD_PRETEST, RecordModel.RECORD_GENERATE] }, |
| 87 | status: { $ne: STATUS.STATUS_CANCELED }, |
| 88 | }, |
| 89 | }, |
| 90 | { |
| 91 | $group: { |
| 92 | _id: { domainId: '$domainId', pid: '$pid', uid: '$uid' }, |
| 93 | nSubmit: { $sum: 1 }, |
| 94 | nAccept: sumStatus(STATUS.STATUS_ACCEPTED), |
| 95 | WA: sumStatus(STATUS.STATUS_WRONG_ANSWER), |
| 96 | TLE: sumStatus(STATUS.STATUS_TIME_LIMIT_EXCEEDED), |
| 97 | MLE: sumStatus(STATUS.STATUS_MEMORY_LIMIT_EXCEEDED), |
| 98 | RE: sumStatus(STATUS.STATUS_RUNTIME_ERROR), |
| 99 | SE: sumStatus(STATUS.STATUS_SYSTEM_ERROR), |
| 100 | IGN: sumStatus(STATUS.STATUS_CANCELED), |
| 101 | CE: sumStatus(STATUS.STATUS_COMPILE_ERROR), |
| 102 | }, |
| 103 | }, |
| 104 | { |
| 105 | $group: { |
| 106 | _id: { domainId: '$_id.domainId', pid: '$_id.pid' }, |
| 107 | nSubmit: { $sum: '$nSubmit' }, |
| 108 | nAccept: { $sum: { $min: ['$nAccept', 1] } }, |
| 109 | AC: { $sum: '$nAccept' }, |
| 110 | WA: { $sum: '$WA' }, |
| 111 | TLE: { $sum: '$TLE' }, |
| 112 | MLE: { $sum: '$MLE' }, |
| 113 | RE: { $sum: '$RE' }, |
| 114 | SE: { $sum: '$SE' }, |
| 115 | IGN: { $sum: '$IGN' }, |
| 116 | CE: { $sum: '$CE' }, |
| 117 | }, |
| 118 | }, |
| 119 | ]; |
| 120 | for (let i = 0; i <= 100; i++) { |
| 121 | pipeline[1].$group[`s${i}`] = { |
| 122 | $sum: { |
| 123 | $cond: [{ |
| 124 | $and: [ |
| 125 | { $gte: ['$score', i] }, |
| 126 | { $lt: ['$score', i + 1] }, |
| 127 | ], |
| 128 | }, 1, 0], |
| 129 | }, |
| 130 | }; |
| 131 | pipeline[2].$group[`s${i}`] = { $sum: `$s${i}` }; |
| 132 | } |
| 133 | let bulk = db.collection('document').initializeUnorderedBulkOp(); |
| 134 | const data = db.collection('record').aggregate<any>(pipeline, { allowDiskUse: true }); |
| 135 | let cnt = 0; |
| 136 | for await (const adoc of data) { |
| 137 | const $set = { |
| 138 | nSubmit: adoc.nSubmit, |