[FIX] OPW 577963: ir_attachment: speed up ir.attachment search for large databases
authorOlivier Dony <odo@openerp.com>
Tue, 21 Aug 2012 14:41:28 +0000 (16:41 +0200)
committerXavier ALT <xal@openerp.com>
Tue, 21 Aug 2012 14:41:28 +0000 (16:41 +0200)
  Frequents calls to list.remove() were being a bottleneck for large
  document lists (100k+). Using a set make remove() calls much faster.

  This commit has a corresponding server patch in the core ir.attachment
  search method.

bzr revid: xal@openerp.com-20120821144128-nbuta933adyufeg4

addons/document/document.py

index 04a7bbc..9011eaf 100644 (file)
@@ -186,6 +186,10 @@ class document_file(osv.osv):
         if not ids:
             return 0 if count else []
 
+        # Work with a set, as list.remove() is prohibitive for large lists of documents
+        # (takes 20+ seconds on a db with 100k docs during search_count()!)
+        ids = set(ids)
+
         # Filter out documents that are in directories that the user is not allowed to read.
         # Must use pure SQL to avoid access rules exceptions (we want to remove the records,
         # not fail), and the records have been filtered in parent's search() anyway.
@@ -197,8 +201,8 @@ class document_file(osv.osv):
         for doc_id, parent_id in doc_pairs:
             if parent_id in disallowed_parents:
                 ids.remove(doc_id)
-        return len(ids) if count else ids
 
+        return len(ids) if count else list(ids)
 
     def copy(self, cr, uid, id, default=None, context=None):
         if not default: