From 4b312de4646625d30b39dbe78af3271306724496 Mon Sep 17 00:00:00 2001 From: Ole Laursen Date: Mon, 21 Jan 2013 14:01:33 +0000 Subject: [PATCH] Introduce a simple cache in doc.get_state so repeated reads don't cause a DB query - Legacy-Id: 5314 --- ietf/doc/models.py | 16 +++++++++++----- ietf/sync/tests.py | 1 + 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/ietf/doc/models.py b/ietf/doc/models.py index 1a4cc6f9c..0fbd44d1d 100644 --- a/ietf/doc/models.py +++ b/ietf/doc/models.py @@ -100,20 +100,26 @@ class DocumentInfo(models.Model): self.states.remove(*others) if state not in already_set: self.states.add(state) + self.state_cache = None # invalidate cache def unset_state(self, state_type): """Unset state of type so no state of that type is any longer set.""" self.states.remove(*self.states.filter(type=state_type)) + self.state_cache = None # invalidate cache def get_state(self, state_type=None): - """Get state of type, or default state for document type if not specified.""" + """Get state of type, or default state for document type if + not specified. Uses a local cache to speed multiple state + reads up.""" if state_type == None: state_type = self.type_id - try: - return self.states.get(type=state_type) - except State.DoesNotExist: - return None + if not hasattr(self, "state_cache") or self.state_cache == None: + self.state_cache = {} + for s in self.states.all().select_related(): + self.state_cache[s.type_id] = s + + return self.state_cache.get(state_type, None) def get_state_slug(self, state_type=None): """Get state of type, or default if not specified, returning diff --git a/ietf/sync/tests.py b/ietf/sync/tests.py index b614742e8..73cf2172e 100644 --- a/ietf/sync/tests.py +++ b/ietf/sync/tests.py @@ -436,6 +436,7 @@ class RFCEditorUndoTestCase(django.test.TestCase): self.assertEquals(DeletedEvent.objects.count(), deleted_before + 1) # delete e1 + draft.state_cache = None r = self.client.post(url, dict(event=e1.id)) self.assertEquals(draft.get_state("draft-rfceditor"), None)