From cdf23dd6411423dc91d96359f286b74d9dba28b1 Mon Sep 17 00:00:00 2001 From: Hanno Schlichting Date: Sat, 7 Apr 2012 18:32:30 +0000 Subject: [PATCH] restore special case for single sort while iterating over the search index --- src/Products/ZCatalog/Catalog.py | 45 ++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/src/Products/ZCatalog/Catalog.py b/src/Products/ZCatalog/Catalog.py index c560cebd..138d4097 100644 --- a/src/Products/ZCatalog/Catalog.py +++ b/src/Products/ZCatalog/Catalog.py @@ -740,28 +740,39 @@ def sortResults(self, rs, sort_index, reverse=False, limit=None, # Try to turn rs into an IISet. rs = IISet(rs) - for k, intset in sort_index.items(): - # 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) - if intset: - keys = getattr(intset, 'keys', None) - if keys is not None: - # Is this ever true? - intset = keys() - length += len(intset) - # sort on secondary index - if index2_key_map is not None: + if sort_index_length == 1: + for k, intset in sort_index.items(): + # 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) + if intset: + keys = getattr(intset, 'keys', None) + if keys is not None: + # Is this ever true? + intset = keys() + length += len(intset) + append((k, intset, _self__getitem__)) + result.sort(reverse=reverse) + else: + for k, intset in sort_index.items(): + # 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) + if intset: + keys = getattr(intset, 'keys', None) + if keys is not None: + # Is this ever true? + intset = keys() + length += len(intset) + # sort on secondary index keysets = defaultdict(list) for i in intset: keysets[(k, index2_key_map.get(i))].append(i) for k2, v2 in keysets.items(): append((k2, v2, _self__getitem__)) - else: - append((k, intset, _self__getitem__)) - - result = multisort(result, sort_spec) + result = multisort(result, sort_spec) sequence, slen = self._limit_sequence(result, length, b_start, b_size, switched_reverse) result = LazyCat(LazyValues(sequence), slen, actual_result_count)