From a2064a0a15cff7f22cc863862b0f2c060ce71e8e Mon Sep 17 00:00:00 2001 From: Andre D Date: Mon, 11 Mar 2013 18:52:04 -0400 Subject: [PATCH] wiki: Do revision WikiPage lookups in batch. --- r2/r2/models/builder.py | 4 ++-- r2/r2/models/wiki.py | 22 +++++++++++++++++++--- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/r2/r2/models/builder.py b/r2/r2/models/builder.py index dd6eb838c..99ba4e081 100755 --- a/r2/r2/models/builder.py +++ b/r2/r2/models/builder.py @@ -613,8 +613,8 @@ class WikiRevisionBuilder(QueryBuilder): def keep_item(self, item): from r2.lib.validator.wiki import may_view - return (not item.is_hidden and may_view(self.sr, self.user, - wiki.WikiPage.get(self.sr, item.page))) + return ((not item.is_hidden) and + may_view(self.sr, self.user, item.wikipage)) class WikiRecentRevisionBuilder(WikiRevisionBuilder): show_extended = False diff --git a/r2/r2/models/wiki.py b/r2/r2/models/wiki.py index 3e9824e49..e7d774997 100644 --- a/r2/r2/models/wiki.py +++ b/r2/r2/models/wiki.py @@ -82,7 +82,7 @@ class WikiRevision(tdb_cassandra.UuidThing, Printable): _str_props = ('pageid', 'content', 'author', 'reason') _bool_props = ('hidden') - cache_ignore = set(list(_str_props)).union(Printable.cache_ignore) + cache_ignore = set(list(_str_props)).union(Printable.cache_ignore).union(['wikipage']) def get_author(self): author = self._get('author') @@ -104,9 +104,12 @@ class WikiRevision(tdb_cassandra.UuidThing, Printable): @classmethod def add_props(cls, user, wrapped): authors = cls.get_printable_authors(wrapped) + pages = {r.page: None for r in wrapped} + pages = WikiPage.get_multiple((c.site, page) for page in pages) for item in wrapped: item._hidden = item.is_hidden item._spam = False + item.wikipage = pages[item.pageid] author = item._get('author') item.printable_author = authors.get(author, '[unknown]') item.reported = False @@ -187,11 +190,24 @@ class WikiPage(tdb_cassandra.Thing): return None @classmethod - def get(cls, sr, name): + def id_for(cls, sr, name): id = getattr(sr, '_id36', None) if not id: raise tdb_cassandra.NotFound - return cls._byID(wiki_id(id, name)) + return wiki_id(id, name) + + @classmethod + def get_multiple(cls, pages): + """Get multiple wiki pages. + + Arguments: + pages -- list of tuples in the form of [(sr, names),..] + """ + return cls._byID([cls.id_for(sr, name) for sr, name in pages]) + + @classmethod + def get(cls, sr, name): + return cls._byID(cls.id_for(sr, name)) @classmethod def create(cls, sr, name):