faster filters

This commit is contained in:
j 2016-01-25 23:02:04 +05:30
commit 2b3edd40dc
5 changed files with 68 additions and 19 deletions

View file

@ -44,43 +44,42 @@ def find(data):
if 'group' in q:
names = {}
groups = {}
sortvalues = {}
_keydata = data.copy()
for key in ('range', 'position'):
for key in ('range', 'position', 'positions'):
if key in _keydata:
del _keydata[key]
key = 'group:' + hashlib.sha1(json.dumps(_keydata).encode('utf-8')).hexdigest()
key = 'group:' + hashlib.sha1(json.dumps(_keydata, sort_keys=True).encode('utf-8')).hexdigest()
g = state.cache.get(key)
if g is None:
items = q['qs'].options(load_only('id'))
qs = models.Find.query.filter_by(key=q['group'])
if items.first():
qs = qs.filter(models.Find.item_id.in_(items))
for f in qs.values('value', 'findvalue'):
for f in qs.values('value', 'findvalue', 'sortvalue'):
value = f[0]
findvalue = f[1]
sortvalue = f[2]
if findvalue not in groups:
groups[findvalue] = 0
groups[findvalue] += 1
names[findvalue] = value
sortvalues[value] = sortvalue
g = [{'name': names[k], 'items': groups[k]} for k in groups]
else:
g = []
if 'sort' in q:
sort_type = utils.get_by_id(settings.config['itemKeys'], q['group']).get('sortType')
reverse = q['sort'][0]['operator'] == '-'
def _sort_key(k):
if sort_type == 'person':
name = get_sort_name(k['name'])
else:
name = k['name']
if isinstance(name, str):
name = unicodedata.normalize('NFKD', name).lower()
name = sortvalues[k['name']]
if not name:
name = '\uffff' if not reverse else ''
items = k['items']
if q['sort'][0]['key'] == 'name':
v = (name, items)
else:
v = (-items, name)
return v
reverse = q['sort'][0]['operator'] == '-'
if q['sort'][0]['key'] == 'items':
reverse = not reverse
g.sort(key=_sort_key, reverse=reverse)