Skip to content
Snippets Groups Projects
Verified Commit 29747a3b authored by Timm Fitschen's avatar Timm Fitschen
Browse files

WIP: local caching

parent 9e48d028
No related branches found
No related tags found
No related merge requests found
...@@ -121,6 +121,8 @@ class DefaultCaosDBClientDelegate: ...@@ -121,6 +121,8 @@ class DefaultCaosDBClientDelegate:
self._caosdb = caosdb self._caosdb = caosdb
self._caosdb.configure_connection(**kwargs) self._caosdb.configure_connection(**kwargs)
self._query_cache = {}
self._etag = None
def _get_reference_clause(self, type, p, v, negation, sub=None): def _get_reference_clause(self, type, p, v, negation, sub=None):
result = (f" REFERENCES {v}" result = (f" REFERENCES {v}"
...@@ -162,7 +164,22 @@ class DefaultCaosDBClientDelegate: ...@@ -162,7 +164,22 @@ class DefaultCaosDBClientDelegate:
return f' {n}{p}{o}"{v}"' return f' {n}{p}{o}"{v}"'
raise NotImplementedError("_get_filter_clause(%s)", fil) raise NotImplementedError("_get_filter_clause(%s)", fil)
def _query(self, query): def _cache_locally(self, etag, key, value):
if etag != self._etag:
self._query_cache = {}
if key is not None:
self._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]
result = self._query_no_local_cache(query)
self._cache_locally(etag, key, result)
return result
def _query_no_local_cache(self, query):
t1 = time.time() t1 = time.time()
result = self._caosdb.execute_query(query) result = self._caosdb.execute_query(query)
t2 = time.time() t2 = time.time()
...@@ -176,7 +193,7 @@ class DefaultCaosDBClientDelegate: ...@@ -176,7 +193,7 @@ class DefaultCaosDBClientDelegate:
filter_clause = " WITH " + self._get_filter_clause(fil) filter_clause = " WITH " + self._get_filter_clause(fil)
query = f'FIND RECORD "{record_type}"{filter_clause}' query = f'FIND RECORD "{record_type}"{filter_clause}'
return self._query(query) return self._query(query, key=query)
def _get_property_values(self, container, projection): def _get_property_values(self, container, projection):
if projection is None: if projection is None:
...@@ -335,10 +352,10 @@ class DefaultCaosDBClientDelegate: ...@@ -335,10 +352,10 @@ class DefaultCaosDBClientDelegate:
def _aggregate(self, record_type, sort=None, projection=None, limit=None, def _aggregate(self, record_type, sort=None, projection=None, limit=None,
filter=None, count=False, skip=None): filter=None, count=False, skip=None):
query = self._generate_query(record_type, sort, projection, filter, query, key = self._generate_query(record_type, sort, projection, filter,
count) count)
res = self._query(query) res = self._query(query, key=key)
if count: if count:
return CountResult(res, count) return CountResult(res, count)
rows = self._get_property_values(res, projection) rows = self._get_property_values(res, projection)
...@@ -354,7 +371,9 @@ class DefaultCaosDBClientDelegate: ...@@ -354,7 +371,9 @@ class DefaultCaosDBClientDelegate:
elif sort is not None: elif sort is not None:
prefix = 'SELECT ' + ", ".join(list(projection) + prefix = 'SELECT ' + ", ".join(list(projection) +
list(sort.keys())) + " FROM" list(sort.keys())) + " FROM"
return f'{prefix} RECORD "{record_type}"{filter_clause}' query = f'{prefix} RECORD "{record_type}"{filter_clause}'
key = query if not count else None
return query, key
def delete_many(self, record_type, filter): def delete_many(self, record_type, filter):
container = self._find(record_type, filter=filter) container = self._find(record_type, filter=filter)
......
...@@ -82,7 +82,7 @@ def find_version(*file_paths): ...@@ -82,7 +82,7 @@ def find_version(*file_paths):
install_requires = [ install_requires = [
'sqlparse==0.2.4', 'sqlparse==0.2.4',
'caosdb>=0.4.0', 'caosdb>=0.5.1',
'django>=2.1', 'django>=2.1',
'python-dateutil>=2.8.1', 'python-dateutil>=2.8.1',
] ]
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment