From 257f698ba03d5c57d3432ee7af2c7b22793b41cf Mon Sep 17 00:00:00 2001 From: Leah Tacke genannt Unterberg <leah.tgu@pads.rwth-aachen.de> Date: Thu, 20 Mar 2025 10:28:33 +0100 Subject: [PATCH] fixed some superset definition generation stuff --- .../superset/definition_bundles.py | 31 ++++++++++++++++++- .../superset/definitions/core.py | 5 +-- .../superset/definitions/post_processing.py | 13 +++----- .../superset/factories/dataset.py | 2 +- .../superset/factories/mitm_dataset.py | 30 ++++++++++++++++-- .../superset/from_intermediate.py | 9 +++--- .../transformation/superset/from_sql.py | 12 ++++--- pyproject.toml | 2 +- 8 files changed, 77 insertions(+), 27 deletions(-) diff --git a/mitm_tooling/transformation/superset/definition_bundles.py b/mitm_tooling/transformation/superset/definition_bundles.py index b87ab43..bbea4c0 100644 --- a/mitm_tooling/transformation/superset/definition_bundles.py +++ b/mitm_tooling/transformation/superset/definition_bundles.py @@ -1,5 +1,6 @@ from abc import ABC, abstractmethod -from typing import Any +from typing import Any, Self +from uuid import UUID import pydantic @@ -24,6 +25,14 @@ class SupersetDatasourceBundle(SupersetAssetBundle): database: SupersetDatabaseDef datasets: list[SupersetDatasetDef] = pydantic.Field(default_factory=list) + @property + def database_uuid(self) -> UUID: + return self.database.uuid + + @property + def dataset_uuids(self) -> list[UUID]: + return [ds.uuid for ds in self.datasets] + @property def placeholder_dataset_identifiers(self) -> dict[TableName, DatasourceIdentifier]: return {ds.table_name: DatasourceIdentifier(uuid=ds.uuid) for ds in self.datasets} @@ -36,6 +45,14 @@ class SupersetVisualizationBundle(SupersetAssetBundle): charts: list[SupersetChartDef] = pydantic.Field(default_factory=list) dashboards: list[SupersetDashboardDef] = pydantic.Field(default_factory=list) + @property + def chart_uuids(self) -> list[UUID]: + return [ch.uuid for ch in self.charts] + + @property + def dashboard_uuids(self) -> list[UUID]: + return [da.uuid for da in self.dashboards] + def to_import(self) -> SupersetAssetsImport: return mk_assets_import(charts=self.charts, dashboards=self.dashboards) @@ -45,6 +62,18 @@ class SupersetMitMDatasetBundle(SupersetAssetBundle): datasource_bundle: SupersetDatasourceBundle visualization_bundle: SupersetVisualizationBundle = pydantic.Field(default_factory=SupersetVisualizationBundle) + def with_visualization_bundle(self, visualization_bundle: SupersetVisualizationBundle) -> Self: + mitm_ds = self.mitm_dataset + from mitm_tooling.transformation.superset.factories.mitm_dataset import mk_mitm_dataset + return self.__class__( + mitm_dataset=mk_mitm_dataset(name=mitm_ds.dataset_name, mitm=mitm_ds.mitm, uuid=mitm_ds.uuid, + database_uuid=self.datasource_bundle.database_uuid, + table_uuids=self.datasource_bundle.dataset_uuids, + slice_uuids=visualization_bundle.chart_uuids, + dashboard_uuids=visualization_bundle.dashboard_uuids), + datasource_bundle=self.datasource_bundle, + visualization_bundle=visualization_bundle) + def to_import(self) -> SupersetMitMDatasetImport: base_assets = mk_assets_import(databases=[self.datasource_bundle.database], datasets=self.datasource_bundle.datasets, diff --git a/mitm_tooling/transformation/superset/definitions/core.py b/mitm_tooling/transformation/superset/definitions/core.py index 3a31bda..7fad78f 100644 --- a/mitm_tooling/transformation/superset/definitions/core.py +++ b/mitm_tooling/transformation/superset/definitions/core.py @@ -16,10 +16,7 @@ class DatasourceIdentifier(FrozenSupersetDefinition): class SupersetPostProcessing(pydantic.BaseModel, ABC): - @pydantic.computed_field() - @property - def operation(self) -> str: - raise NotImplementedError() + operation: str class SupersetColumn(FrozenSupersetDefinition): diff --git a/mitm_tooling/transformation/superset/definitions/post_processing.py b/mitm_tooling/transformation/superset/definitions/post_processing.py index e7d7d41..6c00e40 100644 --- a/mitm_tooling/transformation/superset/definitions/post_processing.py +++ b/mitm_tooling/transformation/superset/definitions/post_processing.py @@ -13,9 +13,7 @@ class PivotOptions(FrozenSupersetDefinition): class Pivot(SupersetPostProcessing): - @property - def operation(self) -> str: - return 'pivot' + operation: Literal['pivot'] = 'pivot' options: PivotOptions @@ -27,14 +25,11 @@ class RenameOptions(FrozenSupersetDefinition): class Rename(SupersetPostProcessing): - @property - def operation(self) -> str: - return 'flatten' + operation: Literal['rename'] = 'rename' options: RenameOptions class Flatten(SupersetPostProcessing): - @property - def operation(self) -> str: - return 'flatten' + operation: Literal['flatten'] = 'flatten' + diff --git a/mitm_tooling/transformation/superset/factories/dataset.py b/mitm_tooling/transformation/superset/factories/dataset.py index 24183a0..477fe20 100644 --- a/mitm_tooling/transformation/superset/factories/dataset.py +++ b/mitm_tooling/transformation/superset/factories/dataset.py @@ -19,7 +19,7 @@ def mk_dataset(tm: TableMetaInfo, database_uuid: UUID, dialect: sa.Dialect | Non cols.append( mk_column(c, dt, dialect=dialect), ) - if dt in {MITMDataType.Numeric, MITMDataType.Integer}: + if dt in {MITMDataType.Numeric}: metrics.extend(( mk_metric(c, SupersetAggregate.AVG), mk_metric(c, SupersetAggregate.SUM), diff --git a/mitm_tooling/transformation/superset/factories/mitm_dataset.py b/mitm_tooling/transformation/superset/factories/mitm_dataset.py index a55f4b7..fae7f79 100644 --- a/mitm_tooling/transformation/superset/factories/mitm_dataset.py +++ b/mitm_tooling/transformation/superset/factories/mitm_dataset.py @@ -1,18 +1,44 @@ +from typing import Sequence, Literal, Iterable from uuid import UUID from mitm_tooling.definition import MITM from ..common import name_plus_uuid from ..definitions import SupersetMitMDatasetDef +from ..definitions.mitm_dataset import RelatedTable, RelatedSlice, RelatedDashboard from ..factories.utils import mk_uuid -def mk_mitm_dataset(name: str, mitm: MITM, database_uuid: UUID, uuid: UUID | None = None, uniquify_name: bool = False) -> SupersetMitMDatasetDef: +def mk_related_obj(kind: Literal['table', 'slice', 'dashboard'], + uuid: UUID) -> RelatedTable | RelatedSlice | RelatedDashboard | None: + match kind: + case 'table': + return RelatedTable(table_uuid=uuid) + case 'slice': + return RelatedSlice(slice_uuid=uuid) + case 'dashboard': + return RelatedDashboard(dashboard_uuid=uuid) + + +def mk_related_objs(kind: Literal['table', 'slice', 'dashboard'], uuids: Iterable[UUID]) -> Iterable[RelatedTable] | \ + Iterable[RelatedSlice] | \ + Iterable[ + RelatedDashboard] | None: + if uuids: + return [mk_related_obj(kind, uuid) for uuid in uuids] + + +def mk_mitm_dataset(name: str, mitm: MITM, database_uuid: UUID, table_uuids: list[UUID] | None = None, + slice_uuids: Sequence[UUID] | None = None, dashboard_uuids: Sequence[UUID] | None = None, + uuid: UUID | None = None, uniquify_name: bool = False) -> SupersetMitMDatasetDef: uuid = uuid or mk_uuid() if uniquify_name: name = name_plus_uuid(name, uuid) return SupersetMitMDatasetDef( dataset_name=name, mitm=mitm, + uuid=uuid or mk_uuid(), database_uuid=database_uuid, - uuid=uuid or mk_uuid() + tables=mk_related_objs('table', table_uuids), + slices=mk_related_objs('slice', slice_uuids), + dashboards=mk_related_objs('dashboard', dashboard_uuids), ) diff --git a/mitm_tooling/transformation/superset/from_intermediate.py b/mitm_tooling/transformation/superset/from_intermediate.py index d3b8615..83bb728 100644 --- a/mitm_tooling/transformation/superset/from_intermediate.py +++ b/mitm_tooling/transformation/superset/from_intermediate.py @@ -1,8 +1,7 @@ from mitm_tooling.representation import Header - from .common import SupersetDBConnectionInfo -from .definitions.mitm_dataset import MitMDatasetIdentifier from .definition_bundles import SupersetDatasourceBundle, SupersetMitMDatasetBundle, SupersetVisualizationBundle +from .definitions.mitm_dataset import MitMDatasetIdentifier from .mitm_specific import get_mitm_visualization_factory @@ -28,6 +27,8 @@ def header_into_superset_mitm_dataset_bundle(header: Header, db_meta = header_into_db_meta(header) mitm_dataset_bundle = db_meta_into_mitm_dataset_bundle(db_meta, db_conn_info, dataset_identifier, header.mitm) if include_visualizations: - mitm_dataset_bundle.visualization_bundle = header_into_superset_visualization_bundle(header, - mitm_dataset_bundle.datasource_bundle) + mitm_dataset_bundle = mitm_dataset_bundle.with_visualization_bundle( + header_into_superset_visualization_bundle(header, + mitm_dataset_bundle.datasource_bundle)) + return mitm_dataset_bundle diff --git a/mitm_tooling/transformation/superset/from_sql.py b/mitm_tooling/transformation/superset/from_sql.py index 1751e7d..359b16c 100644 --- a/mitm_tooling/transformation/superset/from_sql.py +++ b/mitm_tooling/transformation/superset/from_sql.py @@ -2,9 +2,9 @@ from mitm_tooling.extraction.sql.data_models import DBMetaInfo from mitm_tooling.extraction.sql.data_models.db_meta import DBMetaInfoBase from mitm_tooling.extraction.sql.db import connect_and_reflect from .common import SupersetDBConnectionInfo -from .definitions.mitm_dataset import MitMDatasetIdentifier from .common import _mk_engine, SQLiteFileOrEngine from .definition_bundles import SupersetDatasourceBundle, SupersetMitMDatasetBundle +from .definitions.mitm_dataset import MitMDatasetIdentifier from .factories.database import mk_database from .factories.dataset import mk_dataset from .factories.mitm_dataset import mk_mitm_dataset @@ -33,8 +33,9 @@ def db_meta_into_mitm_dataset_bundle(db_meta: DBMetaInfoBase, dataset_identifier: MitMDatasetIdentifier, mitm: MITM) -> SupersetMitMDatasetBundle: datasource_bundle = db_meta_into_superset_datasource_bundle(db_meta, db_conn_info) - db_uuid = datasource_bundle.database.uuid - mitm_dataset = mk_mitm_dataset(dataset_identifier.dataset_name, mitm, db_uuid, uuid=dataset_identifier.uuid) + mitm_dataset = mk_mitm_dataset(dataset_identifier.dataset_name, mitm, uuid=dataset_identifier.uuid, + database_uuid=datasource_bundle.database_uuid, + table_uuids=datasource_bundle.dataset_uuids) return SupersetMitMDatasetBundle(mitm_dataset=mitm_dataset, datasource_bundle=datasource_bundle) @@ -53,6 +54,7 @@ def db_into_mitm_dataset_bundle(arg: SQLiteFileOrEngine, dataset_identifier: MitMDatasetIdentifier, mitm: MITM) -> SupersetMitMDatasetBundle: datasource_bundle = db_into_superset_datasource_bundle(arg, db_conn_info) - db_uuid = datasource_bundle.database.uuid - mitm_dataset = mk_mitm_dataset(dataset_identifier.dataset_name, mitm, db_uuid, uuid=dataset_identifier.uuid) + mitm_dataset = mk_mitm_dataset(dataset_identifier.dataset_name, mitm, uuid=dataset_identifier.uuid, + database_uuid=datasource_bundle.database_uuid, + table_uuids=datasource_bundle.dataset_uuids) return SupersetMitMDatasetBundle(mitm_dataset=mitm_dataset, datasource_bundle=datasource_bundle) diff --git a/pyproject.toml b/pyproject.toml index c5ad1fa..118d222 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mitm-tooling" -version = "0.4.6" +version = "0.4.7" description = "" authors = ["Leah Tacke genannt Unterberg <leah.tgu@pads.rwth-aachen.de>"] readme = "README.md" -- GitLab