From 0e4fb5f1915779af3073c10f8d8023fe87a5688a Mon Sep 17 00:00:00 2001 From: r350178982 <32759763+r350178982@users.noreply.github.com> Date: Mon, 4 Mar 2024 09:44:37 +0800 Subject: [PATCH 1/5] Update db.py --- events/db.py | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/events/db.py b/events/db.py index 74a4bdba..211fbaa9 100644 --- a/events/db.py +++ b/events/db.py @@ -5,7 +5,7 @@ from datetime import timedelta import hashlib -from sqlalchemy import desc, select, update, func, text +from sqlalchemy import desc, select, update, func, text, and_ from sqlalchemy.sql import exists from .models import FileAudit, FileUpdate, PermAudit, \ @@ -58,12 +58,13 @@ def _get_user_activities(session, username, start, limit): if limit <= 0: logger.error('limit must be positive') raise RuntimeError('limit must be positive') - - stmt = select(Activity).where( - UserActivity.username == username, - UserActivity.activity_id == Activity.id).\ - order_by(desc(UserActivity.timestamp)).\ - slice(start, start + limit) + stmt = ( + select(Activity) + .join(UserActivity, UserActivity.activity_id == Activity.id) + .where(UserActivity.username == username, ) + .order_by(UserActivity.timestamp) + .slice(start, start + limit) + ) events = session.scalars(stmt).all() return [ UserActivityDetail(ev, username=username) for ev in events ] @@ -74,11 +75,16 @@ def get_user_activities(session, username, start, limit): def _get_user_activities_by_timestamp(session, username, start, end): events = [] try: - stmt = select(Activity).where( - UserActivity.username == username, - UserActivity.timestamp.between(start, end), - UserActivity.activity_id == Activity.id).\ - order_by(UserActivity.timestamp) + stmt = ( + select(Activity) + .join(UserActivity, UserActivity.activity_id == Activity.id) + .where( + and_( + UserActivity.username == username, + UserActivity.timestamp.between(start, end) + )) + .order_by(UserActivity.timestamp) + ) events = session.scalars(stmt).all() except Exception as e: logging.warning('Failed to get activities of %s: %s.', username, e) From 943acd5f3150259c198997da6f40d39eb2cad440 Mon Sep 17 00:00:00 2001 From: r350178982 <32759763+r350178982@users.noreply.github.com> Date: Mon, 4 Mar 2024 09:57:13 +0800 Subject: [PATCH 2/5] Update db.py --- events/db.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/events/db.py b/events/db.py index 211fbaa9..a29a480a 100644 --- a/events/db.py +++ b/events/db.py @@ -62,7 +62,7 @@ def _get_user_activities(session, username, start, limit): select(Activity) .join(UserActivity, UserActivity.activity_id == Activity.id) .where(UserActivity.username == username, ) - .order_by(UserActivity.timestamp) + .order_by(desc(UserActivity.timestamp)) .slice(start, start + limit) ) events = session.scalars(stmt).all() From 21625908402c5e790868f56034709edf67364de8 Mon Sep 17 00:00:00 2001 From: r350178982 <32759763+r350178982@users.noreply.github.com> Date: Mon, 4 Mar 2024 12:56:31 +0800 Subject: [PATCH 3/5] use subquery --- events/db.py | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/events/db.py b/events/db.py index a29a480a..f6c05fc5 100644 --- a/events/db.py +++ b/events/db.py @@ -58,13 +58,19 @@ def _get_user_activities(session, username, start, limit): if limit <= 0: logger.error('limit must be positive') raise RuntimeError('limit must be positive') - stmt = ( - select(Activity) - .join(UserActivity, UserActivity.activity_id == Activity.id) - .where(UserActivity.username == username, ) - .order_by(desc(UserActivity.timestamp)) + + sub_query = ( + select(UserActivity.activity_id) + .where(UserActivity.username == username) + + ) + stmt = ( + select(Activity) + .where(Activity.id.in_(sub_query)) .slice(start, start + limit) - ) + .order_by(desc(Activity.timestamp)) + ) + print(str(stmt.compile(compile_kwargs={"literal_binds": True})), '1111111') events = session.scalars(stmt).all() return [ UserActivityDetail(ev, username=username) for ev in events ] @@ -75,17 +81,23 @@ def get_user_activities(session, username, start, limit): def _get_user_activities_by_timestamp(session, username, start, end): events = [] try: - stmt = ( - select(Activity) - .join(UserActivity, UserActivity.activity_id == Activity.id) - .where( - and_( - UserActivity.username == username, - UserActivity.timestamp.between(start, end) - )) - .order_by(UserActivity.timestamp) - ) + sub_query = ( + select(UserActivity.activity_id) + .where( + and_( + UserActivity.username == username, + UserActivity.timestamp.between(start, end) + ) + ) + ) + stmt = ( + select(Activity) + .where(Activity.id.in_(sub_query)) + .order_by(Activity.timestamp) + ) + print(str(stmt.compile(compile_kwargs={"literal_binds": True})), '222222') events = session.scalars(stmt).all() + print(events, 'ppppp') except Exception as e: logging.warning('Failed to get activities of %s: %s.', username, e) finally: From 8825859938dcc5d686b916ffe07506916c723c35 Mon Sep 17 00:00:00 2001 From: r350178982 <32759763+r350178982@users.noreply.github.com> Date: Mon, 4 Mar 2024 13:06:54 +0800 Subject: [PATCH 4/5] remove useless code --- events/db.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/events/db.py b/events/db.py index f6c05fc5..05ada831 100644 --- a/events/db.py +++ b/events/db.py @@ -70,7 +70,6 @@ def _get_user_activities(session, username, start, limit): .slice(start, start + limit) .order_by(desc(Activity.timestamp)) ) - print(str(stmt.compile(compile_kwargs={"literal_binds": True})), '1111111') events = session.scalars(stmt).all() return [ UserActivityDetail(ev, username=username) for ev in events ] @@ -95,9 +94,7 @@ def _get_user_activities_by_timestamp(session, username, start, end): .where(Activity.id.in_(sub_query)) .order_by(Activity.timestamp) ) - print(str(stmt.compile(compile_kwargs={"literal_binds": True})), '222222') events = session.scalars(stmt).all() - print(events, 'ppppp') except Exception as e: logging.warning('Failed to get activities of %s: %s.', username, e) finally: From c6ec807d7b592571e82157d2e0ea8035fdd527b1 Mon Sep 17 00:00:00 2001 From: r350178982 <32759763+r350178982@users.noreply.github.com> Date: Mon, 4 Mar 2024 13:27:26 +0800 Subject: [PATCH 5/5] change order_by slice order --- events/db.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/events/db.py b/events/db.py index 05ada831..af8f4fac 100644 --- a/events/db.py +++ b/events/db.py @@ -67,8 +67,9 @@ def _get_user_activities(session, username, start, limit): stmt = ( select(Activity) .where(Activity.id.in_(sub_query)) - .slice(start, start + limit) .order_by(desc(Activity.timestamp)) + .slice(start, start + limit) + ) events = session.scalars(stmt).all()