Skip to content

Commit 0b1ee4f

Browse files
gonzalesedwin1123kneckinator
authored andcommitted
feat(spp_registry): add database indexes for search performance
Add B-tree indexes on is_registrant, is_group, registration_date, reg_id.value, and phone_no fields. Add pg_trgm trigram GIN indexes on name, email, and phone_no to support efficient ILIKE substring matching. Without these, ILIKE '%term%' queries do full table scans.
1 parent 32a5c78 commit 0b1ee4f

4 files changed

Lines changed: 28 additions & 6 deletions

File tree

spp_registry/__manifest__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
{
44
"name": "OpenSPP Registry",
55
"category": "OpenSPP/Core",
6-
"version": "19.0.2.0.0",
6+
"version": "19.0.2.0.1",
77
"sequence": 1,
88
"author": "OpenSPP.org",
99
"website": "https://github.com/OpenSPP/OpenSPP2",

spp_registry/models/phone_number.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class SPPPhoneNumber(models.Model):
2525
index=True,
2626
domain=[("is_registrant", "=", True)],
2727
)
28-
phone_no = fields.Char("Phone Number", required=True)
28+
phone_no = fields.Char("Phone Number", required=True, index=True)
2929
phone_sanitized = fields.Char(compute="_compute_phone_sanitized", store=True)
3030
date_collected = fields.Date(
3131
default=fields.Date.today,
@@ -34,6 +34,14 @@ class SPPPhoneNumber(models.Model):
3434
disabled_by = fields.Many2one("res.users")
3535
country_id = fields.Many2one("res.country", "Country")
3636

37+
def init(self):
38+
"""Create trigram index for phone number ILIKE search."""
39+
self.env.cr.execute("""
40+
CREATE EXTENSION IF NOT EXISTS pg_trgm;
41+
CREATE INDEX IF NOT EXISTS spp_phone_number_phone_no_trgm_idx
42+
ON spp_phone_number USING gin (phone_no gin_trgm_ops);
43+
""")
44+
3745
@api.onchange("date_collected")
3846
def _check_date_collected(self):
3947
for record in self:

spp_registry/models/reg_id.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class SPPRegistrantID(models.Model):
2323
)
2424
available_id_type_ids = fields.Many2many("spp.vocabulary.code", compute="_compute_available_id_type_ids")
2525
id_type_id = fields.Many2one("spp.vocabulary.code", "ID Type", required=True)
26-
value = fields.Char(size=100)
26+
value = fields.Char(size=100, index=True)
2727

2828
expiry_date = fields.Date()
2929
id_type_as_str = fields.Char(related="id_type_id.display")

spp_registry/models/registrant.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ class SPPRegistrant(models.Model):
3333
disabled_by = fields.Many2one("res.users")
3434

3535
reg_ids = fields.One2many("spp.registry.id", "partner_id", "Registrant IDs")
36-
is_registrant = fields.Boolean("Registrant")
37-
is_group = fields.Boolean("Group")
36+
is_registrant = fields.Boolean("Registrant", index=True)
37+
is_group = fields.Boolean("Group", index=True)
3838

3939
name = fields.Char(index=True)
4040

@@ -44,7 +44,7 @@ class SPPRegistrant(models.Model):
4444
phone_number_ids = fields.One2many("spp.phone.number", "partner_id", "Phone Numbers")
4545

4646
company_id = fields.Many2one("res.company", required=True, default=lambda self: self.env.company)
47-
registration_date = fields.Date(default=lambda self: fields.Date.today())
47+
registration_date = fields.Date(default=lambda self: fields.Date.today(), index=True)
4848
tags_ids = fields.Many2many(
4949
"spp.vocabulary.code",
5050
relation="res_partner_registrant_tag_rel",
@@ -79,6 +79,20 @@ class SPPRegistrant(models.Model):
7979
compute="_compute_relationships_count",
8080
)
8181

82+
def init(self):
83+
"""Create trigram indexes for ILIKE search performance.
84+
85+
Standard B-tree indexes cannot help with ILIKE '%term%' (leading wildcard).
86+
Trigram GIN indexes allow PostgreSQL to use indexes for substring matching.
87+
"""
88+
self.env.cr.execute("""
89+
CREATE EXTENSION IF NOT EXISTS pg_trgm;
90+
CREATE INDEX IF NOT EXISTS res_partner_name_trgm_idx
91+
ON res_partner USING gin (name gin_trgm_ops);
92+
CREATE INDEX IF NOT EXISTS res_partner_email_trgm_idx
93+
ON res_partner USING gin (email gin_trgm_ops);
94+
""")
95+
8296
@api.onchange("phone_number_ids")
8397
def phone_number_ids_change(self):
8498
phone = ""

0 commit comments

Comments
 (0)