faster filters
This commit is contained in:
parent
27908619ef
commit
2b3edd40dc
5 changed files with 68 additions and 19 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue