From d92588d9be9425bd53f2308b332311a9916f0194 Mon Sep 17 00:00:00 2001 From: Josef Skladanka Date: Jul 30 2020 11:59:17 +0000 Subject: Further SQL and code optimizations --- diff --git a/oraculum/utils/cache_utils.py b/oraculum/utils/cache_utils.py index d028a14..5f4cfe5 100644 --- a/oraculum/utils/cache_utils.py +++ b/oraculum/utils/cache_utils.py @@ -105,33 +105,46 @@ class Cached(): return self.__get(False, priority, what, *args, **kwargs) def async_get_batch(self, what_base, items, priority="medium"): - whats = {} + whats = set() + what_to_item = {} data = {} if what_base not in self._refreshers: return (None, RefresherNotRegistered) - whats = {item: self._construct_what(what_base, item) for item in items} + for item in items: + what = self._construct_what(what_base, item) - # Create dict with inverted keys/values, for convenience - inv_whats = {v: k for k, v in whats.items()} + if app.config['ENABLE_LOCAL_CACHE']: + cached = self._local_cache.get(what) + if self._new_enough(cached): + data[item] = cached.data + continue + + whats.add(what) + what_to_item[what] = item + + if not whats: + return (data, None) - from_db = CachedData.query.filter(CachedData.provider.in_(whats.values())).all() + from_db = CachedData.query.filter(CachedData.provider.in_(list(whats))).all() # We need to remove the results from the session so we don't get sqlalchemy.exc.UnboundExecutionError later db.session.expunge_all() seen = set() for result in from_db: - item = inv_whats[result.provider] - if not app.config['FORCE_CACHED_DATA']: - if datetime.datetime.utcnow() > result.time_created + self.max_cache_age: - continue + if not self._new_enough(result): + continue + item = what_to_item[result.provider] data[item] = result.data seen.add(item) + if app.config['ENABLE_LOCAL_CACHE']: + self._local_cache[result.provider] = CachedObject(result.time_created, result.data) # Schedule refresh for any missing result that we've asked for - missing = set(whats).difference(seen) + missing = set(items).difference(seen) + for missed in missing: celery_utils.plan_celery_refresh(priority, what_base, missed) data[missed] = []