Skip to content

Commit 305dd34

Browse files
committed
problem_stat
1 parent f9614a5 commit 305dd34

File tree

3 files changed

+45
-0
lines changed

3 files changed

+45
-0
lines changed

setup.py

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
'vj4.handler',
1414
'vj4.model',
1515
'vj4.model.adaptor',
16+
'vj4.pipeline',
1617
'vj4.service',
1718
'vj4.util',
1819
],

vj4/pipeline/__init__.py

Whitespace-only changes.

vj4/pipeline/problem_stat.py

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
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

Comments
 (0)