From 93ae01fb047e285e7a87f3d976812e41f5d05fa7 Mon Sep 17 00:00:00 2001 From: Patrick Uiterwijk Date: May 14 2018 16:54:45 +0000 Subject: Transform joins in search_issues to subqueries Signed-off-by: Patrick Uiterwijk --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 39db198..0a48a86 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -2501,15 +2501,24 @@ def search_issues( query = query.filter(model.Issue.uid.in_(list(final_set))) if assignee is not None: - if str(assignee).lower() not in ['false', '0', 'true', '1']: - user2 = aliased(model.User) + assignee = "%s" % assignee + if not pagure.utils.is_true(assignee, ['false', '0', 'true', '1']): + reverseassignee = False if assignee.startswith('!'): + reverseassignee = True + assignee = assignee[1:] + + userassignee = session.query( + model.User.id + ).filter( + model.User.user == assignee + ).subquery() + + if reverseassignee: sub = session.query( model.Issue.uid ).filter( - model.Issue.assignee_id == user2.id - ).filter( - user2.user == assignee[1:] + model.Issue.assignee_id == userassignee ) query = query.filter( @@ -2517,9 +2526,7 @@ def search_issues( ) else: query = query.filter( - model.Issue.assignee_id == user2.id - ).filter( - user2.user == assignee + model.Issue.assignee_id == userassignee ) elif str(assignee).lower() in ['true', '1']: query = query.filter( @@ -2530,32 +2537,35 @@ def search_issues( model.Issue.assignee_id.is_(None) ) if author is not None: - user3 = aliased(model.User) - query = query.filter( - model.Issue.user_id == user3.id + userauthor = session.query( + model.User.id ).filter( - user3.user == author + model.User.user == author + ).subquery() + query = query.filter( + model.Issue.user_id == userauthor ) if private is False: query = query.filter( model.Issue.private == False # noqa: E712 ) - elif isinstance(private, basestring): - user2 = aliased(model.User) - user4 = aliased(model.User) + elif isinstance(private, six.string_types): + userprivate = session.query( + model.User.id + ).filter( + model.User.user == private + ).subquery() query = query.filter( sqlalchemy.or_( model.Issue.private == False, # noqa: E712 sqlalchemy.and_( model.Issue.private == True, # noqa: E712 - model.Issue.user_id == user2.id, - user2.user == private, + model.Issue.user_id == userprivate ), sqlalchemy.and_( model.Issue.private == True, # noqa: E712 - model.Issue.assignee_id == user4.id, - user4.user == private, + model.Issue.assignee_id == userprivate ) ) )