[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