aboutsummaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authorrr-2016-05-30 20:01:14 +0200
committerrr-2016-05-30 20:51:52 +0200
commit48bcbbff83e18d614ccff0b11c655fa86291f62c (patch)
tree638abe27e74070122b43b772018d988575367395 /server
parent5427b0d25a8f9c27e81531c5ac65eaeae5c13406 (diff)
server/search: improve performance
Diffstat (limited to 'server')
-rw-r--r--server/szurubooru/db/post.py2
-rw-r--r--server/szurubooru/func/posts.py2
-rw-r--r--server/szurubooru/func/scores.py12
-rw-r--r--server/szurubooru/search/post_search_config.py11
-rw-r--r--server/szurubooru/search/tag_search_config.py10
-rw-r--r--server/szurubooru/tests/search/test_post_search_config.py2
6 files changed, 26 insertions, 13 deletions
diff --git a/server/szurubooru/db/post.py b/server/szurubooru/db/post.py
index 2fdcb4e..e413e23 100644
--- a/server/szurubooru/db/post.py
+++ b/server/szurubooru/db/post.py
@@ -116,7 +116,7 @@ class Post(Base):
'Post',
secondary='post_relation',
primaryjoin=post_id == PostRelation.parent_id,
- secondaryjoin=post_id == PostRelation.child_id)
+ secondaryjoin=post_id == PostRelation.child_id, lazy='joined')
features = relationship(
'PostFeature', cascade='all, delete-orphan', lazy='joined')
scores = relationship(
diff --git a/server/szurubooru/func/posts.py b/server/szurubooru/func/posts.py
index 51d9952..81b68b4 100644
--- a/server/szurubooru/func/posts.py
+++ b/server/szurubooru/func/posts.py
@@ -79,7 +79,7 @@ def serialize_post(post, authenticated_user):
'contentUrl': get_post_content_url(post),
'thumbnailUrl': get_post_thumbnail_url(post),
'flags': post.flags,
- 'tags': [tag.first_name for tag in post.tags],
+ 'tags': [tag.names[0].name for tag in post.tags],
'relations': [rel.post_id for rel in post.relations],
'notes': sorted(
[ serialize_note(note) for note in post.notes],
diff --git a/server/szurubooru/func/scores.py b/server/szurubooru/func/scores.py
index f475a1e..5ed3960 100644
--- a/server/szurubooru/func/scores.py
+++ b/server/szurubooru/func/scores.py
@@ -21,11 +21,13 @@ def delete_score(entity, user):
db.session.delete(score_entity)
def get_score(entity, user):
- score_entity = _get_score_entity(entity, user)
- if score_entity:
- return score_entity.score
- else:
- return 0
+ table, get_column = _get_table_info(entity)
+ row = db.session \
+ .query(table.score) \
+ .filter(get_column(table) == get_column(entity)) \
+ .filter(table.user_id == user.user_id) \
+ .one_or_none()
+ return row[0] if row else 0
def set_score(entity, user, score):
if not score:
diff --git a/server/szurubooru/search/post_search_config.py b/server/szurubooru/search/post_search_config.py
index 8c90f30..dd33cff 100644
--- a/server/szurubooru/search/post_search_config.py
+++ b/server/szurubooru/search/post_search_config.py
@@ -1,3 +1,4 @@
+from sqlalchemy.orm import subqueryload
from sqlalchemy.sql.expression import func
from szurubooru import db, errors
from szurubooru.func import util
@@ -23,6 +24,16 @@ def _type_transformer(value):
class PostSearchConfig(BaseSearchConfig):
def create_filter_query(self):
+ return self.create_count_query() \
+ .options(
+ subqueryload(db.Post.user),
+ subqueryload(db.Post.relations),
+ subqueryload(db.Post.notes),
+ subqueryload(db.Post.tags).subqueryload(db.Tag.names),
+ subqueryload(db.Post.favorited_by),
+ )
+
+ def create_count_query(self):
return db.session.query(db.Post)
def finalize_query(self, query):
diff --git a/server/szurubooru/search/tag_search_config.py b/server/szurubooru/search/tag_search_config.py
index 689bba7..d9ed898 100644
--- a/server/szurubooru/search/tag_search_config.py
+++ b/server/szurubooru/search/tag_search_config.py
@@ -1,4 +1,4 @@
-from sqlalchemy.orm import joinedload
+from sqlalchemy.orm import subqueryload
from sqlalchemy.sql.expression import func
from szurubooru import db
from szurubooru.func import util
@@ -9,10 +9,10 @@ class TagSearchConfig(BaseSearchConfig):
return self.create_count_query() \
.join(db.TagCategory) \
.options(
- joinedload(db.Tag.names),
- joinedload(db.Tag.category),
- joinedload(db.Tag.suggestions).joinedload(db.Tag.names),
- joinedload(db.Tag.implications).joinedload(db.Tag.names)
+ subqueryload(db.Tag.names),
+ subqueryload(db.Tag.category),
+ subqueryload(db.Tag.suggestions).joinedload(db.Tag.names),
+ subqueryload(db.Tag.implications).joinedload(db.Tag.names)
)
def create_count_query(self):
diff --git a/server/szurubooru/tests/search/test_post_search_config.py b/server/szurubooru/tests/search/test_post_search_config.py
index 810f79d..b476908 100644
--- a/server/szurubooru/tests/search/test_post_search_config.py
+++ b/server/szurubooru/tests/search/test_post_search_config.py
@@ -56,11 +56,11 @@ def verify_unpaged(executor):
actual_count, actual_posts = executor.execute(
input, page=1, page_size=100)
actual_post_ids = list([p.post_id for p in actual_posts])
- assert actual_count == len(expected_post_ids)
if not test_order:
actual_post_ids = sorted(actual_post_ids)
expected_post_ids = sorted(expected_post_ids)
assert actual_post_ids == expected_post_ids
+ assert actual_count == len(expected_post_ids)
return verify
@pytest.mark.parametrize('input,expected_post_ids', [

© 2015 - 2026 Jakob L. Kreuze