Ir al contenido

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]));

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;
}

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;
}

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);
}

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.