Skip to content

Commit

Permalink
refactor: Improve performance regression introduced in #20473
Browse files Browse the repository at this point in the history
  • Loading branch information
john-bodley committed Jul 21, 2022
1 parent 1101922 commit 24690ef
Showing 1 changed file with 28 additions and 30 deletions.
58 changes: 28 additions & 30 deletions superset/datasets/dao.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,10 +154,10 @@ def update(
"""

if "columns" in properties:
properties["columns"] = cls.update_columns(model, properties["columns"])
cls.update_columns(model, properties.pop("columns"))

if "metrics" in properties:
properties["metrics"] = cls.update_metrics(model, properties["metrics"])
cls.update_metrics(model, properties.pop("metrics"))

return super().update(model, properties, commit=commit)

Expand All @@ -166,7 +166,7 @@ def update_columns(
cls,
model: SqlaTable,
property_columns: List[Dict[str, Any]],
) -> List[TableColumn]:
) -> None:
"""
Creates/updates and/or deletes a list of columns, based on a
list of Dict.
Expand All @@ -178,33 +178,32 @@ def update_columns(
"""

column_by_id = {column.id: column for column in model.columns}
columns = []
seen = set()

for properties in property_columns:
if "id" in properties:
columns.append(
DatasetDAO.update_column(
column_by_id[properties["id"]],
properties,
commit=False,
)
seen.add(properties["id"])

DatasetDAO.update_column(
column_by_id[properties["id"]],
properties,
commit=False,
)
else:
DatasetDAO.create_column(
{**properties, "table_id": model.id},
commit=False,
)

# Note for new columns the primary key is undefined sans a commit/flush.
columns.append(DatasetDAO.create_column(properties, commit=False))

for id_ in {obj.id for obj in model.columns} - {obj.id for obj in columns}:
for id_ in {obj.id for obj in model.columns} - seen:
DatasetDAO.delete_column(column_by_id[id_], commit=False)

return columns

@classmethod
def update_metrics(
cls,
model: SqlaTable,
property_metrics: List[Dict[str, Any]],
) -> List[SqlMetric]:
) -> None:
"""
Creates/updates and/or deletes a list of metrics, based on a
list of Dict.
Expand All @@ -216,27 +215,26 @@ def update_metrics(
"""

metric_by_id = {metric.id: metric for metric in model.metrics}
metrics = []
seen = set()

for properties in property_metrics:
if "id" in properties:
metrics.append(
DatasetDAO.update_metric(
metric_by_id[properties["id"]],
properties,
commit=False,
)
seen.add(properties["id"])

DatasetDAO.update_metric(
metric_by_id[properties["id"]],
properties,
commit=False,
)
else:
DatasetDAO.create_metric(
{**properties, "table_id": model.id},
commit=False,
)

# Note for new metrics the primary key is undefined sans a commit/flush.
metrics.append(DatasetDAO.create_metric(properties, commit=False))

for id_ in {obj.id for obj in model.metrics} - {obj.id for obj in metrics}:
for id_ in {obj.id for obj in model.metrics} - seen:
DatasetDAO.delete_column(metric_by_id[id_], commit=False)

return metrics

@classmethod
def find_dataset_column(
cls, dataset_id: int, column_id: int
Expand Down

0 comments on commit 24690ef

Please sign in to comment.