From 76b5bdc5d795aedd0f65beff8862f51b594e821e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20K=C3=B6pf?= Date: Sun, 22 Jan 2023 00:58:03 +0100 Subject: [PATCH] fix cursor queries query_users_ordered_by_username/query_users_ordered_by_display_name --- backend/oasst_backend/api/v1/users.py | 2 +- backend/oasst_backend/user_repository.py | 24 ++++++++++++++++++------ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/backend/oasst_backend/api/v1/users.py b/backend/oasst_backend/api/v1/users.py index 04b3cc99..ed07eb21 100644 --- a/backend/oasst_backend/api/v1/users.py +++ b/backend/oasst_backend/api/v1/users.py @@ -111,7 +111,7 @@ def get_users_cursor( n = lt return p, n - def remove_extra_item(items: list[protocol.FrontEndUser], lt: str | None, gt: str): + def remove_extra_item(items: list[protocol.FrontEndUser], lt: str | None, gt: str | None): num_rows = len(items) if qry_max_count > max_count and num_rows == qry_max_count: assert not (lt and gt) diff --git a/backend/oasst_backend/user_repository.py b/backend/oasst_backend/user_repository.py index 1e9ac78f..44a7e685 100644 --- a/backend/oasst_backend/user_repository.py +++ b/backend/oasst_backend/user_repository.py @@ -153,7 +153,7 @@ class UserRepository: if api_client_id != self.api_client.id: raise OasstError("Forbidden", OasstErrorCode.API_CLIENT_NOT_AUTHORIZED, HTTP_403_FORBIDDEN) - qry = self.db.query(User).order_by(User.username, User.id) + qry = self.db.query(User) if gte_username is not None: if gt_id: @@ -184,8 +184,14 @@ class UserRepository: pattern = "%{}%".format(search_text.replace("\\", "\\\\").replace("_", "\\_").replace("%", "\\%")) qry = qry.filter(User.username.like(pattern)) - if limit is not None: - qry = qry.limit(limit) + if limit is not None and lte_username and not gte_username: + # select top rows but return results in ascernding order + sub_qry = qry.order_by(User.username.desc(), User.id.desc()).limit(limit).subquery("u") + qry = self.db.query(User).select_entity_from(sub_qry).order_by(User.username, User.id) + else: + qry = qry.order_by(User.username, User.id) + if limit is not None: + qry = qry.limit(limit) return qry.all() @@ -209,7 +215,7 @@ class UserRepository: # Unprivileged api client asks for foreign users raise OasstError("Forbidden", OasstErrorCode.API_CLIENT_NOT_AUTHORIZED, HTTP_403_FORBIDDEN) - qry = self.db.query(User).order_by(User.display_name, User.id) + qry = self.db.query(User) if gte_display_name is not None: if gt_id: @@ -249,7 +255,13 @@ class UserRepository: if auth_method: qry = qry.filter(User.auth_method == auth_method) - if limit is not None: - qry = qry.limit(limit) + if limit is not None and lte_display_name and not gte_display_name: + # select top rows but return results in ascernding order + sub_qry = qry.order_by(User.display_name.desc(), User.id.desc()).limit(limit).subquery("u") + qry = self.db.query(User).select_entity_from(sub_qry).order_by(User.display_name, User.id) + else: + qry = qry.order_by(User.display_name, User.id) + if limit is not None: + qry = qry.limit(limit) return qry.all()