From 05b034ddf46d7e4b16c32cd6a5c1ba7afb351d26 Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Thu, 8 Apr 2021 21:23:10 +0200
Subject: [PATCH] Add some (convering) indexes to speed up database queries

---
 .../apps/chronos/migrations/0005_indexes.py   | 59 +++++++++++++++++++
 aleksis/apps/chronos/models.py                | 21 ++++++-
 2 files changed, 78 insertions(+), 2 deletions(-)
 create mode 100644 aleksis/apps/chronos/migrations/0005_indexes.py

diff --git a/aleksis/apps/chronos/migrations/0005_indexes.py b/aleksis/apps/chronos/migrations/0005_indexes.py
new file mode 100644
index 00000000..a00fefca
--- /dev/null
+++ b/aleksis/apps/chronos/migrations/0005_indexes.py
@@ -0,0 +1,59 @@
+# Generated by Django 3.2 on 2021-04-08 19:12
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0010_external_link_widget'),
+        ('chronos', '0004_substitution_extra_lesson_year'),
+    ]
+
+    operations = [
+        migrations.AlterModelOptions(
+            name='chronosglobalpermissions',
+            options={'managed': False, 'permissions': (('view_all_timetables', 'Can view all timetables'), ('view_timetable_overview', 'Can view timetable overview'), ('view_lessons_day', 'Can view all lessons per day'))},
+        ),
+        migrations.AlterModelOptions(
+            name='lessonsubstitution',
+            options={'ordering': ['year', 'week', 'lesson_period__period__weekday', 'lesson_period__period__period'], 'verbose_name': 'Lesson substitution', 'verbose_name_plural': 'Lesson substitutions'},
+        ),
+        migrations.RemoveIndex(
+            model_name='event',
+            name='chronos_eve_period__c7ec33_idx',
+        ),
+        migrations.RemoveIndex(
+            model_name='lessonperiod',
+            name='chronos_les_lesson__05250e_idx',
+        ),
+        migrations.AddIndex(
+            model_name='event',
+            index=models.Index(fields=['date_start', 'date_end'], include=('period_from', 'period_to'), name='event_date_start_date_end'),
+        ),
+        migrations.AddIndex(
+            model_name='extralesson',
+            index=models.Index(fields=['week', 'year'], name='extra_lesson_week_year'),
+        ),
+        migrations.AddIndex(
+            model_name='lessonperiod',
+            index=models.Index(fields=['lesson', 'period'], name='lesson_period_lesson_period'),
+        ),
+        migrations.AddIndex(
+            model_name='lessonperiod',
+            index=models.Index(fields=['room'], include=('lesson', 'period'), name='lesson_period_room'),
+        ),
+        migrations.AddIndex(
+            model_name='lessonsubstitution',
+            index=models.Index(fields=['week', 'year'], name='substitution_week_year'),
+        ),
+        migrations.AddIndex(
+            model_name='lessonsubstitution',
+            index=models.Index(fields=['lesson_period'], name='substitution_lesson_period'),
+        ),
+        migrations.AddIndex(
+            model_name='validityrange',
+            index=models.Index(fields=['date_start', 'date_end'], name='validity_date_start_date_end'),
+        ),
+    ]
diff --git a/aleksis/apps/chronos/models.py b/aleksis/apps/chronos/models.py
index 209155a4..9aaf8227 100644
--- a/aleksis/apps/chronos/models.py
+++ b/aleksis/apps/chronos/models.py
@@ -117,6 +117,9 @@ class ValidityRange(ExtensibleModel):
         verbose_name = _("Validity range")
         verbose_name_plural = _("Validity ranges")
         unique_together = ["date_start", "date_end"]
+        indexes = [
+            models.Index(fields=["date_start", "date_end"], name="validity_date_start_date_end")
+        ]
 
 
 class TimePeriod(ValidityRangeRelatedExtensibleModel):
@@ -425,6 +428,10 @@ class LessonSubstitution(ExtensibleModel, TeacherPropertiesMixin, WeekRelatedMix
                 name="either_substituted_or_cancelled",
             )
         ]
+        indexes = [
+            models.Index(fields=["week", "year"], name="substitution_week_year"),
+            models.Index(fields=["lesson_period"], name="substitution_lesson_period"),
+        ]
         verbose_name = _("Lesson substitution")
         verbose_name_plural = _("Lesson substitutions")
 
@@ -531,7 +538,10 @@ class LessonPeriod(WeekAnnotationMixin, TeacherPropertiesMixin, ExtensibleModel)
             "period__period",
             "lesson__subject",
         ]
-        indexes = [models.Index(fields=["lesson", "period"])]
+        indexes = [
+            models.Index(fields=["lesson", "period"], name="lesson_period_lesson_period"),
+            models.Index(fields=["room"], include=["lesson", "period"], name="lesson_period_room"),
+        ]
         verbose_name = _("Lesson period")
         verbose_name_plural = _("Lesson periods")
 
@@ -992,7 +1002,13 @@ class Event(SchoolTermRelatedExtensibleModel, GroupPropertiesMixin, TeacherPrope
 
     class Meta:
         ordering = ["date_start"]
-        indexes = [models.Index(fields=["period_from", "period_to", "date_start", "date_end"])]
+        indexes = [
+            models.Index(
+                fields=["date_start", "date_end"],
+                include=["period_from", "period_to"],
+                name="event_date_start_date_end",
+            )
+        ]
         verbose_name = _("Event")
         verbose_name_plural = _("Events")
 
@@ -1046,6 +1062,7 @@ class ExtraLesson(
     class Meta:
         verbose_name = _("Extra lesson")
         verbose_name_plural = _("Extra lessons")
+        indexes = [models.Index(fields=["week", "year"], name="extra_lesson_week_year")]
 
 
 class ChronosGlobalPermissions(GlobalPermissionModel):
-- 
GitLab