|
| 1 | +"""Recalcuates num_submit and num_accept in problem status.""" |
| 2 | +import asyncio |
| 3 | + |
| 4 | +from vj4 import constant |
| 5 | +from vj4 import db |
| 6 | +from vj4.model import document |
| 7 | + |
| 8 | + |
| 9 | +async def main(): |
| 10 | + pipeline = [ |
| 11 | + { |
| 12 | + '$match': {'hidden': False, 'type': constant.record.TYPE_SUBMISSION} |
| 13 | + }, |
| 14 | + { |
| 15 | + '$group': { |
| 16 | + '_id': {'domain_id': '$domain_id', 'pid': '$pid', 'uid': '$uid'}, |
| 17 | + 'num_submit': {'$sum': 1}, |
| 18 | + 'num_accept': { |
| 19 | + '$sum': { |
| 20 | + '$cond': [{'$eq': ['$status', constant.record.STATUS_ACCEPTED]}, 1, 0] |
| 21 | + } |
| 22 | + } |
| 23 | + } |
| 24 | + }, |
| 25 | + { |
| 26 | + '$group': { |
| 27 | + '_id': {'domain_id': '$_id.domain_id', 'pid': '$_id.pid'}, |
| 28 | + 'num_submit': {'$sum': '$num_submit'}, |
| 29 | + 'num_accept': {'$sum': {'$min': ['$num_accept', 1]}} |
| 30 | + } |
| 31 | + }, |
| 32 | + ] |
| 33 | + |
| 34 | + bulk = db.Collection('document').initialize_unordered_bulk_op() |
| 35 | + async for adoc in db.Collection('record').aggregate(pipeline): |
| 36 | + bulk.find({'domain_id': adoc['_id']['domain_id'], |
| 37 | + 'doc_type': document.TYPE_PROBLEM, |
| 38 | + 'doc_id': adoc['_id']['pid']}) \ |
| 39 | + .update_one({'$set': {'num_submit': adoc['num_submit'], |
| 40 | + 'num_accept': adoc['num_accept']}}) |
| 41 | + await bulk.execute() |
| 42 | + |
| 43 | +if __name__ == '__main__': |
| 44 | + asyncio.get_event_loop().run_until_complete(main()) |
0 commit comments