From 130fbeb0572a5ac4ebbe360e27f95cd2e46eb552 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Sat, 17 Aug 2019 20:25:18 +0200 Subject: [PATCH] [FIX] account_financial_report: Avoid slow vacuum due to ondelete=cascade `report_journal_ledger` is auto-vacuumed as any transient model, but has some ondelete="cascade" constraints that auto-remove subtables when a record is removed, doing this operation very slow when selecting these sub-records. Letting default ondelete="set null" would result in same performance bottleneck, as the select on sub-table is performed the same for setting "null" value on them. As a solution, and for avoiding a costly index operation, we delete by SQL sub-tables rows in advance. A bit of extra logic has been added for avoiding to remove that records if it's not the turn of vacuum the parent table. --- account_financial_report/__manifest__.py | 2 +- account_financial_report/readme/CONTRIBUTORS.rst | 4 ++++ account_financial_report/report/journal_ledger.py | 13 +++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/account_financial_report/__manifest__.py b/account_financial_report/__manifest__.py index 4bf40b51..a80ed871 100644 --- a/account_financial_report/__manifest__.py +++ b/account_financial_report/__manifest__.py @@ -4,7 +4,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { 'name': 'Account Financial Reports', - 'version': '12.0.1.2.1', + 'version': '12.0.1.2.2', 'category': 'Reporting', 'summary': 'OCA Financial Reports', 'author': 'Camptocamp SA,' diff --git a/account_financial_report/readme/CONTRIBUTORS.rst b/account_financial_report/readme/CONTRIBUTORS.rst index 4e9f615c..4c3dafc7 100644 --- a/account_financial_report/readme/CONTRIBUTORS.rst +++ b/account_financial_report/readme/CONTRIBUTORS.rst @@ -15,6 +15,10 @@ * Alexis de Lattre * Mihai Fekete * Miquel Raïch +* `Tecnativa `__: + + * Pedro M. Baeza + * Sergio Teruel Much of the work in this module was done at a sprint in Sorrento, Italy in April 2016. diff --git a/account_financial_report/report/journal_ledger.py b/account_financial_report/report/journal_ledger.py index 8ce26caf..3e4d7293 100644 --- a/account_financial_report/report/journal_ledger.py +++ b/account_financial_report/report/journal_ledger.py @@ -613,6 +613,19 @@ class ReportJournalLedger(models.TransientModel): def get_html(self, given_context=None): return self._get_html() + @api.model + def _transient_vacuum(self, force=False): + """Remove journal ledger subtables first for avoiding a costly + ondelete operation. + """ + # Next 3 lines adapted from super method for mimicking behavior + cls = type(self) + if not force and (cls._transient_check_count < 21): + return True # no vacuum cleaning this time + self.env.cr.execute("DELETE FROM report_journal_ledger_move_line") + self.env.cr.execute("DELETE FROM report_journal_ledger_move") + return super(ReportJournalLedger, self)._transient_vacuum(force=force) + class ReportJournalLedgerJournal(models.TransientModel):