From ed02b1772d73b59c6102f284ecf24c94ffc83e91 Mon Sep 17 00:00:00 2001 From: j Date: Thu, 11 Feb 2016 23:53:32 +0530 Subject: [PATCH] faster list query --- oml/item/models.py | 3 ++- oml/queryparser.py | 25 ++++++++++++++++++------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/oml/item/models.py b/oml/item/models.py index f1d0933..27226c7 100644 --- a/oml/item/models.py +++ b/oml/item/models.py @@ -95,7 +95,8 @@ class Item(db.Model): @classmethod def find(cls, data): - return Parser(cls, user_items, Find, Sort).find(data) + from user.models import list_items + return Parser(cls, user_items, list_items, Find, Sort).find(data) @classmethod def remove_many(cls, ids): diff --git a/oml/queryparser.py b/oml/queryparser.py index 7761495..dd50678 100644 --- a/oml/queryparser.py +++ b/oml/queryparser.py @@ -38,12 +38,13 @@ def get_operator(op, type='str'): class Parser(object): - def __init__(self, model, user_items, find, sort): + def __init__(self, model, user_items, list_items, find, sort): self._model = model self._find = find self._sort = sort self._user = model.users.mapper.class_ self._user_items = user_items + self._list_items = list_items self._list = model.lists.mapper.class_ self.item_keys = model.item_keys self.filter_keys = model.filter_keys @@ -129,15 +130,25 @@ class Parser(object): u = self._user.query.filter_by(nickname=nickname).one() else: u = self._user.query.filter_by(id=settings.USER_ID).one() - if nickname: + if not name: + ids = self._user_items.select().where( + self._user_items.columns['user_id'].is_(u.id) + ).with_only_columns( + ['item_id'] + ) + elif nickname: peer = utils.get_peer(u.id) - if name: - ids = peer.info['lists'].get(name, []) - else: - ids = list(peer.library.keys()) + ids = peer.info['lists'].get(name, []) else: l = self._list.query.filter_by(user_id=u.id, name=name).one() - ids = l.get_items().options(load_only('id')) + if l.type == 'static': + ids = self._list_items.select().where( + self._list_items.columns['list_id'].is_(l.id) + ).with_only_columns( + ['item_id'] + ) + else: + ids = l.get_items().options(load_only('id')) in_op = operators.notin_op if exclude else operators.in_op q = in_op(self._model.id, ids) return q