Commit 60de6f12 authored by Hanno Schlichting's avatar Hanno Schlichting

Group value indexes functions into a class

parent 8b47fab8
...@@ -28,29 +28,27 @@ REPORTS = {} ...@@ -28,29 +28,27 @@ REPORTS = {}
PRIORITYMAP_LOCK = allocate_lock() PRIORITYMAP_LOCK = allocate_lock()
PRIORITYMAP = {} PRIORITYMAP = {}
VALUE_INDEXES_LOCK = allocate_lock()
VALUE_INDEXES = frozenset()
class ValueIndexes(object):
def get_value_indexes(): lock = allocate_lock()
return VALUE_INDEXES value = frozenset()
@classmethod
def get(cls):
return cls.value
def set_value_indexes(value): @classmethod
with VALUE_INDEXES_LOCK: def set(cls, value):
global VALUE_INDEXES with cls.lock:
VALUE_INDEXES = value cls.value = value
@classmethod
def clear(cls):
cls.set(frozenset())
def clear_value_indexes(): @classmethod
set_value_indexes(frozenset()) def determine(cls, indexes):
from zope.testing.cleanup import addCleanUp
addCleanUp(clear_value_indexes)
del addCleanUp
def determine_value_indexes(indexes):
# This function determines all indexes whose values should be respected # This function determines all indexes whose values should be respected
# in the report key. The number of unique values for the index needs to be # in the report key. The number of unique values for the index needs to be
# lower than the MAX_DISTINCT_VALUES watermark. # lower than the MAX_DISTINCT_VALUES watermark.
...@@ -59,7 +57,7 @@ def determine_value_indexes(indexes): ...@@ -59,7 +57,7 @@ def determine_value_indexes(indexes):
# of unique values, where the number of items for each value differs a # of unique values, where the number of items for each value differs a
# lot. If the number of items per value is similar, the duration of a # lot. If the number of items per value is similar, the duration of a
# query is likely similar as well. # query is likely similar as well.
value_indexes = get_value_indexes() value_indexes = cls.get()
if value_indexes: if value_indexes:
# Calculating all the value indexes is quite slow, so we do this once # Calculating all the value indexes is quite slow, so we do this once
# for the first query. Since this is an optimization only, slightly # for the first query. Since this is an optimization only, slightly
...@@ -76,16 +74,20 @@ def determine_value_indexes(indexes): ...@@ -76,16 +74,20 @@ def determine_value_indexes(indexes):
# greater than zero # greater than zero
value_indexes.add(name) value_indexes.add(name)
set_value_indexes(frozenset(value_indexes)) cls.set(frozenset(value_indexes))
return value_indexes return value_indexes
from zope.testing.cleanup import addCleanUp
addCleanUp(ValueIndexes.clear)
del addCleanUp
def make_key(catalog, query): def make_key(catalog, query):
if not query: if not query:
return None return None
indexes = catalog.indexes indexes = catalog.indexes
valueindexes = determine_value_indexes(indexes) valueindexes = ValueIndexes.determine(indexes)
key = keys = query.keys() key = keys = query.keys()
values = [name for name in keys if name in valueindexes] values = [name for name in keys if name in valueindexes]
......
...@@ -41,8 +41,8 @@ class TestCatalogPlan(unittest.TestCase): ...@@ -41,8 +41,8 @@ class TestCatalogPlan(unittest.TestCase):
self.zcat.catalog_object(obj, str(i)) self.zcat.catalog_object(obj, str(i))
def tearDown(self): def tearDown(self):
from Products.ZCatalog.plan import clear_value_indexes from Products.ZCatalog.plan import ValueIndexes
clear_value_indexes() ValueIndexes.clear()
def test_ReportLength(self): def test_ReportLength(self):
""" tests the report aggregation """ """ tests the report aggregation """
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment