Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(dashboard): Add caching for dashboard datasets #14306

Merged
merged 9 commits into from
Apr 24, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 1 addition & 8 deletions superset/dashboards/dao.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
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__)
Expand All @@ -49,13 +48,7 @@ def get_by_id_or_slug(id_or_slug: str) -> Dashboard:
@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]:
Expand Down
35 changes: 10 additions & 25 deletions superset/models/dashboard.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@
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
Expand All @@ -49,7 +48,6 @@
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
Expand Down Expand Up @@ -242,30 +240,17 @@ def data(self) -> Dict[str, Any]:

@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
Expand All @@ -287,7 +272,7 @@ def update_thumbnail(self) -> None:

@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)
Expand Down