Uses single query to get suggested users

This commit is contained in:
Mouse Reeve 2022-01-04 16:33:19 -08:00
parent 1bd813c6f7
commit c28fbbeb09

View file

@ -2,7 +2,7 @@
import math import math
import logging import logging
from django.dispatch import receiver from django.dispatch import receiver
from django.db.models import signals, Count, Q from django.db.models import signals, Count, Q, Case, When, IntegerField
from bookwyrm import models from bookwyrm import models
from bookwyrm.redis_store import RedisStore, r from bookwyrm.redis_store import RedisStore, r
@ -84,24 +84,17 @@ class SuggestedUsers(RedisStore):
def get_suggestions(self, user, local=False): def get_suggestions(self, user, local=False):
"""get suggestions""" """get suggestions"""
values = self.get_store(self.store_id(user), withscores=True) values = self.get_store(self.store_id(user), withscores=True)
results = [] annotations = [
When(pk=int(pk), then=self.get_counts_from_rank(score)["mutuals"])
for (pk, score) in values
]
# annotate users with mutuals and shared book counts # annotate users with mutuals and shared book counts
for user_id, rank in values: users = models.User.objects.filter(
counts = self.get_counts_from_rank(rank) is_active=True, bookwyrm_user=True, id__in=[pk for (pk, _) in values]
try: ).annotate(mutuals=Case(*annotations, output_field=IntegerField(), default=0))
user = models.User.objects.get( if local:
id=user_id, is_active=True, bookwyrm_user=True users = users.filter(local=True)
) return users[:5]
except models.User.DoesNotExist as err:
# if this happens, the suggestions are janked way up
logger.exception(err)
continue
user.mutuals = counts["mutuals"]
if (local and user.local) or not local:
results.append(user)
if len(results) >= 5:
break
return results
def get_annotated_users(viewer, *args, **kwargs): def get_annotated_users(viewer, *args, **kwargs):