diff -r 76b3cd5d4f31 -r 01152fffd593 server/sources/pyrorql.py --- a/server/sources/pyrorql.py Mon Apr 06 12:37:45 2009 +0200 +++ b/server/sources/pyrorql.py Tue Apr 07 09:30:23 2009 +0200 @@ -22,7 +22,7 @@ from cubicweb import dbapi, server from cubicweb import BadConnectionId, UnknownEid, ConnectionError from cubicweb.cwconfig import register_persistent_options -from cubicweb.server.sources import AbstractSource, ConnectionWrapper +from cubicweb.server.sources import AbstractSource, ConnectionWrapper, TimedCache class ReplaceByInOperator(Exception): def __init__(self, eids): @@ -130,6 +130,7 @@ 'group': 'sources', }),) register_persistent_options(myoptions) + self._query_cache = TimedCache(30) def last_update_time(self): pkey = u'sources.%s.latest-update-time' % self.uri @@ -154,6 +155,7 @@ """method called by the repository once ready to handle request""" interval = int(self.config.get('synchronization-interval', 5*60)) self.repo.looping_task(interval, self.synchronize) + self.repo.looping_task(self._query_cache.ttl.seconds/10, self._query_cache.clear_expired) def synchronize(self, mtime=None): """synchronize content known by this repository with content in the @@ -241,9 +243,18 @@ # try to reconnect return self.get_connection() - def syntax_tree_search(self, session, union, args=None, cachekey=None, varmap=None): + #assert not varmap, (varmap, union) + rqlkey = union.as_string(kwargs=args) + try: + results = self._query_cache[rqlkey] + except KeyError: + results = self._syntax_tree_search(session, union, args) + self._query_cache[rqlkey] = results + return results + + def _syntax_tree_search(self, session, union, args): """return result from this source for a rql query (actually from a rql syntax tree and a solution dictionary mapping each used variable to a possible type). If cachekey is given, the query necessary to fetch the