Skip to content

Commit adcbaaf

Browse files
committed
Fix: resolve entity through model dimension sql_expr, normalize for each CTE alias
1 parent 64c7ced commit adcbaaf

1 file changed

Lines changed: 14 additions & 5 deletions

File tree

sidemantic/sql/generator.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2844,6 +2844,15 @@ def _normalize_expr_for_subquery(sql_expr: str, table_alias: str, qualify_bare:
28442844
# ts_sql for from_clause_s subquery (SQL models aliased as "_src", table models no alias)
28452845
ts_sql_src = _normalize_expr_for_subquery(ts_sql_raw, "_src" if model.sql else "")
28462846

2847+
# Resolve entity: use dimension sql_expr if available (handles aliased dims
2848+
# and qualified names like events.user_id -> user_id)
2849+
entity_dim = model.get_dimension(metric.entity)
2850+
entity_sql_raw = entity_dim.sql_expr if entity_dim else metric.entity
2851+
# Normalize for step 1 context (alias "t" for SQL models, bare for table models)
2852+
entity_sql = _normalize_expr_for_subquery(entity_sql_raw, "t" if model.sql else "")
2853+
# Normalize for step N context (always alias "s")
2854+
entity_sql_s = _normalize_expr_for_subquery(entity_sql_raw, "s")
2855+
28472856
# Normalize filters: strip model name prefixes so they work inside CTEs
28482857
normalized_filters = self._strip_model_prefixes(filters or [], model.name)
28492858

@@ -2898,11 +2907,11 @@ def _normalize_expr_for_subquery(sql_expr: str, table_alias: str, qualify_bare:
28982907
norm_step = _normalize_expr_for_subquery(step_expr, "t" if model.sql else "")
28992908

29002909
# Step 1: find the earliest matching event per entity
2901-
select_parts = [f"{metric.entity} AS entity", f"MIN({ts_sql}) AS step_1_ts"]
2910+
select_parts = [f"{entity_sql} AS entity", f"MIN({ts_sql}) AS step_1_ts"]
29022911
for alias, sql_col in dim_entries:
29032912
select_parts.append(f"{sql_col} AS {alias}")
29042913
select_str = ",\n ".join(select_parts)
2905-
group_parts = [metric.entity]
2914+
group_parts = [entity_sql]
29062915
for _alias, sql_col in dim_entries:
29072916
group_parts.append(sql_col)
29082917
group_str = ",\n ".join(group_parts)
@@ -2924,11 +2933,11 @@ def _normalize_expr_for_subquery(sql_expr: str, table_alias: str, qualify_bare:
29242933

29252934
# Step N: join source to step N-1, only consider events at or after prior step
29262935
prev = f"step_{i - 1}"
2927-
select_parts = [f"s.{metric.entity} AS entity", f"MIN(s.__ts) AS step_{i}_ts"]
2936+
select_parts = [f"{entity_sql_s} AS entity", f"MIN(s.__ts) AS step_{i}_ts"]
29282937
for alias, _sql_col in dim_entries:
29292938
select_parts.append(f"{prev}.{alias}")
29302939
select_str = ",\n ".join(select_parts)
2931-
group_parts = [f"s.{metric.entity}"]
2940+
group_parts = [entity_sql_s]
29322941
for alias, _sql_col in dim_entries:
29332942
group_parts.append(f"{prev}.{alias}")
29342943
group_str = ",\n ".join(group_parts)
@@ -2937,7 +2946,7 @@ def _normalize_expr_for_subquery(sql_expr: str, table_alias: str, qualify_bare:
29372946
f" SELECT\n"
29382947
f" {select_str}\n"
29392948
f" FROM {from_clause_s}\n"
2940-
f" JOIN {prev} ON s.{metric.entity} = {prev}.entity\n"
2949+
f" JOIN {prev} ON {entity_sql_s} = {prev}.entity\n"
29412950
f" AND s.__ts >= {prev}.step_{i - 1}_ts\n"
29422951
f" WHERE ({norm_step}){filter_clause_s}\n"
29432952
f" GROUP BY\n"

0 commit comments

Comments
 (0)