fix: Address performance regression introduced in #11785 (#20893)

This commit is contained in:
John Bodley 2022-07-28 22:56:39 -07:00 committed by GitHub
parent 3f124d9d67
commit 50d2e5a15d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 19 additions and 11 deletions

View File

@ -134,7 +134,9 @@ include-naming-hint=no
# List of decorators that produce properties, such as abc.abstractproperty. Add # List of decorators that produce properties, such as abc.abstractproperty. Add
# to this list to register other decorators that produce valid properties. # 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 # Regular expression matching correct argument names
argument-rgx=[a-z_][a-z0-9_]{2,30}$ argument-rgx=[a-z_][a-z0-9_]{2,30}$

View File

@ -66,6 +66,7 @@ from sqlalchemy import (
update, update,
) )
from sqlalchemy.engine.base import Connection 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 import backref, Query, relationship, RelationshipProperty, Session
from sqlalchemy.orm.exc import NoResultFound from sqlalchemy.orm.exc import NoResultFound
from sqlalchemy.orm.mapper import Mapper from sqlalchemy.orm.mapper import Mapper
@ -741,7 +742,7 @@ class SqlaTable(Model, BaseDatasource): # pylint: disable=too-many-public-metho
"MAX": sa.func.MAX, "MAX": sa.func.MAX,
} }
def __repr__(self) -> str: def __repr__(self) -> str: # pylint: disable=invalid-repr-returned
return self.name return self.name
@staticmethod @staticmethod
@ -835,11 +836,9 @@ class SqlaTable(Model, BaseDatasource): # pylint: disable=too-many-public-metho
raise DatasetInvalidPermissionEvaluationException() raise DatasetInvalidPermissionEvaluationException()
return f"[{self.database}].[{self.table_name}](id:{self.id})" return f"[{self.database}].[{self.table_name}](id:{self.id})"
@property @hybrid_property
def name(self) -> str: def name(self) -> str: # pylint: disable=invalid-overridden-method
if not self.schema: return self.schema + "." + self.table_name if self.schema else self.table_name
return self.table_name
return "{}.{}".format(self.schema, self.table_name)
@property @property
def full_name(self) -> str: def full_name(self) -> str:

View File

@ -1207,7 +1207,16 @@ class Superset(BaseSupersetView): # pylint: disable=too-many-public-methods
max_tables = max_items * len(tables) // total_items max_tables = max_items * len(tables) // total_items
max_views = max_items * len(views) // 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 = [ table_options = [
{ {
@ -1216,9 +1225,7 @@ class Superset(BaseSupersetView): # pylint: disable=too-many-public-methods
"label": get_datasource_label(tn), "label": get_datasource_label(tn),
"title": get_datasource_label(tn), "title": get_datasource_label(tn),
"type": "table", "type": "table",
"extra": dataset_tables[f"{tn.schema}.{tn.table}"].extra_dict "extra": extra_dict_by_name.get(f"{tn.schema}.{tn.table}", None),
if (f"{tn.schema}.{tn.table}" in dataset_tables)
else None,
} }
for tn in tables[:max_tables] for tn in tables[:max_tables]
] ]