Skip to content

Commit a550add

Browse files
kneckinatorclaude
andcommitted
perf(spp_programs): add composite indexes for frequent query patterns
Add indexes on (cycle_id, partner_id), (cycle_id, state) for spp_entitlement and (program_id, state) for spp_program_membership. These cover hot paths in prepare_entitlements, cycle computed fields, and get_beneficiaries/count_beneficiaries. The init() methods are placed in entitlement.py and program_membership.py (the actual loaded model classes), not in entitlement_base_model.py which is dead code never imported in models/__init__.py. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 66c1264 commit a550add

4 files changed

Lines changed: 94 additions & 0 deletions

File tree

spp_programs/models/entitlement.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,24 @@ class SPPEntitlement(models.Model):
2929
# Cached model ID for performance (class-level cache)
3030
_entitlement_model_id_cache = None
3131

32+
def init(self):
33+
res = super().init()
34+
self.env.cr.execute(
35+
"""
36+
CREATE INDEX IF NOT EXISTS
37+
spp_entitlement_cycle_id_partner_id_idx
38+
ON spp_entitlement (cycle_id, partner_id)
39+
"""
40+
)
41+
self.env.cr.execute(
42+
"""
43+
CREATE INDEX IF NOT EXISTS
44+
spp_entitlement_cycle_id_state_idx
45+
ON spp_entitlement (cycle_id, state)
46+
"""
47+
)
48+
return res
49+
3250
@api.model
3351
def _generate_code(self):
3452
return str(uuid4())[4:-8][3:]

spp_programs/models/program_membership.py

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

22+
def init(self):
23+
res = 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+
return res
32+
2233
partner_id = fields.Many2one(
2334
"res.partner",
2435
"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)