Skip to content

Commit 17332bd

Browse files
committed
Fix join export to use resolved models and escape CASE labels
Use inheritance-resolved models for join target lookup during export so inherited primary keys are picked up correctly. Escape single quotes in CASE dimension labels to prevent SQL injection/syntax errors.
1 parent 3bd0f9c commit 17332bd

1 file changed

Lines changed: 7 additions & 7 deletions

File tree

sidemantic/adapters/cube.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -318,10 +318,10 @@ def _parse_dimension(self, dim_def: dict, cube_name: str) -> Dimension | None:
318318
parts = []
319319
for w in whens:
320320
cond = _normalize_cube_sql(w.get("sql"), cube_name)
321-
lbl = w.get("label", "")
321+
lbl = w.get("label", "").replace("'", "''")
322322
parts.append(f"WHEN {cond} THEN '{lbl}'")
323323
if else_clause:
324-
else_label = else_clause.get("label", "Unknown")
324+
else_label = else_clause.get("label", "Unknown").replace("'", "''")
325325
parts.append(f"ELSE '{else_label}'")
326326
dim_sql = "CASE " + " ".join(parts) + " END"
327327

@@ -719,7 +719,7 @@ def export(self, graph: SemanticGraph, output_path: str | Path) -> None:
719719
for model in resolved_models.values():
720720
if model.meta and model.meta.get("cube_type") == "view":
721721
continue
722-
cube = self._export_cube(model, graph)
722+
cube = self._export_cube(model, resolved_models)
723723
cubes.append(cube)
724724

725725
data = {"cubes": cubes}
@@ -729,12 +729,12 @@ def export(self, graph: SemanticGraph, output_path: str | Path) -> None:
729729
with open(output_path, "w") as f:
730730
yaml.dump(data, f, sort_keys=False, default_flow_style=False)
731731

732-
def _export_cube(self, model: Model, graph: SemanticGraph) -> dict:
732+
def _export_cube(self, model: Model, resolved_models: dict[str, Model]) -> dict:
733733
"""Export model to Cube definition.
734734
735735
Args:
736736
model: Model to export
737-
graph: Semantic graph (for join discovery)
737+
resolved_models: Resolved (inheritance-applied) models dict for join target lookup
738738
739739
Returns:
740740
Cube definition dictionary
@@ -928,8 +928,8 @@ def _export_cube(self, model: Model, graph: SemanticGraph) -> dict:
928928
if relationship.type == "many_to_many":
929929
continue
930930

931-
# Find target model
932-
target_model = graph.models.get(relationship.name)
931+
# Find target model from resolved models (inheritance-applied)
932+
target_model = resolved_models.get(relationship.name)
933933
if target_model:
934934
if relationship.type in ("many_to_one", "one_to_one"):
935935
local_key = relationship.sql_expr or relationship.foreign_key

0 commit comments

Comments
 (0)