[Erp5-report] r35908 jm - in /erp5/trunk/products/ERP5Type: Core/Folder.py Tool/TypesTool.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Wed Jun 2 16:49:06 CEST 2010
Author: jm
Date: Wed Jun 2 16:49:05 2010
New Revision: 35908
URL: http://svn.erp5.org?rev=35908&view=rev
Log:
Revert [35537] and speed up contentValues by optimizing TypesTool.listContentTypes
[35537] was committed for performance reason, but it changed the behaviour of
Folder.contentValues
Modified:
erp5/trunk/products/ERP5Type/Core/Folder.py
erp5/trunk/products/ERP5Type/Tool/TypesTool.py
Modified: erp5/trunk/products/ERP5Type/Core/Folder.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Core/Folder.py?rev=35908&r1=35907&r2=35908&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/Core/Folder.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/Core/Folder.py [utf8] Wed Jun 2 16:49:05 2010
@@ -1431,16 +1431,17 @@
def contentValues(self, *args, **kw):
# Returns a list of documents contained in this folder.
# ( no docstring to prevent publishing )
+ portal_type_id_list = self._getTypesTool().listContentTypes()
filter_kw = kw.pop('filter', None) or {}
portal_type = kw.pop('portal_type', None)
if 'portal_type' in filter_kw:
portal_type = filter_kw.pop('portal_type')
if portal_type is None:
- kw['portal_type'] = self._getTypesTool().listContentTypes()
+ kw['portal_type'] = portal_type_id_list
else:
if isinstance(portal_type, str):
portal_type = portal_type,
- kw['portal_type'] = portal_type
+ kw['portal_type'] = [x for x in portal_type if x in portal_type_id_list]
object_list = self.objectValues(*args, **kw)
if filter_kw:
object_list = filter(ContentFilter(**filter_kw), object_list)
Modified: erp5/trunk/products/ERP5Type/Tool/TypesTool.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Tool/TypesTool.py?rev=35908&r1=35907&r2=35908&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/Tool/TypesTool.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/Tool/TypesTool.py [utf8] Wed Jun 2 16:49:05 2010
@@ -16,6 +16,7 @@
##############################################################################
import imp, sys, warnings
+from itertools import chain
import zope.interface
from Acquisition import aq_base
from AccessControl import ClassSecurityInfo
@@ -30,6 +31,47 @@
from Products.ERP5Type.interfaces import ITypeProvider, ITypesTool
+class ComposedObjectIds(object):
+ """Sequence type used to iterate efficiently over a union of folders
+
+ Returned values are ids of contained objects.
+ This type should used instead of building a simple list from the concatenation
+ of multiple calls on objectIds.
+
+ Note this class even implements '__contains__', which makes:
+ 'some_id' in ComposedObjectIds([container])
+ faster than:
+ 'some_id' in container.objectIds()
+
+ XXX Is it only useful for TypesTool ?
+ If not, this should it be moved in another place, like ERP5Type.Utils
+ """
+ __allow_access_to_unprotected_subobjects__ = 1
+
+ def __init__(self, container_list):
+ self._container_list = container_list
+
+ def __contains__(self, item):
+ for container in self._container_list:
+ if container.has_key(item):
+ return True
+ return False
+
+ def __iter__(self):
+ return chain(*[container.objectIds() for container in self._container_list])
+
+ def __len__(self):
+ return sum(map(len, self._container_list))
+
+ def __getitem__(self, item):
+ for container in self._container_list:
+ count = len(container)
+ if item < count:
+ return container.objectIds()[item]
+ item -= count
+ raise IndexError
+
+
CMFCore_TypesTool = CMFCore_TypesToolModule.TypesTool
class TypeProvider(BaseTool, CMFCore_TypesTool):
@@ -54,19 +96,32 @@
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
+ def listContentTypes(self, container=None):
+ """List content types from all providers
+ """
+ if container is not None:
+ # XXX Slow legacy implementation. Is 'container_list' parameter useful ?
+ return CMFCore_TypesTool.listContentTypes(self, container)
+ object_list = [self]
+ _getOb = self.getPortalObject()._getOb
+ for provider in self.type_provider_list:
+ provider_value = _getOb(provider, None)
+ if provider_value:
+ object_list.append(provider_value)
+ return ComposedObjectIds(object_list)
+
def listTypeInfo(self, container=None):
"""List type information from all providers
"""
listTypeInfo = CMFCore_TypesTool.listTypeInfo
type_info_list = listTypeInfo(self, container=container)
- portal = self.getPortalObject()
+ _getOb = self.getPortalObject()._getOb
for provider in self.type_provider_list:
- provider_value = portal._getOb(provider, None)
+ provider_value = _getOb(provider, None)
if provider_value is not None:
- type_info_list.extend(
- listTypeInfo(provider_value, container=container))
+ type_info_list += listTypeInfo(provider_value, container=container)
return type_info_list
-
+
def _aq_dynamic(self, id):
"""Get a type information from a provider
"""
More information about the Erp5-report
mailing list