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

@ -171,12 +171,8 @@ class Item(db.Model):
value = list(map(get_sort_name, value))
value = ox.sort_string('\n'.join(value)).lower()
elif sort_type == 'title':
if isinstance(value, dict):
value = list(value.values())
if isinstance(value, list):
value = ''.join(value)
value = ox.get_sort_title(value)
value = utils.sort_title(value).lower()
value = self.get_sorttitle().lower()
value = utils.sort_title(value)
elif sort_type == 'boolean':
pass
else:
@ -204,6 +200,16 @@ class Item(db.Model):
if f.value != v:
f.findvalue = unicodedata.normalize('NFKD', v).lower()
f.value = v
if k in self.filter_keys:
sort_type = utils.get_by_id(settings.config['itemKeys'], k).get('sortType')
if sort_type == 'person':
f.sortvalue = get_sort_name(f.value)
else:
f.sortvalue = f.value
if f.sortvalue:
f.sortvalue = unicodedata.normalize('NFKD', f.sortvalue).lower()
else:
f.sortvalue = None
state.db.session.add(f)
keys = []
@ -285,7 +291,8 @@ class Item(db.Model):
'series',
'sharemetadata',
'tableofcontents',
'title'
'title',
'sorttitle'
)
def update_metadata(self, data, modified=None):
@ -320,6 +327,13 @@ class Item(db.Model):
def get_hash(self):
return utils.get_meta_hash(self.meta.copy())
def get_sorttitle(self):
title = self.meta.get('sorttitle')
if title is None:
title = self.meta.get('title', 'Untitled')
title = ox.get_sort_title(title)
return title
def sync_metadata(self):
from user.models import Metadata
if self.meta.get('sharemetadata'):
@ -583,6 +597,7 @@ class Find(db.Model):
key = sa.Column(sa.String(200), index=True)
value = sa.Column(sa.Text())
findvalue = sa.Column(sa.Text(), index=True)
sortvalue = sa.Column(sa.Text())
def __repr__(self):
return '%s=%s' % (self.key, self.findvalue)
@ -782,6 +797,11 @@ def update_sort_table():
sql = []
for col in set(Item.sort_keys)-set(sort_indexes):
sql.append('CREATE INDEX ix_sort_{col} ON sort ({col})'.format(col=col))
if not 'sortvalue' in db.get_table_columns('find'):
create_table = str(CreateTable(Find.__table__).compile(db.engine)).split('\n')
col = 'sortvalue'
add = [r for r in create_table if '\t%s ' % col in r][0].strip()[:-1]
sql.append('ALTER TABLE find ADD '+add)
if sql:
with db.session() as s:
for q in sql: