Crear índices de búsqueda
Las colecciones del modelo son arreglos planos cuyas referencias cruzadas son
id de cadena simples (consulta ID y referencias).
Para cualquier cosa más allá de búsquedas puntuales, crea un índice Map una
sola vez — una única pasada O(n) que se amortiza en cada búsqueda posterior.
import { parseArchiModel } from '@cda/archi-semantic-core';
const model = parseArchiModel(xml);
const elementById = new Map(model.elements.map((e) => [e.id, e]));const relationshipById = new Map(model.relationships.map((r) => [r.id, r]));const folderById = new Map(model.folders.map((f) => [f.id, f]));const objectById = new Map(model.diagramObjects.map((o) => [o.id, o]));const profileById = new Map(model.profiles.map((p) => [p.id, p]));Resolución de extremos de relaciones
Sección titulada «Resolución de extremos de relaciones»El origen o el destino de una relación puede ser un elemento u otra relación (consulta Relaciones), por lo que se resuelve desde ambos índices:
function nodeName(id: string): string | null { return elementById.get(id)?.name ?? relationshipById.get(id)?.name ?? null;}Resolución de la capa visual
Sección titulada «Resolución de la capa visual»Los sourceId/targetId de una conexión apuntan a objetos de diagrama,
no a elementos semánticos. Sigue la cadena:
function elementForObject(objectId: string) { const object = objectById.get(objectId); return object?.archimateElementId ? elementById.get(object.archimateElementId) : undefined;}Navegación local a la vista
Sección titulada «Navegación local a la vista»Las vistas precalculan su contención (consulta Vistas), por lo que iterar los objetos de diagrama de una vista es directo:
function objectsInView(viewId: string) { const view = model.views.find((v) => v.id === viewId); if (!view) return []; return view.diagramObjectIds .map((id) => objectById.get(id)) .filter(Boolean);}Cuándo omitir los índices
Sección titulada «Cuándo omitir los índices»Para un solo recorrido de una colección, find/filter son suficientes y
más simples. Crea índices cuando vayas a buscar cosas repetidamente —
normalmente en cualquier renderizador, recorrido de análisis de impacto o
generador de informes.