diff --git a/converters/dbt/src/ossie_dbt/ossie_to_msi.py b/converters/dbt/src/ossie_dbt/ossie_to_msi.py index dfad90b0..ca496ecd 100644 --- a/converters/dbt/src/ossie_dbt/ossie_to_msi.py +++ b/converters/dbt/src/ossie_dbt/ossie_to_msi.py @@ -188,7 +188,7 @@ def _classify_field( Aggregation info lives on metrics (`metric_aggregation_params`), not on semantic model measures, so there is no measure classification step. """ - if field.name in primary_key_cols: + if field.name in primary_key_cols or expr in primary_key_cols: entities.append( PydanticEntity( name=field.name, @@ -201,7 +201,7 @@ def _classify_field( ) ) return - if field.name in unique_key_cols: + if field.name in unique_key_cols or expr in unique_key_cols: entities.append( PydanticEntity( name=field.name, @@ -214,7 +214,7 @@ def _classify_field( ) ) return - if field.name in foreign_key_cols: + if field.name in foreign_key_cols or expr in foreign_key_cols: entities.append( PydanticEntity( name=field.name, diff --git a/converters/dbt/tests/test_ossie_to_msi.py b/converters/dbt/tests/test_ossie_to_msi.py index eaec212b..b9eb92c3 100644 --- a/converters/dbt/tests/test_ossie_to_msi.py +++ b/converters/dbt/tests/test_ossie_to_msi.py @@ -23,12 +23,16 @@ from ossie import OssieDataType, OssieDimension from ossie_dbt.msi_to_ossie import MSIToOssieConverter from ossie_dbt.ossie_to_msi import OssieToMSIConverter +from metricflow_semantic_interfaces.test_utils import semantic_model_with_guaranteed_meta from metricflow_semantic_interfaces.type_enums import ( AggregationType, DimensionType, + EntityType, MetricType, ) from tests.helpers import ( + _entity, + _manifest, _ossie_dataset, _ossie_doc, _ossie_field, @@ -445,3 +449,22 @@ def test_ossie_to_msi_to_ossie_preserves_structure(self, snapshot: SnapshotAsser assert metrics[0].name == "revenue" assert metrics[0].expression.dialects[0].expression == "SUM(orders.amount)" assert ossie_doc.to_ossie_yaml() == snapshot + + def test_entity_with_expr_different_from_name_survives_round_trip(self) -> None: + """A PRIMARY entity whose expr differs from its name is not lost on MSI -> OSI -> MSI.""" + orders = semantic_model_with_guaranteed_meta( + name="orders", + entities=[_entity("customer_id", entity_type=EntityType.PRIMARY, expr="id")], + ) + + ossie_doc = MSIToOssieConverter().convert(_manifest(semantic_models=[orders])).output + + assert ossie_doc.semantic_model[0].datasets[0].primary_key == ["id"] + + back = OssieToMSIConverter().convert(ossie_doc).output + sm = back.semantic_models[0] + + assert len(sm.entities) == 1 + assert sm.entities[0].name == "customer_id" + assert sm.entities[0].expr == "id" + assert sm.entities[0].type is EntityType.PRIMARY