Inist-CNRS / lodex

Linked Open Data EXperiment
https://www.lodex.fr/
Other
53 stars 12 forks source link

le transformer Array ne fonctionne pas correctement #2133

Closed Bonvallot closed 1 month ago

Bonvallot commented 1 month ago

Décrire le bogue Lorsqu'on lance le transformer Array, il crée un tableau quand il n'y a qu'une valeur. Il crée un tableau de tableau quand il y a plusieurs valeurs

Reproduire Étapes pour reproduire le comportement :

  1. Allez à ...'
  2. Voir l'aperçu de la valeur : ["HD 101065"] [["Iron"],["iron"],["sugar"],["haem iron"]]

Comportement attendu Ne pas créer de tableaux dans le tableau mais avoir un seul tableau avec plusieurs valeurs ["HD 101065"] ["Iron","iron","sugar","haem iron"]

Captures d'écran Le cas échéant, ajoutez des captures d'écran pour expliquer votre problème. image

Environnement (veuillez compléter les informations suivantes) :

Contexte supplémentaire Pour contourner l'actuel Array, on enchaîne un Join puis un Split

AnaelKremer commented 1 month ago

Tout fonctionne comme c'est censé fonctionner en fait. Le problème ne vient pas de l'utilisation du transformer "Array" mais de l'utilisation de "Get".

Pour info, les transformers testent le type des données et s'adaptent en fonction. Puisque le 1er exemple renvoyé après "Get" est un string, le transformer transforme la chaîne en tableau. Dans les cas où ce sont déjà des tableaux le transformer va agir su chaque élement du tableau, et donc transformer chaque chaîne ou élément en tableau et c'est pourquoi on obtient un tableau de tableaux.

L'utilisation du transformer "Array" dans ce contexte revient à exécuter ce code .map(item=>_.castArray(item)) quand on a un tableau, et simplement .castArray() quand c'est une chaîne.

Le résultat du transformer "Array" est donc tout à fait normal.

Le problème apparaît à l'utlisation de "Get" car on voit que pour le 1er exemple on n'a bien un tableau d'une seule valeur image

c'est l'usage de "Get" qui transforme ce taleau d'une valeur en un string.

image

Mais ce n'est pas un bug, en vérifiant le code du transformer "Get" il y a bien une ligne qui spécifie que si le tableau contient exactement 1 élément alors on renvoie directement l'élément sous forme de chaîne. Si le tableau est vide ou s'il contient pus d'un élément on renvoie le tableau d'origine >> https://github.com/Inist-CNRS/lodex/blob/master/packages/transformers/src/operations/GET.js

ligne 8 : return values.length === 1 ? values[0] : values;

A voir si @touv veut modifier le code de ce transformer et si cette ligne en particulier a une utilité. Si non je pense qu'il suffit de remplacer par return values;

Pour l'heure, le problème peut être résolu en passant par le mode enrichissement en écrivant simplement [assign] path=value value=get("value.chemTag.chemical")

le get de Lodash ne modifiant pas la structure des données.

touv commented 1 month ago

Le Transformer GET est peut-être le Transformer le plus utilisé, du coup, modifier son comportement risque de casser beaucoup de modèles. Je préférais modifier le comportement du transformer ARRAY pour éviter de créer des matrices car l'idée de ce Transformer était d’homogénéiser les types de données pour être certain de créer un tableau de valeurs directement exploitable par le format liste.

AnaelKremer commented 1 month ago

ok ok je comprends l'argument, par contre je laisse la main pour la résolution car pour moi le code spécifie déjà de ne pas créer de tableau si l'on a déjà un tableau... `export const valueToArray = value => { const arr = Array.isArray(value) ? value : [value]; return arr.filter(x => x); };

https://github.com/Inist-CNRS/lodex/blob/master/packages/transformers/src/operations/ARRAY.js`