[Checkins] SVN: Products.ZCatalog/trunk/src/Products/ZCatalog/ cover n-best/n-worst sort algorithms

Hano Schlichting cvs-admin at zope.org
Sun Mar 25 22:54:01 UTC 2012


Log message for revision 124732:
  cover n-best/n-worst sort algorithms
  

Changed:
  U   Products.ZCatalog/trunk/src/Products/ZCatalog/Catalog.py
  U   Products.ZCatalog/trunk/src/Products/ZCatalog/tests/test_catalog.py

-=-
Modified: Products.ZCatalog/trunk/src/Products/ZCatalog/Catalog.py
===================================================================
--- Products.ZCatalog/trunk/src/Products/ZCatalog/Catalog.py	2012-03-25 21:59:43 UTC (rev 124731)
+++ Products.ZCatalog/trunk/src/Products/ZCatalog/Catalog.py	2012-03-25 22:53:58 UTC (rev 124732)
@@ -677,13 +677,10 @@
             if len(sort_index) > 1:
                 index2 = sort_index[1]
             sort_index = sort_index[0]
-        _intersection = intersection
         _self__getitem__ = self.__getitem__
         index_key_map = sort_index.documentToKeyMap()
         index2_key_map = (index2 is not None and
             index2.documentToKeyMap() or None)
-        _None = None
-        _keyerror = KeyError
         result = []
         append = result.append
         if hasattr(rs, 'keys'):
@@ -736,10 +733,10 @@
                 # We have an index that has a set of values for
                 # each sort key, so we intersect with each set and
                 # get a sorted sequence of the intersections.
-                intset = _intersection(rs, intset)
+                intset = intersection(rs, intset)
                 if intset:
-                    keys = getattr(intset, 'keys', _None)
-                    if keys is not _None:
+                    keys = getattr(intset, 'keys', None)
+                    if keys is not None:
                         # Is this ever true?
                         intset = keys()
                     length += len(intset)
@@ -763,10 +760,11 @@
             result = LazyCat(LazyValues(sequence), slen, actual_result_count)
         elif limit is None or (limit * 4 > rlen):
             # Iterate over the result set getting sort keys from the index
+            # import pdb; pdb.set_trace()
             for did in rs:
                 try:
                     key = index_key_map[did]
-                except _keyerror:
+                except KeyError:
                     # This document is not in the sort key index, skip it.
                     pass
                 else:
@@ -800,7 +798,9 @@
             for did in rs:
                 try:
                     key = index_key_map[did]
-                except _keyerror:
+                    key2 = (index2_key_map is not None and
+                        index2_key_map.get(did) or None)
+                except KeyError:
                     # This document is not in the sort key index, skip it.
                     pass
                 else:
@@ -808,13 +808,16 @@
                         continue
                     i = bisect(keys, key)
                     keys.insert(i, key)
-                    result.insert(i, (key, did, _self__getitem__))
+                    result.insert(i, ((key, key2), did, _self__getitem__))
                     if n == limit:
                         del keys[0], result[0]
                     else:
                         n += 1
                     worst = keys[0]
-            result.reverse()
+            if index2 is not None:
+                result.sort(reverse=True)
+            else:
+                result.reverse()
             if merge:
                 sequence, _ = self._limit_sequence(result, 0, b_start, b_size,
                     switched_reverse)
@@ -832,7 +835,9 @@
             for did in rs:
                 try:
                     key = index_key_map[did]
-                except _keyerror:
+                    key2 = (index2_key_map is not None and
+                        index2_key_map.get(did) or None)
+                except KeyError:
                     # This document is not in the sort key index, skip it.
                     pass
                 else:
@@ -840,12 +845,14 @@
                         continue
                     i = bisect(keys, key)
                     keys.insert(i, key)
-                    result.insert(i, (key, did, _self__getitem__))
+                    result.insert(i, ((key, key2), did, _self__getitem__))
                     if n == limit:
                         del keys[-1], result[-1]
                     else:
                         n += 1
                     best = keys[-1]
+            if index2 is not None:
+                result.sort()
             if merge:
                 sequence, _ = self._limit_sequence(result, 0, b_start, b_size,
                     switched_reverse)

Modified: Products.ZCatalog/trunk/src/Products/ZCatalog/tests/test_catalog.py
===================================================================
--- Products.ZCatalog/trunk/src/Products/ZCatalog/tests/test_catalog.py	2012-03-25 21:59:43 UTC (rev 124731)
+++ Products.ZCatalog/trunk/src/Products/ZCatalog/tests/test_catalog.py	2012-03-25 22:53:58 UTC (rev 124732)
@@ -507,6 +507,19 @@
         for x in range(self.upper):
             self.assertEqual(a[x].num, x)
 
+    def test_sort_on_two_small_limit(self):
+        a = self._catalog(sort_on=('att1', 'num'), att1='att1', sort_limit=10)
+        self.assertEqual(len(a), 10)
+        for x in range(9):
+            self.assertTrue(a[x].num < a[x + 1].num)
+
+    def test_sort_on_two_small_limit_reverse(self):
+        a = self._catalog(sort_on=('att1', 'num'), att1='att1',
+            sort_limit=10, sort_order='reverse')
+        self.assertEqual(len(a), 10)
+        for x in range(9):
+            self.assertTrue(a[x].num > a[x + 1].num)
+
     def testKeywordIndexWithMinRange(self):
         a = self._catalog(att3={'query': 'att', 'range': 'min'})
         self.assertEqual(len(a), self.upper)



More information about the checkins mailing list