Ce tutoriel est la suite des deux précédents : mise en place des métadonnées et création d’un job élémentaire de nettoyage.

Lors du dernier tutoriel, nous avons créé un job très simple : lecture d’une donnée, remplacement de son contenu, et mise à jour en base. Nous allons poursuivre sur la même problématique, mais cette fois-ci, créer un job nécessitant plus de composants et de logique.

Après avoir supprimé les acronymes des billets de WordPress, je me demande si tous ceux que j’ai supprimés sont bien référencés dans le plugin « acronyms« , afin de rajouter ceux qui manqueraient (et ainsi ne pas perdre d’informations).

Encore une fois, une vérification manuelle serait longue et fastidieuse. Et encore une fois, c’est Talend qui va nous éviter ce travail…

Entrons donc dans le vif du sujet ! Ce job comportant de nombreux composants, je ne détaillerai pas autant leur configuration que dans l’article précédent, supposant que vous avez compris le principe général de fonctionnement de TOS.

Récupération des acronymes des anciens articles

Comme dans le job précédent, je place un tMysqlInput qui va lire la table des articles, mais cette fois de Dotclear (ceux de WordPress ayant déjà subi le nettoyage). Je m’intéresse cette fois uniquement aux champs « post_excerpt_xhtml » et « post_content_xhtml » (susceptibles de contenir les fameux acronymes). N’ayant pas de mise à jour à faire, l’ID de l’article ne m’intéresse pas.

Je concatène ces deux champs de contenu afin d’en obtenir un seul, nommé « content » (ce qui simplifiera le traitement pour la suite). Pour cela j’utilise un des composants les plus utiles de TOS : le tMap (je reviendrai dessus tout à l’heure). Dans le champ de sortie, j’indique juste la concaténation par l’opérateur « + ».

Concaténation des champs de contenu des articles

Concaténation des champs de contenu des articles

De ce champ unique de contenu, j’extrais les acronymes grâce au composant tExtractRegexFields. Celui-ci va rechercher dans le contenu les champs correspondant à l’expression régulière suivante, et en extraire l’information qui m’intéresse, les différents acronymes utilisés :

1
"<acronym title=\"(.+?)\">(.+?)</acronym>"

Avec celle-ci j’extrais à la fois la définition de l’acronyme (le contenu du paramètre « title »), et l’acronyme lui-même, placé entre la balise de début et celle de fin. Comme la dernière fois, pour l’explication de cette expression régulière, je vous renvoie au tutoriel de Hugo Etiévant.

Pour finir de configurer ce composant, il nous me faut maintenant mettre à jour le schéma de sortie, ce composant ayant la particularité d’avoir un schéma de sortie différent de celui d’entrée, qui doit comporter autant de champs que de données extraites (deux dans notre cas) :

Schéma du composant d'extraction des acronymes

Schéma du composant d'extraction des acronymes

Liste des acronymes connus de WordPress

Nous allons laisser les trois composants ci-dessus en suspens quelques temps, et passer à la deuxième source de données dont nous avons besoin. La liste des acronymes du plugin de WordPress est enregistrée dans un enregistrement de la table wp_options, sous le nom « acronym_acronyms ». J’extrais la valeur de ce champ en personnalisant la requête SQL d’un nouveau composant tMysqlInput :

1
2
3
SELECT wp_options.wp_value
FROM wp_options
WHERE wp_options.wp_name = 'acronym_acronyms';

Cette valeur unique contenant l’ensemble des acronymes, nous allons devoir la travailler avant qu’elle ne devienne exploitable. On commence donc par en extraire la partie centrale, contenant les acronymes, avec un nouveau tExtractRegexFields paramétré comme suit :

1
"^.+?\\{(.+)\\}$"

Dans cette unique ligne de données, un acronyme a la forme suivante (où lg1 et lg2 sont respectivement la longueur en nombre de caractères de l’acronyme et de sa définition) :

s:lg1:acronyme;s:lg2:définition;

J’aurais aimé pour ce tutoriel utiliser le composant tNormalize pour séparer les différents acronymes, afin de varier les composants, mais la structure du champ ne le permet malheureusement pas : si je faisais cela, en utilisant le séparateur « ; » pour la normalisation, je perdrais la différence entre les acronymes et leur définition, qui est uniquement déterminé par la parité de la position dans la chaîne (impair : acronyme – pair : définition associée), sauf à réaliser un post-traitement. Je ne vais pas monter une usine à gaz dans l’unique but d’utiliser ce composant, et je me rabats donc sur un nouveau tExtractRegexFields, qui aura l’effet désiré paramétré comme suit :

1
"s:\\d+:\"(.+?)\";s:\\d+:\"(.+?)\";"

Là encore, on récupère les acronymes et leurs définitions.

