Skip to content

Commit d868742

Browse files
committed
perf(spp_programs): add composite indexes for frequent query patterns
Add indexes on spp_entitlement(cycle_id, partner_id), spp_entitlement(cycle_id, state), and spp_program_membership(program_id, state) to avoid sequential scans during prepare_entitlements duplicate checks, cycle computed fields, and beneficiary pagination.
1 parent 1a91296 commit d868742

4 files changed

Lines changed: 92 additions & 0 deletions

File tree

spp_programs/models/entitlement_base_model.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,23 @@ class SPPEntitlement(models.Model):
1717
_order = "partner_id asc,id desc"
1818
_check_company_auto = True
1919

20+
def init(self):
21+
super().init()
22+
self.env.cr.execute(
23+
"""
24+
CREATE INDEX IF NOT EXISTS
25+
spp_entitlement_cycle_id_partner_id_idx
26+
ON spp_entitlement (cycle_id, partner_id)
27+
"""
28+
)
29+
self.env.cr.execute(
30+
"""
31+
CREATE INDEX IF NOT EXISTS
32+
spp_entitlement_cycle_id_state_idx
33+
ON spp_entitlement (cycle_id, state)
34+
"""
35+
)
36+
2037
@api.model
2138
def _generate_code(self):
2239
return str(uuid4())[4:-8][3:]

spp_programs/models/program_membership.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,16 @@ class SPPProgramMembership(models.Model):
1919
_inherits = {"res.partner": "partner_id"}
2020
_order = "id desc"
2121

22+
def init(self):
23+
super().init()
24+
self.env.cr.execute(
25+
"""
26+
CREATE INDEX IF NOT EXISTS
27+
spp_program_membership_program_id_state_idx
28+
ON spp_program_membership (program_id, state)
29+
"""
30+
)
31+
2232
partner_id = fields.Many2one(
2333
"res.partner",
2434
"Registrant",

spp_programs/tests/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@
1515
from . import test_eligibility_cel_integration
1616
from . import test_compliance_cel
1717
from . import test_create_program_wizard_cel
18+
from . import test_composite_indexes
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# Part of OpenSPP. See LICENSE file for full copyright and licensing details.
2+
from odoo.tests import TransactionCase
3+
4+
5+
class TestCompositeIndexes(TransactionCase):
6+
"""Test that composite indexes exist for frequent query patterns."""
7+
8+
def test_entitlement_cycle_partner_index_exists(self):
9+
"""Composite index on spp_entitlement(cycle_id, partner_id) must exist.
10+
11+
The prepare_entitlements duplicate check searches entitlements by
12+
(cycle_id, partner_id). Without this index, each batch does a
13+
sequential scan.
14+
"""
15+
self.env.cr.execute(
16+
"""
17+
SELECT 1 FROM pg_indexes
18+
WHERE tablename = 'spp_entitlement'
19+
AND indexdef LIKE '%%cycle_id%%'
20+
AND indexdef LIKE '%%partner_id%%'
21+
"""
22+
)
23+
self.assertTrue(
24+
self.env.cr.fetchone(),
25+
"Composite index on (cycle_id, partner_id) must exist on spp_entitlement",
26+
)
27+
28+
def test_entitlement_cycle_state_index_exists(self):
29+
"""Composite index on spp_entitlement(cycle_id, state) must exist.
30+
31+
Cycle computed fields (total_amount, show_approve_button,
32+
entitlements_count) filter entitlements by cycle_id and state.
33+
"""
34+
self.env.cr.execute(
35+
"""
36+
SELECT 1 FROM pg_indexes
37+
WHERE tablename = 'spp_entitlement'
38+
AND indexdef LIKE '%%cycle_id%%'
39+
AND indexdef LIKE '%%state%%'
40+
"""
41+
)
42+
self.assertTrue(
43+
self.env.cr.fetchone(),
44+
"Composite index on (cycle_id, state) must exist on spp_entitlement",
45+
)
46+
47+
def test_program_membership_program_state_index_exists(self):
48+
"""Composite index on spp_program_membership(program_id, state) must exist.
49+
50+
get_beneficiaries() and count_beneficiaries() filter by
51+
(program_id, state) on every async batch dispatch.
52+
"""
53+
self.env.cr.execute(
54+
"""
55+
SELECT 1 FROM pg_indexes
56+
WHERE tablename = 'spp_program_membership'
57+
AND indexdef LIKE '%%program_id%%'
58+
AND indexdef LIKE '%%state%%'
59+
"""
60+
)
61+
self.assertTrue(
62+
self.env.cr.fetchone(),
63+
"Composite index on (program_id, state) must exist on spp_program_membership",
64+
)

0 commit comments

Comments
 (0)