From 41c886155629e176608af8c9d7cbe47059eb3807 Mon Sep 17 00:00:00 2001
From: Vincent Pelletier <vincent@nexedi.com>
Date: Wed, 6 Sep 2006 15:26:39 +0000
Subject: [PATCH] Implement getBaseCategoryDict, a cached version of
 getBaseCategoryList which should be used to check if a base category is
 present (dict key searching is O(1), which is always better than list
 searching, even if sorted).

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@9709 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 product/ERP5/Tool/CategoryTool.py | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/product/ERP5/Tool/CategoryTool.py b/product/ERP5/Tool/CategoryTool.py
index deb92445c3..da0be6ae2e 100644
--- a/product/ERP5/Tool/CategoryTool.py
+++ b/product/ERP5/Tool/CategoryTool.py
@@ -41,6 +41,7 @@ from Products.CMFCore.PortalFolder import PortalFolder
 from Products.ERP5Type.CopySupport import CopyContainer
 from Products.CMFCore.utils import getToolByName
 from Products.ERP5Type.Document import newTempBase
+from Products.ERP5Type.Cache import CachingMethod
 
 from zLOG import LOG
 
@@ -121,6 +122,16 @@ class CategoryTool(CopyContainer, CMFCategoryTool, BaseTool):
     security.declareProtected(Permissions.AccessContentsInformation, 'getUids')
     getUids = getCategoryParentUidList
 
+    def getBaseCategoryDict(self):
+      """
+        Cached method to which resturns a dict with category names as keys, and None as values.
+        This allows to search for an element existence in the list faster.
+        ie: if x in self.getPortalObject().portal_categories.getBaseCategoryDict()
+      """
+      def getBaseCategoryDict(self):
+        return dict.fromkeys(self.getBaseCategoryList(), None)
+      return CachingMethod(getBaseCategoryDict, 'portal_categories.getBaseCategoryDict', cache_duration=None)(self)
+
     def updateRelatedContent(self, context,
                              previous_category_url, new_category_url):
       """See CMFCategory.CategoryTool.updateRelatedContent
-- 
2.30.9