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
if not ids:
return 0 if count else []
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.
# 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.
for doc_id, parent_id in doc_pairs:
if parent_id in disallowed_parents:
ids.remove(doc_id)
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:
def copy(self, cr, uid, id, default=None, context=None):
if not default: