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
This commit is contained in:
David Aaron Suddjian 2021-04-23 21:04:45 -07:00 committed by GitHub
parent a8781c5313
commit 91ba897f8e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 33 deletions

View File

@ -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]:

View File

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