From 85176a8e6b267e68eac034378823053d3c9dd337 Mon Sep 17 00:00:00 2001
From: Leah Tacke genannt Unterberg <leah.tgu@pads.rwth-aachen.de>
Date: Fri, 14 Mar 2025 15:44:23 +0100
Subject: [PATCH] factored out MitMDatasetIdentifier

---
 .../sql/data_models/virtual_view.py           |  2 +-
 .../superset/definition_bundles.py            |  2 +-
 .../superset/definitions/core.py              | 16 +++++++-------
 .../superset/definitions/mitm_dataset.py      | 21 +++++++++++++------
 .../superset/factories/generic_charts.py      |  6 +++---
 .../superset/from_intermediate.py             |  5 +++--
 .../transformation/superset/from_sql.py       |  9 ++++----
 .../transformation/superset/interface.py      |  5 +++--
 pyproject.toml                                |  2 +-
 test/something.py                             |  9 ++++++--
 10 files changed, 47 insertions(+), 30 deletions(-)

diff --git a/mitm_tooling/extraction/sql/data_models/virtual_view.py b/mitm_tooling/extraction/sql/data_models/virtual_view.py
index 0a56d21..44131a8 100644
--- a/mitm_tooling/extraction/sql/data_models/virtual_view.py
+++ b/mitm_tooling/extraction/sql/data_models/virtual_view.py
@@ -42,7 +42,7 @@ class VirtualView(VirtualViewBase):
         return cls(table_meta=tm, from_clause=from_clause, sa_table=virtual_table)
 
     def as_compiled(self, dialect: sa.Dialect) -> 'CompiledVirtualView':
-        compiled = self.from_clause.select().compile(dialect=dialect, compile_kwargs={"literal_binds": True})
+        compiled = self.from_clause.select().compile(dialect=dialect, compile_kwargs={'literal_binds': True, 'render_postcompile': True})
         contains_binds = len(compiled.binds) > 0
         tm = self.table_meta
         if contains_binds:
diff --git a/mitm_tooling/transformation/superset/definition_bundles.py b/mitm_tooling/transformation/superset/definition_bundles.py
index 8e42b24..b87ab43 100644
--- a/mitm_tooling/transformation/superset/definition_bundles.py
+++ b/mitm_tooling/transformation/superset/definition_bundles.py
@@ -26,7 +26,7 @@ class SupersetDatasourceBundle(SupersetAssetBundle):
 
     @property
     def placeholder_dataset_identifiers(self) -> dict[TableName, DatasourceIdentifier]:
-        return {ds.table_name: DatasourceIdentifier(dataset_uuid=ds.uuid) for ds in self.datasets}
+        return {ds.table_name: DatasourceIdentifier(uuid=ds.uuid) for ds in self.datasets}
 
     def to_import(self) -> SupersetAssetsImport:
         return mk_assets_import(databases=[self.database], datasets=self.datasets)
diff --git a/mitm_tooling/transformation/superset/definitions/core.py b/mitm_tooling/transformation/superset/definitions/core.py
index c53eeda..3a31bda 100644
--- a/mitm_tooling/transformation/superset/definitions/core.py
+++ b/mitm_tooling/transformation/superset/definitions/core.py
@@ -4,24 +4,24 @@ from mitm_tooling.representation import ColumnName
 from .constants import *
 
 
-class SupersetPostProcessing(pydantic.BaseModel, ABC):
-    @pydantic.computed_field()
-    @property
-    def operation(self) -> str:
-        raise NotImplementedError()
-
-
 class DatasourceIdentifier(FrozenSupersetDefinition):
     id: SupersetId = -1 # -1 as a placeholder
     type: Literal['table', 'annotation'] = 'table'
 
-    dataset_uuid: StrUUID = pydantic.Field(exclude=True)
+    uuid: StrUUID = pydantic.Field(exclude=False)
 
     @property
     def datasource_uid(self):
         return f'{self.id}__{self.type}'
 
 
+class SupersetPostProcessing(pydantic.BaseModel, ABC):
+    @pydantic.computed_field()
+    @property
+    def operation(self) -> str:
+        raise NotImplementedError()
+
+
 class SupersetColumn(FrozenSupersetDefinition):
     column_name: str
     verbose_name: str | None = None
diff --git a/mitm_tooling/transformation/superset/definitions/mitm_dataset.py b/mitm_tooling/transformation/superset/definitions/mitm_dataset.py
index 4a259eb..5c5ff61 100644
--- a/mitm_tooling/transformation/superset/definitions/mitm_dataset.py
+++ b/mitm_tooling/transformation/superset/definitions/mitm_dataset.py
@@ -4,17 +4,26 @@ from mitm_tooling.transformation.superset.definitions import SupersetDefFile, St
     SupersetId
 
 
