Files
graph_explorer/issues/0035b-renderer-hides-grouped-children.md
egutierrez d3da1416f3 feat(0035b): renderer oculta hijos de grupos colapsados + dedup aristas
- AppState anade `group_expanded` (unordered_map<string,bool>) en RAM,
  default vacio = todos los grupos colapsados al arranque. Sin
  persistencia entre sesiones (fase 1).
- `apply_group_filter(GraphData*, db_path, expanded)` consulta
  entities (id, group_id, type_ref) de operations.db, marca como
  ocultos los nodos cuyo group_id apunta a un grupo no expandido,
  compacta `g->nodes` y re-mapea indices de aristas.
- Aristas:
  * Cross-edge (un extremo oculto, otro fuera): se redirige el
    extremo oculto al nodo del grupo. Sin dedup (issue 0035 dec. 5).
  * Internas (ambos extremos en el mismo grupo colapsado): se ocultan.
  * Inter-grupo (ambos en grupos colapsados distintos): dedup por
    par no ordenado (group_a, group_b) + rel_type, una linea por par.
  * Orfanas (group_id apunta a un grupo no presente en grafo): el
    nodo se oculta y sus aristas se descartan.
- Centralizado: el filtro corre en `reload_graph()` cuando se le
  pasa `group_expanded`, y en `load_input()` tras el load inicial.
  Cubre las 4 rutas de carga del app (toolbar reload, mutaciones,
  inspector save, primera carga / switch project).
- Idempotente sobre un grafo ya filtrado y robusto frente a BDs sin
  columna `group_id` (schema antiguo) — no toca el grafo.

Smoke test manual con 3 BDs sintéticas:
- Grupo + 2 children + edges cruzadas/internas: nodes 5→3, edges
  4→3 (internal hidden, cross redirected).
- 2 grupos con 4 cross-edges entre ellos: edges 4→1 (dedup).
- group_id huerfano: nodo oculto + arista descartada.

Build clean en Windows. Tests verdes:
- WSL pytest: 32 passed.
- Windows pytest: 21 passed + 11 skipped.

Refs: issues/0035b-renderer-hides-grouped-children.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 14:48:17 +02:00

2.4 KiB

id, title, status, priority, created, parent, depends_on
id title status priority created parent depends_on
0035b Renderer oculta hijos de grupos colapsados + dedup de aristas grupo-a-grupo done high 2026-05-03 0035
0035a

Objetivo

El renderer aprende a esconder entidades cuyo group_id apunta a un grupo colapsado, y a deduplicar aristas que cruzan dos grupos colapsados a una sola linea por par de grupos. Sin este paso, los grupos creados por enrichers (0035c) seguirian mostrando todos sus hijos en el canvas.

Cambios

  1. Estado de expansion en RAM: unordered_map<entity_id, bool> en AppState (group_expanded). Default: vacio (todos los grupos colapsados al arranque). No persiste entre sesiones (fase 1).
  2. Filtro al cargar el grafo (graph_load_from_operations o wrapper en el app): tras leer entities de la BD, descartar las que tengan group_id != NULL y cuyo grupo padre no este expandido. Las aristas cuyos extremos esten descartados tambien se omiten.
  3. Deduplicacion de aristas inter-grupo: cuando ambos extremos de una arista caen dentro de grupos colapsados (incluso el mismo), colapsamos el conjunto a UNA linea por par (group_a, group_b). Sin peso visual, sin grosor variable. Solo deduplicacion topologica.
  4. Centralizar el filtro: aplicarlo dentro del loader (no en cada caller). Hoy el grafo se recarga desde toolbar reload, dirty_counter de jobs, chat mutations marker, switch project — el filtro debe funcionar en TODAS estas rutas.

Acceptance criteria

  • Insertando manualmente en BD un Group + un Url con group_id que apunte a el, recargar el grafo muestra solo el cuadrado, no el Url.
  • Si el Url tiene una arista a un Domain externo, la arista no se dibuja al Url oculto pero SI se dibuja al cuadrado del grupo.
  • Si dos Urls dentro del mismo grupo tienen aristas a un Domain externo, se dibuja UNA sola arista del grupo al Domain (dedup).
  • Con group_expanded[id] = true (manualmente seteado a efectos de test, no hay UI todavia), los hijos vuelven a aparecer y las aristas se dibujan a su extremo real.
  • Tests pytest verdes.

TBD

Branch issue/0035b-renderer-hides-grouped-children en el sub-repo, merge --no-ff a master con tests verdes.

Out of scope

  • UI para expandir/colapsar grupo (drilling se hace via tableview en 0035d, no expandiendo en canvas).
  • Layouts internos del grupo expandido (fase 3).
  • Agregacion de aristas con peso visual (fase 3).