Skip to content

Commit

Permalink
Add a progress handler to the addColumn and delColumn methods
Browse files Browse the repository at this point in the history
  • Loading branch information
hannosch committed Apr 7, 2012
1 parent 70df02e commit 7404b58
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 9 deletions.
4 changes: 4 additions & 0 deletions CHANGES.txt
Expand Up @@ -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.
Expand Down
19 changes: 13 additions & 6 deletions src/Products/ZCatalog/Catalog.py
Expand Up @@ -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')

Expand Down Expand Up @@ -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
"""
Expand All @@ -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
Expand All @@ -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
"""
Expand All @@ -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.
Expand Down
5 changes: 3 additions & 2 deletions src/Products/ZCatalog/ZCatalog.py
Expand Up @@ -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

Expand Down
13 changes: 12 additions & 1 deletion src/Products/ZCatalog/tests/test_catalog.py
Expand Up @@ -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')
Expand Down

0 comments on commit 7404b58

Please sign in to comment.