[Erp5-report] r39032 jm - in /erp5/trunk/products: ERP5/mixin/composition.py ERP5Type/Cache.py

nobody at svn.erp5.org nobody at svn.erp5.org
Mon Oct 11 21:26:46 CEST 2010


Author: jm
Date: Mon Oct 11 21:26:46 2010
New Revision: 39032

URL: http://svn.erp5.org?rev=39032&view=rev
Log:
Fix possible performance issues with transactional_cached decorator

Modified:
    erp5/trunk/products/ERP5/mixin/composition.py
    erp5/trunk/products/ERP5Type/Cache.py

Modified: erp5/trunk/products/ERP5/mixin/composition.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/mixin/composition.py?rev=39032&r1=39031&r2=39032&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/mixin/composition.py [utf8] (original)
+++ erp5/trunk/products/ERP5/mixin/composition.py [utf8] Mon Oct 11 21:26:46 2010
@@ -37,7 +37,7 @@ from Products.ZSQLCatalog.SQLCatalog imp
 
 
 @transactional_cached()
-def _getEffectiveModel(self, start_date=None, stop_date=None):
+def _getEffectiveModel(self, start_date, stop_date):
   """Return the most appropriate model using effective_date, expiration_date
   and version number.
   An effective model is a model which start and stop_date are equal (or
@@ -79,7 +79,7 @@ def _getEffectiveModel(self, start_date=
 
 
 @transactional_cached()
-def _findPredicateList(container_list, portal_type=None):
+def _findPredicateList(container_list, portal_type):
   predicate_list = []
   reference_dict = {}
   for container in container_list:
@@ -164,7 +164,9 @@ class CompositionMixin:
 
   security.declareProtected(Permissions.AccessContentsInformation,
                             'asComposedDocument')
-  asComposedDocument = transactional_cached()(asComposedDocument)
+  asComposedDocument = transactional_cached(
+    lambda self, portal_type_list=None: (self, portal_type_list)
+    )(asComposedDocument)
 
   # XXX add accessors to get properties from '_effective_model_list' ?
   #     (cf PaySheetModel)

Modified: erp5/trunk/products/ERP5Type/Cache.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Cache.py?rev=39032&r1=39031&r2=39032&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/Cache.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/Cache.py [utf8] Mon Oct 11 21:26:46 2010
@@ -334,9 +334,15 @@ def caching_instance_method(*args, **kw)
     return lambda *args, **kw: caching_method(*args, **kw)
   return decorator
 
-def transactional_cached(key_method=lambda *args: args):
+_default_key_method = lambda *args: args
+def transactional_cached(key_method=_default_key_method):
   @simple_decorator
   def decorator(function):
+    # Unfornately, we can only check functions (not other callable like class).
+    assert (key_method is not _default_key_method or
+            not getattr(function, 'func_defaults', None)), (
+      "default 'key_method' of 'transactional_cached' does not work with"
+      " functions having default values for parameters")
     key = repr(function)
     def wrapper(*args, **kw):
       cache = getTransactionalVariable().setdefault(key, {})




More information about the Erp5-report mailing list