[Checkins] SVN: zc.relation/trunk/src/zc/relation/catalog.py Small changes for better readability
Partick Gerken
cvs-admin at zope.org
Fri Sep 21 14:22:31 UTC 2012
Log message for revision 127872:
Small changes for better readability
- some docstrings
- some more speaking varnames
- in one case of KeyError while removing an indexed value,
run a consistency check on the BTree. This would raise
an AssertionError which is slightly more helpful for the user
Changed:
U zc.relation/trunk/src/zc/relation/catalog.py
-=-
Modified: zc.relation/trunk/src/zc/relation/catalog.py
===================================================================
--- zc.relation/trunk/src/zc/relation/catalog.py 2012-09-19 19:55:27 UTC (rev 127871)
+++ zc.relation/trunk/src/zc/relation/catalog.py 2012-09-21 14:22:24 UTC (rev 127872)
@@ -11,14 +11,15 @@
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
+import copy
import sys
-import copy
+import BTrees
+import BTrees.check
+import BTrees.Length
import persistent
import persistent.list
import persistent.wref
-import BTrees
-import BTrees.Length
import zope.interface
import zope.interface.interfaces
@@ -40,7 +41,7 @@
#
def multiunion(sets, data):
- sets = tuple(s for s in sets if s) # bool is appropriate here
+ sets = tuple(s for s in sets if s) # bool is appropriate here
if not sets:
res = data['Set']()
elif data['multiunion'] is not None:
@@ -218,7 +219,7 @@
res._attrs = self.family.OO.Bucket(
[(k, self.family.OO.Bucket(v)) for k, v in self._attrs.items()])
res._relTools = dict(self._relTools)
- res._queryFactories = self._queryFactories # it's a tuple
+ res._queryFactories = self._queryFactories # it's a tuple
res._relLength = BTrees.Length.Length()
res._relLength.set(self._relLength.value)
if self._searchIndexMatches is not None:
@@ -239,12 +240,12 @@
for l in self._listeners:
cl = l.sourceCopied(self, res)
return res
-
+
# Value Indexes
# -------------
def _fixLegacyAttrs(self):
- if isinstance(self._attrs, dict): # legacy
+ if isinstance(self._attrs, dict): # legacy
# because _attrs used to be a normal dict
self._attrs = self.family.OO.Bucket(self._attrs)
@@ -252,11 +253,12 @@
multiple=False, name=None):
if btree is None:
btree = self.family.IF
- res = self.family.OO.Bucket(getModuleTools(btree))
- res['dump'] = dump
- res['load'] = load
- res['multiple'] = multiple
- if (res['dump'] is None) ^ (res['load'] is None):
+ value_index_info = self.family.OO.Bucket(getModuleTools(btree))
+ value_index_info['dump'] = dump
+ value_index_info['load'] = load
+ value_index_info['multiple'] = multiple
+ if (value_index_info['dump'] is None) \
+ ^ (value_index_info['load'] is None):
raise ValueError(
"either both of 'dump' and 'load' must be None, or "
"neither")
@@ -266,31 +268,32 @@
# family (BTree, TreeSet, Set, Bucket).
if zope.interface.interfaces.IElement.providedBy(element):
key = 'element'
- res['attrname'] = defaultname = element.__name__
- res['interface'] = element.interface
- res['call'] = zope.interface.interfaces.IMethod.providedBy(element)
+ value_index_info['attrname'] = defaultname = element.__name__
+ value_index_info['interface'] = element.interface
+ value_index_info['call'] = \
+ zope.interface.interfaces.IMethod.providedBy(element)
else:
key = 'callable'
defaultname = getattr(element, '__name__', None)
if [d for d in self._attrs.values() if d.get(key) == element]:
raise ValueError('element already indexed', element)
- res[key] = element
+ value_index_info[key] = element
if name is None:
if defaultname is None:
raise ValueError('no name specified')
name = defaultname
if name in self._attrs:
raise ValueError('name already used', name)
- res['name'] = name
- self._name_TO_mapping[name] = getMapping(res)()
+ value_index_info['name'] = name
+ self._name_TO_mapping[name] = getMapping(value_index_info)()
# these are objtoken to (relcount, relset)
- self._attrs[name] = res
+ self._attrs[name] = value_index_info
load = self._relTools['load']
cache = {}
for token in self._relTokens:
additions = {}
additions[name] = (None, self._indexNew(
- token, load(token, self, cache), res))
+ token, load(token, self, cache), value_index_info))
for l in self._iterListeners():
l.relationModified(token, self, additions, {})
self._fixLegacyAttrs()
@@ -315,7 +318,7 @@
# Listeners
# -----------
-
+
def addListener(self, listener, weakref=False):
res = []
for item in self._listeners:
@@ -369,7 +372,7 @@
# DefaultQueryFactories
# -----------------------
-
+
def addDefaultQueryFactory(self, factory):
if factory in self._queryFactories:
raise ValueError('factory already registered')
@@ -401,7 +404,7 @@
rel_bool = True
else:
rel_bool = False
- query_names_res = BTrees.family32.OO.Set() # sorts
+ query_names_res = BTrees.family32.OO.Set() # sorts
relation_query = False
for nm in query_names:
if nm is RELATION:
@@ -462,14 +465,14 @@
# Top-Level
# ---------
- def _indexNew(self, token, rel, data):
+ def _indexNew(self, token, rel, value_index_info):
assert self._reltoken_name_TO_objtokenset.get(
- (token, data['name']), self) is self
+ (token, value_index_info['name']), self) is self
values, tokens, optimization = self._getValuesAndTokens(
- rel, data)
+ rel, value_index_info)
if optimization and tokens is not None:
- tokens = data['TreeSet'](tokens)
- self._add(token, tokens, data['name'], tokens)
+ tokens = value_index_info['TreeSet'](tokens)
+ self._add(token, tokens, value_index_info['name'], tokens)
return tokens
def index(self, rel):
@@ -510,7 +513,7 @@
recycle = True
else:
len_old = len(oldTokens)
- ratio = float(len_old)/len_removed
+ ratio = float(len_old) / len_removed
recycle = (ratio <= 0.1 or len_old > 500
and ratio < 0.2)
if recycle:
@@ -535,8 +538,9 @@
l.relationModified(relToken, self, additions, removals)
else:
# new token
- for data in self._attrs.values():
- additions[data['name']] = self._indexNew(relToken, rel, data)
+ for value_index_info in self._attrs.values():
+ additions[value_index_info['name']] = self._indexNew(relToken,
+ rel, value_index_info)
self._relTokens.insert(relToken)
self._relLength.change(1)
for l in self._iterListeners():
@@ -548,12 +552,12 @@
def unindex_doc(self, relToken):
removals = {}
if relToken in self._relTokens:
- for data in self._attrs.values():
+ for value_index_info in self._attrs.values():
tokens = self._reltoken_name_TO_objtokenset.pop(
- (relToken, data['name']))
+ (relToken, value_index_info['name']))
if tokens:
- removals[data['name']] = tokens
- self._remove(relToken, tokens, data['name'])
+ removals[value_index_info['name']] = tokens
+ self._remove(relToken, tokens, value_index_info['name'])
self._relTokens.remove(relToken)
self._relLength.change(-1)
for l in self._iterListeners():
@@ -576,7 +580,7 @@
# None is a marker for no value
values = (values,)
optimization = data['dump'] is None and (
- values is None or
+ values is None or
isinstance(values, (
data['TreeSet'], data['BTree'], data['Bucket'], data['Set'])))
if not values:
@@ -611,6 +615,11 @@
data[0].change(1)
def _remove(self, relToken, tokens, name):
+ """
+ relToken: The token to remove
+ tokens: the tokens that match for the value index of `name`
+ name: the name of the value index
+ """
if tokens is None:
dataset = self._EMPTY_name_TO_relcount_relset
keys = (name,)
@@ -618,7 +627,11 @@
dataset = self._name_TO_mapping[name]
keys = tokens
for key in keys:
- data = dataset[key]
+ try:
+ data = dataset[key]
+ except KeyError:
+ BTrees.check.check(dataset)
+ raise
data[1].remove(relToken)
data[0].change(-1)
if not data[0].value:
More information about the checkins
mailing list