Skip to content

Commit 77ebfb5

Browse files
fix: use database schema name for collapsed nodes when module is ambiguous
When multiple schemas share the same Python module name (e.g., __main__ in notebooks), collapsed nodes now use the database schema name instead. This makes it clear which schema is collapsed when tables from different schemas are mixed in the same diagram. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 09cf50d commit 77ebfb5

File tree

1 file changed

+35
-3
lines changed

1 file changed

+35
-3
lines changed

src/datajoint/diagram.py

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -442,15 +442,47 @@ def _apply_collapse(self, graph: nx.DiGraph) -> tuple[nx.DiGraph, dict[str, str]
442442
module_name = cls.__module__.split(".")[-1]
443443
schema_modules[schema_name].add(module_name)
444444

445+
# Collect module names for ALL schemas in the diagram (not just collapsed)
446+
all_schema_modules = {} # schema_name -> module_name
447+
for node in graph.nodes():
448+
full_name = class_to_full.get(node)
449+
if full_name:
450+
parts = full_name.replace('"', '`').split('`')
451+
if len(parts) >= 2:
452+
db_schema = parts[1]
453+
cls = self._resolve_class(node)
454+
if cls is not None and hasattr(cls, "__module__"):
455+
module_name = cls.__module__.split(".")[-1]
456+
all_schema_modules[db_schema] = module_name
457+
458+
# Check which module names are shared by multiple schemas
459+
module_to_schemas = {}
460+
for db_schema, module_name in all_schema_modules.items():
461+
if module_name not in module_to_schemas:
462+
module_to_schemas[module_name] = []
463+
module_to_schemas[module_name].append(db_schema)
464+
465+
ambiguous_modules = {m for m, schemas in module_to_schemas.items() if len(schemas) > 1}
466+
467+
# Determine labels for collapsed schemas
445468
collapsed_labels = {} # schema_name -> label
446-
collapsed_counts = {} # label -> count of tables
447469
for schema_name, modules in schema_modules.items():
448470
if len(modules) == 1:
449-
label = next(iter(modules))
471+
module_name = next(iter(modules))
472+
# Use database schema name if module is ambiguous
473+
if module_name in ambiguous_modules:
474+
label = schema_name
475+
else:
476+
label = module_name
450477
else:
451478
label = schema_name
452479
collapsed_labels[schema_name] = label
453-
collapsed_counts[label] = len(collapsed_by_schema[schema_name])
480+
481+
# Build counts using final labels
482+
collapsed_counts = {} # label -> count of tables
483+
for schema_name, class_names in collapsed_by_schema.items():
484+
label = collapsed_labels[schema_name]
485+
collapsed_counts[label] = len(class_names)
454486

455487
# Create new graph with collapsed nodes
456488
new_graph = nx.DiGraph()

0 commit comments

Comments
 (0)