[Checkins] SVN: Products.ZCatalog/trunk/src/Products/ZCatalog/ Move value index determination onto the plan
Hanno Schlichting
hannosch at hannosch.eu
Thu Oct 20 09:02:06 EST 2011
Log message for revision 123119:
Move value index determination onto the plan
Changed:
U Products.ZCatalog/trunk/src/Products/ZCatalog/plan.py
U Products.ZCatalog/trunk/src/Products/ZCatalog/tests/test_plan.py
-=-
Modified: Products.ZCatalog/trunk/src/Products/ZCatalog/plan.py
===================================================================
--- Products.ZCatalog/trunk/src/Products/ZCatalog/plan.py 2011-10-20 14:01:21 UTC (rev 123118)
+++ Products.ZCatalog/trunk/src/Products/ZCatalog/plan.py 2011-10-20 14:02:06 UTC (rev 123119)
@@ -24,6 +24,7 @@
MAX_DISTINCT_VALUES = 10
REFRESH_RATE = 100
+VALUE_INDEX_KEY = '#valueindexes'
Duration = namedtuple('Duration', ['start', 'end'])
IndexMeasurement = namedtuple('IndexMeasurement',
@@ -146,37 +147,7 @@
def clear(cls):
cls.set(frozenset())
- @classmethod
- def determine(cls, indexes):
- # 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 lower than the MAX_DISTINCT_VALUES watermark.
- # TODO: Ideally who would only consider those indexes with a small
- # number 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 query is likely similar as well.
- value_indexes = cls.get()
- if value_indexes:
- # Calculating all the value indexes is quite slow, so we do this
- # once for the first query. Since this is an optimization only,
- # slightly outdated results based on index changes in the running
- # process can be ignored.
- return value_indexes
-
- value_indexes = set()
- for name, index in indexes.items():
- if IUniqueValueIndex.providedBy(index):
- values = index.uniqueValues()
- if values and len(list(values)) < MAX_DISTINCT_VALUES:
- # Only consider indexes which actually return a number
- # greater than zero
- value_indexes.add(name)
-
- cls.set(value_indexes)
- return value_indexes
-
-
class CatalogPlan(object):
"""Catalog plan class to measure and identify catalog queries and plan
their execution.
@@ -207,12 +178,42 @@
self.stop_time = None
self.duration = None
+ def valueindexes(self):
+ indexes = self.catalog.indexes
+
+ # 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 lower than the MAX_DISTINCT_VALUES watermark.
+
+ # TODO: Ideally who would only consider those indexes with a small
+ # number 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 query is likely similar as well.
+ value_indexes = ValueIndexes.get()
+ if value_indexes:
+ # Calculating all the value indexes is quite slow, so we do this
+ # once for the first query. Since this is an optimization only,
+ # slightly outdated results based on index changes in the running
+ # process can be ignored.
+ return value_indexes
+
+ value_indexes = set()
+ for name, index in indexes.items():
+ if IUniqueValueIndex.providedBy(index):
+ values = index.uniqueValues()
+ if values and len(list(values)) < MAX_DISTINCT_VALUES:
+ # Only consider indexes which actually return a number
+ # greater than zero
+ value_indexes.add(name)
+
+ ValueIndexes.set(value_indexes)
+ return value_indexes
+
def make_key(self, query):
if not query:
return None
- indexes = self.catalog.indexes
- valueindexes = ValueIndexes.determine(indexes)
+ valueindexes = self.valueindexes()
key = keys = query.keys()
values = [name for name in keys if name in valueindexes]
Modified: Products.ZCatalog/trunk/src/Products/ZCatalog/tests/test_plan.py
===================================================================
--- Products.ZCatalog/trunk/src/Products/ZCatalog/tests/test_plan.py 2011-10-20 14:01:21 UTC (rev 123118)
+++ Products.ZCatalog/trunk/src/Products/ZCatalog/tests/test_plan.py 2011-10-20 14:02:06 UTC (rev 123119)
@@ -156,41 +156,6 @@
self.assertEquals(type(self.reports.lock), LockType)
-class TestValueIndexes(unittest.TestCase):
-
- def setUp(self):
- self.value = self._makeOne()
-
- def tearDown(self):
- self.value.clear()
-
- def _makeOne(self):
- from ..plan import ValueIndexes
- return ValueIndexes
-
- def test_get(self):
- self.assertEquals(self.value.get(), frozenset())
-
- def test_set(self):
- indexes = ('index1', 'index2')
- self.value.set(indexes)
- self.assertEquals(self.value.get(), frozenset(indexes))
-
- def test_clear(self):
- self.value.set(('index1', ))
- self.value.clear()
- self.assertEquals(self.value.get(), frozenset())
-
- def test_determine_already_set(self):
- self.value.set(('index1', ))
- self.assertEquals(self.value.determine(()), frozenset(('index1', )))
-
-
-# class TestValueIndexesDetermination(unittest.TestCase):
-# Test the actual logic for determining value indexes
-
-# class TestMakeKey(unittest.TestCase):
-
class TestCatalogPlan(cleanup.CleanUp, unittest.TestCase):
def setUp(self):
@@ -212,7 +177,7 @@
from Products.ZCatalog.ZCatalog import ZCatalog
zcat = ZCatalog('catalog')
plan = self._makeOne(zcat._catalog)
- self.assertEquals(plan.get_id(), ('catalog',))
+ self.assertEquals(plan.get_id(), ('catalog', ))
def test_getCatalogPlan_empty(self):
from Products.ZCatalog.ZCatalog import ZCatalog
@@ -302,7 +267,33 @@
plan.reset()
self.assertEquals(len(plan.report()), 0)
+ def test_valueindexes_get(self):
+ plan = self._makeOne()
+ self.assertEquals(plan.valueindexes(), frozenset())
+ def test_valueindexes_set(self):
+ from ..plan import ValueIndexes
+ indexes = ('index1', 'index2')
+ ValueIndexes.set(indexes)
+ plan = self._makeOne()
+ self.assertEquals(plan.valueindexes(), frozenset(indexes))
+
+ def test_valueindexes_clear(self):
+ from ..plan import ValueIndexes
+ ValueIndexes.set(('index1', ))
+ ValueIndexes.clear()
+ plan = self._makeOne()
+ self.assertEquals(plan.valueindexes(), frozenset())
+
+ def test_valueindexes_already_set(self):
+ from ..plan import ValueIndexes
+ ValueIndexes.set(('index1', ))
+ plan = self._makeOne()
+ self.assertEquals(plan.valueindexes(), frozenset(('index1', )))
+
+ # Test the actual logic for determining value indexes
+ # Test make_key
+
class TestCatalogReport(cleanup.CleanUp, unittest.TestCase):
def setUp(self):
More information about the checkins
mailing list