This is an automated email from the ASF dual-hosted git repository.
johnbodley pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new 50d2e5a15d fix: Address performance regression introduced in #11785
(#20893)
50d2e5a15d is described below
commit 50d2e5a15d83b4759cdbbcce363a83f6fe12c6bb
Author: John Bodley <[email protected]>
AuthorDate: Thu Jul 28 22:56:39 2022 -0700
fix: Address performance regression introduced in #11785 (#20893)
---
.pylintrc | 4 +++-
superset/connectors/sqla/models.py | 11 +++++------
superset/views/core.py | 15 +++++++++++----
3 files changed, 19 insertions(+), 11 deletions(-)
diff --git a/.pylintrc b/.pylintrc
index dbc0eabaef..848767fe5d 100644
--- a/.pylintrc
+++ b/.pylintrc
@@ -134,7 +134,9 @@ include-naming-hint=no
# List of decorators that produce properties, such as abc.abstractproperty. Add
# to this list to register other decorators that produce valid properties.
-property-classes=abc.abstractproperty
+property-classes=
+ abc.abstractproperty,
+ sqlalchemy.ext.hybrid.hybrid_property
# Regular expression matching correct argument names
argument-rgx=[a-z_][a-z0-9_]{2,30}$
diff --git a/superset/connectors/sqla/models.py
b/superset/connectors/sqla/models.py
index 237a71ab7b..cb1673c828 100644
--- a/superset/connectors/sqla/models.py
+++ b/superset/connectors/sqla/models.py
@@ -66,6 +66,7 @@ from sqlalchemy import (
update,
)
from sqlalchemy.engine.base import Connection
+from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.orm import backref, Query, relationship, RelationshipProperty,
Session
from sqlalchemy.orm.exc import NoResultFound
from sqlalchemy.orm.mapper import Mapper
@@ -741,7 +742,7 @@ class SqlaTable(Model, BaseDatasource): # pylint:
disable=too-many-public-metho
"MAX": sa.func.MAX,
}
- def __repr__(self) -> str:
+ def __repr__(self) -> str: # pylint: disable=invalid-repr-returned
return self.name
@staticmethod
@@ -835,11 +836,9 @@ class SqlaTable(Model, BaseDatasource): # pylint:
disable=too-many-public-metho
raise DatasetInvalidPermissionEvaluationException()
return f"[{self.database}].[{self.table_name}](id:{self.id})"
- @property
- def name(self) -> str:
- if not self.schema:
- return self.table_name
- return "{}.{}".format(self.schema, self.table_name)
+ @hybrid_property
+ def name(self) -> str: # pylint: disable=invalid-overridden-method
+ return self.schema + "." + self.table_name if self.schema else
self.table_name
@property
def full_name(self) -> str:
diff --git a/superset/views/core.py b/superset/views/core.py
index 8363cde191..f3835dd83f 100755
--- a/superset/views/core.py
+++ b/superset/views/core.py
@@ -1207,7 +1207,16 @@ class Superset(BaseSupersetView): # pylint:
disable=too-many-public-methods
max_tables = max_items * len(tables) // total_items
max_views = max_items * len(views) // total_items
- dataset_tables = {table.name: table for table in database.tables}
+ extra_dict_by_name = {
+ table.name: table.extra_dict
+ for table in (
+ db.session.query(SqlaTable).filter(
+ SqlaTable.name.in_( # # pylint: disable=no-member
+ f"{table.schema}.{table.table}" for table in tables
+ )
+ )
+ ).all()
+ }
table_options = [
{
@@ -1216,9 +1225,7 @@ class Superset(BaseSupersetView): # pylint:
disable=too-many-public-methods
"label": get_datasource_label(tn),
"title": get_datasource_label(tn),
"type": "table",
- "extra": dataset_tables[f"{tn.schema}.{tn.table}"].extra_dict
- if (f"{tn.schema}.{tn.table}" in dataset_tables)
- else None,
+ "extra": extra_dict_by_name.get(f"{tn.schema}.{tn.table}",
None),
}
for tn in tables[:max_tables]
]