You are viewing an old version of this page. View the current version.
Compare with Current
View Page History
« Previous
Version 3
Next »
Below I'm cataloging each and every read/write access to the courseware StudentModule (CSM) Django model. It's essential to know of each access due to our pending work to encapsulate all CSM access behind an interface. The interface backend will support both the present Django ORM and a Cassandra backend to better handle student traffic at scale. Dave Ormsbee has authored this page to capture existing CSM query patterns - the catalog below looks at all code in edx-platform and catalogs access in each file therein.
lms/djangoapps/courseware/model_data.py
Reads
Call Chain | Query | Maps To New Query |
---|
FieldDataCache.__init__() / FieldDataCache.add_descriptor_descendants()
FieldDataCache.add_descriptors_to_cache()
FieldDataCache._retrieve_fields()
| return self._chunked_query( StudentModule, 'module_state_key__in', self._all_usage_ids(descriptors), course_id=self.course_id, student=self.user.pk, ) Ultimately, a objects.filter() call. | |
Writes
Call Chain | Query | Maps To New Query |
---|
FieldDataCache.find_or_create() DjangoKeyValueStore.set_many() | field_object = StudentModule(
course_id=self.course_id,
student_id=key.user_id,
module_state_key=key.block_scope_id,
state=json.dumps({}),
module_type=key.block_scope_id.block_type,
)
| |
DjangoKeyValueStore.set_many() | StudentModule.save() | |
DjangoKeyValueStore.delete()
| StudentModule.save()
| |
lms/djangoapps/class_dashboard/dashboard_data.py
Reads
Call Chain | Query | Maps To New Query |
---|
get_problem_grade_distribution()
| db_query = models.StudentModule.objects.filter(
course_id__exact=course_id,
grade__isnull=False,
module_type__exact="problem",
).values(
'module_state_key', 'grade', 'max_grade'
).annotate(
count_grade=Count('grade')
)
| |
get_sequential_open_distrib()
| db_query = models.StudentModule.objects.filter(
course_id__exact=course_id,
module_type__exact="sequential",
).values(
'module_state_key'
).annotate(
count_sequential=Count('module_state_key')
)
| |
get_problem_set_grade_distrib()
| db_query = models.StudentModule.objects.filter(
course_id__exact=course_id,
grade__isnull=False,
module_type__exact="problem",
module_state_key__in=problem_set,
).values(
'module_state_key',
'grade',
'max_grade',
).annotate(
count_grade=Count('grade')
).order_by(
'module_state_key', 'grade'
)
| |
get_students_opened_subsection()
| students = models.StudentModule.objects.select_related('student').filter(
module_state_key__exact=module_state_key,
module_type__exact='sequential',
).values(
'student__username', 'student__profile__name'
).order_by(
'student__profile__name'
)
| |
get_students_problem_grades()
| students = models.StudentModule.objects.select_related('student').filter(
module_state_key=module_state_key,
module_type__exact='problem',
grade__isnull=False,
).values(
'student__username', 'student__profile__name', 'grade', 'max_grade'
).order_by(
'student__profile__name'
)
| |
lms/djangoapps/courseware/grades.py
Reads
Call Chain | Query | Maps to New Query |
---|
answer_distributions()
| for module in StudentModule.all_submitted_problems_read_only(course_key):
...which is: queryset = cls.objects.filter(
course_id=course_id,
module_type='problem',
grade__isnull=False
)
if "read_replica" in settings.DATABASES:
return queryset.using("read_replica")
else:
return queryset
| |
common/djangoapps/xmodule_modifiers.py
This access behaves poorly - it accesses the CSM table via direct SQL!
Call Chain | Query | Maps to New Query |
---|
grade_histogram() | SELECT courseware_studentmodule.grade,
COUNT(courseware_studentmodule.student_id)
FROM courseware_studentmodule
WHERE courseware_studentmodule.module_id=%s
GROUP BY courseware_studentmodule.grade
| |
lms/djangoapps/courseware/entrance_exams.py
Determines a user's entrance exam score via direct CSM access.
Call Chain | Query | Maps to New Query |
---|
_calculate_entrance_exam_score()
| student_modules = StudentModule.objects.filter(
student=user,
course_id=course_descriptor.id,
module_state_key__in=exam_module_ids,
)
| |