+class MitMDatasetIdentifier(BaseSupersetDefinition):
+    dataset_name: str
+    id: SupersetId | None = None
+    uuid: StrUUID | None = None
+
+
 class RelatedTable(BaseSupersetDefinition):
-    table_id : SupersetId | None = None
-    table_uuid : StrUUID
+    table_id: SupersetId | None = None
+    table_uuid: StrUUID
+
 
 class RelatedSlice(BaseSupersetDefinition):
-    slice_id : SupersetId | None = None
-    slice_uuid : StrUUID
+    slice_id: SupersetId | None = None
+    slice_uuid: StrUUID
+
 
 class RelatedDashboard(BaseSupersetDefinition):
-    dashboard_id : SupersetId | None = None
-    dashboard_uuid : StrUUID
+    dashboard_id: SupersetId | None = None
+    dashboard_uuid: StrUUID
+
 
 class SupersetMitMDatasetDef(SupersetDefFile):
     uuid: StrUUID
diff --git a/mitm_tooling/transformation/superset/factories/generic_charts.py b/mitm_tooling/transformation/superset/factories/generic_charts.py
index 3f8973d..f615919 100644
--- a/mitm_tooling/transformation/superset/factories/generic_charts.py
+++ b/mitm_tooling/transformation/superset/factories/generic_charts.py
@@ -26,7 +26,7 @@ def mk_pie_chart(name: str, datasource_identifier: DatasourceIdentifier, col: Co
 
     return mk_chart_def(name=name,
                         viz_type=SupersetVizType.PIE,
-                        dataset_uuid=datasource_identifier.dataset_uuid,
+                        dataset_uuid=datasource_identifier.uuid,
                         params=params,
                         query_context=qc)
 
@@ -64,7 +64,7 @@ def mk_time_series_bar_chart(name: str,
 
     return mk_chart_def(name=name,
                         viz_type=SupersetVizType.TIMESERIES_BAR,
-                        dataset_uuid=datasource_identifier.dataset_uuid,
+                        dataset_uuid=datasource_identifier.uuid,
                         params=params,
                         query_context=qc)
 
@@ -101,6 +101,6 @@ def mk_avg_count_time_series_chart(name: str,
 
     return mk_chart_def(name=name,
                         viz_type=SupersetVizType.TIMESERIES_LINE,
-                        dataset_uuid=datasource_identifier.dataset_uuid,
+                        dataset_uuid=datasource_identifier.uuid,
                         params=params,
                         query_context=qc)
diff --git a/mitm_tooling/transformation/superset/from_intermediate.py b/mitm_tooling/transformation/superset/from_intermediate.py
index 29123bf..d3b8615 100644
--- a/mitm_tooling/transformation/superset/from_intermediate.py
+++ b/mitm_tooling/transformation/superset/from_intermediate.py
@@ -1,6 +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 .mitm_specific import get_mitm_visualization_factory
 
@@ -20,12 +21,12 @@ def header_into_superset_visualization_bundle(header: Header,
 
 def header_into_superset_mitm_dataset_bundle(header: Header,
                                              db_conn_info: SupersetDBConnectionInfo,
-                                             dataset_name: str,
+                                             dataset_identifier: MitMDatasetIdentifier,
                                              include_visualizations: bool = False) -> SupersetMitMDatasetBundle:
     from ..sql.from_intermediate import header_into_db_meta
     from .from_sql import db_meta_into_mitm_dataset_bundle
     db_meta = header_into_db_meta(header)
-    mitm_dataset_bundle = db_meta_into_mitm_dataset_bundle(db_meta, db_conn_info, dataset_name, header.mitm)
+    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)
diff --git a/mitm_tooling/transformation/superset/from_sql.py b/mitm_tooling/transformation/superset/from_sql.py
index 93b6bf0..1751e7d 100644
--- a/mitm_tooling/transformation/superset/from_sql.py
+++ b/mitm_tooling/transformation/superset/from_sql.py
@@ -2,6 +2,7 @@ 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 .factories.database import mk_database
@@ -29,11 +30,11 @@ def db_meta_into_superset_datasource_bundle(db_meta: DBMetaInfoBase,
 
 def db_meta_into_mitm_dataset_bundle(db_meta: DBMetaInfoBase,
                                      db_conn_info: SupersetDBConnectionInfo,
-                                     dataset_name: str,
+                                     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_name, mitm, db_uuid)
+    mitm_dataset = mk_mitm_dataset(dataset_identifier.dataset_name, mitm, db_uuid, uuid=dataset_identifier.uuid)
     return SupersetMitMDatasetBundle(mitm_dataset=mitm_dataset, datasource_bundle=datasource_bundle)
 
 
@@ -49,9 +50,9 @@ def db_into_superset_datasource_bundle(arg: SQLiteFileOrEngine,
 
 def db_into_mitm_dataset_bundle(arg: SQLiteFileOrEngine,
                                 db_conn_info: SupersetDBConnectionInfo,
-                                dataset_name: str,
+                                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_name, mitm, db_uuid)
+    mitm_dataset = mk_mitm_dataset(dataset_identifier.dataset_name, mitm, db_uuid, uuid=dataset_identifier.uuid)
     return SupersetMitMDatasetBundle(mitm_dataset=mitm_dataset, datasource_bundle=datasource_bundle)
diff --git a/mitm_tooling/transformation/superset/interface.py b/mitm_tooling/transformation/superset/interface.py
index 048e616..85204be 100644
--- a/mitm_tooling/transformation/superset/interface.py
+++ b/mitm_tooling/transformation/superset/interface.py
@@ -4,6 +4,7 @@ from mitm_tooling.transformation.superset.definition_bundles import SupersetData
 from mitm_tooling.transformation.superset.from_intermediate import header_into_superset_mitm_dataset_bundle
 from mitm_tooling.transformation.superset.from_intermediate import header_into_superset_visualization_bundle
 from .common import SupersetDBConnectionInfo
+from .definitions.mitm_dataset import MitMDatasetIdentifier
 from .from_intermediate import header_into_superset_datasource_bundle
 
 
@@ -16,6 +17,6 @@ def mk_superset_visualization_bundle(header: Header,
     return header_into_superset_visualization_bundle(header, superset_datasource_bundle)
 
 
-def mk_superset_mitm_dataset_bundle(dataset_name: str, header: Header, db_conn_info: SupersetDBConnectionInfo,
+def mk_superset_mitm_dataset_bundle(header: Header, dataset_identifier: MitMDatasetIdentifier, db_conn_info: SupersetDBConnectionInfo,
                                     include_visualizations: bool = False) -> SupersetMitMDatasetBundle:
-    return header_into_superset_mitm_dataset_bundle(header, db_conn_info, dataset_name=dataset_name)
+    return header_into_superset_mitm_dataset_bundle(header, db_conn_info, dataset_identifier, include_visualizations=include_visualizations)
diff --git a/pyproject.toml b/pyproject.toml
index 9289a99..afd4e43 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "mitm-tooling"
-version = "0.4.4"
+version = "0.4.5"
 description = ""
 authors = ["Leah Tacke genannt Unterberg <leah.tgu@pads.rwth-aachen.de>"]
 readme = "README.md"
diff --git a/test/something.py b/test/something.py
index 26100fd..cd58d9c 100644
--- a/test/something.py
+++ b/test/something.py
@@ -4,6 +4,7 @@ import unittest
 from pydantic import AnyUrl
 
 from mitm_tooling.transformation.superset.common import name_plus_uuid, SupersetDBConnectionInfo
+from mitm_tooling.transformation.superset.definitions.mitm_dataset import MitMDatasetIdentifier
 
 
 class MyTestCase(unittest.TestCase):
@@ -65,7 +66,9 @@ class MyTestCase(unittest.TestCase):
         from mitm_tooling.io import importing, MITM
         syn = importing.read_zip('synthetic.maed', MITM.MAED, header_only=True)
         from mitm_tooling.transformation.superset import mk_superset_mitm_dataset_bundle, write_superset_import_as_zip
-        dataset_import = mk_superset_mitm_dataset_bundle(name_plus_uuid('SyntheticExampleDataset'), syn.header,
+        dataset_import = mk_superset_mitm_dataset_bundle(syn.header,
+                                                         MitMDatasetIdentifier(
+                                                             dataset_name=name_plus_uuid('SyntheticExampleDataset')),
                                                          SupersetDBConnectionInfo(
                                                              sql_alchemy_uri=AnyUrl(
                                                                  'sqlite://synthetic-variation.sqlite'),
@@ -77,7 +80,9 @@ class MyTestCase(unittest.TestCase):
         from mitm_tooling.io import importing, MITM
         syn = importing.read_zip('synthetic.maed', MITM.MAED, header_only=True)
         from mitm_tooling.transformation.superset import mk_superset_mitm_dataset_bundle, write_superset_import_as_zip
-        dataset_import = mk_superset_mitm_dataset_bundle(name_plus_uuid('SyntheticExampleDataset'), syn.header,
+        dataset_import = mk_superset_mitm_dataset_bundle(syn.header,
+                                                         MitMDatasetIdentifier(
+                                                             dataset_name=name_plus_uuid('SyntheticExampleDataset')),
                                                          SupersetDBConnectionInfo(
                                                              sql_alchemy_uri=AnyUrl(
                                                                  'sqlite://synthetic-variation.sqlite'),
-- 
GitLab