From 3c7872c4cdd5d9ccefb202b9d1085720b53f25ee Mon Sep 17 00:00:00 2001
From: Yoshinori Okuji <yo@nexedi.com>
Date: Fri, 23 Sep 2005 19:37:16 +0000
Subject: [PATCH] Implement an argument cache. This speeds up the indexing of
 movements 1.5 time faster.

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@3850 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 product/ZSQLCatalog/SQLCatalog.py | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/product/ZSQLCatalog/SQLCatalog.py b/product/ZSQLCatalog/SQLCatalog.py
index b70a116cc1..6f0e7140ed 100755
--- a/product/ZSQLCatalog/SQLCatalog.py
+++ b/product/ZSQLCatalog/SQLCatalog.py
@@ -935,6 +935,8 @@ class Catalog(Folder, Persistent, Acquisition.Implicit, ExtensionClass.Base):
 
     methods = self.sql_catalog_object_list
     econtext_cache = {}
+    argument_cache = {}
+
     for method_name in methods:
       kw = {}
       #LOG('catalogObjectList', 0, 'method_name = %s, self.isMethodFiltered(method_name) = %r, self.filter_dict.has_key(method_name) = %r' % (method_name, self.isMethodFiltered(method_name), self.filter_dict.has_key(method_name)))
@@ -975,18 +977,17 @@ class Catalog(Folder, Persistent, Acquisition.Implicit, ExtensionClass.Base):
           value_list = []
           append = value_list.append
           for object in catalogged_object_list:
-            #LOG('catalog_object_list: object.uid',0,getattr(object,'uid',None))
-            #LOG('catalog_object_list: object.path',0,object.getPhysicalPath())
             try:
-              value = getattr(object, arg, None)
-              if callable(value):
-                value = value()
-              #if arg == 'optimised_roles_and_users':
-              #  LOG('catalogObjectList', 0, 'object = %r, arg = %r, value = %r' % (object, arg, value,))
-              append(value)
-            except:
-              #LOG("SQLCatalog Warning: Callable value could not be called",0,str((path, arg, method_name)))
-              append(None)
+              value = argument_cache[(object.uid, arg)]
+            except KeyError:
+              try:
+                value = getattr(object, arg, None)
+                if callable(value):
+                  value = value()
+              except:
+                value = None
+              argument_cache[(object.uid, arg)] = value
+            append(value)
           kw[arg] = value_list
 
       method = aq_base(method).__of__(self) # Use method in the context of portal_catalog
-- 
2.30.9