Skip to content

BDD-99 — Configurer le bloc Croiser

Objectif

En tant qu'administrateur, configurer le bloc Traitement / Croiser en définissant la clé de jointure et le type de jointure, afin de fusionner deux sources de données dans le pipeline workflow.

Périmètre livré

  • Deux entrées obligatoires : le nœud Croiser doit avoir exactement deux connexions entrantes (Source ou Traitement en amont).
  • Clé de jointure : sélection parmi les colonnes communes aux deux fichiers chargés (intersection des noms de colonnes).
  • Type de jointure : inner ou left.
  • Aperçu du résultat : tableau (jusqu'à 10 lignes) après simulation sur les données chargées.
  • Nombre de lignes non jointes affiché après simulation :
    • inner : lignes gauche sans correspondance + lignes droite sans correspondance ;
    • left : lignes gauche sans correspondance uniquement.
  • Simulation sur les lignes chargées depuis le fichier du dépôt (GET /sources/preview?documentUuid=, ~20 lignes par fichier). Ce n'est pas l'exécution complète du pipeline côté serveur (hors périmètre MVP4 actuel).
  • Les blocs Source lient un fichier du dépôt (inputDocumentUuid). Voir Workflows (MVP4).

Topologie canvas

text
Source A ──┐
           ├──► [Traitement / Croiser] ──► …
Source B ──┘

Ou avec traitements intermédiaires (chaque branche remonte jusqu'au fichier dépôt).

Gauche / droite : ordre stable des deux prédécesseurs directs, tri par id du nœud source de l'arête (branche « gauche » = id le plus petit).

Comparaison des clés (simulation)

Les valeurs de jointure sont comparées après normalisation légère :

  • null, undefined et chaîne vide sont des clés distinctes entre elles ;
  • les autres valeurs sont converties en chaîne (String(value)), sans trim ni harmonisation des zéros (011).

Format de configuration JSONB (workflow_nodes.configuration)

json
{
  "type": "croiser",
  "joinKey": "code_departement",
  "joinType": "inner"
}

joinType : "inner" (défaut) ou "left".

Les colonnes homonymes côté droit sont suffixées __droite dans l'aperçu (sauf la clé de jointure).

Fichiers principaux

RôleChemin
Moteur (logique pure)front/src/pages/admin/workflows/workflow-croiser.engine.js
Résolution des deux branchesfront/src/pages/admin/workflows/workflow-croiser-branches.resolver.js
Sync UI sous-type / config.typefront/src/pages/admin/workflows/workflow-traitement.sync.js
Options type traitementfront/src/pages/admin/workflows/workflow-treatment-type-options.js
Panneau UIfront/src/components/workflows/WorkflowCroiserPanel.vue
Intégration éditeurfront/src/pages/admin/workflows/WorkflowEditorPage.vue
Chargement lignes dépôt (prévisualisation)front/src/pages/admin/workflows/workflow-source-preview.fetch.js
Tiroir inspecteurfront/src/components/workflows/WorkflowInspectorDrawer.vue

API

  • PUT /workflows/:uuid/canvas : nodes[].inputDocumentUuid pour les blocs source ; nodes[].config pour les traitement (type croiser).

Tests

  • front/src/__tests__/pages/admin/workflows/workflow-croiser.engine.spec.js
  • front/src/__tests__/pages/admin/workflows/workflow-croiser-branches.resolver.spec.js
  • front/src/__tests__/pages/admin/workflows/workflow-traitement.sync.spec.js

Chaînage des aperçus (pipeline MVP4)

Chaque bloc Traitement consomme la sortie simulée de son prédécesseur direct (un seul entrant pour Mapper / Nettoyer ; deux pour Croiser). Seul un bloc Source lit le fichier du dépôt.

Exemples :

  • Source → Nettoyer : nettoyage des lignes du fichier.
  • Source → Mapper → Nettoyer : nettoyage après renommage / typage Mapper.
  • Source A + Source B → Croiser → Nettoyer : nettoyage sur le résultat de la jointure.

Implémentation : workflow-traitement-preview.pipeline.js (resolveNodeOutput, resolvePredecessorInputForTraitement, resolveCroiserBranchInputs).

Scripts SQL

Aucun — réutilisation du schéma existant (workflow_nodes.configuration JSONB, input_document_id sur les nœuds source, voir BDD-98 / sql/tool_14_workflow_input_document.sql).