[IMP] website_crm_score: optimize computation of static rules

Added new field `event_based` for marking dynamic rules that need
to be re-evaluated even for leads that were checked previously
and did not match.  (default: False)

If this field is not set to true, check only newer leads that
were never checked before, significantly speeding up the
check when there are hundreds of thousands of leads.

Closes #6019
This commit is contained in:
Jeremy Kersten
2015-04-10 18:23:32 +02:00
committed by Olivier Dony
parent fd73263c51
commit 7fecbc91eb
2 changed files with 17 additions and 1 deletions
@@ -41,6 +41,14 @@ class website_crm_score(models.Model):
name = fields.Char('Name', required=True)
value = fields.Float('Value', required=True)
domain = fields.Char('Domain', required=True)
event_based = fields.Boolean(
'Event-based rule',
help='When checked, the rule will be re-evaluated every time, even for leads '
'that have already been checked previously. This option incurs a large '
'performance penalty, so it should be checked only for rules that depend '
'on dynamic events',
default=False
)
running = fields.Boolean('Active', default=True)
leads_count = fields.Integer(compute='_count_leads')
@@ -64,6 +72,13 @@ class website_crm_score(models.Model):
where_clause += """ AND (id NOT IN (SELECT lead_id FROM crm_lead_score_rel WHERE score_id = %s)) """
where_params.append(score['id'])
if not self.event_based:
# Only check leads that are newer than the last matching lead.
# Could be based on a "last run date" for a more precise optimization
where_clause += """ AND (id > (SELECT COALESCE(max(lead_id), 0)
FROM crm_lead_score_rel WHERE score_id = %s)) """
where_params.append(score['id'])
self._cr.execute("""INSERT INTO crm_lead_score_rel
SELECT crm_lead.id as lead_id, %s as score_id
FROM crm_lead
+2 -1
View File
@@ -80,6 +80,7 @@
<group>
<field name="value"/>
<field name="domain"/>
<field name="event_based"/>
<field name="running"/>
</group>
<button name="assign_scores_to_leads" type="object" string=" Score Now" class="oe_link"/>
@@ -303,4 +304,4 @@
<menuitem id="leads_dry_run" name="Assignation dry run" parent="leads_menu" action="lead_dry_run_action" groups="base.group_no_one"/>
</data>
</openerp>
</openerp>