From a2c1eb8ae34d580b666ae7df116c064544f4c6e3 Mon Sep 17 00:00:00 2001 From: Samuel Clay Date: Wed, 20 Feb 2013 16:08:14 -0800 Subject: [PATCH] Phase 2: switching to using story_hash index instead of compound unique story_feed_id/story_guid index. --- apps/reader/models.py | 16 ++++++---------- apps/rss_feeds/models.py | 22 +++++++++++++--------- apps/social/views.py | 8 ++++---- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/apps/reader/models.py b/apps/reader/models.py index 793cd3b30..5c0925795 100644 --- a/apps/reader/models.py +++ b/apps/reader/models.py @@ -356,13 +356,8 @@ class UserSubscription(models.Model): logging.user(request, "~FYRead story in feed: %s" % (self.feed)) for story_id in set(story_ids): - try: - story = MStory.objects.get(story_feed_id=self.feed_id, story_guid=story_id) - except MStory.DoesNotExist: - # Story has been deleted, probably by feed_fetcher. - continue - except MStory.MultipleObjectsReturned: - story = MStory.objects.filter(story_feed_id=self.feed_id, story_guid=story_id)[0] + story, _ = MStory.find_story(story_feed_id=self.feed_id, story_id=story_id) + if not story: continue now = datetime.datetime.utcnow() date = now if now > story.story_date else story.story_date # For handling future stories m, _ = MUserStory.objects.get_or_create(story_id=story_id, user_id=self.user_id, @@ -510,11 +505,12 @@ class UserSubscription(models.Model): duplicate_story = user_story.story if duplicate_story: story_guid = duplicate_story.story_guid if hasattr(duplicate_story, 'story_guid') else duplicate_story.id - original_story = MStory.objects(story_feed_id=new_feed.pk, - story_guid=story_guid) + original_story, _ = MStory.find_story(story_feed_id=new_feed.pk, + story_id=story_guid, + original_only=True) if original_story: - user_story.story = original_story[0] + user_story.story = original_story try: user_story.save() except OperationError: diff --git a/apps/rss_feeds/models.py b/apps/rss_feeds/models.py index af0a3a0b8..0b9cb504a 100644 --- a/apps/rss_feeds/models.py +++ b/apps/rss_feeds/models.py @@ -843,11 +843,13 @@ class Feed(models.Model): try: existing_story = MStory.objects.get(id=existing_story.id) except ValidationError: - existing_story = MStory.objects.get(story_feed_id=existing_story.story_feed_id, - story_guid=existing_story.id) + existing_story, _ = MStory.find_story(existing_story.story_feed_id, + existing_story.id, + original_only=True) elif existing_story and existing_story.story_guid: - existing_story = MStory.objects.get(story_feed_id=existing_story.story_feed_id, - story_guid=existing_story.story_guid) + existing_story, _ = MStory.find_story(existing_story.story_feed_id, + existing_story.story_guid, + original_only=True) else: raise MStory.DoesNotExist except (MStory.DoesNotExist, OperationError): @@ -923,7 +925,8 @@ class Feed(models.Model): def save_popular_tags(self, feed_tags=None, verbose=False): if not feed_tags: - all_tags = MStory.objects(story_feed_id=self.pk, story_tags__exists=True).item_frequencies('story_tags') + all_tags = MStory.objects(story_feed_id=self.pk, + story_tags__exists=True).item_frequencies('story_tags') feed_tags = sorted([(k, v) for k, v in all_tags.items() if int(v) > 0], key=itemgetter(1), reverse=True)[:25] @@ -1426,7 +1429,7 @@ class MFeedPage(mongo.Document): class MStory(mongo.Document): '''A feed item''' - story_feed_id = mongo.IntField(unique_with='story_guid') + story_feed_id = mongo.IntField() story_date = mongo.DateTimeField() story_title = mongo.StringField(max_length=1024) story_content = mongo.StringField() @@ -1501,9 +1504,10 @@ class MStory(mongo.Document): def find_story(cls, story_feed_id, story_id, original_only=False): from apps.social.models import MSharedStory original_found = True - - story = cls.objects(story_feed_id=story_feed_id, - story_guid=story_id).limit(1).first() + + guid_hash = hashlib.sha1(story_id).hexdigest()[:6] + story_hash = "%s:%s" % (story_feed_id, guid_hash) + story = cls.objects(story_hash=story_hash).limit(1).first() if not story: original_found = False diff --git a/apps/social/views.py b/apps/social/views.py index 178487aa4..137ed874f 100644 --- a/apps/social/views.py +++ b/apps/social/views.py @@ -575,10 +575,10 @@ def mark_story_as_unshared(request): format = request.REQUEST.get('format', 'json') original_story_found = True - story = MStory.objects(story_feed_id=feed_id, story_guid=story_id).limit(1).first() - if not story: - original_story_found = False - + story, original_story_found = MStory.find_story(story_feed_id=feed_id, + story_id=story_id, + original_only=True) + shared_story = MSharedStory.objects(user_id=request.user.pk, story_feed_id=feed_id, story_guid=story_id).limit(1).first()