本文整理汇总了Python中BTrees.IIBTree.IITreeSet类的典型用法代码示例。如果您正苦于以下问题:Python IITreeSet类的具体用法?Python IITreeSet怎么用?Python IITreeSet使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了IITreeSet类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: _combine_union
def _combine_union(self, values, object):
if not values: return
set= None
for v in values:
sv= self._standardizeValue_(v, object)
if not sv: continue
if set is None: set = IITreeSet(sv)
else: set.update(sv)
return set
示例2: getPositions
def getPositions(self, docid, wordid):
""" return a sequence of positions of occurrences of wordid within
a document given by its docid.
"""
encoded_wid = encode((wordid,))
encoded_document = self._doc2wid[docid].get()
positions = IITreeSet()
for pos, wid in enumerate(decode(encoded_document)):
if wid == wordid:
positions.insert(pos)
return positions
示例3: _finalize_index
def _finalize_index(self, result, start, end, used_fields):
filtered_result = IITreeSet()
# used_recurrence = False
for documentId in result:
recurrence = self._uid2recurrence.get(documentId)
if recurrence is None:
# This event isn't recurring, so it's a match:
filtered_result.add(documentId)
continue
# used_recurrence = True
match = False
# This is a possible place where optimizations can be done if
# necessary. For example, for periods where the start and end
# date is the same, we can first check if the start time and
# and time of the date falls inbetween the start and end times
# of the period, so to avoid expansion. But most likely this
# will have a very small impact on speed, so I skip this until
# it actually becomes a problem.
if start is not None:
event_start = datetime(*self._uid2start[documentId][:6])
else:
event_start = None
if end is not None:
event_duration = self._uid2duration[documentId]
event_end = event_start + event_duration
else:
event_end = None
for occurrence in recurrence._iter():
utc_occurrence = datetime(*occurrence.utctimetuple()[:6])
if event_start is not None and utc_occurrence < event_start:
# XXX we should add a counter and break after 10000 occurrences.
continue
if event_end is not None and utc_occurrence > event_end:
break
# The start of this occurrence starts between the start and end date of
# the query:
match = True
break
if match:
filtered_result.add(documentId)
# if used_recurrence:
used_fields += (self.recurrence_attr,)
return filtered_result, used_fields
示例4: group
def group(self, seq):
sortIndex = self._sortIndex; sortReverse = self._sortReverse
ns = len(seq); ni = len(sortIndex)
if ns >= 0.1 * ni:
# result large compared to index -- sort via index
handled = IISet(); hn = 0
_load = getattr(sortIndex, '_load', None)
if _load is None:
# not an optimized index
items = sortIndex.items()
_load = lambda (x1, x2): x2
if sortReverse: items.reverse()
elif sortReverse:
gRO = getattr(sortIndex, 'getReverseOrder', None)
items = gRO and gRO()
if items is None:
items = list(sortIndex._index.keys()); items.reverse()
else: items = sortIndex._index.keys()
for i in items:
ids = intersection(seq, _load(i))
if ids:
handled.update(ids); hn += len(ids)
yield i, ids
if hn != len(seq): yield None, difference(seq, handled)
else:
# result relatively small -- sort via result
m = OOBTree()
keyFor = getattr(sortIndex, 'keyForDocument', None)
# work around "nogopip" bug: it defines "keyForDocument" as an integer
if not callable(keyFor):
# this will fail, when the index neither defines a reasonable
# "keyForDocument" nor "documentToKeyMap". In this case,
# the index cannot be used for sorting.
keyFor = lambda doc, map=sortIndex.documentToKeyMap(): map[doc]
noValue = IITreeSet()
for doc in seq.keys():
try: k = keyFor(doc)
except KeyError: noValue.insert(doc); continue
l = m.get(k)
if l is None: l = m[k] = IITreeSet()
l.insert(doc)
items = m.items()
if sortReverse: items = list(items); items.reverse()
for i in items: yield i
if noValue: yield None, noValue
示例5: __init__
def __init__(self, principalId):
self.index = OIBTree()
self.messages = IOBTree()
self.services = OOBTree()
self.readstatus = IITreeSet()
self.principalId = principalId
self._next = Length(1)
示例6: FilteredSetBase
class FilteredSetBase(Persistent):
# A pre-calculated result list based on an expression.
def __init__(self, id, expr):
self.id = id
self.expr = expr
self.clear()
def clear(self):
self.ids = IITreeSet()
def index_object(self, documentId, obj):
raise NotImplementedError('index_object not defined')
def unindex_object(self, documentId):
try:
self.ids.remove(documentId)
except KeyError:
pass
def getId(self):
return self.id
def getExpression(self):
# Get the expression.
return self.expr
def getIds(self):
# Get the IDs of all objects for which the expression is True.
return self.ids
def getType(self):
return self.meta_type
def setExpression(self, expr):
# Set the expression.
self.expr = expr
def __repr__(self):
return '{0}: ({1}) {2}'.format(
self.id, self.expr,
list(map(None, self.ids))
)
__str__ = __repr__
示例7: clear
def clear(self):
"""Start over fresh."""
self._always = IITreeSet()
self._since_only = IOBTree()
self._until_only = IOBTree()
self._since = IOBTree()
self._until = IOBTree()
self._unindex = IOBTree() # 'datum' will be a tuple of date ints
self._length = Length()
示例8: clear
def clear(self):
self._index = IITreeSet()
self._index_length = BTrees.Length.Length()
self._index_value = 1
self._unindex = IIBTree()
self._length = BTrees.Length.Length()
if self._counter is None:
self._counter = BTrees.Length.Length()
else:
self._increment_counter()
示例9: group
def group(self, seq):
sortIndex = self._sortIndex; sortReverse = self._sortReverse
ns = len(seq); ni = len(sortIndex)
if ns >= 0.1 * ni:
# result large compared to index -- sort via index
handled = IISet(); hn = 0
_load = getattr(sortIndex, '_load', None)
if _load is None:
# not an optimized index
items = sortIndex.items()
_load = lambda (x1, x2): x2
if sortReverse: items.reverse()
elif sortReverse:
gRO = getattr(sortIndex, 'getReverseOrder', None)
items = gRO and gRO()
if items is None:
items = list(sortIndex._index.keys()); items.reverse()
else: items = sortIndex._index.keys()
for i in items:
ids = intersection(seq, _load(i))
if ids:
handled.update(ids); hn += len(ids)
yield i, ids
if hn != len(seq): yield None, difference(seq, handled)
else:
# result relatively small -- sort via result
keyFor = sortIndex.keyForDocument; m = OOBTree()
noValue = IITreeSet()
for doc in seq.keys():
try: k = keyFor(doc)
except KeyError: noValue.insert(doc); continue
l = m.get(k)
if l is None: l = m[k] = IITreeSet()
l.insert(doc)
items = m.items()
if sortReverse: items = list(items); items.reverse()
for i in items: yield i
if noValue: yield None, noValue
示例10: clear
def clear(self):
"""Start over fresh."""
self._always = IITreeSet()
self._since_only = IOBTree()
self._until_only = IOBTree()
self._since = IOBTree()
self._until = IOBTree()
self._unindex = IOBTree() # 'datum' will be a tuple of date ints
self._length = Length()
if self._counter is None:
self._counter = Length()
else:
self._increment_counter()
示例11: BooleanIndex
class BooleanIndex(UnIndex):
"""Index for booleans
self._index = set([documentId1, documentId2])
self._unindex = {documentId:[True/False]}
self._length is the length of the unindex
self._index_length is the length of the index
False doesn't have actual entries in _index.
"""
meta_type = "BooleanIndex"
manage_options = (
{'label': 'Settings',
'action': 'manage_main'},
{'label': 'Browse',
'action': 'manage_browse'},
)
query_options = ["query"]
manage = manage_main = DTMLFile('dtml/manageBooleanIndex', globals())
manage_main._setName('manage_main')
manage_browse = DTMLFile('../dtml/browseIndex', globals())
_index_value = 1
_index_length = None
def clear(self):
self._index = IITreeSet()
self._index_length = BTrees.Length.Length()
self._index_value = 1
self._unindex = IIBTree()
self._length = BTrees.Length.Length()
if self._counter is None:
self._counter = BTrees.Length.Length()
else:
self._increment_counter()
def histogram(self):
"""Return a mapping which provides a histogram of the number of
elements found at each point in the index.
"""
histogram = {}
indexed = bool(self._index_value)
histogram[indexed] = self._index_length.value
histogram[not indexed] = self._length.value - self._index_length.value
return histogram
def _invert_index(self, documentId=None):
self._index_value = indexed = int(not self._index_value)
self._index.clear()
length = 0
for rid, value in self._unindex.iteritems():
if value == indexed:
self._index.add(rid)
length += 1
# documentId is the rid of the currently processed object that
# triggered the invert. in the case of unindexing, the rid hasn't
# been removed from the unindex yet. While indexing, the rid will
# be added to the index and unindex after this method is done
if documentId is not None:
self._index.remove(documentId)
length -= 1
self._index_length = BTrees.Length.Length(length)
def insertForwardIndexEntry(self, entry, documentId):
"""If the value matches the indexed one, insert into treeset
"""
# When we get the first entry, decide to index the opposite of what
# we got, as indexing zero items is fewer than one.
if self._length.value == 0:
self._index_value = int(not bool(entry))
# if the added entry value is index value, insert it into index
if bool(entry) is bool(self._index_value):
self._index_length.change(1)
self._index.insert(documentId)
# insert value into global unindex (before computing index invert)
self._unindex[documentId] = entry
self._length.change(1)
# is the index (after adding the current entry) larger than 60%
# of the total length? than switch the indexed value
if bool(entry) is bool(self._index_value):
if (self._index_length.value) >= ((self._length.value) * 0.6):
self._invert_index()
def removeForwardIndexEntry(self, entry, documentId, check=True):
"""Take the entry provided and remove any reference to documentId
in its entry in the index.
"""
if bool(entry) is bool(self._index_value):
try:
self._index.remove(documentId)
self._index_length.change(-1)
except ConflictError:
#.........这里部分代码省略.........
示例12: _wrapLookup
def _wrapLookup(r):
if not isinstance(r, (IISet, IITreeSet)):
r = IITreeSet(r.keys())
return r
示例13: clear
def clear(self):
self.ids = IITreeSet()
示例14: readstatus
def readstatus(self):
self.readstatus = IITreeSet()
return self.readstatus
示例15: index_object
def index_object(self, documentId, obj, threshold=None):
"""Index an object.
- ``documentId`` is the integer ID of the document.
- ``obj`` is the object to be indexed.
- ``threshold`` is the number of words to process between committing
subtransactions. If None, subtransactions are disabled.
For each name in ``getIndexSourceNames``, try to get the named
attribute from ``obj``.
- If the object does not have the attribute, do not add it to the
index for that name.
- If the attribute is a callable, call it to get the value. If
calling it raises an AttributeError, do not add it to the index.
for that name.
"""
# Clear the data structures before indexing the object. This will ensure
# we don't leave any stale data behind when an object gets reindexed.
self.unindex_object(documentId)
### 1. Get the values.
start = self._getattr(self.start_attr, obj)
end = self._getattr(self.end_attr, obj)
if start is None:
# Ignore calls if the obj does not have the start field.
return False
if end is None:
# Singular event
end = start
recurrence = self._getattr(self.recurrence_attr, obj)
if not recurrence:
rule = None
elif isinstance(recurrence, basestring):
# XXX trap and log errors
rule = rrule.rrulestr(recurrence, dtstart=start)
elif isinstance(recurrence, rrule.rrulebase):
rule = recurrence
else:
#XXX Log error
rule = None
# Strip out times from the recurrence:
if rule is not None:
sync_timezone(rule, start.tzinfo)
### 2. Make them into what should be indexed.
# XXX Naive events are not comparable to timezoned events, so we convert
# everything to utctimetuple(). This means naive events are assumed to
# be GMT, but we can live with that at the moment.
start_value = start.utctimetuple()
end_value = end.utctimetuple()
# The end value should be the end of the recurrence, if any:
if rule is not None:
if is_open_ended(rule):
# This recurrence is open ended
end_value = None
else:
duration = end - start
allrecs = [x for x in rule._iter()]
if allrecs:
last = allrecs[-1] + duration
else:
# Real data may have invalud recurrence rules,
# which end before the start for example.
# Then we end up here.
last = end
end_value = last.utctimetuple()
### 3. Store everything in the indexes:
row = self._start2uid.get(start_value, None)
if row is None:
row = IITreeSet((documentId,))
self._start2uid[start_value] = row
else:
row.insert(documentId)
row = self._end2uid.get(end_value, None)
if row is None:
row = IITreeSet((documentId,))
self._end2uid[end_value] = row
else:
row.insert(documentId)
self._uid2start[documentId] = start_value
self._uid2recurrence[documentId] = rule
self._uid2end[documentId] = end_value
self._uid2duration[documentId] = end - start
return True