[Zope-Checkins] CVS: Zope/lib/python/Products/ZCatalog - Catalog.py:1.84

Toby Dickenson tdickenson@geminidataloggers.com
Wed, 17 Apr 2002 06:39:28 -0400


Update of /cvs-repository/Zope/lib/python/Products/ZCatalog
In directory cvs.zope.org:/tmp/cvs-serv31063

Modified Files:
	Catalog.py 
Log Message:
merged toby-catalog-cmp-collision-branch

=== Zope/lib/python/Products/ZCatalog/Catalog.py 1.83 => 1.84 ===
 from Products.PluginIndexes.common.randid import randid
 
-import time
+import time, sys
 
 class Catalog(Persistent, Acquisition.Implicit, ExtensionClass.Base):
     """ An Object Catalog
@@ -509,6 +509,13 @@
         return used
 
     def _build_sorted_results(self,rs,sort_index,append):
+        # This function will .append pairs where the first item
+        # in the pair is a sort key, and the second item in the
+        # pair is a squence of results which share the same
+        # sort key. Later on the list to which these things
+        # are .append()ed will be .sort()ed, and the first element
+        # of each pair stripped.
+        #
         # The two 'for' loops in here contribute a significant
         # proportion of the time to perform an indexed search.
         # Try to avoid all non-local attribute lookup inside
@@ -534,16 +541,28 @@
                         # Is this ever true?
                         intset = keys()
                     append((k,_lazymap(_self__getitem__, intset)))
+                    # Note that sort keys are unique.
         else:
             if hasattr(rs, 'keys'): rs=rs.keys()
             _sort_index_keyForDocument = sort_index.keyForDocument
             _keyerror = KeyError
             for did in rs:
                 try:
-                    append((_sort_index_keyForDocument(did),
-                           _lazymap(_self__getitem__,[did])))
+                    key = _sort_index_keyForDocument(did)
                 except _keyerror:
+                    # This document is not in the sort key index.
+                    # skip it.
                     pass
+                else:
+                    # We want the sort keys to be unique so that
+                    # .sort()ing the list does not involve comparing
+                    # _lazymap objects, which is slow. To ensure
+                    # uniqueness the first element of each pair is
+                    # actually a tuple of:
+                    # (real sort key, some unique number)
+                    lm = _lazymap(_self__getitem__,[did])
+                    key = (key,id(lm))
+                    append((key,lm))
 
     def searchResults(self, REQUEST=None, used=None, **kw):