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)
This commit is contained in:
Wesley Aptekar-Cassels 2023-03-13 15:45:21 -04:00
parent ded3f469ef
commit 60fee54da9

View file

@ -22,16 +22,19 @@ class Export(View):
def post(self, request): def post(self, request):
"""Download the csv file of a user's book data""" """Download the csv file of a user's book data"""
books = ( books = models.Edition.viewer_aware_objects(request.user)
models.Edition.viewer_aware_objects(request.user) books_shelves = books.filter(Q(shelves__user=request.user)).distinct()
.filter( books_readthrough = books.filter(Q(readthrough__user=request.user)).distinct()
Q(shelves__user=request.user) books_review = books.filter(Q(review__user=request.user)).distinct()
| Q(readthrough__user=request.user) books_comment = books.filter(Q(comment__user=request.user)).distinct()
| Q(review__user=request.user) books_quotation = books.filter(Q(quotation__user=request.user)).distinct()
| Q(comment__user=request.user)
| Q(quotation__user=request.user) books = set(
) list(books_shelves)
.distinct() + list(books_readthrough)
+ list(books_review)
+ list(books_comment)
+ list(books_quotation)
) )
csv_string = io.StringIO() csv_string = io.StringIO()