base_adresse: ajouter des index sur unaccent_name et zipcode et tous les champs qui servent aux recherches (#66694) #147

Merged
bdauvergne merged 1 commits from wip/66694-base-adresse-ajouter-des-index-s into main 2024-01-15 18:18:02 +01:00
2 changed files with 85 additions and 0 deletions

View File

@ -0,0 +1,63 @@
# Generated by Django 3.2.18 on 2023-11-29 18:06
import django.contrib.postgres.indexes
import django.db.models.functions.text
from django.contrib.postgres import operations as postgresql_operations
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('base_adresse', '0030_auto_20220627_1511'),
]
operations = [
postgresql_operations.TrigramExtension(),
migrations.AddIndex(
model_name='citymodel',
index=models.Index(fields=['code'], name='base_adress_code_e169d0_idx'),
),
migrations.AddIndex(
model_name='citymodel',
index=models.Index(fields=['zipcode'], name='base_adress_zipcode_79aa6f_idx'),
),
migrations.AddIndex(
model_name='citymodel',
index=models.Index(
django.db.models.functions.text.Upper('unaccent_name'), name='base_adresse_city_name_idx'
),
),
migrations.AddIndex(
model_name='departmentmodel',
index=models.Index(
django.db.models.functions.text.Upper('unaccent_name'), name='base_adresse_dept_name_idx'
),
),
migrations.AddIndex(
model_name='regionmodel',
index=models.Index(
django.db.models.functions.text.Upper('unaccent_name'), name='base_adresse_region_name_idx'
),
),
migrations.AddIndex(
model_name='streetmodel',
index=models.Index(fields=['ban_id'], name='base_adress_ban_id_2c35ab_idx'),
),
migrations.AddIndex(
model_name='streetmodel',
index=models.Index(fields=['zipcode'], name='base_adress_zipcode_bf7091_idx'),
),
migrations.AddIndex(
model_name='streetmodel',
index=models.Index(fields=['citycode'], name='base_adress_citycod_428b79_idx'),
),
migrations.AddIndex(
model_name='streetmodel',
index=django.contrib.postgres.indexes.GinIndex(
django.contrib.postgres.indexes.OpClass(
django.db.models.functions.text.Upper('unaccent_name'), 'gin_trgm_ops'
),
name='base_adresse_street_name_idx',
),
),
]

View File

@ -5,9 +5,11 @@ import json
from io import StringIO
from urllib import parse as urlparse
from django.contrib.postgres import indexes as postgresql_indexes
from django.core.exceptions import FieldError
from django.db import connection, models
from django.db.models import JSONField, Q
from django.db.models.functions import Upper
from django.utils import timezone
from django.utils.http import urlencode
from django.utils.translation import gettext_lazy as _
@ -735,6 +737,15 @@ class StreetModel(UnaccentNameMixin, models.Model):
class Meta:
ordering = ['unaccent_name', 'name']
indexes = [
models.Index(fields=['ban_id']),
models.Index(fields=['zipcode']),
models.Index(fields=['citycode']),
nroche marked this conversation as resolved Outdated

Si on a 2 connecteurs BAN ?
(parce que, bien que je n'ai pas compris pourquoi, mais c'est le cas sur parsifal)

Si on a 2 connecteurs BAN ? (parce que, bien que je n'ai pas compris pourquoi, mais c'est le cas sur parsifal)

Je n'ai pas compris ce que tu insinues, peux-tu expliciter ?

Je n'ai pas compris ce que tu insinues, peux-tu expliciter ?

Oui déso.
name='%(app_label)s_street_name_idx'
ici, j'ai l'impression qu'on va utiliser le même index pour 2 connecteurs instanciés sur un même tenant.
Je m'attendais à un truc comme : "%s%s" % (self.resource.slug, self.resource.get_connector_slug())

Oui déso. `name='%(app_label)s_street_name_idx'` ici, j'ai l'impression qu'on va utiliser le même index pour 2 connecteurs instanciés sur un même tenant. Je m'attendais à un truc comme : "%s%s" % (self.resource.slug, self.resource.get_connector_slug())

Et je réalise que ma remarque démontre mon manque de connaissance ici.
Le filtrage sur les objets connecteurs est déjà fait en amont sur le QuerySet, ex :
streets = self.streetmodel_set.all()
Il n'y a pas de distinction à faire sur les index pour isoler les instance des connecteurs.

Et je réalise que ma remarque démontre mon manque de connaissance ici. Le filtrage sur les objets connecteurs est déjà fait en amont sur le QuerySet, ex : `streets = self.streetmodel_set.all()` Il n'y a pas de distinction à faire sur les index pour isoler les instance des connecteurs.
postgresql_indexes.GinIndex(
postgresql_indexes.OpClass(Upper('unaccent_name'), 'gin_trgm_ops'),
name='%(app_label)s_street_name_idx',
),
]
def __str__(self):
return self.name
@ -759,6 +770,9 @@ class RegionModel(UnaccentNameMixin, models.Model):
class Meta:
ordering = ['code']
unique_together = ('resource', 'code')
indexes = [
models.Index(Upper('unaccent_name'), name='%(app_label)s_region_name_idx'),
]
def __str__(self):
return '%s %s' % (self.code, self.name)
@ -786,6 +800,9 @@ class DepartmentModel(UnaccentNameMixin, models.Model):
class Meta:
ordering = ['code']
unique_together = ('resource', 'code')
indexes = [
models.Index(Upper('unaccent_name'), name='%(app_label)s_dept_name_idx'),
]
def __str__(self):
return '%s %s' % (self.code, self.name)
@ -821,6 +838,11 @@ class CityModel(UnaccentNameMixin, models.Model):
class Meta:
ordering = ['-population', 'zipcode', 'unaccent_name', 'name']
unique_together = ('resource', 'code', 'zipcode')
indexes = [
models.Index(fields=['code']),
models.Index(fields=['zipcode']),
models.Index(Upper('unaccent_name'), name='%(app_label)s_city_name_idx'),
]
def __str__(self):
return '%s %s' % (self.zipcode, self.name)