Merge lp:~openerp-dev/openobject-server/7.0-perf_imp_wkf_trigger-tfr into lp:openobject-server/7.0

Proposed by tfr (Openerp)
Status: Needs review
Proposed branch: lp:~openerp-dev/openobject-server/7.0-perf_imp_wkf_trigger-tfr
Merge into: lp:openobject-server/7.0
Diff against target: 25 lines (+7/-1)
1 file modified
openerp/osv/orm.py (+7/-1)
To merge this branch: bzr merge lp:~openerp-dev/openobject-server/7.0-perf_imp_wkf_trigger-tfr
Reviewer Review Type Date Requested Status
OpenERP Core Team Pending
Review via email: mp+209927@code.launchpad.net

Description of the change

When write is call for more then one ids, the query "SELECT id FROM wkf_instance WHERE res_id = ... AND res_type = '.....' AND state = 'active';" is called for each id in the write.

This is necessary to trigger the workflow but totally unecessary when there is no workflow for the current object.

The patch check the existance of a workflow for the object (1 query) and if there is no workflow do not call trigger_write and thus avoid calling N times the select query on wkf instance.

The improvement is small for a smal amount of records but for 5000 it can multiple the time by 3

To post a comment you must log in.

Unmerged revisions

5256. By tfr (Openerp)

[PERF] Don't try to trigger workflow on write when there is no workflow for the current model, then avoiding unecessary o(n) query on wkf_instance

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'openerp/osv/orm.py'
2--- openerp/osv/orm.py 2014-03-05 14:30:50 +0000
3+++ openerp/osv/orm.py 2014-03-07 13:45:32 +0000
4@@ -3983,6 +3983,12 @@
5 returned_ids = [x['id'] for x in cr.dictfetchall()]
6 self._check_record_rules_result_count(cr, uid, sub_ids, returned_ids, operation, context=context)
7
8+ def _workflow_check_trigger(self, cr, uid, ids, trigger, context=None):
9+ cr.execute('select id from wkf where osv = %s', (self._name,))
10+ if cr.fetchone():
11+ self._workflow_trigger(cr, uid, ids, trigger, context)
12+
13+
14 def _workflow_trigger(self, cr, uid, ids, trigger, context=None):
15 """Call given workflow trigger as a result of a CRUD operation"""
16 wf_service = netsvc.LocalService("workflow")
17@@ -4341,7 +4347,7 @@
18 todo.append(id)
19 self.pool.get(object)._store_set_values(cr, user, todo, fields_to_recompute, context)
20
21- self._workflow_trigger(cr, user, ids, 'trg_write', context=context)
22+ self._workflow_check_trigger(cr, user, ids, 'trg_write', context=context)
23 return True
24
25 #