From e62b0586385d0dc8a5617ef8da543fd9fb173984 Mon Sep 17 00:00:00 2001 From: Samuel Clay Date: Tue, 25 Jun 2013 15:41:42 -0700 Subject: [PATCH] Major optimization to both single feed loads and river loads. Both are now checking training only for trained feeds, and river makes only a single subscirption call instead of N subscription calls. --- apps/reader/models.py | 17 +++++++++++------ apps/reader/views.py | 21 +++++++++++++-------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/apps/reader/models.py b/apps/reader/models.py index c6b113d5e..54c37941d 100644 --- a/apps/reader/models.py +++ b/apps/reader/models.py @@ -100,7 +100,7 @@ class UserSubscription(models.Model): else: r.delete(unread_ranked_stories_key) if not r.exists(stories_key): - print " ---> No stories on feed: %s" % self + # print " ---> No stories on feed: %s" % self return [] elif read_filter != 'unread' or not r.exists(read_stories_key): ignore_user_stories = True @@ -128,7 +128,7 @@ class UserSubscription(models.Model): max_score = int(time.mktime(self.mark_read_date.timetuple())) + 1 else: max_score = 0 - + if settings.DEBUG and False: debug_stories = r.zrevrange(unread_ranked_stories_key, 0, -1, withscores=True) print " ---> Unread all stories (%s - %s) %s stories: %s" % ( @@ -157,7 +157,8 @@ class UserSubscription(models.Model): return [] @classmethod - def feed_stories(cls, user_id, feed_ids, offset=0, limit=6, order='newest', read_filter='all'): + def feed_stories(cls, user_id, feed_ids, offset=0, limit=6, order='newest', read_filter='all', + usersubs=None): r = redis.Redis(connection_pool=settings.REDIS_STORY_HASH_POOL) if order == 'oldest': @@ -178,11 +179,15 @@ class UserSubscription(models.Model): r.delete(ranked_stories_keys) cache.delete(unread_ranked_stories_keys) + if not usersubs: + usersubs = cls.objects.get(user=user_id, feed__in=feed_ids) + usersubs = dict((sub.feed_id, sub) for sub in usersubs) + unread_feed_story_hashes = {} for feed_id in feed_ids: - try: - us = cls.objects.get(user=user_id, feed=feed_id) - except cls.DoesNotExist: + if feed_id in usersubs: + us = usersubs[feed_id] + else: continue story_hashes = us.get_stories(offset=0, limit=200, order=order, read_filter=read_filter, diff --git a/apps/reader/views.py b/apps/reader/views.py index cef94c37c..2d65b9a25 100644 --- a/apps/reader/views.py +++ b/apps/reader/views.py @@ -786,9 +786,11 @@ def load_river_stories__redis(request): now = localtime_for_timezone(datetime.datetime.now(), user.profile.timezone) if not feed_ids and not story_hashes: - usersubs = UserSubscription.objects.filter(user=user, active=True).only('feed') + usersubs = UserSubscription.objects.filter(user=user, active=True) feed_ids = [sub.feed_id for sub in usersubs] - + else: + usersubs = UserSubscription.objects.filter(user=user, active=True, feed__in=feed_ids) + offset = (page-1) * limit limit = page * limit - 1 story_date_order = "%sstory_date" % ('' if order == 'oldest' else '-') @@ -800,11 +802,14 @@ def load_river_stories__redis(request): story_hashes, unread_feed_story_hashes = UserSubscription.feed_stories(user.pk, feed_ids, offset=offset, limit=limit, order=order, - read_filter=read_filter) + read_filter=read_filter, + usersubs=usersubs) mstories = MStory.objects(story_hash__in=story_hashes).order_by(story_date_order) stories = Feed.format_stories(mstories) found_feed_ids = list(set([story['story_feed_id'] for story in stories])) stories, user_profiles = MSharedStory.stories_with_comments_and_profiles(stories, user.pk) + trained_feed_ids = [sub.feed_id for sub in usersubs if sub.is_trained] + found_trained_feed_ids = list(set(trained_feed_ids) & set(found_feed_ids)) # Find starred stories if found_feed_ids: @@ -818,15 +823,15 @@ def load_river_stories__redis(request): starred_stories = {} # Intelligence classifiers for all feeds involved - if found_feed_ids: + if found_trained_feed_ids: classifier_feeds = list(MClassifierFeed.objects(user_id=user.pk, - feed_id__in=found_feed_ids)) + feed_id__in=found_trained_feed_ids)) classifier_authors = list(MClassifierAuthor.objects(user_id=user.pk, - feed_id__in=found_feed_ids)) + feed_id__in=found_trained_feed_ids)) classifier_titles = list(MClassifierTitle.objects(user_id=user.pk, - feed_id__in=found_feed_ids)) + feed_id__in=found_trained_feed_ids)) classifier_tags = list(MClassifierTag.objects(user_id=user.pk, - feed_id__in=found_feed_ids)) + feed_id__in=found_trained_feed_ids)) else: classifier_feeds = [] classifier_authors = []