From a54afd5210bc0655523071cd1532dbf3e57ebaf6 Mon Sep 17 00:00:00 2001 From: Tom Hacohen Date: Tue, 15 Aug 2023 20:21:23 -0400 Subject: [PATCH] Optimize stoken-using functions to only account for current revisions. No need to account for revisions that are not current when calculating stokens because those, by definition, are not the latest ones, and therefore won't have the most recent stokens. This becomes a problem when collections have many associated revisions. --- etebase_server/django/models.py | 2 +- etebase_server/fastapi/routers/collection.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/etebase_server/django/models.py b/etebase_server/django/models.py index e3a8e7f..336e3b8 100644 --- a/etebase_server/django/models.py +++ b/etebase_server/django/models.py @@ -66,7 +66,7 @@ class Collection(models.Model): @cached_property def stoken(self) -> str: stoken_id = ( - self.__class__.objects.filter(main_item=self.main_item) + self.__class__.objects.filter(main_item=self.main_item, items__revisions__current=True) .annotate(max_stoken=self.stoken_annotation) .values("max_stoken") .first()["max_stoken"] diff --git a/etebase_server/fastapi/routers/collection.py b/etebase_server/fastapi/routers/collection.py index c847743..97dbbf4 100644 --- a/etebase_server/fastapi/routers/collection.py +++ b/etebase_server/fastapi/routers/collection.py @@ -208,7 +208,7 @@ def collection_list_common( prefetch: Prefetch, ) -> CollectionListResponse: result, new_stoken_obj, done = filter_by_stoken_and_limit( - stoken, limit, queryset, models.Collection.stoken_annotation + stoken, limit, queryset.filter(items__revisions__current=True), models.Collection.stoken_annotation ) new_stoken = new_stoken_obj and new_stoken_obj.uid context = Context(user, prefetch) @@ -428,7 +428,7 @@ def item_list_common( prefetch: Prefetch, ) -> CollectionItemListResponse: result, new_stoken_obj, done = filter_by_stoken_and_limit( - stoken, limit, queryset, models.CollectionItem.stoken_annotation + stoken, limit, queryset.filter(revisions__current=True), models.CollectionItem.stoken_annotation ) new_stoken = new_stoken_obj and new_stoken_obj.uid context = Context(user, prefetch)