async def get_list(domain_id: str, uid: int = None, fields=None, skip: int = 0, limit: int = 0): # TODO(iceboy): projection. pdocs = await (document.get_multi(domain_id, document.TYPE_PROBLEM, fields=fields).sort([ ('doc_id', 1) ]).skip(skip).limit(limit).to_list(None)) piter = iter(pdocs) if uid is not None: doc_ids = [pdoc['doc_id'] for pdoc in pdocs] # TODO(iceboy): projection. psdocs = (document.get_multi_status(domain_id, document.TYPE_PROBLEM, uid=uid, doc_id={ '$in': doc_ids }).sort([('doc_id', 1)])) async for psdoc in psdocs: pdoc = next(piter) while pdoc['doc_id'] != psdoc['doc_id']: pdoc['psdoc'] = {} pdoc = next(piter) pdoc['psdoc'] = psdoc for rest in piter: rest['psdoc'] = {} return pdocs
def get_multi_reply(domain_id: str, did: document.convert_doc_id, *, fields=None): return document.get_multi(domain_id=domain_id, doc_type=document.TYPE_DISCUSSION_REPLY, parent_doc_type=document.TYPE_DISCUSSION, parent_doc_id=did, fields=fields) \ .sort([('doc_id', -1)])
def get_multi(domain_id: str, fields=None, **kwargs): # TODO(twd2): projection. return document.get_multi(domain_id=domain_id, doc_type=document.TYPE_CONTEST, fields=fields, **kwargs) \ .sort([('doc_id', -1)])
async def get_list(domain_id: str, fields=None): # TODO(iceboy): projection, pagination. tdocs = await (document.get_multi(domain_id, document.TYPE_CONTEST, fields=fields).sort([('doc_id', -1) ]).to_list(None)) return tdocs
async def update_status_by_tid(domain_id: str, uid: int, tid: objectid.ObjectId): tdocs = document.get_multi(domain_id, document.TYPE_TRAINING, require_tids=tid, fields=['doc_id', 'pids', 'require_tids']) futs = [] async for tdoc in tdocs: futs.append(_update_status(domain_id, tdoc, uid, 'done_tids', tid)) await asyncio.gather(*futs)
async def get_list_solution(domain_id: str, pid: document.convert_doc_id, fields=None): # TODO(iceboy): projection, pagination. return await (document.get_multi(domain_id, document.TYPE_PROBLEM_SOLUTION, parent_doc_type=document.TYPE_PROBLEM, parent_doc_id=pid, fields=fields) .sort([('vote', -1), ('doc_id', -1)]) .to_list(None))
def get_multi(domain_id: str, *, fields=None, **kwargs): return document.get_multi(domain_id=domain_id, doc_type=document.TYPE_DISCUSSION, fields=fields, **kwargs) \ .sort([('update_at', -1), ('doc_id', -1)])
def get_multi_solution(domain_id: str, pid: document.convert_doc_id, fields=None): return document.get_multi(domain_id=domain_id, doc_type=document.TYPE_PROBLEM_SOLUTION, parent_doc_type=document.TYPE_PROBLEM, parent_doc_id=pid, fields=fields) \ .sort([('vote', -1), ('doc_id', -1)])
async def get_random_id(domain_id: str, **kwargs): pdocs = document.get_multi(domain_id=domain_id, doc_type=document.TYPE_PROBLEM, **kwargs) pcount = await pdocs.count() if pcount: async for pdoc in pdocs.skip(random.randrange(pcount)).limit(1): return pdoc['doc_id']
def get_multi(domain_id: str, doc_type: int, fields=None, **kwargs): # TODO(twd2): projection. if doc_type not in [document.TYPE_CONTEST, document.TYPE_HOMEWORK]: raise error.InvalidArgumentError('doc_type') return document.get_multi(domain_id=domain_id, doc_type=doc_type, fields=fields, **kwargs) \ .sort([('doc_id', -1)])
def get_multi(domain_id: str, *, fields=None, **kwargs): return document.get_multi(domain_id=domain_id, doc_type=document.TYPE_DISCUSSION, fields=fields, **kwargs) \ .sort([("highlight",-1), ('update_at', -1), ('generation_time', -1), ('num_replies', -1)])
async def get_list_solution(domain_id: str, pid: document.convert_doc_id, fields=None, skip: int=0, limit: int=0): return await (document.get_multi(domain_id, document.TYPE_PROBLEM_SOLUTION, parent_doc_type=document.TYPE_PROBLEM, parent_doc_id=pid, fields=fields) .sort([('vote', -1), ('doc_id', -1)]) .skip(skip) .limit(limit) .to_list(None))
async def get_list(domain_id: str, *, fields=None, skip: int=0, limit: int=0): # TODO(twd2): projection. ddocs = await (document.get_multi(domain_id, document.TYPE_DISCUSSION, fields=fields) .sort([('doc_id', -1)]) .skip(skip) .limit(limit) .to_list(None)) await asyncio.gather(user.attach_udocs(ddocs, 'owner_uid'), attach_vnodes(ddocs, domain_id, 'parent_doc_id')) return ddocs
async def get_vnode_and_list_and_count_for_node(domain_id: str, node_or_pid: document.convert_doc_id, *, fields=None, skip: int = 0, limit: int = 0): vnode = await get_vnode(domain_id, node_or_pid) count_future = asyncio.ensure_future( document.get_multi(domain_id, document.TYPE_DISCUSSION, parent_doc_type=vnode['doc_type'], parent_doc_id=vnode['doc_id']).count()) # TODO(twd2): projection. ddocs = await (document.get_multi(domain_id, document.TYPE_DISCUSSION, parent_doc_type=vnode['doc_type'], parent_doc_id=vnode['doc_id'], fields=fields) .sort([('doc_id', -1)]) .skip(skip) .limit(limit) .to_list(None)) await asyncio.gather(user.attach_udocs(ddocs, 'owner_uid'), attach_vnodes(ddocs, domain_id, 'parent_doc_id')) return vnode, ddocs, await count_future
async def get_list_reply(domain_id: str, did: document.convert_doc_id, *, fields=None): drdocs = await (document.get_multi(domain_id, document.TYPE_DISCUSSION_REPLY, parent_doc_type=document.TYPE_DISCUSSION, parent_doc_id=did, fields=fields) .sort([('doc_id', -1)]) .to_list(None)) drdocs_with_reply = list(drdocs) for drdoc in drdocs: if 'reply' in drdoc: drdocs_with_reply.extend(drdoc['reply']) await user.attach_udocs(drdocs_with_reply, 'owner_uid') return drdocs
async def get_dict_multi_domain(pdom_and_ids, *, fields=None): query = {'$or': []} key_func = lambda e: e[0] for domain_id, ptuples in itertools.groupby(sorted(set(pdom_and_ids), key=key_func), key=key_func): query['$or'].append({'domain_id': domain_id, 'doc_type': document.TYPE_PROBLEM, 'doc_id': {'$in': [e[1] for e in ptuples]}}) result = dict() if not query['$or']: return result async for pdoc in document.get_multi(**query, fields=fields): result[(pdoc['domain_id'], pdoc['doc_id'])] = pdoc return result
async def get_list_by_user(domain_id: str, uid: int, *, fields=None): tsdocs = document.get_multi_status(domain_id, document.TYPE_TRAINING, uid=uid, done=True, fields=['doc_id']) done_tids = [] async for tsdoc in tsdocs: done_tids.append(tsdoc['doc_id']) # TODO(iceboy): pagination, projection. tdocs = await (document.get_multi(domain_id, document.TYPE_TRAINING, require_tids={'$not': {'$elemMatch': {'$nin': done_tids}}}, fields=fields) .sort([('doc_id', 1)]) .to_list(None)) return tdocs
async def get_list(domain_id: str, *, fields=None, skip: int = 0, limit: int = 0): # TODO(twd2): projection. ddocs = await (document.get_multi(domain_id, document.TYPE_DISCUSSION, fields=fields).sort([ ('doc_id', -1) ]).skip(skip).limit(limit).to_list(None)) await asyncio.gather(user.attach_udocs(ddocs, 'owner_uid'), attach_vnodes(ddocs, domain_id, 'parent_doc_id')) return ddocs
async def get_vnode_and_list_and_count_for_node( domain_id: str, node_or_pid: document.convert_doc_id, *, fields=None, skip: int = 0, limit: int = 0): vnode = await get_vnode(domain_id, node_or_pid) count_future = asyncio.ensure_future( document.get_multi(domain_id, document.TYPE_DISCUSSION, parent_doc_type=vnode['doc_type'], parent_doc_id=vnode['doc_id']).count()) # TODO(twd2): projection. ddocs = await (document.get_multi(domain_id, document.TYPE_DISCUSSION, parent_doc_type=vnode['doc_type'], parent_doc_id=vnode['doc_id'], fields=fields).sort([ ('doc_id', -1) ]).skip(skip).limit(limit).to_list(None)) await asyncio.gather(user.attach_udocs(ddocs, 'owner_uid'), attach_vnodes(ddocs, domain_id, 'parent_doc_id')) return vnode, ddocs, await count_future
async def test_add_get(self): doc_id = await document.add(DOMAIN_ID, CONTENT, OWNER_UID, DOC_TYPE) doc = await document.get(DOMAIN_ID, DOC_TYPE, doc_id) self.assertEqual(doc['_id'], doc_id) self.assertEqual(doc['content'], CONTENT) self.assertEqual(doc['owner_uid'], OWNER_UID) self.assertEqual(doc['domain_id'], DOMAIN_ID) self.assertEqual(doc['doc_type'], DOC_TYPE) self.assertEqual(doc['doc_id'], doc_id) docs = document.get_multi(domain_id=DOMAIN_ID, doc_type=DOC_TYPE, fields=['doc_id', 'title']) doc = await docs.__anext__() self.assertEqual(doc['doc_id'], doc_id) self.assertFalse('content' in doc) with self.assertRaises(StopAsyncIteration): await docs.__anext__()
async def get_list_reply(domain_id: str, did: document.convert_doc_id, *, fields=None): drdocs = await (document.get_multi( domain_id, document.TYPE_DISCUSSION_REPLY, parent_doc_type=document.TYPE_DISCUSSION, parent_doc_id=did, fields=fields).sort([('doc_id', -1)]).to_list(None)) drdocs_with_reply = list(drdocs) for drdoc in drdocs: if 'reply' in drdoc: drdocs_with_reply.extend(drdoc['reply']) await user.attach_udocs(drdocs_with_reply, 'owner_uid') return drdocs
async def get_list(domain_id: str, uid: int=None, fields=None, skip: int=0, limit: int=0): # TODO(iceboy): projection. pdocs = await (document.get_multi(domain_id, document.TYPE_PROBLEM, fields=fields) .sort([('doc_id', 1)]) .skip(skip) .limit(limit) .to_list(None)) piter = iter(pdocs) if uid is not None: doc_ids = [pdoc['doc_id'] for pdoc in pdocs] # TODO(iceboy): projection. psdocs = document.get_multi_status(domain_id, document.TYPE_PROBLEM, uid=uid, doc_id={'$in': doc_ids}) async for psdoc in psdocs: pdoc = next(piter) while pdoc['doc_id'] < psdoc['doc_id']: pdoc['psdoc'] = {} pdoc = next(piter) pdoc['psdoc'] = psdoc for rest in piter: rest['psdoc'] = {} return pdocs
def get_multi(fields=None, **kwargs): return document.get_multi(domain_id=STORE_DOMAIN_ID, doc_type=document.TYPE_USERFILE, fields=fields, **kwargs)
def get_multi(*, fields=None, **kwargs): return document.get_multi(doc_type=document.TYPE_PROBLEM, fields=fields, **kwargs)
def get_multi(domain_id: str, *, fields=None, **kwargs): return document.get_multi(domain_id=domain_id, doc_type=document.TYPE_TRAINING, fields=fields, **kwargs)
async def get_list(domain_id: str, fields=None): # TODO(iceboy): projection, pagination. tdocs = await (document.get_multi(domain_id, document.TYPE_CONTEST, fields=fields) .sort([('doc_id', -1)]) .to_list(None)) return tdocs
def get_multi_solution_by_uid(domain_id: str, uid: int, fields=None): return document.get_multi(domain_id=domain_id, doc_type=document.TYPE_PROBLEM_SOLUTION, owner_uid=uid, fields=fields)