mirror of
https://github.com/jointakahe/takahe.git
synced 2024-11-22 07:10:59 +00:00
Add indexes for Stator and some of its common tasks (#332)
This commit is contained in:
parent
43ba09a16e
commit
5f1d7b5253
6 changed files with 195 additions and 3 deletions
84
activities/migrations/0008_state_and_post_indexes.py
Normal file
84
activities/migrations/0008_state_and_post_indexes.py
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
# Generated by Django 4.1.4 on 2023-01-01 17:34
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
("activities", "0007_post_stats"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddIndex(
|
||||||
|
model_name="fanout",
|
||||||
|
index=models.Index(
|
||||||
|
fields=["state", "state_attempted"], name="ix_fanout_state_attempted"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AddIndex(
|
||||||
|
model_name="fanout",
|
||||||
|
index=models.Index(
|
||||||
|
condition=models.Q(("state_locked_until__isnull", False)),
|
||||||
|
fields=["state_locked_until", "state"],
|
||||||
|
name="ix_fanout_state_locked",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AddIndex(
|
||||||
|
model_name="hashtag",
|
||||||
|
index=models.Index(
|
||||||
|
fields=["state", "state_attempted"], name="ix_hashtag_state_attempted"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AddIndex(
|
||||||
|
model_name="hashtag",
|
||||||
|
index=models.Index(
|
||||||
|
condition=models.Q(("state_locked_until__isnull", False)),
|
||||||
|
fields=["state_locked_until", "state"],
|
||||||
|
name="ix_hashtag_state_locked",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AddIndex(
|
||||||
|
model_name="post",
|
||||||
|
index=models.Index(
|
||||||
|
fields=["visibility", "local", "published"],
|
||||||
|
name="ix_post_local_public_published",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AddIndex(
|
||||||
|
model_name="post",
|
||||||
|
index=models.Index(
|
||||||
|
fields=["visibility", "local", "created"],
|
||||||
|
name="ix_post_local_public_created",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AddIndex(
|
||||||
|
model_name="post",
|
||||||
|
index=models.Index(
|
||||||
|
fields=["state", "state_attempted"], name="ix_post_state_attempted"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AddIndex(
|
||||||
|
model_name="post",
|
||||||
|
index=models.Index(
|
||||||
|
condition=models.Q(("state_locked_until__isnull", False)),
|
||||||
|
fields=["state_locked_until", "state"],
|
||||||
|
name="ix_post_state_locked",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AddIndex(
|
||||||
|
model_name="postattachment",
|
||||||
|
index=models.Index(
|
||||||
|
fields=["state", "state_attempted"],
|
||||||
|
name="ix_postattachm_state_attempted",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AddIndex(
|
||||||
|
model_name="postattachment",
|
||||||
|
index=models.Index(
|
||||||
|
condition=models.Q(("state_locked_until__isnull", False)),
|
||||||
|
fields=["state_locked_until", "state"],
|
||||||
|
name="ix_postattachm_state_locked",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
|
@ -297,6 +297,14 @@ class Post(StatorModel):
|
||||||
class Meta:
|
class Meta:
|
||||||
indexes = [
|
indexes = [
|
||||||
GinIndex(fields=["hashtags"], name="hashtags_gin"),
|
GinIndex(fields=["hashtags"], name="hashtags_gin"),
|
||||||
|
models.Index(
|
||||||
|
fields=["visibility", "local", "published"],
|
||||||
|
name="ix_post_local_public_published",
|
||||||
|
),
|
||||||
|
models.Index(
|
||||||
|
fields=["visibility", "local", "created"],
|
||||||
|
name="ix_post_local_public_created",
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
class urls(urlman.Urls):
|
class urls(urlman.Urls):
|
||||||
|
|
|
@ -4,6 +4,7 @@ from typing import ClassVar, cast
|
||||||
|
|
||||||
from asgiref.sync import sync_to_async
|
from asgiref.sync import sync_to_async
|
||||||
from django.db import models, transaction
|
from django.db import models, transaction
|
||||||
|
from django.db.models.signals import class_prepared
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.utils.functional import classproperty
|
from django.utils.functional import classproperty
|
||||||
|
|
||||||
|
@ -37,6 +38,40 @@ class StateField(models.CharField):
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
def add_stator_indexes(sender, **kwargs):
|
||||||
|
"""
|
||||||
|
Inject Indexes used by StatorModel in to any subclasses. This sidesteps the
|
||||||
|
current Django inability to inherit indexes when the Model subclass defines
|
||||||
|
its own indexes.
|
||||||
|
"""
|
||||||
|
if issubclass(sender, StatorModel):
|
||||||
|
indexes = [
|
||||||
|
models.Index(
|
||||||
|
fields=["state", "state_attempted"],
|
||||||
|
name=f"ix_{sender.__name__.lower()[:11]}_state_attempted",
|
||||||
|
),
|
||||||
|
models.Index(
|
||||||
|
fields=["state_locked_until", "state"],
|
||||||
|
condition=models.Q(state_locked_until__isnull=False),
|
||||||
|
name=f"ix_{sender.__name__.lower()[:11]}_state_locked",
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
|
if not sender._meta.indexes:
|
||||||
|
# Meta.indexes needs to not be None to trigger Django behaviors
|
||||||
|
sender.Meta.indexes = []
|
||||||
|
|
||||||
|
for idx in indexes:
|
||||||
|
sender._meta.indexes.append(idx)
|
||||||
|
|
||||||
|
|
||||||
|
# class_prepared might become deprecated [1]. If it's removed, the named Index
|
||||||
|
# injection would need to happen in a metaclass subclass of ModelBase's _prepare()
|
||||||
|
#
|
||||||
|
# [1] https://code.djangoproject.com/ticket/24313
|
||||||
|
class_prepared.connect(add_stator_indexes)
|
||||||
|
|
||||||
|
|
||||||
class StatorModel(models.Model):
|
class StatorModel(models.Model):
|
||||||
"""
|
"""
|
||||||
A model base class that has a state machine backing it, with tasks to work
|
A model base class that has a state machine backing it, with tasks to work
|
||||||
|
|
|
@ -14,8 +14,7 @@ class Migration(migrations.Migration):
|
||||||
model_name="follow",
|
model_name="follow",
|
||||||
name="boosts",
|
name="boosts",
|
||||||
field=models.BooleanField(
|
field=models.BooleanField(
|
||||||
default=True,
|
default=True, help_text="Also follow boosts from this user"
|
||||||
help_text="Also follow boosts from this user",
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
66
users/migrations/0009_state_and_post_indexes.py
Normal file
66
users/migrations/0009_state_and_post_indexes.py
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
# Generated by Django 4.1.4 on 2023-01-01 17:34
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
("users", "0008_follow_boosts"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name="identity",
|
||||||
|
name="restriction",
|
||||||
|
field=models.IntegerField(
|
||||||
|
choices=[(0, "None"), (1, "Limited"), (2, "Blocked")],
|
||||||
|
db_index=True,
|
||||||
|
default=0,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AddIndex(
|
||||||
|
model_name="inboxmessage",
|
||||||
|
index=models.Index(
|
||||||
|
fields=["state", "state_attempted"],
|
||||||
|
name="ix_inboxmessag_state_attempted",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AddIndex(
|
||||||
|
model_name="inboxmessage",
|
||||||
|
index=models.Index(
|
||||||
|
condition=models.Q(("state_locked_until__isnull", False)),
|
||||||
|
fields=["state_locked_until", "state"],
|
||||||
|
name="ix_inboxmessag_state_locked",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AddIndex(
|
||||||
|
model_name="passwordreset",
|
||||||
|
index=models.Index(
|
||||||
|
fields=["state", "state_attempted"],
|
||||||
|
name="ix_passwordres_state_attempted",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AddIndex(
|
||||||
|
model_name="passwordreset",
|
||||||
|
index=models.Index(
|
||||||
|
condition=models.Q(("state_locked_until__isnull", False)),
|
||||||
|
fields=["state_locked_until", "state"],
|
||||||
|
name="ix_passwordres_state_locked",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AddIndex(
|
||||||
|
model_name="report",
|
||||||
|
index=models.Index(
|
||||||
|
fields=["state", "state_attempted"], name="ix_report_state_attempted"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AddIndex(
|
||||||
|
model_name="report",
|
||||||
|
index=models.Index(
|
||||||
|
condition=models.Q(("state_locked_until__isnull", False)),
|
||||||
|
fields=["state_locked_until", "state"],
|
||||||
|
name="ix_report_state_locked",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
|
@ -203,7 +203,7 @@ class Identity(StatorModel):
|
||||||
# Admin-only moderation fields
|
# Admin-only moderation fields
|
||||||
sensitive = models.BooleanField(default=False)
|
sensitive = models.BooleanField(default=False)
|
||||||
restriction = models.IntegerField(
|
restriction = models.IntegerField(
|
||||||
choices=Restriction.choices, default=Restriction.none
|
choices=Restriction.choices, default=Restriction.none, db_index=True
|
||||||
)
|
)
|
||||||
admin_notes = models.TextField(null=True, blank=True)
|
admin_notes = models.TextField(null=True, blank=True)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue