From 7404b58613918665d19273efb4f58c3bd631cd21 Mon Sep 17 00:00:00 2001 From: Hanno Schlichting Date: Sat, 7 Apr 2012 12:18:56 +0000 Subject: [PATCH] Add a progress handler to the addColumn and delColumn methods --- CHANGES.txt | 4 ++++ src/Products/ZCatalog/Catalog.py | 19 +++++++++++++------ src/Products/ZCatalog/ZCatalog.py | 5 +++-- src/Products/ZCatalog/tests/test_catalog.py | 13 ++++++++++++- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 23e1ba26..480e9ccc 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -4,6 +4,10 @@ Changelog 3.0 (unreleased) ---------------- +- Added a `threshold` argument to the catalog's `addColumn` and `delColumn` + methods and used it for a progress handler. Also optimized some of their + internals. + - Added support for simple `sort_on` queries with two sort indexes. The `sort_order` is currently single valued and applies to both of them. But a query like: `{'foo': 'a', 'sort_on':['foo', 'bar']}` is supported now. diff --git a/src/Products/ZCatalog/Catalog.py b/src/Products/ZCatalog/Catalog.py index b46ce030..aa6c4b30 100644 --- a/src/Products/ZCatalog/Catalog.py +++ b/src/Products/ZCatalog/Catalog.py @@ -35,6 +35,7 @@ from .Lazy import LazyMap, LazyCat, LazyValues from .CatalogBrains import AbstractCatalogBrain, NoBrainer from .plan import CatalogPlan +from .ProgressHandler import ZLogHandler LOG = logging.getLogger('Zope.ZCatalog') @@ -152,7 +153,7 @@ class mybrains(AbstractCatalogBrain, brains): self._v_brains = brains self._v_result_class = mybrains - def addColumn(self, name, default_value=None): + def addColumn(self, name, default_value=None, threshold=10000): """ adds a row to the meta data schema """ @@ -176,8 +177,12 @@ def addColumn(self, name, default_value=None): if default_value in (None, ''): default_value = MV - for key, value in self.data.iteritems(): + pghandler = ZLogHandler(threshold) + pghandler.init('Adding %s column' % name, len(self)) + for i, (key, value) in enumerate(self.data.iteritems()): + pghandler.report(i) self.data[key] = value + (default_value, ) + pghandler.finish() self.names = tuple(names) self.schema = schema @@ -187,7 +192,7 @@ def addColumn(self, name, default_value=None): self._p_changed = 1 # why? - def delColumn(self, name): + def delColumn(self, name, threshold=10000): """ deletes a row from the meta data schema """ @@ -214,10 +219,12 @@ def delColumn(self, name): # remove the column value from each record _next_index = _index + 1 - for key, value in self.data.iteritems(): - rec = list(value) - del rec[_index] + pghandler = ZLogHandler(threshold) + pghandler.init('Deleting %s column' % name, len(self)) + for i, (key, value) in enumerate(self.data.iteritems()): + pghandler.report(i) self.data[key] = value[:_index] + value[_next_index:] + pghandler.finish() def addIndex(self, name, index_type): """Create a new index, given a name and a index_type. diff --git a/src/Products/ZCatalog/ZCatalog.py b/src/Products/ZCatalog/ZCatalog.py index 5f0f4b66..e6792f26 100644 --- a/src/Products/ZCatalog/ZCatalog.py +++ b/src/Products/ZCatalog/ZCatalog.py @@ -881,11 +881,12 @@ def clearIndex(self, name): security.declareProtected(manage_zcatalog_indexes, 'addColumn') def addColumn(self, name, default_value=None): - return self._catalog.addColumn(name, default_value) + return self._catalog.addColumn(name, default_value, + threshold=self.threshold) security.declareProtected(manage_zcatalog_indexes, 'delColumn') def delColumn(self, name): - return self._catalog.delColumn(name) + return self._catalog.delColumn(name, threshold=self.threshold) # Catalog plan methods diff --git a/src/Products/ZCatalog/tests/test_catalog.py b/src/Products/ZCatalog/tests/test_catalog.py index 38c9b9de..21fcb477 100644 --- a/src/Products/ZCatalog/tests/test_catalog.py +++ b/src/Products/ZCatalog/tests/test_catalog.py @@ -101,13 +101,24 @@ def test_add_bad(self): catalog = self._makeOne() self.assertRaises(CatalogError, catalog.addColumn, '_id') + def test_add_brains(self): + catalog = self._makeOne() + catalog.addColumn('col1') + catalog.addColumn('col3') + for i in xrange(3): + catalog.catalogObject(dummy(3), repr(i)) + self.assertTrue('col2' not in catalog.data.values()[0]) + catalog.addColumn('col2', default_value='new') + self.assert_('col2' in catalog.schema, 'add column failed') + self.assertTrue('new' in catalog.data.values()[0]) + def test_del(self): catalog = self._makeOne() catalog.addColumn('id') catalog.delColumn('id') self.assert_('id' not in catalog.schema, 'del column failed') - def test_del_remaining(self): + def test_del_brains(self): catalog = self._makeOne() catalog.addColumn('col1') catalog.addColumn('col2')