Skip to content

Commit 9010948

Browse files
committed
Skip joins without ON predicates, drop CROSS JOIN fallback
- _build_join_sql now skips joins with no extractable column_pairs instead of emitting bare JOINs that degrade to cartesian products. - Collection SQL builder no longer CROSS JOINs unconnected tables; tables without relationship edges are simply omitted to prevent metric corruption from unexpected cartesian products.
1 parent 00c1909 commit 9010948

1 file changed

Lines changed: 12 additions & 9 deletions

File tree

sidemantic/adapters/tableau.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,11 +1369,11 @@ def _build_collection_sql(
13691369
if not progressed:
13701370
break
13711371

1372+
# Skip unconnected tables rather than CROSS JOIN, which would
1373+
# introduce cartesian products and corrupt metrics
13721374
for table_name, qualified_table in collection_info.tables:
1373-
if table_name in connected or table_name == base_table_name:
1374-
continue
1375-
join_clauses.append(f"CROSS JOIN {_quote_table_reference(qualified_table)} AS {alias_by_table[table_name]}")
1376-
connected.add(table_name)
1375+
if table_name not in connected and table_name != base_table_name:
1376+
pass # Intentionally omitted: no relationship edge found
13771377

13781378
select_clauses = [
13791379
f"{alias_by_table[table_name]}.{_quote_sql_identifier(column_name)} AS {_quote_sql_identifier(field_name)}"
@@ -1569,13 +1569,16 @@ def _build_join_sql(self, base_table: str | None, joins: list[_JoinInfo]) -> str
15691569

15701570
parts = [f"SELECT * FROM {base_table}"]
15711571
for join in joins:
1572+
if not join.column_pairs:
1573+
# Skip joins without extractable ON predicates to avoid
1574+
# emitting bare JOINs that degrade to cartesian products
1575+
continue
15721576
join_keyword = join.join_type.upper()
15731577
parts.append(f"{join_keyword} JOIN {join.right_table_qualified}")
1574-
if join.column_pairs:
1575-
on_clauses = [
1576-
f"{_quote_column_reference(lc)} = {_quote_column_reference(rc)}" for lc, rc in join.column_pairs
1577-
]
1578-
parts.append(f"ON {' AND '.join(on_clauses)}")
1578+
on_clauses = [
1579+
f"{_quote_column_reference(lc)} = {_quote_column_reference(rc)}" for lc, rc in join.column_pairs
1580+
]
1581+
parts.append(f"ON {' AND '.join(on_clauses)}")
15791582

15801583
return "\n".join(parts)
15811584

0 commit comments

Comments
 (0)