diff --git a/djaosdb/caosdb_client.py b/djaosdb/caosdb_client.py index 021ad7d2fbff2cc7a6c37391d0d149f99998b61a..789ce2170effacf158c16069dd262b172196b493 100644 --- a/djaosdb/caosdb_client.py +++ b/djaosdb/caosdb_client.py @@ -112,6 +112,9 @@ class CachedProperties(set): class DefaultCaosDBClientDelegate: + _query_cache = {} + _etag = None + def __init__(self, **kwargs): self.cached_record_types = CachedRecordTypes(self) self.cached_properties = CachedProperties(self) @@ -121,8 +124,7 @@ class DefaultCaosDBClientDelegate: self._caosdb = caosdb self._caosdb.configure_connection(**kwargs) - self._query_cache = {} - self._etag = None + def _get_reference_clause(self, type, p, v, negation, sub=None): result = (f" REFERENCES {v}" @@ -165,26 +167,32 @@ class DefaultCaosDBClientDelegate: raise NotImplementedError("_get_filter_clause(%s)", fil) def _cache_locally(self, etag, key, value): - if etag != self._etag: - self._query_cache = {} + if etag != DefaultCaosDBClientDelegate._etag: + DefaultCaosDBClientDelegate._query_cache = {} + DefaultCaosDBClientDelegate._etag = etag if key is not None: - self._query_cache[key] = value + LOGGER.debug("caching results with etag '%s' for key '%s'", + str(etag), str(key)) + DefaultCaosDBClientDelegate._query_cache[key] = value def _query(self, query, key=None): - if key is not None and key in self.query_local_cache: - return self._query_cache[key] + if key is not None and key in DefaultCaosDBClientDelegate._query_cache: + LOGGER.debug("using cached results for key '%s'", str(key)) + return DefaultCaosDBClientDelegate._query_cache[key] - result = self._query_no_local_cache(query) + result, etag = self._query_no_local_cache(query) self._cache_locally(etag, key, result) return result def _query_no_local_cache(self, query): t1 = time.time() - result = self._caosdb.execute_query(query) + query = self._caosdb.Query(q=query) + result = query.execute() + etag = query.etag t2 = time.time() LOGGER.debug("[%s] execute_query(%s) - %s", str(t1), query, str(t2 - t1)) - return result + return result, etag def _find(self, record_type, *args, **kwargs): filter_clause = ""