d3da1416f3
- 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>
61 lines
2.4 KiB
Markdown
61 lines
2.4 KiB
Markdown
---
|
|
id: 0035b
|
|
title: Renderer oculta hijos de grupos colapsados + dedup de aristas grupo-a-grupo
|
|
status: done
|
|
priority: high
|
|
created: 2026-05-03
|
|
parent: 0035
|
|
depends_on: [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).
|