refactor: Improve performance regression introduced in #20473 (#20810)

* refactor: Improve performance regression introduced in #20473

* Update dao.py
This commit is contained in:
John Bodley 2022-07-26 17:47:15 -07:00 committed by GitHub
parent 4d192e6e4d
commit d327437462
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 34 additions and 28 deletions

View File

@ -154,10 +154,10 @@ class DatasetDAO(BaseDAO): # pylint: disable=too-many-public-methods
"""
if "columns" in properties:
properties["columns"] = cls.update_columns(model, properties["columns"])
cls.update_columns(model, properties.pop("columns"), commit=commit)
if "metrics" in properties:
properties["metrics"] = cls.update_metrics(model, properties["metrics"])
cls.update_metrics(model, properties.pop("metrics"), commit=commit)
return super().update(model, properties, commit=commit)
@ -166,7 +166,8 @@ class DatasetDAO(BaseDAO): # pylint: disable=too-many-public-methods
cls,
model: SqlaTable,
property_columns: List[Dict[str, Any]],
) -> List[TableColumn]:
commit: bool = True,
) -> None:
"""
Creates/updates and/or deletes a list of columns, based on a
list of Dict.
@ -178,33 +179,36 @@ class DatasetDAO(BaseDAO): # pylint: disable=too-many-public-methods
"""
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
if commit:
db.session.commit()
@classmethod
def update_metrics(
cls,
model: SqlaTable,
property_metrics: List[Dict[str, Any]],
) -> List[SqlMetric]:
commit: bool = True,
) -> None:
"""
Creates/updates and/or deletes a list of metrics, based on a
list of Dict.
@ -216,26 +220,28 @@ class DatasetDAO(BaseDAO): # pylint: disable=too-many-public-methods
"""
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
if commit:
db.session.commit()
@classmethod
def find_dataset_column(