[PATCH] Fix slow Patch counting query
Daniel Axtens
dja at axtens.net
Fri Mar 9 03:08:23 AEDT 2018
> (It turns out all of this is all for the "| NN patches" counter we
> added to the filter bar!!)
Ah, this is wrong, the paginator needs it too.
> I think we drop the patch counter for stable and try to get this and
So - AFAICT - we can't fix this in stable.
> the event stuff merged to master promptly, and just tag 2.1. (To that
So we should tag 2.1 sooner rather than later!
Regards,
Daniel
> end, I will re-read and finish reviewing the event stuff soon.)
> ---
> patchwork/migrations/0024_patch_patch_project.py | 39 ++++++++++++++++++++++++
> patchwork/models.py | 4 +++
> patchwork/parser.py | 1 +
> patchwork/views/__init__.py | 2 +-
> 4 files changed, 45 insertions(+), 1 deletion(-)
> create mode 100644 patchwork/migrations/0024_patch_patch_project.py
>
> diff --git a/patchwork/migrations/0024_patch_patch_project.py b/patchwork/migrations/0024_patch_patch_project.py
> new file mode 100644
> index 000000000000..76d8f144c9dd
> --- /dev/null
> +++ b/patchwork/migrations/0024_patch_patch_project.py
> @@ -0,0 +1,39 @@
> +# -*- coding: utf-8 -*-
> +# Generated by Django 1.11.10 on 2018-03-08 01:51
> +from __future__ import unicode_literals
> +
> +from django.db import migrations, models
> +import django.db.models.deletion
> +
> +
> +class Migration(migrations.Migration):
> + # per migration 16, but note this seems to be going away
> + # in new PostgreSQLs (https://stackoverflow.com/questions/12838111/south-cannot-alter-table-because-it-has-pending-trigger-events#comment44629663_12838113)
> + atomic = False
> +
> + dependencies = [
> + ('patchwork', '0023_timezone_unify'),
> + ]
> +
> + operations = [
> + migrations.AddField(
> + model_name='patch',
> + name='patch_project',
> + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='patchwork.Project'),
> + preserve_default=False,
> + ),
> +
> + # as with 10, this will break if you use non-default table names
> + migrations.RunSQL('''UPDATE patchwork_patch SET patch_project_id =
> + (SELECT project_id FROM patchwork_submission
> + WHERE patchwork_submission.id =
> + patchwork_patch.submission_ptr_id);'''
> + ),
> +
> + migrations.AlterField(
> + model_name='patch',
> + name='patch_project',
> + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='patchwork.Project'),
> + ),
> +
> + ]
> diff --git a/patchwork/models.py b/patchwork/models.py
> index b2491752f04a..3b905c4cd75b 100644
> --- a/patchwork/models.py
> +++ b/patchwork/models.py
> @@ -423,6 +423,10 @@ class Patch(SeriesMixin, Submission):
> archived = models.BooleanField(default=False)
> hash = HashField(null=True, blank=True)
>
> + # duplicate project from submission in subclass so we can count the
> + # patches in a project without needing to do a JOIN.
> + patch_project = models.ForeignKey(Project, on_delete=models.CASCADE)
> +
> objects = PatchManager()
>
> @staticmethod
> diff --git a/patchwork/parser.py b/patchwork/parser.py
> index 803e98592fa8..805037c72d73 100644
> --- a/patchwork/parser.py
> +++ b/patchwork/parser.py
> @@ -1004,6 +1004,7 @@ def parse_mail(mail, list_id=None):
> patch = Patch.objects.create(
> msgid=msgid,
> project=project,
> + patch_project=project,
> name=name[:255],
> date=date,
> headers=headers,
> diff --git a/patchwork/views/__init__.py b/patchwork/views/__init__.py
> index 3baf2999a836..f8d23a388ac7 100644
> --- a/patchwork/views/__init__.py
> +++ b/patchwork/views/__init__.py
> @@ -270,7 +270,7 @@ def generic_list(request, project, view, view_args=None, filter_settings=None,
> context['filters'].set_status(filterclass, setting)
>
> if patches is None:
> - patches = Patch.objects.filter(project=project)
> + patches = Patch.objects.filter(patch_project=project)
>
> # annotate with tag counts
> patches = patches.with_tag_counts(project)
> --
> 2.14.1
More information about the Patchwork
mailing list