From 60fee54da911986af0452831e68c168135108e02 Mon Sep 17 00:00:00 2001 From: Wesley Aptekar-Cassels Date: Mon, 13 Mar 2023 15:45:21 -0400 Subject: [PATCH] Optimize CSV export query Splitting this into five separate queries avoids the large join that prevents us from using indexes, and requires materializing to disk. Fixes: #2157 (hopefully) --- bookwyrm/views/preferences/export.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/bookwyrm/views/preferences/export.py b/bookwyrm/views/preferences/export.py index c4540ba78..6880318bc 100644 --- a/bookwyrm/views/preferences/export.py +++ b/bookwyrm/views/preferences/export.py @@ -22,16 +22,19 @@ class Export(View): def post(self, request): """Download the csv file of a user's book data""" - books = ( - models.Edition.viewer_aware_objects(request.user) - .filter( - Q(shelves__user=request.user) - | Q(readthrough__user=request.user) - | Q(review__user=request.user) - | Q(comment__user=request.user) - | Q(quotation__user=request.user) - ) - .distinct() + books = models.Edition.viewer_aware_objects(request.user) + books_shelves = books.filter(Q(shelves__user=request.user)).distinct() + books_readthrough = books.filter(Q(readthrough__user=request.user)).distinct() + books_review = books.filter(Q(review__user=request.user)).distinct() + books_comment = books.filter(Q(comment__user=request.user)).distinct() + books_quotation = books.filter(Q(quotation__user=request.user)).distinct() + + books = set( + list(books_shelves) + + list(books_readthrough) + + list(books_review) + + list(books_comment) + + list(books_quotation) ) csv_string = io.StringIO()