[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