refactor: do not use latest_activity in subquery

This commit is contained in:
Son NK 2020-08-21 23:10:23 +02:00
parent d7583f1733
commit 00a08d898a
1 changed files with 22 additions and 16 deletions

View File

@ -189,21 +189,9 @@ def get_alias_infos_with_pagination_v2(
def get_alias_infos_with_pagination_v3( def get_alias_infos_with_pagination_v3(
user, page_id=0, query=None, sort=None, alias_filter=None user, page_id=0, query=None, sort=None, alias_filter=None
) -> [AliasInfo]: ) -> [AliasInfo]:
ret = []
latest_activity = func.max(
case(
[
(Alias.created_at > EmailLog.created_at, Alias.created_at),
(Alias.created_at < EmailLog.created_at, EmailLog.created_at),
],
else_=Alias.created_at,
)
).label("latest")
sub = ( sub = (
db.session.query( db.session.query(
Alias.id, Alias.id,
latest_activity,
func.sum(case([(EmailLog.is_reply, 1)], else_=0)).label("nb_reply"), func.sum(case([(EmailLog.is_reply, 1)], else_=0)).label("nb_reply"),
func.sum( func.sum(
case( case(
@ -232,15 +220,32 @@ def get_alias_infos_with_pagination_v3(
.subquery() .subquery()
) )
latest_activity = case(
[
(Alias.created_at > EmailLog.created_at, Alias.created_at),
(Alias.created_at < EmailLog.created_at, EmailLog.created_at),
],
else_=Alias.created_at,
)
q = ( q = (
db.session.query( db.session.query(
Alias, Contact, EmailLog, sub.c.nb_reply, sub.c.nb_blocked, sub.c.nb_forward Alias,
Contact,
EmailLog,
sub.c.nb_reply,
sub.c.nb_blocked,
sub.c.nb_forward,
latest_activity,
) )
.join(Contact, Alias.id == Contact.alias_id, isouter=True) .join(Contact, Alias.id == Contact.alias_id, isouter=True)
.join(EmailLog, Contact.id == EmailLog.contact_id, isouter=True) .join(EmailLog, Contact.id == EmailLog.contact_id, isouter=True)
.filter(Alias.id == sub.c.id) .filter(Alias.id == sub.c.id)
.filter( .filter(
or_(EmailLog.created_at == sub.c.latest, Alias.created_at == sub.c.latest) or_(
EmailLog.created_at == sub.c.max_created_at,
sub.c.max_created_at == None,
)
) )
) )
@ -268,11 +273,12 @@ def get_alias_infos_with_pagination_v3(
q = q.order_by(Alias.email.desc()) q = q.order_by(Alias.email.desc())
else: else:
# default sorting # default sorting
q = q.order_by(sub.c.latest.desc()) q = q.order_by(latest_activity.desc())
q = list(q.limit(PAGE_LIMIT).offset(page_id * PAGE_LIMIT)) q = list(q.limit(PAGE_LIMIT).offset(page_id * PAGE_LIMIT))
for alias, contact, email_log, nb_reply, nb_blocked, nb_forward in q: ret = []
for alias, contact, email_log, nb_reply, nb_blocked, nb_forward, _ in q:
ret.append( ret.append(
AliasInfo( AliasInfo(
alias=alias, alias=alias,