From 91ba897f8e7b8007ce236ac5eae0b47c0b4e200f Mon Sep 17 00:00:00 2001 From: David Aaron Suddjian <1858430+suddjian@users.noreply.github.com> Date: Fri, 23 Apr 2021 21:04:45 -0700 Subject: [PATCH] fix(dashboard): Add caching for dashboard datasets (#14306) * fix(dashboard): [WIP] add caching back in to the dashboard dataset api * caching works! remove log message * remove unused full_data method * add caching to the charts endpoint as well * spread the cache love * lint * Revert "spread the cache love" This reverts commit ef322a3b0df7d35446a60141ad98288102547a52. * Revert "add caching to the charts endpoint as well" This reverts commit d3d1584989324efe56d08c081570149454ddf212. * it's a list --- superset/dashboards/dao.py | 9 +-------- superset/models/dashboard.py | 35 ++++++++++------------------------- 2 files changed, 11 insertions(+), 33 deletions(-) diff --git a/superset/dashboards/dao.py b/superset/dashboards/dao.py index 707da7bc8..4a8a31422 100644 --- a/superset/dashboards/dao.py +++ b/superset/dashboards/dao.py @@ -28,7 +28,6 @@ from superset.extensions import db from superset.models.core import FavStar, FavStarClassName from superset.models.dashboard import Dashboard from superset.models.slice import Slice -from superset.utils import core from superset.utils.dashboard_filter_scopes_converter import copy_filter_scopes logger = logging.getLogger(__name__) @@ -49,13 +48,7 @@ class DashboardDAO(BaseDAO): @staticmethod def get_datasets_for_dashboard(id_or_slug: str) -> List[Any]: dashboard = DashboardDAO.get_by_id_or_slug(id_or_slug) - datasource_slices = core.indexed(dashboard.slices, "datasource") - data = [ - datasource.data_for_slices(slices) - for datasource, slices in datasource_slices.items() - if datasource - ] - return data + return dashboard.datasets_trimmed_for_slices() @staticmethod def get_charts_for_dashboard(id_or_slug: str) -> List[Slice]: diff --git a/superset/models/dashboard.py b/superset/models/dashboard.py index 774cf621d..61607d106 100644 --- a/superset/models/dashboard.py +++ b/superset/models/dashboard.py @@ -38,7 +38,6 @@ from sqlalchemy import ( UniqueConstraint, ) from sqlalchemy.engine.base import Connection -from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.orm import relationship, sessionmaker, subqueryload from sqlalchemy.orm.mapper import Mapper from sqlalchemy.orm.session import object_session @@ -49,7 +48,6 @@ from superset import app, ConnectorRegistry, db, is_feature_enabled, security_ma from superset.connectors.base.models import BaseDatasource from superset.connectors.druid.models import DruidColumn, DruidMetric from superset.connectors.sqla.models import SqlMetric, TableColumn -from superset.exceptions import SupersetException from superset.extensions import cache_manager from superset.models.helpers import AuditMixinNullable, ImportExportMixin from superset.models.slice import Slice @@ -242,30 +240,17 @@ class Dashboard( # pylint: disable=too-many-instance-attributes @cache_manager.cache.memoize( # manage cache version manually - make_name=lambda fname: f"{fname}-v2.1", + make_name=lambda fname: f"{fname}-v1.0", unless=lambda: not is_feature_enabled("DASHBOARD_CACHE"), ) - def full_data(self) -> Dict[str, Any]: - """Bootstrap data for rendering the dashboard page.""" - slices = self.slices - datasource_slices = utils.indexed(slices, "datasource") - try: - datasources = { - # Filter out unneeded fields from the datasource payload - datasource.uid: datasource.data_for_slices(slices) - for datasource, slices in datasource_slices.items() - if datasource - } - except (SupersetException, SQLAlchemyError): - datasources = {} - return { - # dashboard metadata - "dashboard": self.data, - # slices metadata - "slices": [slc.data for slc in slices], - # datasource metadata - "datasources": datasources, - } + def datasets_trimmed_for_slices(self) -> List[Dict[str, Any]]: + datasource_slices = utils.indexed(self.slices, "datasource") + return [ + # Filter out unneeded fields from the datasource payload + datasource.data_for_slices(slices) + for datasource, slices in datasource_slices.items() + if datasource + ] @property # type: ignore def params(self) -> str: # type: ignore @@ -287,7 +272,7 @@ class Dashboard( # pylint: disable=too-many-instance-attributes @debounce(0.1) def clear_cache(self) -> None: - cache_manager.cache.delete_memoized(Dashboard.full_data, self) + cache_manager.cache.delete_memoized(Dashboard.datasets_trimmed_for_slices, self) @classmethod @debounce(0.1)