Phase 2: switching to using story_hash index instead of compound unique story_feed_id/story_guid index.

This commit is contained in:
Samuel Clay 2013-02-20 16:08:14 -08:00
parent fc8b2bd4ec
commit a2c1eb8ae3
3 changed files with 23 additions and 23 deletions

View file

@ -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:

View file

@ -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

View file

@ -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()