Skip to content

Commit b7aae3a

Browse files
committed
Cache key is invariant of sort or pagenation options
1 parent 5ce1295 commit b7aae3a

File tree

2 files changed

+38
-12
lines changed

2 files changed

+38
-12
lines changed

src/Products/ZCatalog/cache.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,17 @@ def make_key(self, query):
4747

4848
catalog = self.catalog
4949

50+
def skip(name, value):
51+
if name in ['b_start', 'b_size']:
52+
return True
53+
elif catalog._get_sort_attr('on', {name: value}):
54+
return True
55+
elif catalog._get_sort_attr('limit', {name: value}):
56+
return True
57+
elif catalog._get_sort_attr('order', {name: value}):
58+
return True
59+
return False
60+
5061
keys = []
5162
for name, value in query.items():
5263
if name in catalog.indexes:
@@ -57,6 +68,10 @@ def make_key(self, query):
5768
# cache key invalidation cannot be supported if
5869
# any index of query cannot be tested for changes
5970
return None
71+
elif skip(name, value):
72+
# applying the query to indexes is invariant of
73+
# sort or pagination options
74+
continue
6075
else:
6176
# return None if query has a nonexistent index key
6277
return None
@@ -71,7 +86,7 @@ def make_key(self, query):
7186
else:
7287
value = self._convert_datum(index, value)
7388

74-
keys.append((name, counter, value))
89+
keys.append((name, value, counter))
7590

7691
key = frozenset(keys)
7792
cache_key = (self.cid, key)

src/Products/ZCatalog/tests/test_cache.py

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -117,21 +117,32 @@ def _get_cache_key(self, query=None):
117117

118118
def test_make_key(self):
119119
query = {'big': True}
120-
key = (('catalog',),
121-
frozenset([('big', self.length, (True,))]))
122-
self.assertEquals(self._get_cache_key(query), key)
120+
expect = (('catalog',),
121+
frozenset([('big', (True,), self.length)]))
122+
self.assertEquals(self._get_cache_key(query), expect)
123123

124124
query = {'start': '2013-07-01'}
125-
key = (('catalog',),
126-
frozenset([('start', self.length, ('2013-07-01',))]))
127-
self.assertEquals(self._get_cache_key(query), key)
125+
expect = (('catalog',),
126+
frozenset([('start', ('2013-07-01',), self.length)]))
127+
self.assertEquals(self._get_cache_key(query), expect)
128128

129129
query = {'path': '/1', 'date': '2013-07-05', 'numbers': [1, 3]}
130-
key = (('catalog',),
131-
frozenset([('date', 9, ('2013-07-05',)),
132-
('numbers', 9, (1, 3)),
133-
('path', 9, ('/1',))]))
134-
self.assertEquals(self._get_cache_key(query), key)
130+
expect = (('catalog',),
131+
frozenset([('date', ('2013-07-05',), self.length),
132+
('numbers', (1, 3), self.length),
133+
('path', ('/1',), self.length)]))
134+
self.assertEquals(self._get_cache_key(query), expect)
135+
136+
queries = [{'big': True, 'b_start': 0},
137+
{'big': True, 'b_start': 0, 'b_size': 5},
138+
{'big': True, 'sort_on': 'big'},
139+
{'big': True, 'sort_on': 'big', 'sort_limit': 3},
140+
{'big': True, 'sort_on': 'big', 'sort_order': 'descending'},
141+
]
142+
expect = (('catalog',),
143+
frozenset([('big', (True,), self.length)]))
144+
for query in queries:
145+
self.assertEquals(self._get_cache_key(query), expect)
135146

136147
def test_cache(self):
137148
query = {'big': True}

0 commit comments

Comments
 (0)