1
votes

Récupération de la clé: paire de valeurs à partir d'un objet de tableau dans mule4

Je veux récupérer la paire clé / valeur de l'objet tableau json. J'essaie de construire une clause where dynamique avec l'entrée. Si la valeur de la clé est la même dans le tableau, je veux l'utiliser avec l'opérateur "IN" sinon je veux utiliser "AND". Expliquer les deux scénarios à l'aide de deux exemples

Input1:

**"Where id = '123' and name = 'abc'**

]

Résultat attendu:

"values": [
{
  "id": "123"
},
{
  "name": "abc"
}

Input2:

**"Where id in ('123','455')"**

]

Résultat attendu:

"values": [
{
  "id": "123"
},
{
  "id": "455"
}

Merci d'avance


0 commentaires

3 Réponses :


1
votes

Cela devrait vous permettre de progresser sur la bonne voie.

%dw 2.0
import * from dw::core::Arrays
output application/json

var values = 
    [
        {
            "id": "123"
        },
        {
            "id": "abc"
        }
    ]

---

if ( (values countBy ($.id != null)) > 1 )
    "in"
else if ( (values countBy ($.id != null)) == 1 )
    "and"
else
    "idk"


0 commentaires

0
votes

Vérifiez si toutes les clés sont identiques pour différencier les cas.

Vous pouvez utiliser la fonction joinBy avec "','" ou "et" pour séparer les valeurs.

%dw 2.0
import * from dw::core::Arrays
output application/json
var firstKey = keysOf(payload.values[0])[0]
var sameKeys = payload.values every ((item) -> keysOf(item)[0] == firstKey)
---
if (sameKeys) 
    "Where " ++ firstKey ++ " in ('" ++ (payload.values[firstKey] joinBy "','") ++ "')" 
else 
    "Where " ++ (payload.values map ((item, index) -> keysOf(item)[0] ++ " = '" ++ valuesOf(item)[0] ++ "'") joinBy  " and ")


2 commentaires

keysOf est introduit dans dataweave 2.3 je suppose. J'utilise une version précédente. Une suggestion sur ce que je pourrais le remplacer? J'ai essayé avec keySet mais même cela ne semble pas fonctionner.


J'ai mis à jour l'approche de Christian en utilisant keySet et publié en tant que réponse ci-dessous. HTH ..



1
votes

L'approche de Christian, utilisant le jeu de clés

%dw 2.0
import * from dw::core::Objects
import * from dw::core::Arrays
output application/json
var firstKey = keySet(payload.values[0])[0]
var sameKeys = payload.values every ((item) -> keySet(item)[0] == firstKey)
---
if (sameKeys) 
    "Where " ++ firstKey ++ " in ('" ++ (payload.values[firstKey] joinBy "','") ++ "')" 
else 
    "Where " ++ (payload.values map ((item, index) -> keysOf(item)[0] ++ " = '" ++ valuesOf(item)[0] ++ "'") joinBy  " and ")


0 commentaires