Jointure

Nous avons donc mis en place deux flux d’alimentation, contenant chacun deux colonnes « acronyme » et « definition ». Afin de vérifier quels acronymes des articles Dotclear manquent dans WordPress, il nous faut effectuer une jointure entre ces deux flux. Nous allons pour cela utiliser un deuxième composant tMap, et voir plus en détail son fonctionnement (note : plus de 3 tutoriels dédiés au tMap sont disponibles chez Talend) :

  • la liste des acronymes de Dotclear doit être la première à rejoindre le tMap, en tant que lien « principal »
  • la liste des acronymes connus de WordPress rejoint ensuite ce même tMap, en tant que lien « lookup

Un double-clic sur le tMap nous permet ensuite de paramétrer celui-ci :

  • à gauche, nous voyons nos deux entrées. Pour réaliser la jointure, on fait glisser le champ « acronyme » de l’entrée Dotclear vers le champ de même nom de l’entrée WordPress, sans oublier de cocher « inner join » pour disposer des rejets de la jointure interne.
  • à droite, nous allons cette fois créer 3 sorties, que nous nommerons respectivement « correct », « incorrect », et « manquant ».

Dans la sortie « correct », nous allons envoyer les acronymes existants à la fois dans Dotclear et dans WordPress, et pour lesquels la définition est identique. Dans incorrect, nous allons relever (pour analyse) les acronymes qui existent dans les deux environnements, mais pour lesquels la définition n’est pas la même. Enfin, dans « manquant », nous relevons les acronymes qui existaient sous Dotclear et qui manquent dans WordPress.

Pour ce faire, dans la sortie « correct », nous activons le « filtre » (bouton blanc en haut à droite de la sortie), avec l’expression :

1
acronymesDC.definition.equals(acronymesWP.definition)

Dans la sortie « incorrect », nous pourrions créer un autre filtre (négation de la condition précédente), mais nous allons procéder différemment. Nous activons le « rejet de sortie » (bouton orange). Cela correspond à tout ce qui vérifie la jointure, mais pas les conditions des autres sorties (« correct » dans notre cas). Pour avoir un maximum d’informations, nous mettons dans cette sortie les deux définitions contradictoires.

Enfin, pour la sortie « manquant », nous activons le « rejet de jointure interne » (bouton violet). C’est cette sortie qui nous donnera la liste des acronymes qu’il faut reporter dans WordPress.

Voici ce que ça donne finalement en image :

Jointure entre les acronymes Dotclear et WordPress

Jointure entre les acronymes Dotclear et WordPress

Finalisation du job

On applique les modifications, et on revient au job général. Il ne nous reste plus qu’à connecter chacune de ces trois sorties du tMap à un composant d’écriture (fichier, base de données, affichage console, etc.). Je choisis de stocker ces différents résultats dans 3 fichier CSV (tFileOutputDelimited), nommés respectivement (avec beaucoup d’imagination) « correct.csv », « incorrect.csv », et « manquant.csv ».

Note : pour aller encore plus loin, on pourrait réaliser un traitement sur la sortie manquant pour insérer automatiquement dans WordPress les acronymes et leurs définitions à partir de celles extraites de Dotclear, mais je vous laisse ça à titre d’exercice ;-) .

Voici donc sans plus attendre à quoi ressemble notre job finalisé :

Job de vérification des acronymes finalisé

Job de vérification des acronymes finalisé

Conclusion

Avec cet exemple, je clos cette première série de tutoriels sur sur l’utilisation basique de TOS. Si j’ai le temps (c’est toujours le gros soucis dans ce genre d’exercices, effectué sur mon temps libre), j’en rédigerai d’autres (j’ai déjà en tête la création de composants, l’utilisation de Talend MDM, etc.).

J’espère qu’ils vous auront convaincu de l’intérêt de ce genre d’outil, qui permet de manière simple et en un temps record de créer des traitements qui sont loin d’être triviaux (à titre d’exemple, j’ai passé environ une heure à créer le job ci-dessus), et de celui de Talend en particulier, qui présente l’énorme avantage (entre autres) d’être Open Source !

Dernière information : au delà du « cas d’école », que représente ce job, il m’a réellement permis de trouver

  • quelques acronymes « incorrect », à cause de fautes de frappes ou d’étourderies lorsque je les ai saisis manuellement sous Dotclear (« eXtended Markup Language » au lieu de « eXtensible Markup Language » par exemple)
  • presque 50 acronymes manquants dans WordPress, ce qui m’a surpris : je ne pensais pas en trouver autant.

Pour l’épilogue, plutôt que de saisir ces 50 acronymes à la main, j’ai vérifié/corrigé ce fichier CSV, et j’ai récidivé en créant un nouveau job pour injecter ce fichier dans WordPress…