Commit 7909bee5 by Calen Pennington

Stop leaking private _data members from per-scope caches

parent 01cf2a32
...@@ -109,7 +109,7 @@ class UserStateCache(object): ...@@ -109,7 +109,7 @@ class UserStateCache(object):
self.select_for_update = select_for_update self.select_for_update = select_for_update
def cache_fields(self, fields, descriptors, aside_types): def cache_fields(self, fields, descriptors, aside_types):
self._data = _chunked_query( data = _chunked_query(
StudentModule, StudentModule,
self.select_for_update, self.select_for_update,
'module_state_key__in', 'module_state_key__in',
...@@ -117,6 +117,8 @@ class UserStateCache(object): ...@@ -117,6 +117,8 @@ class UserStateCache(object):
course_id=self.course_id, course_id=self.course_id,
student=self.user.pk, student=self.user.pk,
) )
for field_object in data:
self._cache[self.cache_key_for_field_object(field_object)] = field_object
def cache_key_for_field_object(self, field_object): def cache_key_for_field_object(self, field_object):
return field_object.module_state_key.map_into_course(self.course_id) return field_object.module_state_key.map_into_course(self.course_id)
...@@ -140,13 +142,15 @@ class UserStateSummaryCache(object): ...@@ -140,13 +142,15 @@ class UserStateSummaryCache(object):
self.select_for_update = select_for_update self.select_for_update = select_for_update
def cache_fields(self, fields, descriptors, aside_types): def cache_fields(self, fields, descriptors, aside_types):
self._data = _chunked_query( data = _chunked_query(
XModuleUserStateSummaryField, XModuleUserStateSummaryField,
self.select_for_update, self.select_for_update,
'usage_id__in', 'usage_id__in',
_all_usage_keys(descriptors, aside_types), _all_usage_keys(descriptors, aside_types),
field_name__in=set(field.name for field in fields), field_name__in=set(field.name for field in fields),
) )
for field_object in data:
self._cache[self.cache_key_for_field_object(field_object)] = field_object
def cache_key_for_field_object(self, field_object): def cache_key_for_field_object(self, field_object):
return (field_object.usage_id.map_into_course(self.course_id), field_object.field_name) return (field_object.usage_id.map_into_course(self.course_id), field_object.field_name)
...@@ -171,7 +175,7 @@ class PreferencesCache(object): ...@@ -171,7 +175,7 @@ class PreferencesCache(object):
self._cache = {} self._cache = {}
def cache_fields(self, fields, descriptors, aside_types): def cache_fields(self, fields, descriptors, aside_types):
self._data = _chunked_query( data = _chunked_query(
XModuleStudentPrefsField, XModuleStudentPrefsField,
self.select_for_update, self.select_for_update,
'module_type__in', 'module_type__in',
...@@ -179,6 +183,8 @@ class PreferencesCache(object): ...@@ -179,6 +183,8 @@ class PreferencesCache(object):
student=self.user.pk, student=self.user.pk,
field_name__in=set(field.name for field in fields), field_name__in=set(field.name for field in fields),
) )
for field_object in data:
self._cache[self.cache_key_for_field_object(field_object)] = field_object
def cache_key_for_field_object(self, field_object): def cache_key_for_field_object(self, field_object):
return (field_object.module_type, field_object.field_name) return (field_object.module_type, field_object.field_name)
...@@ -203,12 +209,14 @@ class UserInfoCache(object): ...@@ -203,12 +209,14 @@ class UserInfoCache(object):
self.select_for_update = select_for_update self.select_for_update = select_for_update
def cache_fields(self, fields, descriptors, aside_types): def cache_fields(self, fields, descriptors, aside_types):
self._data = _query( data = _query(
XModuleStudentInfoField, XModuleStudentInfoField,
self.select_for_update, self.select_for_update,
student=self.user.pk, student=self.user.pk,
field_name__in=set(field.name for field in fields), field_name__in=set(field.name for field in fields),
) )
for field_object in data:
self._cache[self.cache_key_for_field_object(field_object)] = field_object
def cache_key_for_field_object(self, field_object): def cache_key_for_field_object(self, field_object):
return field_object.field_name return field_object.field_name
...@@ -283,7 +291,7 @@ class FieldDataCache(object): ...@@ -283,7 +291,7 @@ class FieldDataCache(object):
if scope not in self.cache: if scope not in self.cache:
continue continue
self._cache_fields(scope, fields, descriptors) self.cache[scope].cache_fields(fields, descriptors, self.asides)
def add_descriptor_descendents(self, descriptor, depth=None, descriptor_filter=lambda descriptor: True): def add_descriptor_descendents(self, descriptor, depth=None, descriptor_filter=lambda descriptor: True):
""" """
...@@ -343,15 +351,6 @@ class FieldDataCache(object): ...@@ -343,15 +351,6 @@ class FieldDataCache(object):
cache.add_descriptor_descendents(descriptor, depth, descriptor_filter) cache.add_descriptor_descendents(descriptor, depth, descriptor_filter)
return cache return cache
def _cache_fields(self, scope, fields, descriptors):
"""
Queries the database for all of the fields in the specified scope
"""
self.cache[scope].cache_fields(fields, descriptors, self.asides)
for field_object in self.cache[scope]._data:
self.cache[scope].set(self.cache[scope].cache_key_for_field_object(field_object), field_object)
def _fields_to_cache(self, descriptors): def _fields_to_cache(self, descriptors):
""" """
Returns a map of scopes to fields in that scope that should be cached Returns a map of scopes to fields in that scope that should be cached
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment