[Neo-report] r2490 vincent - /trunk/neo/client/mq.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Thu Dec 9 14:33:03 CET 2010
Author: vincent
Date: Thu Dec 9 14:33:03 2010
New Revision: 2490
Log:
Add support for indexes on cached values.
Modified:
trunk/neo/client/mq.py
Modified: trunk/neo/client/mq.py
==============================================================================
--- trunk/neo/client/mq.py [iso-8859-1] (original)
+++ trunk/neo/client/mq.py [iso-8859-1] Thu Dec 9 14:33:03 2010
@@ -32,6 +32,31 @@ Multi-Queue Cache Algorithm.
from math import log
+class MQIndex(object):
+ """
+ Virtual base class for MQ cache external indexes.
+ """
+ def clear(self):
+ """
+ Called when MQ is cleared.
+ """
+ raise NotImplementedError
+
+ def remove(self, key):
+ """
+ Called when key's value is removed from cache, and key is pushed to
+ history buffer.
+ """
+ raise NotImplementedError
+
+ def add(self, key):
+ """
+ Called when key is added into cache.
+ It is either a new key, or a know key comming back from history
+ buffer.
+ """
+ raise NotImplementedError
+
class Element(object):
"""
This class defines an element of a FIFO buffer.
@@ -150,12 +175,34 @@ class MQ(object):
def __init__(self, life_time=10000, buffer_levels=9,
max_history_size=100000, max_size=20*1024*1024):
+ self._index_list = []
self._life_time = life_time
self._buffer_levels = buffer_levels
self._max_history_size = max_history_size
self._max_size = max_size
self.clear()
+ def addIndex(self, index, reindex=True):
+ """
+ Add an index ot this cache.
+ index
+ Object implementing methods from MQIndex class.
+ reindex (True)
+ If True, give all existing keys as new to index.
+ """
+ if reindex:
+ # Index existing entries
+ add = index.add
+ for key in self._data.iterkeys():
+ add(key)
+ self._index_list.append(index)
+
+ def _mapIndexes(self, method_id, args=(), kw=None):
+ if kw is None:
+ kw = {}
+ for index in self._index_list:
+ getattr(index, method_id)(*args, **kw)
+
def clear(self):
self._history_buffer = FIFO()
self._cache_buffers = []
@@ -164,6 +211,7 @@ class MQ(object):
self._data = {}
self._time = 0
self._size = 0
+ self._mapIndexes('clear')
def has_key(self, key):
if key in self._data:
@@ -198,6 +246,7 @@ class MQ(object):
"""
Evict an element to the history buffer.
"""
+ self._mapIndexes('remove', (key, ))
data = self._data[key]
self._size -= sizeof(data.value)
del self._cache_buffers[data.level][data.element]
@@ -221,8 +270,10 @@ class MQ(object):
del cache_buffers[level][element]
else:
del self._history_buffer[element]
+ self._mapIndexes('add', (key, ))
except KeyError:
counter = 1
+ self._mapIndexes('add', (key, ))
# XXX It might be better to adjust the level according to the object
# size.
More information about the Neo-report
mailing list