server/search: simplify virtual token mappings

This commit is contained in:
rr- 2016-04-17 18:05:45 +02:00
parent 7334f70829
commit c957befbd0
3 changed files with 33 additions and 60 deletions

View file

@ -58,13 +58,9 @@ class Post(Base):
secondaryjoin=post_id == PostRelation.child_id)
tag_count = column_property(
select(
[func.count('1')],
PostTag.post_id == post_id
) \
.correlate('Post') \
.label('tag_count')
)
select([func.count('1')])
.where(PostTag.post_id == post_id) \
.correlate('Post'))
# TODO: wire these
fav_count = Column('auto_fav_count', Integer, nullable=False, default=0)

View file

@ -55,10 +55,25 @@ class Tag(Base):
secondaryjoin=tag_id == TagImplication.child_id)
post_count = column_property(
select(
[func.count('Post.post_id')],
PostTag.tag_id == tag_id
) \
.correlate('Tag') \
.label('post_count')
)
select([func.count('Post.post_id')]) \
.where(PostTag.tag_id == tag_id) \
.correlate('Tag'))
first_name = column_property(
select([TagName.name]) \
.where(TagName.tag_id == tag_id) \
.limit(1) \
.as_scalar(),
deferred=True)
suggestion_count = column_property(
select([func.count(TagSuggestion.child_id)]) \
.where(TagSuggestion.parent_id == tag_id) \
.as_scalar(),
deferred=True)
implication_count = column_property(
select([func.count(TagImplication.child_id)]) \
.where(TagImplication.parent_id == tag_id) \
.as_scalar(),
deferred=True)

View file

@ -1,4 +1,3 @@
import sqlalchemy
from sqlalchemy.sql.expression import func
from szurubooru import db
from szurubooru.search.base_search_config import BaseSearchConfig
@ -8,11 +7,11 @@ class TagSearchConfig(BaseSearchConfig):
return session.query(db.Tag)
def finalize_query(self, query):
return query.order_by(self._first_name_subquery.asc())
return query.order_by(db.Tag.first_name.asc())
@property
def anonymous_filter(self):
return self._name_filter
return self._create_str_filter(db.Tag.first_name)
@property
def special_filters(self):
@ -21,7 +20,7 @@ class TagSearchConfig(BaseSearchConfig):
@property
def named_filters(self):
return {
'name': self._name_filter,
'name': self._create_str_filter(db.Tag.first_name),
'category': self._create_str_filter(db.Tag.category),
'creation-date': self._create_date_filter(db.Tag.creation_time),
'creation-time': self._create_date_filter(db.Tag.creation_time),
@ -32,15 +31,15 @@ class TagSearchConfig(BaseSearchConfig):
'usages': self._create_num_filter(db.Tag.post_count),
'usage-count': self._create_num_filter(db.Tag.post_count),
'post-count': self._create_num_filter(db.Tag.post_count),
'suggestion-count': self._suggestion_count_filter,
'implication-count': self._implication_count_filter,
'suggestion-count': self._create_num_filter(db.Tag.suggestion_count),
'implication-count': self._create_num_filter(db.Tag.implication_count),
}
@property
def order_columns(self):
return {
'random': (func.random(), None),
'name': (self._first_name_subquery, self.ORDER_ASC),
'name': (db.Tag.first_name, self.ORDER_ASC),
'category': (db.Tag.category, self.ORDER_ASC),
'creation-date': (db.Tag.creation_time, self.ORDER_DESC),
'creation-time': (db.Tag.creation_time, self.ORDER_DESC),
@ -51,43 +50,6 @@ class TagSearchConfig(BaseSearchConfig):
'usages': (db.Tag.post_count, self.ORDER_DESC),
'usage-count': (db.Tag.post_count, self.ORDER_DESC),
'post-count': (db.Tag.post_count, self.ORDER_DESC),
'suggestion-count':
(self._suggestion_count_subquery, self.ORDER_DESC),
'implication-count':
(self._implication_count_subquery, self.ORDER_DESC),
'suggestion-count': (db.Tag.suggestion_count, self.ORDER_DESC),
'implication-count': (db.Tag.implication_count, self.ORDER_DESC),
}
def _name_filter(self, query, criterion):
str_filter = self._create_str_filter(db.TagName.name)
return query.filter(
db.Tag.tag_id.in_(
str_filter(query.session.query(db.TagName.tag_id), criterion)))
def _suggestion_count_filter(self, query, criterion):
return query.filter(
self._apply_num_criterion_to_column(
self._suggestion_count_subquery, criterion))
def _implication_count_filter(self, query, criterion):
return query.filter(
self._apply_num_criterion_to_column(
self._implication_count_subquery, criterion))
@property
def _first_name_subquery(self):
return sqlalchemy.select([db.TagName.name]) \
.limit(1) \
.where(db.TagName.tag_id == db.Tag.tag_id) \
.as_scalar()
@property
def _suggestion_count_subquery(self):
return sqlalchemy.select([func.count(db.TagSuggestion.child_id)]) \
.where(db.TagSuggestion.parent_id == db.Tag.tag_id) \
.as_scalar()
@property
def _implication_count_subquery(self):
return sqlalchemy.select([func.count(1)]) \
.where(db.TagImplication.parent_id == db.Tag.tag_id) \
.as_scalar()